diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d55493cdbd0..5dd22c2833d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -207,8 +207,6 @@
android:value="com.android.settings.category.ia.homepage"/>
-
-
@@ -2246,8 +2242,6 @@
android:value="com.android.settings.category.ia.homepage" />
-
-
-
diff --git a/res/drawable/ic_do_not_disturb_on_24dp.xml b/res/drawable/ic_do_not_disturb_on_24dp.xml
new file mode 100644
index 00000000000..cace8d4433f
--- /dev/null
+++ b/res/drawable/ic_do_not_disturb_on_24dp.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/res/drawable/ic_homepage_sound.xml b/res/drawable/ic_homepage_sound.xml
index 4991656f3bc..a7369ad257c 100644
--- a/res/drawable/ic_homepage_sound.xml
+++ b/res/drawable/ic_homepage_sound.xml
@@ -32,5 +32,5 @@
android:height="@dimen/dashboard_tile_foreground_image_size"
android:start="@dimen/dashboard_tile_foreground_image_inset"
android:top="@dimen/dashboard_tile_foreground_image_inset"
- android:drawable="@drawable/ic_settings_sound_white" />
+ android:drawable="@drawable/ic_volume_up_24dp" />
diff --git a/res/drawable/ic_notifications_off_24dp.xml b/res/drawable/ic_notifications_off_24dp.xml
new file mode 100644
index 00000000000..16220253313
--- /dev/null
+++ b/res/drawable/ic_notifications_off_24dp.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/res/drawable/ic_volume_ringer_mute.xml b/res/drawable/ic_volume_ringer_mute.xml
deleted file mode 100644
index 03357e990e6..00000000000
--- a/res/drawable/ic_volume_ringer_mute.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/drawable/ic_settings_sound_white.xml b/res/drawable/ic_volume_up_24dp.xml
similarity index 61%
rename from res/drawable/ic_settings_sound_white.xml
rename to res/drawable/ic_volume_up_24dp.xml
index 47373498c48..8c68c0070f9 100644
--- a/res/drawable/ic_settings_sound_white.xml
+++ b/res/drawable/ic_volume_up_24dp.xml
@@ -13,17 +13,19 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+
+ android:pathData="M3,9v6h4l5,5V4L7,9H3zM10,8.83v6.34L7.83,13H5v-2h2.83L10,8.83z"/>
+
+
diff --git a/res/drawable/ic_zen.xml b/res/drawable/ic_zen.xml
deleted file mode 100644
index 2c55e026be5..00000000000
--- a/res/drawable/ic_zen.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0797fe6e96f..7ea303f41cd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6918,9 +6918,13 @@
Connected devices
- Bluetooth, Cast, NFC
+ Bluetooth, driving mode, NFC
- Bluetooth, Cast
+ Bluetooth, driving mode
+
+ Bluetooth, NFC
+
+ Bluetooth
Apps & notifications
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 61f529ff33d..5bee7b06edf 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -44,7 +44,6 @@
android:icon="@drawable/ic_local_phone_24_lib"
android:title="@string/call_volume_option_title"
android:order="-170"
- settings:allowDividerAbove="true"
settings:controller="com.android.settings.notification.CallVolumePreferenceController"/>
@@ -61,8 +60,7 @@
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/ring_volume_option_title"
android:order="-160"
- settings:controller="com.android.settings.notification.RingVolumePreferenceController"
- settings:allowDividerAbove="true"/>
+ settings:controller="com.android.settings.notification.RingVolumePreferenceController"/>
@@ -102,7 +99,6 @@
android:title="@string/gesture_prevent_ringing_sound_title"
android:order="-110"
android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
- settings:allowDividerAbove="true"
settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" />
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index af7c90063aa..20033b6bf11 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -276,7 +276,7 @@ public class DashboardSummary extends InstrumentedFragment
mSummaryLoader.updateSummaryToCache(category);
mStagingCategory = category;
if (mSuggestionControllerMixin == null) {
- mAdapter.setCategory(mStagingCategory);
+ ThreadUtils.postOnMainThread(() -> mAdapter.setCategory(mStagingCategory));
return;
}
if (mSuggestionControllerMixin.isSuggestionLoaded()) {
diff --git a/src/com/android/settings/dashboard/conditional/DndCondition.java b/src/com/android/settings/dashboard/conditional/DndCondition.java
index 4acd332b379..405ed811781 100644
--- a/src/com/android/settings/dashboard/conditional/DndCondition.java
+++ b/src/com/android/settings/dashboard/conditional/DndCondition.java
@@ -83,7 +83,7 @@ public class DndCondition extends Condition {
@Override
public Drawable getIcon() {
- return mManager.getContext().getDrawable(R.drawable.ic_zen);
+ return mManager.getContext().getDrawable(R.drawable.ic_do_not_disturb_on_24dp);
}
@Override
diff --git a/src/com/android/settings/dashboard/conditional/RingerMutedCondition.java b/src/com/android/settings/dashboard/conditional/RingerMutedCondition.java
index bf5bc3618d4..7f7bc2be090 100644
--- a/src/com/android/settings/dashboard/conditional/RingerMutedCondition.java
+++ b/src/com/android/settings/dashboard/conditional/RingerMutedCondition.java
@@ -55,7 +55,7 @@ public class RingerMutedCondition extends AbnormalRingerConditionBase {
@Override
public Drawable getIcon() {
- return mManager.getContext().getDrawable(R.drawable.ic_volume_ringer_mute);
+ return mManager.getContext().getDrawable(R.drawable.ic_notifications_off_24dp);
}
@Override
diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java
index e328cd23e30..c4c71c408ff 100644
--- a/src/com/android/settings/notification/RingVolumePreferenceController.java
+++ b/src/com/android/settings/notification/RingVolumePreferenceController.java
@@ -17,7 +17,6 @@
package com.android.settings.notification;
import android.app.NotificationManager;
-import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -47,6 +46,8 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
private final RingReceiver mReceiver = new RingReceiver();
private final H mHandler = new H();
+ private int mMuteIcon;
+
public RingVolumePreferenceController(Context context) {
this(context, KEY_RING_VOLUME);
}
@@ -94,7 +95,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
@Override
public int getMuteIcon() {
- return R.drawable.ic_volume_ringer_vibrate;
+ return mMuteIcon;
}
private void updateRingerMode() {
@@ -104,11 +105,6 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
updatePreferenceIcon();
}
- private boolean wasRingerModeVibrate() {
- return mVibrator != null && mRingerMode == AudioManager.RINGER_MODE_SILENT
- && mHelper.getLastAudibleStreamVolume(getAudioStream()) == 0;
- }
-
private void updateEffectsSuppressor() {
final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
if (Objects.equals(suppressor, mSuppressor)) return;
@@ -122,10 +118,15 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
private void updatePreferenceIcon() {
if (mPreference != null) {
- mPreference.showIcon(
- mRingerMode == AudioManager.RINGER_MODE_VIBRATE || wasRingerModeVibrate()
- ? com.android.internal.R.drawable.ic_audio_ring_notif_vibrate
- : com.android.internal.R.drawable.ic_audio_ring_notif);
+ if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
+ mMuteIcon = R.drawable.ic_volume_ringer_vibrate;
+ mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif_vibrate);
+ } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) {
+ mMuteIcon = R.drawable.ic_notifications_off_24dp;
+ mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif_mute);
+ } else {
+ mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif);
+ }
}
}
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
index a171844559a..8e64d795b2c 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
@@ -65,7 +65,7 @@ public interface DeviceIndexFeatureProvider {
context.getSystemService(JobScheduler.class).schedule(
new JobInfo.Builder(jobId, jobComponent)
.setPersisted(true)
- .setMinimumLatency(1)
+ .setMinimumLatency(1000)
.setOverrideDeadline(1)
.build());
diff --git a/src/com/android/settings/search/DeviceIndexUpdateJobService.java b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
index 510da3a6226..19b7d5e60b6 100644
--- a/src/com/android/settings/search/DeviceIndexUpdateJobService.java
+++ b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
@@ -124,7 +124,7 @@ public class DeviceIndexUpdateJobService extends JobService {
}
protected CharSequence findTitle(Slice loadedSlice, SliceMetadata metaData) {
- ListContent content = new ListContent(this, loadedSlice);
+ ListContent content = new ListContent(null, loadedSlice);
SliceItem headerItem = content.getHeaderItem();
if (headerItem == null) {
if (content.getRowItems().size() != 0) {
diff --git a/src/com/android/settings/support/NewDeviceIntroSuggestionActivity.java b/src/com/android/settings/support/NewDeviceIntroSuggestionActivity.java
index f881e2ff8c8..cddbb57dd5e 100644
--- a/src/com/android/settings/support/NewDeviceIntroSuggestionActivity.java
+++ b/src/com/android/settings/support/NewDeviceIntroSuggestionActivity.java
@@ -20,9 +20,12 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -47,6 +50,8 @@ public class NewDeviceIntroSuggestionActivity extends Activity {
@VisibleForTesting
static final long PERMANENT_DISMISS_THRESHOLD = DateUtils.DAY_IN_MILLIS * 14;
+ public static final String TIPS_PACKAGE_NAME = "com.google.android.apps.tips";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -62,7 +67,9 @@ public class NewDeviceIntroSuggestionActivity extends Activity {
}
public static boolean isSuggestionComplete(Context context) {
- return !isSupported(context)
+ // Always returns 'true' if Tips application exists. Check b/77652536 for more details.
+ return isTipsInstalledAsSystemApp(context)
+ || !isSupported(context)
|| isExpired(context)
|| hasLaunchedBefore(context)
|| !canOpenUrlInBrowser(context);
@@ -130,4 +137,18 @@ public class NewDeviceIntroSuggestionActivity extends Activity {
.addCategory(Intent.CATEGORY_BROWSABLE)
.setData(Uri.parse(url));
}
+
+ /**
+ * Check if the specified package exists and is marked with FLAG_SYSTEM
+ */
+ private static boolean isTipsInstalledAsSystemApp(@NonNull Context context) {
+ try {
+ final PackageInfo info = context.getPackageManager().getPackageInfo(TIPS_PACKAGE_NAME,
+ PackageManager.MATCH_SYSTEM_ONLY);
+ return info != null;
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "Cannot find the package: " + TIPS_PACKAGE_NAME, e);
+ return false;
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
index 286676dd0d0..8b03376afe3 100644
--- a/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
@@ -19,7 +19,10 @@ package com.android.settings.support;
import static com.android.settings.support.NewDeviceIntroSuggestionActivity.PERMANENT_DISMISS_THRESHOLD;
import static com.android.settings.support.NewDeviceIntroSuggestionActivity.PREF_KEY_SUGGGESTION_COMPLETE;
import static com.android.settings.support.NewDeviceIntroSuggestionActivity.PREF_KEY_SUGGGESTION_FIRST_DISPLAY_TIME;
+
+import static com.android.settings.support.NewDeviceIntroSuggestionActivity.TIPS_PACKAGE_NAME;
import static com.android.settings.support.NewDeviceIntroSuggestionActivity.isSuggestionComplete;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
@@ -27,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import com.android.settings.R;
@@ -64,6 +68,40 @@ public class NewDeviceIntroSuggestionActivityTest {
.thenReturn(getSharedPreferences());
}
+ @Test
+ public void isSuggestionComplete_TipsNotExistsAndNotExpiredAndCanOpenUrl_shouldReturnFalse() {
+ mShadowPackageManager.removePackage(TIPS_PACKAGE_NAME);
+
+ when(mMockContext.getResources()
+ .getBoolean(R.bool.config_new_device_intro_suggestion_supported))
+ .thenReturn(true);
+
+ when(mFeatureFactory.supportFeatureProvider.getNewDeviceIntroUrl(any(Context.class)))
+ .thenReturn("https://com.android.settings");
+ final Intent intent = NewDeviceIntroSuggestionActivity.getLaunchIntent(mContext);
+ mShadowPackageManager.addResolveInfoForIntent(intent, new ResolveInfo());
+
+ assertThat(isSuggestionComplete(mContext)).isFalse();
+ }
+
+ @Test
+ public void isSuggestionComplete_TipsExistsAndNotExpiredAndCanOpenUrl_shouldReturnTrue() {
+ final PackageInfo mockInfo = new PackageInfo();
+ mockInfo.packageName = TIPS_PACKAGE_NAME;
+ mShadowPackageManager.addPackage(mockInfo);
+
+ when(mMockContext.getResources()
+ .getBoolean(R.bool.config_new_device_intro_suggestion_supported))
+ .thenReturn(true);
+
+ when(mFeatureFactory.supportFeatureProvider.getNewDeviceIntroUrl(any(Context.class)))
+ .thenReturn("https://com.android.settings");
+ final Intent intent = NewDeviceIntroSuggestionActivity.getLaunchIntent(mContext);
+ mShadowPackageManager.addResolveInfoForIntent(intent, new ResolveInfo());
+
+ assertThat(isSuggestionComplete(mContext)).isTrue();
+ }
+
@Test
public void isSuggestionComplete_notSupported_shouldReturnTrue() {
when(mMockContext.getResources()