Merge "Add Location Slice" into pi-dev
diff --git a/res/drawable/ic_photo_library.xml b/res/drawable/ic_photo_library.xml
index 732a348..a1a58c2 100644
--- a/res/drawable/ic_photo_library.xml
+++ b/res/drawable/ic_photo_library.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M22,16V4c0,-1.11 -0.9,-2 -2,-2H8C6.89,2 6,2.89 6,4v12c0,1.1 0.89,2 2,2h12C21.1,18 22,17.1 22,16zM11,12l2.03,2.71L16,11l4,5H8L11,12zM2,7v13c0,1.1 0.9,2 2,2h13c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H4.5C4.22,20 4,19.78 4,19.5V7c0,-0.55 -0.45,-1 -1,-1h0C2.45,6 2,6.45 2,7z"/>
+        android:pathData="M20,4v12H8V4H20M20,2H8C6.9,2 6,2.9 6,4v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2L20,2zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2zM15.67,11l-2.5,2.98L11.5,11.8L9,15h10L15.67,11z"/>
 </vector>
diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml
index 67b6c9a..d5c89b9 100644
--- a/res/drawable/ic_settings_accessibility.xml
+++ b/res/drawable/ic_settings_accessibility.xml
@@ -20,5 +20,8 @@
         android:viewportHeight="24.0">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M20.75,6.99c-0.14,-0.55 -0.69,-0.87 -1.24,-0.75C17.13,6.77 14.48,7 12,7S6.87,6.77 4.49,6.24c-0.55,-0.12 -1.1,0.2 -1.24,0.75l0,0C3.11,7.55 3.45,8.12 4,8.25C5.61,8.61 7.35,8.86 9,9v12c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1v-5h2v5c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1V9c1.65,-0.14 3.39,-0.39 5,-0.75C20.55,8.12 20.89,7.55 20.75,6.99L20.75,6.99zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"/>
+        android:pathData="M20.5,4c-2.61,0.7 -5.67,1 -8.5,1S6.11,4.7 3.5,4L3,6c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V7c2,-0.17 4.14,-0.5 6,-1L20.5,4zM12,4c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,4 12,4z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M7,24h2v-2H7V24zM11,24h2v-2h-2V24zM15,24h2v-2h-2V24z"/>
 </vector>
diff --git a/res/drawable/ic_settings_memory.xml b/res/drawable/ic_settings_memory.xml
index 830dfc9..78a6b8d 100644
--- a/res/drawable/ic_settings_memory.xml
+++ b/res/drawable/ic_settings_memory.xml
@@ -20,19 +20,6 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M6.0,4.0l0.0,16.0 12.0,0.0 0.0,-16.0 -12.0,0.0z
-        M6.0,5.25l0,1.5 -3,0 0,-1.5 3,0z
-        M6.0,9.25l0,1.5 -3,0 0,-1.5 3,0z
-        M6.0,13.25l0,1.5 -3,0 0,-1.5 3,0z
-        M6.0,17.25l0,1.5 -3,0 0,-1.5 3,0z
-        M21.0,5.25l0,1.5 -3,0 0,-1.5 3,0z
-        M21.0,9.25l0,1.5 -3,0 0,-1.5 3,0z
-        M21.0,13.25l0,1.5 -3,0 0,-1.5 3,0z
-        M21.0,17.25l0,1.5 -3,0 0,-1.5 3,0z
-
-        M11.5,14.5l1,0 0,3 -1,0 0,-3z
-        M13.25,14.5l1,0 0,3 -1,0 0,-3z
-        M15.0,14.5l1,0 0,3 -1,0 0,-3z
-        "
-        android:fillColor="@android:color/black" />
+        android:fillColor="@android:color/black"
+        android:pathData="M15,9H9v6h6V9zM21,11V9h-2V7c0,-1.1 -0.9,-2 -2,-2h-2V3h-2v2h-2V3H9v2H7C5.9,5 5,5.9 5,7v2H3v2h2v2H3v2h2v2c0,1.1 0.9,2 2,2h2v2h2v-2h2v2h2v-2h2c1.1,0 2,-0.9 2,-2v-2h2v-2h-2v-2H21zM17,17H7V7h10V17z"/>
 </vector>
diff --git a/res/drawable/ic_settings_sim.xml b/res/drawable/ic_settings_sim.xml
index d083c9d..3edda49 100644
--- a/res/drawable/ic_settings_sim.xml
+++ b/res/drawable/ic_settings_sim.xml
@@ -16,13 +16,30 @@
 -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
+        android:width="24dp"
+        android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M19.99 4c0-1.1-.89-2-1.99-2h-8L4 8v12c0 1.1.9 2 2 2h12.01c1.1 0 1.99-.9 1.99-2l-.01-16zM9 19H7v-2h2v2zm8 0h-2v-2h2v2zm-8-4H7v-4h2v4zm4 4h-2v-4h2v4zm0-6h-2v-2h2v2zm4 2h-2v-4h2v4z"/>
-      <path android:pathData="M0 0h24v24H0z"/>
+        android:pathData="M18,2h-8L4,8v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM18,4v16H6V8.83L10.83,4L18,4L18,4z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M7,17h2v2h-2z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M15,17h2v2h-2z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M7,11h2v4h-2z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M11,15h2v4h-2z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M11,11h2v2h-2z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M15,11h2v4h-2z"/>
 </vector>
diff --git a/res/drawable/ic_warning_24dp.xml b/res/drawable/ic_warning_24dp.xml
index 8e9fee3..2ca48e0 100644
--- a/res/drawable/ic_warning_24dp.xml
+++ b/res/drawable/ic_warning_24dp.xml
@@ -1,5 +1,5 @@
 <!--
-Copyright (C) 2015 The Android Open Source Project
+Copyright (C) 2018 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.
@@ -16,9 +16,15 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M2 42h44L24 4 2 42zm24,-6h-4v-4h4v4zm0,-8h-4v-8h4v8z"/>
+        android:pathData="M12,5.99L19.53,19H4.47L12,5.99M12,2L1,21h22L12,2L12,2z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M13,16l-2,0l0,2l2,0l0,-2z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M13,10l-2,0l0,4l2,0l0,-4z"/>
 </vector>
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
index bf75ee8..1c25399 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
@@ -31,6 +31,7 @@
 import com.android.settings.slices.SettingsSliceProvider;
 
 import java.util.List;
+import java.util.Locale;
 import java.util.Objects;
 
 public interface DeviceIndexFeatureProvider {
@@ -39,15 +40,21 @@
     String TAG = "DeviceIndex";
 
     String INDEX_VERSION = "settings:index_version";
+    String INDEX_LANGUAGE = "settings:language";
 
     // Increment when new items are added to ensure they get pushed to the device index.
     String VERSION = Build.FINGERPRINT;
 
+    // When the device language changes, re-index so Slices trigger in device language.
+    Locale LANGUAGE = Locale.getDefault();
+
     boolean isIndexingEnabled();
 
     void index(Context context, CharSequence title, Uri sliceUri, Uri launchUri,
             List<String> keywords);
 
+    void clearIndex(Context context);
+
     default void updateIndex(Context context, boolean force) {
         if (!isIndexingEnabled()) {
             Log.w(TAG, "Skipping: device index is not enabled");
@@ -59,12 +66,14 @@
             return;
         }
 
-        if (!force && Objects.equals(
-                Settings.Secure.getString(context.getContentResolver(), INDEX_VERSION), VERSION)) {
+        if (!force && skipIndex(context)) {
             // No need to update.
             return;
         }
 
+        // Prevent scheduling multiple jobs
+        setIndexState(context);
+
         final ComponentName jobComponent = new ComponentName(context.getPackageName(),
                 DeviceIndexUpdateJobService.class.getName());
         final int jobId = context.getResources().getInteger(R.integer.device_index_update);
@@ -77,7 +86,6 @@
                         .setOverrideDeadline(1)
                         .build());
 
-        Settings.Secure.putString(context.getContentResolver(), INDEX_VERSION, VERSION);
     }
 
     static Uri createDeepLink(String s) {
@@ -86,4 +94,18 @@
                 .appendQueryParameter(INTENT, s)
                 .build();
     }
+
+    static boolean skipIndex(Context context) {
+        final boolean isSameVersion = Objects.equals(
+                Settings.Secure.getString(context.getContentResolver(), INDEX_VERSION), VERSION);
+        final boolean isSameLanguage = Objects.equals(
+                Settings.Secure.getString(context.getContentResolver(), INDEX_LANGUAGE), LANGUAGE);
+        return isSameLanguage && isSameVersion;
+    }
+
+    static void setIndexState(Context context) {
+        Settings.Secure.putString(context.getContentResolver(), INDEX_VERSION, VERSION);
+        Settings.Secure.putString(context.getContentResolver(), INDEX_LANGUAGE,
+                LANGUAGE.toString());
+    }
 }
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProviderImpl.java b/src/com/android/settings/search/DeviceIndexFeatureProviderImpl.java
index 7a11bd4..087ecf8 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProviderImpl.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProviderImpl.java
@@ -31,4 +31,9 @@
             List<String> keywords) {
         // Not enabled by default.
     }
+
+    @Override
+    public void clearIndex(Context context) {
+        // Not enabled by default.
+    }
 }
diff --git a/src/com/android/settings/search/DeviceIndexUpdateJobService.java b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
index 19b7d5e..97b0a61 100644
--- a/src/com/android/settings/search/DeviceIndexUpdateJobService.java
+++ b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
@@ -25,6 +25,7 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.net.Uri.Builder;
+import android.provider.SettingsSlicesContract;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -84,11 +85,19 @@
                 .scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(SettingsSliceProvider.SLICE_AUTHORITY)
                 .build();
+        final Uri platformBaseUri = new Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(SettingsSlicesContract.AUTHORITY)
+                .build();
         final Collection<Uri> slices = manager.getSliceDescendants(baseUri);
+        slices.addAll(manager.getSliceDescendants(platformBaseUri));
+
         if (DEBUG) {
             Log.d(TAG, "Indexing " + slices.size() + " slices");
         }
 
+        indexProvider.clearIndex(this /* context */);
+
         for (Uri slice : slices) {
             if (!mRunningJob) {
                 return;
diff --git a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
index d4c1580..a900db0 100644
--- a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
@@ -23,6 +23,7 @@
 
 import android.app.Activity;
 import android.app.job.JobScheduler;
+import android.os.Build;
 import android.provider.Settings;
 
 import com.android.settings.testutils.FakeFeatureFactory;
@@ -76,4 +77,51 @@
         mProvider.updateIndex(mActivity, false);
         verify(jobScheduler).schedule(any());
     }
+
+    @Test
+    public void updateIndex_enabled_provisioned_newBuild_shouldIndex() {
+        Settings.Global.putInt(mActivity.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        DeviceIndexFeatureProvider.setIndexState(mActivity);
+        Settings.Global.putString(mActivity.getContentResolver(),
+                DeviceIndexFeatureProvider.INDEX_VERSION, "new version");
+        Settings.Global.putString(mActivity.getContentResolver(),
+                DeviceIndexFeatureProvider.LANGUAGE.toString(),
+                DeviceIndexFeatureProvider.INDEX_LANGUAGE);
+        JobScheduler jobScheduler = mock(JobScheduler.class);
+        when(mProvider.isIndexingEnabled()).thenReturn(true);
+        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
+
+        mProvider.updateIndex(mActivity, false);
+        verify(jobScheduler).schedule(any());
+    }
+
+    @Test
+    public void updateIndex_enabled_provisioned_newIndex_shouldIndex() {
+        Settings.Global.putInt(mActivity.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        DeviceIndexFeatureProvider.setIndexState(mActivity);
+        Settings.Global.putString(mActivity.getContentResolver(),
+                DeviceIndexFeatureProvider.INDEX_LANGUAGE, "new language");
+        JobScheduler jobScheduler = mock(JobScheduler.class);
+        when(mProvider.isIndexingEnabled()).thenReturn(true);
+        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
+
+        mProvider.updateIndex(mActivity, false);
+        verify(jobScheduler).schedule(any());
+    }
+
+    @Test
+    public void updateIndex_enabled_provisioned_sameBuild_sameLang_shouldNotIndex() {
+        Settings.Global.putInt(mActivity.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        DeviceIndexFeatureProvider.setIndexState(mActivity);
+        JobScheduler jobScheduler = mock(JobScheduler.class);
+        when(mProvider.isIndexingEnabled()).thenReturn(true);
+        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
+
+        mProvider.updateIndex(mActivity, false);
+
+        verify(mProvider, never()).index(any(), any(), any(), any(), any());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java b/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
index ec16893..b5de973 100644
--- a/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
@@ -124,6 +124,7 @@
 
         DeviceIndexFeatureProvider indexFeatureProvider = FakeFeatureFactory.getFactory(mActivity)
                 .getDeviceIndexFeatureProvider();
+        verify(indexFeatureProvider).clearIndex(any());
         verify(indexFeatureProvider, times(1)).index(any(), any(), any(), any(), any());
     }