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()