Merge "Customize actionless car intents" into rvc-dev
diff --git a/src/com/android/settings/intelligence/search/car/CarSearchFeatureProviderImpl.java b/src/com/android/settings/intelligence/search/car/CarSearchFeatureProviderImpl.java
index c141b36..2491cbd 100644
--- a/src/com/android/settings/intelligence/search/car/CarSearchFeatureProviderImpl.java
+++ b/src/com/android/settings/intelligence/search/car/CarSearchFeatureProviderImpl.java
@@ -29,6 +29,7 @@
 import com.android.settings.intelligence.search.indexing.DatabaseIndexingManager;
 import com.android.settings.intelligence.search.indexing.IndexData;
 import com.android.settings.intelligence.search.indexing.IndexingCallback;
+import com.android.settings.intelligence.search.indexing.car.CarDatabaseIndexingManager;
 import com.android.settings.intelligence.search.query.DatabaseResultTask;
 import com.android.settings.intelligence.search.query.InstalledAppResultTask;
 import com.android.settings.intelligence.search.query.SearchQueryTask;
@@ -49,7 +50,7 @@
     private static final String TAG = "CarSearchFeatureProvider";
     private static final long SMART_SEARCH_RANKING_TIMEOUT = 300L;
 
-    private DatabaseIndexingManager mDatabaseIndexingManager;
+    private CarDatabaseIndexingManager mDatabaseIndexingManager;
     private ExecutorService mExecutorService;
     private SiteMapManager mSiteMapManager;
 
@@ -75,7 +76,8 @@
     @Override
     public DatabaseIndexingManager getIndexingManager(Context context) {
         if (mDatabaseIndexingManager == null) {
-            mDatabaseIndexingManager = new DatabaseIndexingManager(context.getApplicationContext());
+            mDatabaseIndexingManager = new CarDatabaseIndexingManager(
+                    context.getApplicationContext());
         }
         return mDatabaseIndexingManager;
     }
diff --git a/src/com/android/settings/intelligence/search/indexing/DatabaseIndexingManager.java b/src/com/android/settings/intelligence/search/indexing/DatabaseIndexingManager.java
index 0053f14..32add54 100644
--- a/src/com/android/settings/intelligence/search/indexing/DatabaseIndexingManager.java
+++ b/src/com/android/settings/intelligence/search/indexing/DatabaseIndexingManager.java
@@ -178,7 +178,7 @@
 
     private List<IndexData> getIndexData(PreIndexData data) {
         if (mConverter == null) {
-            mConverter = new IndexDataConverter(mContext);
+            mConverter = getIndexDataConverter(mContext);
         }
         return mConverter.convertPreIndexDataToIndexData(data);
     }
@@ -186,7 +186,7 @@
     private List<SiteMapPair> getSiteMapPairs(List<IndexData> indexData,
             List<Pair<String, String>> siteMapClassNames) {
         if (mConverter == null) {
-            mConverter = new IndexDataConverter(mContext);
+            mConverter = getIndexDataConverter(mContext);
         }
         return mConverter.convertSiteMapPairs(indexData, siteMapClassNames);
     }
@@ -312,6 +312,14 @@
         }
     }
 
+    /**
+     * Protected method to get a new IndexDataConverter instance. This method can be overridden
+     * in subclasses to substitute in a custom IndexDataConverter.
+     */
+    protected IndexDataConverter getIndexDataConverter(Context context) {
+        return new IndexDataConverter(context);
+    }
+
     public class IndexingTask extends AsyncTask<Void, Void, Void> {
 
         @VisibleForTesting
diff --git a/src/com/android/settings/intelligence/search/indexing/IndexData.java b/src/com/android/settings/intelligence/search/indexing/IndexData.java
index 904deaf..7318eaa 100644
--- a/src/com/android/settings/intelligence/search/indexing/IndexData.java
+++ b/src/com/android/settings/intelligence/search/indexing/IndexData.java
@@ -68,7 +68,7 @@
     private static final Pattern REMOVE_DIACRITICALS_PATTERN
             = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
 
-    private IndexData(Builder builder) {
+    protected IndexData(Builder builder) {
         locale = Locale.getDefault().toString();
         updatedTitle = normalizeHyphen(builder.mTitle);
         updatedSummaryOn = normalizeHyphen(builder.mSummaryOn);
@@ -186,6 +186,18 @@
             return mKey;
         }
 
+        public String getIntentAction() {
+            return mIntentAction;
+        }
+
+        public String getIntentTargetPackage() {
+            return mIntentTargetPackage;
+        }
+
+        public String getIntentTargetClass() {
+            return mIntentTargetClass;
+        }
+
         public Builder setSummaryOn(String summaryOn) {
             mSummaryOn = summaryOn;
             return this;
@@ -290,9 +302,10 @@
         }
 
         /**
-         * Adds Intent payload to builder.
+         * Builds Intent payload for the builder.
+         * This protected method that can be overridden in a subclass for custom intents.
          */
-        private Intent buildIntent(Context context) {
+        protected Intent buildIntent(Context context) {
             final Intent intent;
 
             // TODO REFACTOR (b/62807132) With inline results re-add proper intent support
diff --git a/src/com/android/settings/intelligence/search/indexing/IndexDataConverter.java b/src/com/android/settings/intelligence/search/indexing/IndexDataConverter.java
index bd53596..f57ce6b 100644
--- a/src/com/android/settings/intelligence/search/indexing/IndexDataConverter.java
+++ b/src/com/android/settings/intelligence/search/indexing/IndexDataConverter.java
@@ -165,7 +165,7 @@
         // A row is enabled if it does not show up as an nonIndexableKey
         boolean enabled = !(nonIndexableKeys != null && nonIndexableKeys.contains(raw.key));
 
-        final IndexData.Builder builder = new IndexData.Builder();
+        final IndexData.Builder builder = getIndexDataBuilder();
         builder.setTitle(raw.title)
                 .setSummaryOn(raw.summaryOn)
                 .setEntries(raw.entries)
@@ -244,7 +244,7 @@
             headerKeywords = XmlParserUtils.getDataKeywords(context, attrs);
             enabled = !nonIndexableKeys.contains(headerKey);
             // TODO: Set payload type for header results
-            IndexData.Builder headerBuilder = new IndexData.Builder();
+            IndexData.Builder headerBuilder = getIndexDataBuilder();
             headerBuilder.setTitle(headerTitle)
                     .setSummaryOn(headerSummary)
                     .setScreenTitle(screenTitle)
@@ -286,7 +286,7 @@
                     isHeaderUnique = false;
                 }
 
-                builder = new IndexData.Builder();
+                builder = getIndexDataBuilder();
                 builder.setTitle(title)
                         .setKeywords(keywords)
                         .setClassName(sir.className)
@@ -365,4 +365,8 @@
         final Set<String> result = nonIndexableKeys.get(authority);
         return result != null ? result : new ArraySet<>();
     }
+
+    protected IndexData.Builder getIndexDataBuilder() {
+        return new IndexData.Builder();
+    }
 }
diff --git a/src/com/android/settings/intelligence/search/indexing/car/CarDatabaseIndexingManager.java b/src/com/android/settings/intelligence/search/indexing/car/CarDatabaseIndexingManager.java
new file mode 100644
index 0000000..3026e82
--- /dev/null
+++ b/src/com/android/settings/intelligence/search/indexing/car/CarDatabaseIndexingManager.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.intelligence.search.indexing.car;
+
+import android.content.Context;
+
+import com.android.settings.intelligence.search.indexing.DatabaseIndexingManager;
+import com.android.settings.intelligence.search.indexing.IndexDataConverter;
+import com.android.settings.intelligence.search.indexing.PreIndexData;
+
+/**
+ * Car extension to {@link DatabaseIndexingManager} to use {@link CarIndexDataConverter} for
+ * converting {@link PreIndexData} into {@link CarIndexData}.
+ */
+public class CarDatabaseIndexingManager extends DatabaseIndexingManager {
+
+    public CarDatabaseIndexingManager(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected IndexDataConverter getIndexDataConverter(Context context) {
+        return new CarIndexDataConverter(context);
+    }
+}
diff --git a/src/com/android/settings/intelligence/search/indexing/car/CarIndexData.java b/src/com/android/settings/intelligence/search/indexing/car/CarIndexData.java
new file mode 100644
index 0000000..a57d003
--- /dev/null
+++ b/src/com/android/settings/intelligence/search/indexing/car/CarIndexData.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.intelligence.search.indexing.car;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.settings.intelligence.search.indexing.DatabaseIndexingUtils;
+import com.android.settings.intelligence.search.indexing.IndexData;
+
+/**
+ * Car data class representing a single row in the Setting Search results database.
+ */
+public class CarIndexData extends IndexData {
+
+    public CarIndexData(IndexData.Builder builder) {
+        super(builder);
+    }
+
+    /**
+     * Builder class for {@link CarIndexData}, extending {@link IndexData.Builder}, which replaces
+     * all intents with direct search intents, since CarSettings doesn't support
+     * SearchResultTrampolineIntents.
+     */
+    public static class Builder extends IndexData.Builder {
+        @Override
+        protected Intent buildIntent(Context context) {
+            return DatabaseIndexingUtils.buildDirectSearchResultIntent(getIntentAction(),
+                    getIntentTargetPackage(), getIntentTargetClass(), getKey());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/intelligence/search/indexing/car/CarIndexDataConverter.java b/src/com/android/settings/intelligence/search/indexing/car/CarIndexDataConverter.java
new file mode 100644
index 0000000..11f35cb
--- /dev/null
+++ b/src/com/android/settings/intelligence/search/indexing/car/CarIndexDataConverter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.intelligence.search.indexing.car;
+
+import android.content.Context;
+
+import com.android.settings.intelligence.search.indexing.IndexData;
+import com.android.settings.intelligence.search.indexing.IndexDataConverter;
+import com.android.settings.intelligence.search.indexing.PreIndexData;
+
+/**
+ * Car helper class to convert {@link PreIndexData} to {@link CarIndexData}.
+ */
+public class CarIndexDataConverter extends IndexDataConverter {
+
+    public CarIndexDataConverter(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected IndexData.Builder getIndexDataBuilder() {
+        return new CarIndexData.Builder();
+    }
+}