summaryrefslogtreecommitdiff
path: root/src/com/android/deskclock
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/deskclock')
-rw-r--r--src/com/android/deskclock/AlarmInitReceiver.java3
-rw-r--r--src/com/android/deskclock/AnimatorUtils.java35
-rw-r--r--src/com/android/deskclock/AsyncRingtonePlayer.java32
-rw-r--r--src/com/android/deskclock/ClockFragment.java16
-rw-r--r--src/com/android/deskclock/DeskClockApplication.java22
-rw-r--r--src/com/android/deskclock/DeskClockBackupAgent.java6
-rw-r--r--src/com/android/deskclock/NotificationUtils.java8
-rw-r--r--src/com/android/deskclock/Screensaver.java29
-rw-r--r--src/com/android/deskclock/ScreensaverActivity.java23
-rw-r--r--src/com/android/deskclock/Utils.java97
-rw-r--r--src/com/android/deskclock/alarms/AlarmActivity.java22
-rw-r--r--src/com/android/deskclock/alarms/AlarmKlaxon.java18
-rw-r--r--src/com/android/deskclock/alarms/AlarmNotifications.java34
-rw-r--r--src/com/android/deskclock/alarms/AlarmStateManager.java52
-rw-r--r--src/com/android/deskclock/alarms/TimePickerDialogFragment.java34
-rw-r--r--src/com/android/deskclock/controller/Controller.java8
-rw-r--r--src/com/android/deskclock/controller/ShortcutController.java2
-rw-r--r--src/com/android/deskclock/controller/VoiceController.java10
-rw-r--r--src/com/android/deskclock/data/DataModel.java22
-rw-r--r--src/com/android/deskclock/data/SilentSettingsModel.java32
-rw-r--r--src/com/android/deskclock/data/StopwatchNotificationBuilder.java7
-rw-r--r--src/com/android/deskclock/data/TimerModel.java8
-rw-r--r--src/com/android/deskclock/data/TimerNotificationBuilder.java77
-rw-r--r--src/com/android/deskclock/events/ShortcutEventTracker.java5
-rw-r--r--src/com/android/deskclock/provider/ClockProvider.java31
-rw-r--r--src/com/android/deskclock/settings/AlarmVolumePreference.java32
-rw-r--r--src/com/android/deskclock/settings/ScreensaverSettingsActivity.java7
-rw-r--r--src/com/android/deskclock/stopwatch/StopwatchFragment.java3
-rw-r--r--src/com/android/deskclock/timer/TimerKlaxon.java18
-rw-r--r--src/com/android/deskclock/widget/EmptyViewController.java24
-rw-r--r--src/com/android/deskclock/worldclock/CitySelectionActivity.java2
31 files changed, 155 insertions, 564 deletions
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);