diff options
34 files changed, 159 insertions, 571 deletions
diff --git a/res/layout/timer_setup_time.xml b/res/layout/timer_setup_time.xml index 2f8f0ea92..aef811b68 100644 --- a/res/layout/timer_setup_time.xml +++ b/res/layout/timer_setup_time.xml @@ -37,7 +37,6 @@ android:singleLine="true" android:textColor="?android:attr/textColorPrimary" android:textSize="@dimen/timer_setup_digit_font_size" - tools:targetApi="21" tools:text="12h34m56s"/> </LinearLayout> diff --git a/res/values/styles.xml b/res/values/styles.xml index 6103f4458..7ae54c97c 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -45,7 +45,7 @@ <item name="android:textSize">56sp</item> <item name="android:textColor">@color/white</item> <item name="android:fontFamily">sans-serif</item> - <item name="android:fontFeatureSettings" tools:targetApi="21">tnum</item> + <item name="android:fontFeatureSettings">tnum</item> </style> <style name="world_clock_time"> diff --git a/res/values/themes.xml b/res/values/themes.xml index 0272f6864..08921baec 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -18,13 +18,11 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.DeskClock" parent="Theme.AppCompat.NoActionBar"> - <item name="android:colorBackgroundFloating" tools:targetApi="23"> - ?attr/colorBackgroundFloating - </item> - <item name="android:navigationBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item> + <item name="android:colorBackgroundFloating">?attr/colorBackgroundFloating</item> + <item name="android:navigationBarColor">?attr/colorPrimaryDark</item> <item name="popupTheme">@style/ThemeOverlay.Popup</item> - <item name="android:timePickerStyle" tools:targetApi="21">@style/Widget.TimePicker</item> + <item name="android:timePickerStyle">@style/Widget.TimePicker</item> <item name="android:windowBackground">@color/default_background</item> <item name="android:windowContentOverlay">@null</item> diff --git a/src/com/android/deskclock/AlarmInitReceiver.java b/src/com/android/deskclock/AlarmInitReceiver.java index 24ba864b0..d18330fdc 100644 --- a/src/com/android/deskclock/AlarmInitReceiver.java +++ b/src/com/android/deskclock/AlarmInitReceiver.java @@ -50,8 +50,7 @@ public class AlarmInitReceiver extends BroadcastReceiver { * the user is still locked, so that we can schedule alarms. */ @SuppressLint("InlinedApi") - private static final String ACTION_BOOT_COMPLETED = Utils.isNOrLater() - ? Intent.ACTION_LOCKED_BOOT_COMPLETED : Intent.ACTION_BOOT_COMPLETED; + private static final String ACTION_BOOT_COMPLETED = Intent.ACTION_LOCKED_BOOT_COMPLETED; /** * This receiver handles a variety of actions: diff --git a/src/com/android/deskclock/AnimatorUtils.java b/src/com/android/deskclock/AnimatorUtils.java index f78bd1e98..4e90fa81f 100644 --- a/src/com/android/deskclock/AnimatorUtils.java +++ b/src/com/android/deskclock/AnimatorUtils.java @@ -120,45 +120,12 @@ public class AnimatorUtils { @SuppressWarnings("unchecked") public static final TypeEvaluator<Integer> ARGB_EVALUATOR = new ArgbEvaluator(); - private static Method sAnimateValue; - private static boolean sTryAnimateValue = true; - - public static void setAnimatedFraction(ValueAnimator animator, float fraction) { - if (Utils.isLMR1OrLater()) { - animator.setCurrentFraction(fraction); - return; - } - - if (sTryAnimateValue) { - // try to set the animated fraction directly so that it isn't affected by the - // internal animator scale or time (b/17938711) - try { - if (sAnimateValue == null) { - sAnimateValue = ValueAnimator.class - .getDeclaredMethod("animateValue", float.class); - sAnimateValue.setAccessible(true); - } - - sAnimateValue.invoke(animator, fraction); - return; - } catch (NoSuchMethodException | InvocationTargetException - | IllegalAccessException e) { - // something went wrong, don't try that again - LogUtils.e("Unable to use animateValue directly", e); - sTryAnimateValue = false; - } - } - - // if that doesn't work then just fall back to setting the current play time - animator.setCurrentPlayTime(Math.round(fraction * animator.getDuration())); - } - public static void reverse(ValueAnimator... animators) { for (ValueAnimator animator : animators) { final float fraction = animator.getAnimatedFraction(); if (fraction > 0.0f) { animator.reverse(); - setAnimatedFraction(animator, 1.0f - fraction); + animator.setCurrentFraction(1.0f - fraction); } } } diff --git a/src/com/android/deskclock/AsyncRingtonePlayer.java b/src/com/android/deskclock/AsyncRingtonePlayer.java index afb46d664..09fb1ef64 100644 --- a/src/com/android/deskclock/AsyncRingtonePlayer.java +++ b/src/com/android/deskclock/AsyncRingtonePlayer.java @@ -220,15 +220,9 @@ public final class AsyncRingtonePlayer { checkAsyncRingtonePlayerThread(); if (mPlaybackDelegate == null) { - if (Utils.isMOrLater()) { - // Use the newer Ringtone-based playback delegate because it does not require - // any permissions to read from the SD card. (M+) - mPlaybackDelegate = new RingtonePlaybackDelegate(); - } else { - // Fall back to the older MediaPlayer-based playback delegate because it is the only - // way to force the looping of the ringtone before M. (pre M) - mPlaybackDelegate = new MediaPlayerPlaybackDelegate(); - } + // Use the newer Ringtone-based playback delegate because it does not require + // any permissions to read from the SD card. (M+) + mPlaybackDelegate = new RingtonePlaybackDelegate(); } return mPlaybackDelegate; @@ -345,12 +339,10 @@ public final class AsyncRingtonePlayer { } // Indicate the ringtone should be played via the alarm stream. - if (Utils.isLOrLater()) { - mMediaPlayer.setAudioAttributes(new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build()); - } + mMediaPlayer.setAudioAttributes(new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build()); // Check if we are in a call. If we are, use the in-call alarm resource at a low volume // to not disrupt the call. @@ -541,12 +533,10 @@ public final class AsyncRingtonePlayer { */ private boolean startPlayback(boolean inTelephoneCall) { // Indicate the ringtone should be played via the alarm stream. - if (Utils.isLOrLater()) { - mRingtone.setAudioAttributes(new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build()); - } + mRingtone.setAudioAttributes(new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build()); // Attempt to adjust the ringtone volume if the user is in a telephone call. boolean scheduleVolumeAdjustment = false; diff --git a/src/com/android/deskclock/ClockFragment.java b/src/com/android/deskclock/ClockFragment.java index e9654f895..1c6e17826 100644 --- a/src/com/android/deskclock/ClockFragment.java +++ b/src/com/android/deskclock/ClockFragment.java @@ -71,9 +71,6 @@ public final class ClockFragment extends DeskClockFragment { // Updates the UI in response to changes to the scheduled alarm. private BroadcastReceiver mAlarmChangeReceiver; - // Detects changes to the next scheduled alarm pre-L. - private ContentObserver mAlarmObserver; - private TextClock mDigitalClock; private AnalogClock mAnalogClock; private View mClockFrame; @@ -93,8 +90,7 @@ public final class ClockFragment extends DeskClockFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mAlarmObserver = Utils.isPreL() ? new AlarmObserverPreL() : null; - mAlarmChangeReceiver = Utils.isLOrLater() ? new AlarmChangedBroadcastReceiver() : null; + mAlarmChangeReceiver = new AlarmChangedBroadcastReceiver(); } @Override @@ -168,13 +164,6 @@ public final class ClockFragment extends DeskClockFragment { } refreshAlarm(); - - // Alarm observer is null on L or later. - if (mAlarmObserver != null) { - @SuppressWarnings("deprecation") - final Uri uri = Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED); - activity.getContentResolver().registerContentObserver(uri, false, mAlarmObserver); - } } @Override @@ -185,9 +174,6 @@ public final class ClockFragment extends DeskClockFragment { if (mAlarmChangeReceiver != null) { activity.unregisterReceiver(mAlarmChangeReceiver); } - if (mAlarmObserver != null) { - activity.getContentResolver().unregisterContentObserver(mAlarmObserver); - } } @Override diff --git a/src/com/android/deskclock/DeskClockApplication.java b/src/com/android/deskclock/DeskClockApplication.java index 395d38518..784bc6f1d 100644 --- a/src/com/android/deskclock/DeskClockApplication.java +++ b/src/com/android/deskclock/DeskClockApplication.java @@ -16,7 +16,6 @@ package com.android.deskclock; -import android.annotation.TargetApi; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; @@ -46,20 +45,17 @@ public class DeskClockApplication extends Application { /** * Returns the default {@link SharedPreferences} instance from the underlying storage context. */ - @TargetApi(Build.VERSION_CODES.N) private static SharedPreferences getDefaultSharedPreferences(Context context) { final Context storageContext; - if (Utils.isNOrLater()) { - // All N devices have split storage areas. Migrate the existing preferences into the new - // device encrypted storage area if that has not yet occurred. - final String name = PreferenceManager.getDefaultSharedPreferencesName(context); - storageContext = context.createDeviceProtectedStorageContext(); - if (!storageContext.moveSharedPreferencesFrom(context, name)) { - LogUtils.wtf("Failed to migrate shared preferences"); - } - } else { - storageContext = context; + + // All N devices have split storage areas. Migrate the existing preferences into the new + // device encrypted storage area if that has not yet occurred. + final String name = PreferenceManager.getDefaultSharedPreferencesName(context); + storageContext = context.createDeviceProtectedStorageContext(); + if (!storageContext.moveSharedPreferencesFrom(context, name)) { + LogUtils.wtf("Failed to migrate shared preferences"); } + return PreferenceManager.getDefaultSharedPreferences(storageContext); } -}
\ No newline at end of file +} diff --git a/src/com/android/deskclock/DeskClockBackupAgent.java b/src/com/android/deskclock/DeskClockBackupAgent.java index 2c5867302..7c537b7c8 100644 --- a/src/com/android/deskclock/DeskClockBackupAgent.java +++ b/src/com/android/deskclock/DeskClockBackupAgent.java @@ -79,10 +79,8 @@ public class DeskClockBackupAgent extends BackupAgent { */ @Override public void onRestoreFinished() { - if (Utils.isNOrLater()) { - // TODO: migrate restored database and preferences over into - // the device-encrypted storage area - } + // TODO: migrate restored database and preferences over into + // the device-encrypted storage area // Indicate a data restore has been completed. DataModel.getDataModel().setRestoreBackupFinished(true); diff --git a/src/com/android/deskclock/NotificationUtils.java b/src/com/android/deskclock/NotificationUtils.java index 3919ae7d3..7601c4208 100644 --- a/src/com/android/deskclock/NotificationUtils.java +++ b/src/com/android/deskclock/NotificationUtils.java @@ -103,10 +103,6 @@ public class NotificationUtils { } public static void createChannel(Context context, String id) { - if (!Utils.isOOrLater()) { - return; - } - if (!CHANNEL_PROPS.containsKey(id)) { Log.e(TAG, "Invalid channel requested: " + id); return; @@ -145,10 +141,6 @@ public class NotificationUtils { } public static void updateNotificationChannels(Context context) { - if (!Utils.isOOrLater()) { - return; - } - NotificationManagerCompat nm = NotificationManagerCompat.from(context); // These channels got a new behavior so we need to recreate them with new ids diff --git a/src/com/android/deskclock/Screensaver.java b/src/com/android/deskclock/Screensaver.java index 49530d44c..29cc13ff9 100644 --- a/src/com/android/deskclock/Screensaver.java +++ b/src/com/android/deskclock/Screensaver.java @@ -50,15 +50,6 @@ public final class Screensaver extends DreamService { private TextClock mDigitalClock; private AnalogClock mAnalogClock; - /* Register ContentObserver to see alarm changes for pre-L */ - private final ContentObserver mSettingsContentObserver = - Utils.isLOrLater() ? null : new ContentObserver(new Handler(Looper.myLooper())) { - @Override - public void onChange(boolean selfChange) { - Utils.refreshAlarm(Screensaver.this, mContentView); - } - }; - // Runs every midnight or when the time changes and refreshes the date. private final Runnable mMidnightUpdater = new Runnable() { @Override @@ -118,16 +109,8 @@ public final class Screensaver extends DreamService { setFullscreen(true); // Setup handlers for time reference changes and date updates. - if (Utils.isLOrLater()) { - registerReceiver(mAlarmChangedReceiver, - new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)); - } - - if (mSettingsContentObserver != null) { - @SuppressWarnings("deprecation") - final Uri uri = Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED); - getContentResolver().registerContentObserver(uri, false, mSettingsContentObserver); - } + registerReceiver(mAlarmChangedReceiver, + new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)); Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mContentView); Utils.refreshAlarm(this, mContentView); @@ -141,17 +124,11 @@ public final class Screensaver extends DreamService { LOGGER.v("Screensaver detached from window"); super.onDetachedFromWindow(); - if (mSettingsContentObserver != null) { - getContentResolver().unregisterContentObserver(mSettingsContentObserver); - } - UiDataModel.getUiDataModel().removePeriodicCallback(mMidnightUpdater); stopPositionUpdater(); // Tear down handlers for time reference changes and date updates. - if (Utils.isLOrLater()) { - unregisterReceiver(mAlarmChangedReceiver); - } + unregisterReceiver(mAlarmChangedReceiver); } @Override diff --git a/src/com/android/deskclock/ScreensaverActivity.java b/src/com/android/deskclock/ScreensaverActivity.java index e1db8c5ff..cf770086b 100644 --- a/src/com/android/deskclock/ScreensaverActivity.java +++ b/src/com/android/deskclock/ScreensaverActivity.java @@ -73,16 +73,6 @@ public class ScreensaverActivity extends BaseActivity { } }; - /* Register ContentObserver to see alarm changes for pre-L */ - private final ContentObserver mSettingsContentObserver = Utils.isPreL() - ? new ContentObserver(new Handler(Looper.myLooper())) { - @Override - public void onChange(boolean selfChange) { - Utils.refreshAlarm(ScreensaverActivity.this, mContentView); - } - } - : null; - // Runs every midnight or when the time changes and refreshes the date. private final Runnable mMidnightUpdater = new Runnable() { @Override @@ -144,16 +134,8 @@ public class ScreensaverActivity extends BaseActivity { filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); filter.addAction(Intent.ACTION_USER_PRESENT); - if (Utils.isLOrLater()) { - filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); - } + filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); registerReceiver(mIntentReceiver, filter); - - if (mSettingsContentObserver != null) { - @SuppressWarnings("deprecation") - final Uri uri = Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED); - getContentResolver().registerContentObserver(uri, false, mSettingsContentObserver); - } } @Override @@ -180,9 +162,6 @@ public class ScreensaverActivity extends BaseActivity { @Override public void onStop() { - if (mSettingsContentObserver != null) { - getContentResolver().unregisterContentObserver(mSettingsContentObserver); - } unregisterReceiver(mIntentReceiver); super.onStop(); } diff --git a/src/com/android/deskclock/Utils.java b/src/com/android/deskclock/Utils.java index ef19131b0..3643d0747 100644 --- a/src/com/android/deskclock/Utils.java +++ b/src/com/android/deskclock/Utils.java @@ -17,7 +17,6 @@ package com.android.deskclock; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; import android.app.PendingIntent; @@ -37,14 +36,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Looper; import android.provider.Settings; -import androidx.annotation.AnyRes; -import androidx.annotation.DrawableRes; -import androidx.annotation.StringRes; -import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; -import androidx.core.os.BuildCompat; -import androidx.core.view.AccessibilityDelegateCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; @@ -58,6 +49,15 @@ import android.view.View; import android.widget.TextClock; import android.widget.TextView; +import androidx.annotation.AnyRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.StringRes; +import androidx.core.os.BuildCompat; +import androidx.core.view.AccessibilityDelegateCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; +import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; + import com.android.deskclock.data.DataModel; import com.android.deskclock.provider.AlarmInstance; import com.android.deskclock.uidata.UiDataModel; @@ -107,71 +107,6 @@ public class Utils { } /** - * @return {@code true} if the device is prior to {@link Build.VERSION_CODES#LOLLIPOP} - */ - public static boolean isPreL() { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#LOLLIPOP} or - * {@link Build.VERSION_CODES#LOLLIPOP_MR1} - */ - public static boolean isLOrLMR1() { - final int sdkInt = Build.VERSION.SDK_INT; - return sdkInt == Build.VERSION_CODES.LOLLIPOP || sdkInt == Build.VERSION_CODES.LOLLIPOP_MR1; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#LOLLIPOP} or later - */ - public static boolean isLOrLater() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#LOLLIPOP_MR1} or later - */ - public static boolean isLMR1OrLater() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#M} or later - */ - public static boolean isMOrLater() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#N} or later - */ - public static boolean isNOrLater() { - return BuildCompat.isAtLeastN(); - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#N_MR1} or later - */ - public static boolean isNMR1OrLater() { - return BuildCompat.isAtLeastNMR1(); - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#O} or later - */ - public static boolean isOOrLater() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; - } - - /** - * @return {@code true} if the device is {@link Build.VERSION_CODES#P} or later - */ - public static boolean isPOrLater() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; - } - - /** * @param resourceId identifies an application resource * @return the Uri by which the application resource is accessed */ @@ -299,18 +234,6 @@ public class Utils { * @return The next alarm from {@link AlarmManager} */ public static String getNextAlarm(Context context) { - return isPreL() ? getNextAlarmPreL(context) : getNextAlarmLOrLater(context); - } - - @SuppressWarnings("deprecation") - @TargetApi(Build.VERSION_CODES.KITKAT) - private static String getNextAlarmPreL(Context context) { - final ContentResolver cr = context.getContentResolver(); - return Settings.System.getString(cr, Settings.System.NEXT_ALARM_FORMATTED); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static String getNextAlarmLOrLater(Context context) { final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); final AlarmClockInfo info = getNextAlarmClock(am); if (info != null) { @@ -323,12 +246,10 @@ public class Utils { return null; } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static AlarmClockInfo getNextAlarmClock(AlarmManager am) { return am.getNextAlarmClock(); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void updateNextAlarm(AlarmManager am, AlarmClockInfo info, PendingIntent op) { am.setAlarmClock(info, op); } diff --git a/src/com/android/deskclock/alarms/AlarmActivity.java b/src/com/android/deskclock/alarms/AlarmActivity.java index 7b88e6766..28be63422 100644 --- a/src/com/android/deskclock/alarms/AlarmActivity.java +++ b/src/com/android/deskclock/alarms/AlarmActivity.java @@ -176,18 +176,10 @@ public class AlarmActivity extends BaseActivity // Get the volume/camera button behavior setting mVolumeBehavior = DataModel.getDataModel().getAlarmVolumeButtonBehavior(); - if (Utils.isOOrLater()) { - setShowWhenLocked(true); - setTurnScreenOn(true); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); - } else { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD - | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); - } + setShowWhenLocked(true); + setTurnScreenOn(true); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); // Hide navigation bar to minimize accidental tap on Home key hideNavigationBar(); @@ -558,9 +550,9 @@ public class AlarmActivity extends BaseActivity private void setAnimatedFractions(float snoozeFraction, float dismissFraction) { final float alarmFraction = Math.max(snoozeFraction, dismissFraction); - AnimatorUtils.setAnimatedFraction(mAlarmAnimator, alarmFraction); - AnimatorUtils.setAnimatedFraction(mSnoozeAnimator, snoozeFraction); - AnimatorUtils.setAnimatedFraction(mDismissAnimator, dismissFraction); + mAlarmAnimator.setCurrentFraction(alarmFraction); + mSnoozeAnimator.setCurrentFraction(snoozeFraction); + mDismissAnimator.setCurrentFraction(dismissFraction); } private float getFraction(float x0, float x1, float x) { diff --git a/src/com/android/deskclock/alarms/AlarmKlaxon.java b/src/com/android/deskclock/alarms/AlarmKlaxon.java index a1624239f..c79df9d2b 100644 --- a/src/com/android/deskclock/alarms/AlarmKlaxon.java +++ b/src/com/android/deskclock/alarms/AlarmKlaxon.java @@ -16,7 +16,6 @@ package com.android.deskclock.alarms; -import android.annotation.TargetApi; import android.content.Context; import android.media.AudioAttributes; import android.os.Build; @@ -61,24 +60,15 @@ final class AlarmKlaxon { if (instance.mVibrate) { final Vibrator vibrator = getVibrator(context); - if (Utils.isLOrLater()) { - vibrateLOrLater(vibrator); - } else { - vibrator.vibrate(VIBRATE_PATTERN, 0); - } + vibrator.vibrate(VIBRATE_PATTERN, 0, new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build()); } sStarted = true; } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static void vibrateLOrLater(Vibrator vibrator) { - vibrator.vibrate(VIBRATE_PATTERN, 0, new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build()); - } - private static Vibrator getVibrator(Context context) { return ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)); } diff --git a/src/com/android/deskclock/alarms/AlarmNotifications.java b/src/com/android/deskclock/alarms/AlarmNotifications.java index 2920485a5..6fb7f3bc0 100644 --- a/src/com/android/deskclock/alarms/AlarmNotifications.java +++ b/src/com/android/deskclock/alarms/AlarmNotifications.java @@ -20,7 +20,6 @@ import static com.android.deskclock.NotificationUtils.ALARM_SNOOZE_NOTIFICATION_ import static com.android.deskclock.NotificationUtils.ALARM_UPCOMING_NOTIFICATION_CHANNEL_ID; import static com.android.deskclock.NotificationUtils.FIRING_NOTIFICATION_CHANNEL_ID; -import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -31,6 +30,7 @@ import android.content.Intent; import android.content.res.Resources; import android.os.Build; import android.service.notification.StatusBarNotification; + import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; @@ -108,11 +108,8 @@ public final class AlarmNotifications { .setPriority(NotificationCompat.PRIORITY_LOW) .setCategory(NotificationCompat.CATEGORY_EVENT) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setLocalOnly(true); - - if (Utils.isNOrLater()) { - builder.setGroup(UPCOMING_GROUP_KEY); - } + .setLocalOnly(true) + .setGroup(UPCOMING_GROUP_KEY); final int id = instance.hashCode(); if (lowPriority) { @@ -145,7 +142,6 @@ public final class AlarmNotifications { updateUpcomingAlarmGroupNotification(context, -1, notification); } - @TargetApi(Build.VERSION_CODES.N) private static boolean isGroupSummary(Notification n) { return (n.flags & Notification.FLAG_GROUP_SUMMARY) == Notification.FLAG_GROUP_SUMMARY; } @@ -163,7 +159,6 @@ public final class AlarmNotifications { * @param postedNotification The notification that was just posted * @return The first active notification for the group */ - @TargetApi(Build.VERSION_CODES.N) private static Notification getFirstActiveNotification(Context context, String group, int canceledNotificationId, Notification postedNotification) { final NotificationManager nm = @@ -184,7 +179,6 @@ public final class AlarmNotifications { return firstActiveNotification; } - @TargetApi(Build.VERSION_CODES.N) private static Notification getActiveGroupSummaryNotification(Context context, String group) { final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); @@ -200,10 +194,6 @@ public final class AlarmNotifications { private static void updateUpcomingAlarmGroupNotification(Context context, int canceledNotificationId, Notification postedNotification) { - if (!Utils.isNOrLater()) { - return; - } - final NotificationManagerCompat nm = NotificationManagerCompat.from(context); final Notification firstUpcoming = getFirstActiveNotification(context, UPCOMING_GROUP_KEY, canceledNotificationId, postedNotification); @@ -235,10 +225,6 @@ public final class AlarmNotifications { private static void updateMissedAlarmGroupNotification(Context context, int canceledNotificationId, Notification postedNotification) { - if (!Utils.isNOrLater()) { - return; - } - final NotificationManagerCompat nm = NotificationManagerCompat.from(context); final Notification firstMissed = getFirstActiveNotification(context, MISSED_GROUP_KEY, canceledNotificationId, postedNotification); @@ -284,11 +270,8 @@ public final class AlarmNotifications { .setPriority(NotificationCompat.PRIORITY_LOW) .setCategory(NotificationCompat.CATEGORY_EVENT) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setLocalOnly(true); - - if (Utils.isNOrLater()) { - builder.setGroup(UPCOMING_GROUP_KEY); - } + .setLocalOnly(true) + .setGroup(UPCOMING_GROUP_KEY); // Setup up dismiss action Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, @@ -329,11 +312,8 @@ public final class AlarmNotifications { .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(NotificationCompat.CATEGORY_EVENT) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setLocalOnly(true); - - if (Utils.isNOrLater()) { - builder.setGroup(MISSED_GROUP_KEY); - } + .setLocalOnly(true) + .setGroup(MISSED_GROUP_KEY); final int id = instance.hashCode(); diff --git a/src/com/android/deskclock/alarms/AlarmStateManager.java b/src/com/android/deskclock/alarms/AlarmStateManager.java index 40a1b5bce..7b0ee8d99 100644 --- a/src/com/android/deskclock/alarms/AlarmStateManager.java +++ b/src/com/android/deskclock/alarms/AlarmStateManager.java @@ -15,7 +15,9 @@ */ package com.android.deskclock.alarms; -import android.annotation.TargetApi; +import static android.content.Context.ALARM_SERVICE; +import static android.provider.Settings.System.NEXT_ALARM_FORMATTED; + import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; import android.app.PendingIntent; @@ -28,10 +30,11 @@ import android.os.Build; import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; -import androidx.core.app.NotificationManagerCompat; import android.text.format.DateFormat; import android.widget.Toast; +import androidx.core.app.NotificationManagerCompat; + import com.android.deskclock.AlarmAlertWakeLock; import com.android.deskclock.AlarmClockFragment; import com.android.deskclock.AlarmUtils; @@ -50,9 +53,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import static android.content.Context.ALARM_SERVICE; -import static android.provider.Settings.System.NEXT_ALARM_FORMATTED; - /** * This class handles all the state changes for alarm instances. You need to * register all alarm instances with the state manager if you want them to @@ -182,11 +182,7 @@ public final class AlarmStateManager extends BroadcastReceiver { setPowerOffAlarm(context, nextAlarm); } - if (Utils.isPreL()) { - updateNextAlarmInSystemSettings(context, nextAlarm); - } else { - updateNextAlarmInAlarmManager(context, nextAlarm); - } + updateNextAlarmInAlarmManager(context, nextAlarm); } /** @@ -210,35 +206,8 @@ public final class AlarmStateManager extends BroadcastReceiver { } /** - * Used in pre-L devices, where "next alarm" is stored in system settings. - */ - @SuppressWarnings("deprecation") - @TargetApi(Build.VERSION_CODES.KITKAT) - private static void updateNextAlarmInSystemSettings(Context context, AlarmInstance nextAlarm) { - // Format the next alarm time if an alarm is scheduled. - String time = ""; - if (nextAlarm != null) { - time = AlarmUtils.getFormattedTime(context, nextAlarm.getAlarmTime()); - } - - try { - // Write directly to NEXT_ALARM_FORMATTED in all pre-L versions - Settings.System.putString(context.getContentResolver(), NEXT_ALARM_FORMATTED, time); - - LogUtils.i("Updated next alarm time to: \'" + time + '\''); - - // Send broadcast message so pre-L AppWidgets will recognize an update. - context.sendBroadcast(new Intent(ACTION_ALARM_CHANGED)); - } catch (SecurityException se) { - // The user has most likely revoked WRITE_SETTINGS. - LogUtils.e("Unable to update next alarm to: \'" + time + '\'', se); - } - } - - /** * Used in L and later devices where "next alarm" is stored in the Alarm Manager. */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void updateNextAlarmInAlarmManager(Context context, AlarmInstance nextAlarm) { // Sets a surrogate alarm with alarm manager that provides the AlarmClockInfo for the // alarm that is going to fire next. The operation is constructed such that it is ignored @@ -1048,12 +1017,9 @@ public final class AlarmStateManager extends BroadcastReceiver { PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); - if (Utils.isMOrLater()) { - // Ensure the alarm fires even if the device is dozing. - am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); - } else { - am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); - } + // Ensure the alarm fires even if the device is dozing. + am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); + } @Override diff --git a/src/com/android/deskclock/alarms/TimePickerDialogFragment.java b/src/com/android/deskclock/alarms/TimePickerDialogFragment.java index 05d962b06..f82bea96b 100644 --- a/src/com/android/deskclock/alarms/TimePickerDialogFragment.java +++ b/src/com/android/deskclock/alarms/TimePickerDialogFragment.java @@ -55,33 +55,13 @@ public class TimePickerDialogFragment extends DialogFragment { final int hour = args.getInt(ARG_HOUR, now.get(Calendar.HOUR_OF_DAY)); final int minute = args.getInt(ARG_MINUTE, now.get(Calendar.MINUTE)); - if (Utils.isLOrLater()) { - final Context context = getActivity(); - return new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() { - @Override - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - listener.onTimeSet(TimePickerDialogFragment.this, hourOfDay, minute); - } - }, hour, minute, DateFormat.is24HourFormat(context)); - } else { - final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - final Context context = builder.getContext(); - - final TimePicker timePicker = new TimePicker(context); - timePicker.setCurrentHour(hour); - timePicker.setCurrentMinute(minute); - timePicker.setIs24HourView(DateFormat.is24HourFormat(context)); - - return builder.setView(timePicker) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - listener.onTimeSet(TimePickerDialogFragment.this, - timePicker.getCurrentHour(), timePicker.getCurrentMinute()); - } - }).setNegativeButton(android.R.string.cancel, null /* listener */) - .create(); - } + final Context context = getActivity(); + return new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + listener.onTimeSet(TimePickerDialogFragment.this, hourOfDay, minute); + } + }, hour, minute, DateFormat.is24HourFormat(context)); } public static void show(Fragment fragment) { diff --git a/src/com/android/deskclock/controller/Controller.java b/src/com/android/deskclock/controller/Controller.java index 76f839ad3..13be1d33a 100644 --- a/src/com/android/deskclock/controller/Controller.java +++ b/src/com/android/deskclock/controller/Controller.java @@ -55,9 +55,7 @@ public final class Controller { mContext = context.getApplicationContext(); mEventController = new EventController(); mVoiceController = new VoiceController(); - if (Utils.isNMR1OrLater()) { - mShortcutController = new ShortcutController(mContext); - } + mShortcutController = new ShortcutController(mContext); } } @@ -111,8 +109,6 @@ public final class Controller { public void updateShortcuts() { enforceMainLooper(); - if (mShortcutController != null) { - mShortcutController.updateShortcuts(); - } + mShortcutController.updateShortcuts(); } }
\ No newline at end of file diff --git a/src/com/android/deskclock/controller/ShortcutController.java b/src/com/android/deskclock/controller/ShortcutController.java index 8eba32f5f..d0b6799bb 100644 --- a/src/com/android/deskclock/controller/ShortcutController.java +++ b/src/com/android/deskclock/controller/ShortcutController.java @@ -16,7 +16,6 @@ package com.android.deskclock.controller; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -46,7 +45,6 @@ import com.android.deskclock.uidata.UiDataModel; import java.util.Arrays; import java.util.Collections; -@TargetApi(Build.VERSION_CODES.N_MR1) class ShortcutController { private final Context mContext; diff --git a/src/com/android/deskclock/controller/VoiceController.java b/src/com/android/deskclock/controller/VoiceController.java index 1eae56047..ad4e9584a 100644 --- a/src/com/android/deskclock/controller/VoiceController.java +++ b/src/com/android/deskclock/controller/VoiceController.java @@ -16,7 +16,6 @@ package com.android.deskclock.controller; -import android.annotation.TargetApi; import android.app.Activity; import android.app.VoiceInteractor; import android.app.VoiceInteractor.AbortVoiceRequest; @@ -26,7 +25,6 @@ import android.os.Build; import com.android.deskclock.Utils; -@TargetApi(Build.VERSION_CODES.M) class VoiceController { /** * If the {@code activity} is currently hosting a voice interaction session, indicate the voice @@ -36,10 +34,6 @@ class VoiceController { * @param message to be spoken to the user to indicate success */ void notifyVoiceSuccess(Activity activity, String message) { - if (!Utils.isMOrLater()) { - return; - } - final VoiceInteractor voiceInteractor = activity.getVoiceInteractor(); if (voiceInteractor != null) { final Prompt prompt = new Prompt(message); @@ -55,10 +49,6 @@ class VoiceController { * @param message to be spoken to the user to indicate failure */ void notifyVoiceFailure(Activity activity, String message) { - if (!Utils.isMOrLater()) { - return; - } - final VoiceInteractor voiceInteractor = activity.getVoiceInteractor(); if (voiceInteractor != null) { final Prompt prompt = new Prompt(message); diff --git a/src/com/android/deskclock/data/DataModel.java b/src/com/android/deskclock/data/DataModel.java index 3dafe9ddb..e90f7e991 100644 --- a/src/com/android/deskclock/data/DataModel.java +++ b/src/com/android/deskclock/data/DataModel.java @@ -134,18 +134,16 @@ public final class DataModel { @Override public void onClick(View v) { final Context context = v.getContext(); - if (Utils.isLOrLater()) { - try { - // Attempt to open the notification settings for this app. - context.startActivity( - new Intent("android.settings.APP_NOTIFICATION_SETTINGS") - .putExtra("app_package", context.getPackageName()) - .putExtra("app_uid", context.getApplicationInfo().uid) - .addFlags(FLAG_ACTIVITY_NEW_TASK)); - return; - } catch (Exception ignored) { - // best attempt only; recovery code below - } + try { + // Attempt to open the notification settings for this app. + context.startActivity( + new Intent("android.settings.APP_NOTIFICATION_SETTINGS") + .putExtra("app_package", context.getPackageName()) + .putExtra("app_uid", context.getApplicationInfo().uid) + .addFlags(FLAG_ACTIVITY_NEW_TASK)); + return; + } catch (Exception ignored) { + // best attempt only; recovery code below } // Fall back to opening the app settings page. diff --git a/src/com/android/deskclock/data/SilentSettingsModel.java b/src/com/android/deskclock/data/SilentSettingsModel.java index 50054f134..93bd1adaf 100644 --- a/src/com/android/deskclock/data/SilentSettingsModel.java +++ b/src/com/android/deskclock/data/SilentSettingsModel.java @@ -16,7 +16,15 @@ package com.android.deskclock.data; -import android.annotation.TargetApi; +import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; +import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE; +import static android.content.Context.AUDIO_SERVICE; +import static android.content.Context.NOTIFICATION_SERVICE; +import static android.media.AudioManager.STREAM_ALARM; +import static android.media.RingtoneManager.TYPE_ALARM; +import static android.provider.Settings.System.CONTENT_URI; +import static android.provider.Settings.System.DEFAULT_ALARM_ALERT_URI; + import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -31,6 +39,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.os.Looper; + import androidx.core.app.NotificationManagerCompat; import com.android.deskclock.Utils; @@ -39,15 +48,6 @@ import com.android.deskclock.data.DataModel.SilentSetting; import java.util.ArrayList; import java.util.List; -import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; -import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE; -import static android.content.Context.AUDIO_SERVICE; -import static android.content.Context.NOTIFICATION_SERVICE; -import static android.media.AudioManager.STREAM_ALARM; -import static android.media.RingtoneManager.TYPE_ALARM; -import static android.provider.Settings.System.CONTENT_URI; -import static android.provider.Settings.System.DEFAULT_ALARM_ALERT_URI; - /** * This model fetches and stores reasons that alarms may be suppressed or silenced by system * settings on the device. This information is displayed passively to notify the user of this @@ -93,10 +93,9 @@ final class SilentSettingsModel { final ContentObserver contentChangeWatcher = new ContentChangeWatcher(); cr.registerContentObserver(VOLUME_URI, false, contentChangeWatcher); cr.registerContentObserver(DEFAULT_ALARM_ALERT_URI, false, contentChangeWatcher); - if (Utils.isMOrLater()) { - final IntentFilter filter = new IntentFilter(ACTION_INTERRUPTION_FILTER_CHANGED); - context.registerReceiver(new DoNotDisturbChangeReceiver(), filter); - } + + final IntentFilter filter = new IntentFilter(ACTION_INTERRUPTION_FILTER_CHANGED); + context.registerReceiver(new DoNotDisturbChangeReceiver(), filter); } void addSilentSettingsListener(OnSilentSettingsListener listener) { @@ -178,12 +177,7 @@ final class SilentSettingsModel { } } - @TargetApi(Build.VERSION_CODES.M) private boolean isDoNotDisturbBlockingAlarms() { - if (!Utils.isMOrLater()) { - return false; - } - try { final int interruptionFilter = mNotificationManager.getCurrentInterruptionFilter(); return interruptionFilter == INTERRUPTION_FILTER_NONE; diff --git a/src/com/android/deskclock/data/StopwatchNotificationBuilder.java b/src/com/android/deskclock/data/StopwatchNotificationBuilder.java index d426b5c0b..799902645 100644 --- a/src/com/android/deskclock/data/StopwatchNotificationBuilder.java +++ b/src/com/android/deskclock/data/StopwatchNotificationBuilder.java @@ -137,11 +137,8 @@ class StopwatchNotificationBuilder { .setPriority(Notification.PRIORITY_LOW) .setSmallIcon(R.drawable.stat_notify_stopwatch) .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) - .setColor(ContextCompat.getColor(context, R.color.default_background)); - - if (Utils.isNOrLater()) { - notification.setGroup(nm.getStopwatchNotificationGroupKey()); - } + .setColor(ContextCompat.getColor(context, R.color.default_background)) + .setGroup(nm.getStopwatchNotificationGroupKey()); for (Action action : actions) { notification.addAction(action); diff --git a/src/com/android/deskclock/data/TimerModel.java b/src/com/android/deskclock/data/TimerModel.java index 5eb5d43e5..2ea31d6bd 100644 --- a/src/com/android/deskclock/data/TimerModel.java +++ b/src/com/android/deskclock/data/TimerModel.java @@ -838,11 +838,7 @@ final class TimerModel { } static void schedulePendingIntent(AlarmManager am, long triggerTime, PendingIntent pi) { - if (Utils.isMOrLater()) { - // Ensure the timer fires even if the device is dozing. - am.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, triggerTime, pi); - } else { - am.setExact(ELAPSED_REALTIME_WAKEUP, triggerTime, pi); - } + // Ensure the timer fires even if the device is dozing. + am.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, triggerTime, pi); } } diff --git a/src/com/android/deskclock/data/TimerNotificationBuilder.java b/src/com/android/deskclock/data/TimerNotificationBuilder.java index 6bc9c12fa..e3aa3017a 100644 --- a/src/com/android/deskclock/data/TimerNotificationBuilder.java +++ b/src/com/android/deskclock/data/TimerNotificationBuilder.java @@ -24,7 +24,6 @@ import static android.text.format.DateUtils.SECOND_IN_MILLIS; import static com.android.deskclock.NotificationUtils.FIRING_NOTIFICATION_CHANNEL_ID; import static com.android.deskclock.NotificationUtils.TIMER_MODEL_NOTIFICATION_CHANNEL_ID; -import android.annotation.TargetApi; import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; @@ -36,7 +35,9 @@ import android.os.SystemClock; import android.text.TextUtils; import android.widget.RemoteViews; +import androidx.annotation.DrawableRes; import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; import com.android.deskclock.AlarmUtils; @@ -161,55 +162,14 @@ class TimerNotificationBuilder { .setSortKey(nm.getTimerNotificationSortKey()) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) - .setColor(ContextCompat.getColor(context, R.color.default_background)); + .setColor(ContextCompat.getColor(context, R.color.default_background)) + .setCustomContentView(buildChronometer(pname, base, running, stateText)) + .setGroup(nm.getTimerNotificationGroupKey()); for (Action action : actions) { notification.addAction(action); } - if (Utils.isNOrLater()) { - notification.setCustomContentView(buildChronometer(pname, base, running, stateText)) - .setGroup(nm.getTimerNotificationGroupKey()); - } else { - final CharSequence contentTextPreN; - if (count == 1) { - contentTextPreN = TimerStringFormatter.formatTimeRemaining(context, - timer.getRemainingTime(), false); - } else if (running) { - final String timeRemaining = TimerStringFormatter.formatTimeRemaining(context, - timer.getRemainingTime(), false); - contentTextPreN = context.getString(R.string.next_timer_notif, timeRemaining); - } else { - contentTextPreN = context.getString(R.string.all_timers_stopped_notif); - } - - notification.setContentTitle(stateText).setContentText(contentTextPreN); - - final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - final Intent updateNotification = TimerService.createUpdateNotificationIntent(context); - final long remainingTime = timer.getRemainingTime(); - if (timer.isRunning() && remainingTime > MINUTE_IN_MILLIS) { - // Schedule a callback to update the time-sensitive information of the running timer - final PendingIntent pi = - PendingIntent.getService(context, REQUEST_CODE_UPCOMING, updateNotification, - PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT | - PendingIntent.FLAG_IMMUTABLE); - - final long nextMinuteChange = remainingTime % MINUTE_IN_MILLIS; - final long triggerTime = SystemClock.elapsedRealtime() + nextMinuteChange; - TimerModel.schedulePendingIntent(am, triggerTime, pi); - } else { - // Cancel the update notification callback. - final PendingIntent pi = PendingIntent.getService(context, 0, updateNotification, - PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE | - PendingIntent.FLAG_IMMUTABLE); - if (pi != null) { - am.cancel(pi); - pi.cancel(); - } - } - } - NotificationUtils.createChannel(context, TIMER_MODEL_NOTIFICATION_CHANNEL_ID); return notification.build(); } @@ -275,22 +235,13 @@ class TimerNotificationBuilder { .setSmallIcon(R.drawable.stat_notify_timer) .setFullScreenIntent(pendingFullScreen, true) .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) - .setColor(ContextCompat.getColor(context, R.color.default_background)); + .setColor(ContextCompat.getColor(context, R.color.default_background)) + .setCustomContentView(buildChronometer(pname, base, true, stateText)); for (Action action : actions) { notification.addAction(action); } - if (Utils.isNOrLater()) { - notification.setCustomContentView(buildChronometer(pname, base, true, stateText)); - } else { - final CharSequence contentTextPreN = count == 1 - ? context.getString(R.string.timer_times_up) - : context.getString(R.string.timer_multi_times_up, count); - - notification.setContentTitle(stateText).setContentText(contentTextPreN); - } - NotificationUtils.createChannel(context, FIRING_NOTIFICATION_CHANNEL_ID); return notification.build(); } @@ -360,16 +311,9 @@ class TimerNotificationBuilder { .setSortKey(nm.getTimerNotificationMissedSortKey()) .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) .addAction(action) - .setColor(ContextCompat.getColor(context, R.color.default_background)); - - if (Utils.isNOrLater()) { - notification.setCustomContentView(buildChronometer(pname, base, true, stateText)) - .setGroup(nm.getTimerNotificationGroupKey()); - } else { - final CharSequence contentText = AlarmUtils.getFormattedTime(context, - timer.getWallClockExpirationTime()); - notification.setContentText(contentText).setContentTitle(stateText); - } + .setColor(ContextCompat.getColor(context, R.color.default_background)) + .setCustomContentView(buildChronometer(pname, base, true, stateText)) + .setGroup(nm.getTimerNotificationGroupKey()); NotificationUtils.createChannel(context, TIMER_MODEL_NOTIFICATION_CHANNEL_ID); return notification.build(); @@ -389,7 +333,6 @@ class TimerNotificationBuilder { return SystemClock.elapsedRealtime() + adjustedRemaining; } - @TargetApi(Build.VERSION_CODES.N) private RemoteViews buildChronometer(String pname, long base, boolean running, CharSequence stateText) { final RemoteViews content = new RemoteViews(pname, R.layout.chronometer_notif_content); diff --git a/src/com/android/deskclock/events/ShortcutEventTracker.java b/src/com/android/deskclock/events/ShortcutEventTracker.java index 4b956cebf..f88b2cad2 100644 --- a/src/com/android/deskclock/events/ShortcutEventTracker.java +++ b/src/com/android/deskclock/events/ShortcutEventTracker.java @@ -16,19 +16,18 @@ package com.android.deskclock.events; -import android.annotation.TargetApi; import android.content.Context; import android.content.pm.ShortcutManager; import android.os.Build; -import androidx.annotation.StringRes; import android.util.ArraySet; +import androidx.annotation.StringRes; + import com.android.deskclock.R; import com.android.deskclock.uidata.UiDataModel; import java.util.Set; -@TargetApi(Build.VERSION_CODES.N_MR1) public final class ShortcutEventTracker implements EventTracker { private final ShortcutManager mShortcutManager; diff --git a/src/com/android/deskclock/provider/ClockProvider.java b/src/com/android/deskclock/provider/ClockProvider.java index 0e8882421..680e3f4b3 100644 --- a/src/com/android/deskclock/provider/ClockProvider.java +++ b/src/com/android/deskclock/provider/ClockProvider.java @@ -16,7 +16,11 @@ package com.android.deskclock.provider; -import android.annotation.TargetApi; +import static com.android.deskclock.provider.ClockContract.AlarmsColumns; +import static com.android.deskclock.provider.ClockContract.InstancesColumns; +import static com.android.deskclock.provider.ClockDatabaseHelper.ALARMS_TABLE_NAME; +import static com.android.deskclock.provider.ClockDatabaseHelper.INSTANCES_TABLE_NAME; + import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentUris; @@ -28,20 +32,16 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Build; -import androidx.annotation.NonNull; import android.text.TextUtils; import android.util.ArrayMap; +import androidx.annotation.NonNull; + import com.android.deskclock.LogUtils; import com.android.deskclock.Utils; import java.util.Map; -import static com.android.deskclock.provider.ClockContract.AlarmsColumns; -import static com.android.deskclock.provider.ClockContract.InstancesColumns; -import static com.android.deskclock.provider.ClockDatabaseHelper.ALARMS_TABLE_NAME; -import static com.android.deskclock.provider.ClockDatabaseHelper.INSTANCES_TABLE_NAME; - public class ClockProvider extends ContentProvider { private ClockDatabaseHelper mOpenHelper; @@ -126,20 +126,15 @@ public class ClockProvider extends ContentProvider { } @Override - @TargetApi(Build.VERSION_CODES.N) public boolean onCreate() { final Context context = getContext(); final Context storageContext; - if (Utils.isNOrLater()) { - // All N devices have split storage areas, but we may need to - // migrate existing database into the new device encrypted - // storage area, which is where our data lives from now on. - storageContext = context.createDeviceProtectedStorageContext(); - if (!storageContext.moveDatabaseFrom(context, ClockDatabaseHelper.DATABASE_NAME)) { - LogUtils.wtf("Failed to migrate database: %s", ClockDatabaseHelper.DATABASE_NAME); - } - } else { - storageContext = context; + // All N devices have split storage areas, but we may need to + // migrate existing database into the new device encrypted + // storage area, which is where our data lives from now on. + storageContext = context.createDeviceProtectedStorageContext(); + if (!storageContext.moveDatabaseFrom(context, ClockDatabaseHelper.DATABASE_NAME)) { + LogUtils.wtf("Failed to migrate database: %s", ClockDatabaseHelper.DATABASE_NAME); } mOpenHelper = new ClockDatabaseHelper(storageContext); diff --git a/src/com/android/deskclock/settings/AlarmVolumePreference.java b/src/com/android/deskclock/settings/AlarmVolumePreference.java index 92edd9e67..91d0accdb 100644 --- a/src/com/android/deskclock/settings/AlarmVolumePreference.java +++ b/src/com/android/deskclock/settings/AlarmVolumePreference.java @@ -16,29 +16,29 @@ package com.android.deskclock.settings; -import android.annotation.TargetApi; +import static android.content.Context.AUDIO_SERVICE; +import static android.content.Context.NOTIFICATION_SERVICE; +import static android.media.AudioManager.STREAM_ALARM; + import android.app.NotificationManager; import android.content.Context; import android.database.ContentObserver; import android.media.AudioManager; import android.os.Build; import android.provider.Settings; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + import com.android.deskclock.R; import com.android.deskclock.RingtonePreviewKlaxon; import com.android.deskclock.Utils; import com.android.deskclock.data.DataModel; -import static android.content.Context.AUDIO_SERVICE; -import static android.content.Context.NOTIFICATION_SERVICE; -import static android.media.AudioManager.STREAM_ALARM; - public class AlarmVolumePreference extends Preference { private static final long ALARM_PREVIEW_DURATION_MS = 2000; @@ -61,11 +61,12 @@ public class AlarmVolumePreference extends Preference { holder.itemView.setClickable(false); // Minimum volume for alarm is not 0, calculate it. - int maxVolume = audioManager.getStreamMaxVolume(STREAM_ALARM) - getMinVolume(audioManager); + int maxVolume = audioManager.getStreamMaxVolume(STREAM_ALARM) - + audioManager.getStreamMinVolume(STREAM_ALARM); mSeekbar = (SeekBar) holder.findViewById(R.id.seekbar); mSeekbar.setMax(maxVolume); mSeekbar.setProgress(audioManager.getStreamVolume(STREAM_ALARM) - - getMinVolume(audioManager)); + audioManager.getStreamMinVolume(STREAM_ALARM)); ((ImageView) holder.findViewById(android.R.id.icon)) .setImageResource(R.drawable.ic_alarm_small); @@ -76,7 +77,7 @@ public class AlarmVolumePreference extends Preference { public void onChange(boolean selfChange) { // Volume was changed elsewhere, update our slider. mSeekbar.setProgress(audioManager.getStreamVolume(STREAM_ALARM) - - getMinVolume(audioManager)); + audioManager.getStreamMinVolume(STREAM_ALARM)); } }; @@ -97,7 +98,7 @@ public class AlarmVolumePreference extends Preference { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { - int newVolume = progress + getMinVolume(audioManager); + int newVolume = progress + audioManager.getStreamMinVolume(STREAM_ALARM); audioManager.setStreamVolume(STREAM_ALARM, newVolume, 0); } onSeekbarChanged(); @@ -131,18 +132,9 @@ public class AlarmVolumePreference extends Preference { } private boolean doesDoNotDisturbAllowAlarmPlayback() { - return !Utils.isNOrLater() || doesDoNotDisturbAllowAlarmPlaybackNPlus(); - } - - @TargetApi(Build.VERSION_CODES.N) - private boolean doesDoNotDisturbAllowAlarmPlaybackNPlus() { final NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(NOTIFICATION_SERVICE); return notificationManager.getCurrentInterruptionFilter() != NotificationManager.INTERRUPTION_FILTER_NONE; } - - private int getMinVolume(AudioManager audioManager) { - return (Utils.isPOrLater()) ? audioManager.getStreamMinVolume(STREAM_ALARM) : 0; - } }
\ No newline at end of file diff --git a/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java b/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java index 92d558dff..9d38f5736 100644 --- a/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java +++ b/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java @@ -16,10 +16,10 @@ package com.android.deskclock.settings; -import android.annotation.TargetApi; import android.os.Build; import android.os.Bundle; import android.view.MenuItem; + import androidx.appcompat.app.AppCompatActivity; import androidx.preference.ListPreference; import androidx.preference.Preference; @@ -61,13 +61,10 @@ public final class ScreensaverSettingsActivity extends AppCompatActivity { implements Preference.OnPreferenceChangeListener { @Override - @TargetApi(Build.VERSION_CODES.N) public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Utils.isNOrLater()) { - getPreferenceManager().setStorageDeviceProtected(); - } + getPreferenceManager().setStorageDeviceProtected(); } @Override diff --git a/src/com/android/deskclock/stopwatch/StopwatchFragment.java b/src/com/android/deskclock/stopwatch/StopwatchFragment.java index 06c7578d7..a4bd7ac44 100644 --- a/src/com/android/deskclock/stopwatch/StopwatchFragment.java +++ b/src/com/android/deskclock/stopwatch/StopwatchFragment.java @@ -361,8 +361,7 @@ public final class StopwatchFragment extends DeskClockFragment { @SuppressLint("InlinedApi") @SuppressWarnings("deprecation") final Intent shareIntent = new Intent(Intent.ACTION_SEND) - .addFlags(Utils.isLOrLater() ? Intent.FLAG_ACTIVITY_NEW_DOCUMENT - : Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) + .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) .putExtra(Intent.EXTRA_SUBJECT, subject) .putExtra(Intent.EXTRA_TEXT, text) .setType("text/plain"); diff --git a/src/com/android/deskclock/timer/TimerKlaxon.java b/src/com/android/deskclock/timer/TimerKlaxon.java index 1c40b4a4d..1b8707efb 100644 --- a/src/com/android/deskclock/timer/TimerKlaxon.java +++ b/src/com/android/deskclock/timer/TimerKlaxon.java @@ -16,7 +16,6 @@ package com.android.deskclock.timer; -import android.annotation.TargetApi; import android.content.Context; import android.media.AudioAttributes; import android.net.Uri; @@ -67,23 +66,14 @@ public abstract class TimerKlaxon { if (DataModel.getDataModel().getTimerVibrate()) { final Vibrator vibrator = getVibrator(context); - if (Utils.isLOrLater()) { - vibrateLOrLater(vibrator); - } else { - vibrator.vibrate(VIBRATE_PATTERN, 0); - } + vibrator.vibrate(VIBRATE_PATTERN, 0, new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build()); } sStarted = true; } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static void vibrateLOrLater(Vibrator vibrator) { - vibrator.vibrate(VIBRATE_PATTERN, 0, new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build()); - } - private static Vibrator getVibrator(Context context) { return ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)); } diff --git a/src/com/android/deskclock/widget/EmptyViewController.java b/src/com/android/deskclock/widget/EmptyViewController.java index 4a2199932..0c7fbb89b 100644 --- a/src/com/android/deskclock/widget/EmptyViewController.java +++ b/src/com/android/deskclock/widget/EmptyViewController.java @@ -31,7 +31,6 @@ import com.android.deskclock.Utils; public final class EmptyViewController { private static final int ANIMATION_DURATION = 300; - private static final boolean USE_TRANSITION_FRAMEWORK = Utils.isLOrLater(); private final Transition mEmptyViewTransition; private final ViewGroup mMainLayout; @@ -49,17 +48,14 @@ public final class EmptyViewController { mMainLayout = mainLayout; mContentView = contentView; mEmptyView = emptyView; - if (USE_TRANSITION_FRAMEWORK) { - mEmptyViewTransition = new TransitionSet() - .setOrdering(TransitionSet.ORDERING_SEQUENTIAL) - .addTarget(contentView) - .addTarget(emptyView) - .addTransition(new Fade(Fade.OUT)) - .addTransition(new Fade(Fade.IN)) - .setDuration(ANIMATION_DURATION); - } else { - mEmptyViewTransition = null; - } + mEmptyViewTransition = new TransitionSet() + .setOrdering(TransitionSet.ORDERING_SEQUENTIAL) + .addTarget(contentView) + .addTarget(emptyView) + .addTransition(new Fade(Fade.OUT)) + .addTransition(new Fade(Fade.IN)) + .setDuration(ANIMATION_DURATION); + } /** @@ -73,9 +69,7 @@ public final class EmptyViewController { } mIsEmpty = isEmpty; // State changed, perform transition. - if (USE_TRANSITION_FRAMEWORK) { - TransitionManager.beginDelayedTransition(mMainLayout, mEmptyViewTransition); - } + TransitionManager.beginDelayedTransition(mMainLayout, mEmptyViewTransition); mEmptyView.setVisibility(mIsEmpty ? View.VISIBLE : View.GONE); mContentView.setVisibility(mIsEmpty ? View.GONE : View.VISIBLE); } diff --git a/src/com/android/deskclock/worldclock/CitySelectionActivity.java b/src/com/android/deskclock/worldclock/CitySelectionActivity.java index 13e85c47d..97c92249a 100644 --- a/src/com/android/deskclock/worldclock/CitySelectionActivity.java +++ b/src/com/android/deskclock/worldclock/CitySelectionActivity.java @@ -447,7 +447,7 @@ public final class CitySelectionActivity extends BaseActivity { break; case UTC_OFFSET: final TimeZone timezone = city.getTimeZone(); - sections.add(Utils.getGMTHourOffset(timezone, Utils.isPreL())); + sections.add(Utils.getGMTHourOffset(timezone, false)); break; } positions.add(position); |