Added dismiss button to location permission request.

This change adds a dismiss button to the location permission prompt shown in
the search UI. A few other minor changes:
 - Permission prompt is always the first element in the list
 - Adjusted a few dimensions and strings

screenshot: http://screen/9CkRPUQ5dwh
Bug: 65858857
Test: SAT, NSFT
PiperOrigin-RevId: 169466585
Change-Id: I8177c23fe3f635fec5fdcdbe6675428cebb19f5d
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index 1dbd953..47a4ee6 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -24,6 +24,7 @@
 import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
@@ -53,6 +54,7 @@
 import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader;
 import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader.Directory;
 import com.android.dialer.util.CallUtil;
+import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PermissionsUtil;
 import com.android.dialer.util.ViewUtil;
 import com.android.dialer.widget.EmptyContentView;
@@ -76,6 +78,7 @@
   private static final int ENRICHED_CALLING_CAPABILITIES_UPDATED_DELAY = 400;
 
   private static final String KEY_SHOW_ZERO_SUGGEST = "use_zero_suggest";
+  private static final String KEY_LOCATION_PROMPT_DISMISSED = "search_location_prompt_dismissed";
 
   @VisibleForTesting public static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
   @VisibleForTesting private static final int LOCATION_PERMISSION_REQUEST_CODE = 2;
@@ -326,9 +329,12 @@
 
   // Should not be called before remote directories (not contacts) have finished loading.
   private void loadNearbyPlacesCursor() {
-    if (!PermissionsUtil.hasLocationPermissions(getContext())) {
+    if (!PermissionsUtil.hasLocationPermissions(getContext())
+        && !DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(getContext())
+            .getBoolean(KEY_LOCATION_PROMPT_DISMISSED, false)) {
       if (adapter != null) {
-        adapter.showLocationPermissionRequest(v -> requestLocationPermission());
+        adapter.showLocationPermissionRequest(
+            v -> requestLocationPermission(), v -> dismissLocationPermission());
       }
       return;
     }
@@ -353,6 +359,14 @@
     requestPermissions(deniedPermissions, LOCATION_PERMISSION_REQUEST_CODE);
   }
 
+  private void dismissLocationPermission() {
+    PreferenceManager.getDefaultSharedPreferences(getContext())
+        .edit()
+        .putBoolean(KEY_LOCATION_PROMPT_DISMISSED, true)
+        .apply();
+    adapter.hideLocationPermissionRequest();
+  }
+
   @Override
   public void onResume() {
     super.onResume();
diff --git a/java/com/android/dialer/searchfragment/list/SearchAdapter.java b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
index 358a59a..22bfa6d 100644
--- a/java/com/android/dialer/searchfragment/list/SearchAdapter.java
+++ b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
@@ -56,7 +56,8 @@
   private boolean showZeroSuggest;
   private String query;
   private CallInitiationType.Type callInitiationType = CallInitiationType.Type.UNKNOWN_INITIATION;
-  private OnClickListener locationRequestClickListener;
+  private OnClickListener allowClickListener;
+  private OnClickListener dismissClickListener;
 
   @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
   public SearchAdapter(Activity activity, SearchCursorManager searchCursorManager) {
@@ -87,7 +88,8 @@
       case RowType.LOCATION_REQUEST:
         return new LocationPermissionViewHolder(
             LayoutInflater.from(activity).inflate(R.layout.location_permission_row, root, false),
-            locationRequestClickListener);
+            allowClickListener,
+            dismissClickListener);
       case RowType.INVALID:
       default:
         throw Assert.createIllegalStateFailException("Invalid RowType: " + rowType);
@@ -178,10 +180,12 @@
    * Updates the adapter to show the location request row element. If the element was previously
    * hidden, the adapter will call {@link #notifyDataSetChanged()}.
    */
-  public void showLocationPermissionRequest(OnClickListener clickListener) {
-    Assert.isNotNull(locationRequestClickListener = clickListener);
+  public void showLocationPermissionRequest(
+      OnClickListener allowClickListener, OnClickListener dismissClickListener) {
+    this.allowClickListener = Assert.isNotNull(allowClickListener);
+    this.dismissClickListener = Assert.isNotNull(dismissClickListener);
     if (searchCursorManager.showLocationPermissionRequest(true)) {
-      notifyDataSetChanged();
+      notifyItemRemoved(0);
     }
   }
 
@@ -190,9 +194,10 @@
    * visible, the adapter will call {@link #notifyDataSetChanged()}.
    */
   void hideLocationPermissionRequest() {
-    locationRequestClickListener = null;
+    allowClickListener = null;
+    dismissClickListener = null;
     if (searchCursorManager.showLocationPermissionRequest(false)) {
-      notifyDataSetChanged();
+      notifyItemRemoved(0);
     }
   }
 
@@ -242,13 +247,19 @@
   /** Viewholder for R.layout.location_permission_row that requests the location permission. */
   private static class LocationPermissionViewHolder extends RecyclerView.ViewHolder {
 
-    LocationPermissionViewHolder(View itemView, OnClickListener locationRequestClickListener) {
+    LocationPermissionViewHolder(
+        View itemView, OnClickListener allowClickListener, OnClickListener dismissClickListener) {
       super(itemView);
-      Assert.isNotNull(locationRequestClickListener);
+      Assert.isNotNull(allowClickListener);
+      Assert.isNotNull(dismissClickListener);
       itemView
           .findViewById(
               com.android.dialer.searchfragment.nearbyplaces.R.id.location_permission_allow)
-          .setOnClickListener(locationRequestClickListener);
+          .setOnClickListener(allowClickListener);
+      itemView
+          .findViewById(
+              com.android.dialer.searchfragment.nearbyplaces.R.id.location_permission_dismiss)
+          .setOnClickListener(dismissClickListener);
     }
   }
 }
diff --git a/java/com/android/dialer/searchfragment/list/SearchCursorManager.java b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java
index f8d1e1b..c6aca8e 100644
--- a/java/com/android/dialer/searchfragment/list/SearchCursorManager.java
+++ b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java
@@ -244,6 +244,13 @@
    * @return Cursor moved to position specific to passed in position.
    */
   SearchCursor getCursor(int position) {
+    if (showLocationPermissionRequest) {
+      if (position == 0) {
+        return LOCATION_PERMISSION_CURSOR;
+      }
+      position--;
+    }
+
     if (contactsCursor != null) {
       int count = contactsCursor.getCount();
 
@@ -254,13 +261,7 @@
       position -= count;
     }
 
-    if (showLocationPermissionRequest) {
-      if (position == 0) {
-        return LOCATION_PERMISSION_CURSOR;
-      }
-      position--;
-
-    } else if (nearbyPlacesCursor != null) {
+    if (!showLocationPermissionRequest && nearbyPlacesCursor != null) {
       int count = nearbyPlacesCursor.getCount();
 
       if (position - count < 0) {
diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
index 800bf62..4204a4f 100644
--- a/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
+++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
@@ -19,12 +19,13 @@
     android:layout_height="wrap_content"
     android:paddingStart="16dp"
     android:paddingEnd="16dp"
-    android:paddingTop="16dp">
+    android:paddingTop="16dp"
+    android:paddingBottom="8dp">
 
   <ImageView
       android:id="@+id/permission_image"
-      android:layout_width="56dp"
-      android:layout_height="56dp"
+      android:layout_width="40dp"
+      android:layout_height="40dp"
       android:layout_marginEnd="16dp"
       android:src="@drawable/quantum_ic_my_location_vd_theme_24"
       android:tint="@color/dialer_secondary_text_color"/>
@@ -34,8 +35,9 @@
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toEndOf="@id/permission_image"
-      android:minHeight="56dp"
-      android:text="@string/permission_no_location_for_search"
+      android:minHeight="40dp"
+      android:text="@string/search_location_permission"
+      android:lineSpacingMultiplier="1.2"
       android:textSize="16sp"
       android:textColor="@color/dialer_secondary_text_color"/>
 
@@ -45,7 +47,18 @@
       android:layout_height="wrap_content"
       android:layout_alignParentEnd="true"
       android:layout_below="@id/permission_text"
-      android:text="@string/nearby_places_allow"
+      android:layout_marginTop="24dp"
+      android:text="@string/nearby_places_allow"/>
+
+  <Button
+      android:id="@+id/location_permission_dismiss"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_toStartOf="@+id/location_permission_allow"
+      android:layout_below="@id/permission_text"
+      android:layout_marginEnd="16dp"
+      android:layout_marginTop="24dp"
+      android:text="@string/nearby_places_dismiss"
       android:textColor="@color/dialer_theme_color"
       style="@style/Widget.AppCompat.Button.Borderless"/>
 </RelativeLayout>
\ No newline at end of file