Merge "Adds the Clear App dialog for Instant Apps" into oc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ed00054..543c90b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -902,13 +902,23 @@
                 android:icon="@drawable/ic_settings_night_display"
                 android:taskAffinity="">
             <intent-filter android:priority="1">
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.settings.suggested.category.SETTINGS_ONLY" />
+            </intent-filter>
+            <intent-filter android:priority="1">
                 <action android:name="android.settings.NIGHT_DISPLAY_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.display.NightDisplaySettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.display.NightDisplaySettings" />
+            <meta-data android:name="com.android.settings.dismiss"
+                android:value="30" />
+            <meta-data android:name="com.android.settings.title"
+                android:resource="@string/night_display_suggestion_title" />
+            <meta-data android:name="com.android.settings.summary"
+                android:resource="@string/night_display_suggestion_summary" />
         </activity>
 
         <activity android:name="Settings$DeviceInfoSettingsActivity"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1b75148..c23d399 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7631,7 +7631,7 @@
     <!-- Link to the apps page for SYSTEM_ALERT_WINDOW settings [CHAR LIMIT=45] -->
     <string name="app_overlay_permission_preference">App display on top permission</string>
     <!-- Description of allowing overlay setting [CHAR LIMIT=NONE] -->
-    <string name="allow_overlay_description">This feature allows an app to display on top of other apps you\u2019re using. It may interfere with your use of those apps or change the way they seem to appear or behave.</string>
+    <string name="allow_overlay_description">Allow this app to display on top of other apps you\u2019re using. It may interfere with your use of those apps or change the way they seem to appear or behave.</string>
 
     <!-- Keyword for VR setting -->
     <string name="keywords_vr_listener">vr virtual reality listener stereo helper service</string>
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index fde145f..229e294 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -33,6 +33,7 @@
 import android.preference.PreferenceFrameLayout;
 import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
+import android.util.ArraySet;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -86,10 +87,12 @@
 import com.android.settingslib.applications.StorageStatsSource;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 
 /**
  * Activity to pick an application that will be used to display installation information and
@@ -253,6 +256,12 @@
     public static final int LIST_TYPE_MANAGE_SOURCES = 8;
     public static final int LIST_TYPE_GAMES = 9;
 
+
+    // List types that should show instant apps.
+    public static final Set<Integer> LIST_TYPES_WITH_INSTANT = new ArraySet<>(Arrays.asList(
+                    LIST_TYPE_MAIN,
+                    LIST_TYPE_STORAGE));
+
     private View mRootView;
 
     private View mSpinnerHeader;
@@ -701,7 +710,9 @@
     }
 
     public void setHasInstant(boolean haveInstantApps) {
-        mFilterAdapter.setFilterEnabled(FILTER_APPS_INSTANT, haveInstantApps);
+        if (LIST_TYPES_WITH_INSTANT.contains(mListType)) {
+            mFilterAdapter.setFilterEnabled(FILTER_APPS_INSTANT, haveInstantApps);
+        }
     }
 
     static class FilterSpinnerAdapter extends ArrayAdapter<CharSequence> {
@@ -956,8 +967,13 @@
                 filterObj = mOverrideFilter;
             }
             if (!mManageApplications.mShowSystem) {
-                filterObj = new CompoundFilter(filterObj,
-                        ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER);
+                if (LIST_TYPES_WITH_INSTANT.contains(mManageApplications.mListType)) {
+                    filterObj = new CompoundFilter(filterObj,
+                            ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT);
+                } else {
+                    filterObj = new CompoundFilter(filterObj,
+                            ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER);
+                }
             }
             switch (mLastSortMode) {
                 case R.id.sort_order_size:
diff --git a/tests/robotests/src/com/android/settings/suggestions/SettingsSuggestionsTest.java b/tests/robotests/src/com/android/settings/suggestions/SettingsSuggestionsTest.java
new file mode 100644
index 0000000..3780d35
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/suggestions/SettingsSuggestionsTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 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.suggestions;
+
+import static com.android.settings.TestConfig.MANIFEST_PATH;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.annotation.StringRes;
+import android.content.Context;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.manifest.ActivityData;
+import org.robolectric.manifest.AndroidManifest;
+import org.robolectric.manifest.IntentFilterData;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SettingsSuggestionsTest {
+
+  @Test
+  public void zenModeAutomationSuggestion_isValid() {
+    assertSuggestionEquals("Settings$ZenModeAutomationSuggestionActivity",
+        R.string.zen_mode_automation_suggestion_title,
+        R.string.zen_mode_automation_suggestion_summary);
+  }
+
+  @Test
+  public void wallpaperSuggestion_isValid() {
+    assertSuggestionEquals("com.android.settings.wallpaper.WallpaperSuggestionActivity",
+        R.string.wallpaper_suggestion_title, R.string.wallpaper_suggestion_summary);
+  }
+
+  @Test
+  public void nightDisplaySettings_isValid() {
+    assertSuggestionEquals("Settings$NightDisplaySettingsActivity",
+        R.string.night_display_suggestion_title, R.string.night_display_suggestion_summary);
+  }
+
+  @Test
+  public void fingerprintSuggestion_isValid() {
+    assertSuggestionEquals("com.android.settings.Settings$FingerprintSuggestionActivity",
+        R.string.suggestion_additional_fingerprints,
+        R.string.suggestion_additional_fingerprints_summary);
+  }
+
+  @Test
+  public void wifiCallingSuggestion_isValid() {
+    assertSuggestionEquals("Settings$WifiCallingSuggestionActivity",
+        R.string.wifi_calling_suggestion_title, R.string.wifi_calling_suggestion_summary);
+  }
+
+  private void assertSuggestionEquals(String activityName, @StringRes int title,
+      @StringRes int summary) {
+    final AndroidManifest androidManifest = ShadowApplication.getInstance().getAppManifest();
+    final ActivityData activityData = androidManifest.getActivityData(activityName);
+    final Map<String, Object> metaData = activityData.getMetaData().getValueMap();
+    final Context context = RuntimeEnvironment.application;
+    final String expectedTitle = context.getString(title);
+    final String expectedSummary = context.getString(summary);
+
+    final String pName= context.getPackageName();
+    final String actualTitle = context.getString(context.getResources().getIdentifier(
+        ((String) metaData.get("com.android.settings.title")).substring(8), "string", pName));
+    final String actualSummary = context.getString(context.getResources().getIdentifier(
+        ((String) metaData.get("com.android.settings.summary")).substring(8), "string", pName));
+    assertThat(actualTitle).isEqualTo(expectedTitle);
+    assertThat(actualSummary).isEqualTo(expectedSummary);
+
+    final List<IntentFilterData> intentFilters = activityData.getIntentFilters();
+    final List<String> categories = new ArrayList<>();
+    for (IntentFilterData intentFilter : intentFilters) {
+      categories.addAll(intentFilter.getCategories());
+    }
+
+    assertThat(categories).contains("com.android.settings.suggested.category.SETTINGS_ONLY");
+  }
+}