1ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski/*
2ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Copyright (C) 2013 The Android Open Source Project
3ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski *
4ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Licensed under the Apache License, Version 2.0 (the "License");
5ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * you may not use this file except in compliance with the License.
6ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * You may obtain a copy of the License at
7ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski *
8ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski *      http://www.apache.org/licenses/LICENSE-2.0
9ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski *
10ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Unless required by applicable law or agreed to in writing, software
11ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * distributed under the License is distributed on an "AS IS" BASIS,
12ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * See the License for the specific language governing permissions and
14ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * limitations under the License.
15ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski */
16ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
17ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskipackage com.android.deskclock.alarms;
18ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
19da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieuximport android.annotation.TargetApi;
20ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.Context;
21662846cd9d25a4523262f2ae39ceaed243574f5aJohn Spurlockimport android.media.AudioAttributes;
222a82b07ca6db0547bf55aca3cf13542e2434bdafJustin Klaassenimport android.os.Build;
23ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.os.Vibrator;
24ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
2595559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieuximport com.android.deskclock.AsyncRingtonePlayer;
26cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassenimport com.android.deskclock.LogUtils;
27da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieuximport com.android.deskclock.Utils;
280777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieuximport com.android.deskclock.data.DataModel;
29ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.provider.AlarmInstance;
30ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
31ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski/**
320777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux * Manages playing alarm ringtones and vibrating the device.
33ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski */
340777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieuxfinal class AlarmKlaxon {
350777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux
360777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux    private static final long[] VIBRATE_PATTERN = {500, 500};
37ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
38ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    private static boolean sStarted = false;
3995559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux    private static AsyncRingtonePlayer sAsyncRingtonePlayer;
4095559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux
4195559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux    private AlarmKlaxon() {}
42ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
43ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void stop(Context context) {
44ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        if (sStarted) {
455bacdff3431203e8eb14500dc7a3df7a6950f3f6Annie Chin            LogUtils.v("AlarmKlaxon.stop()");
46ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski            sStarted = false;
4795559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux            getAsyncRingtonePlayer(context).stop();
4895559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux            ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).cancel();
49ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        }
50ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
51ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
5295559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux    public static void start(Context context, AlarmInstance instance) {
5395559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux        // Make sure we are stopped before starting
54ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        stop(context);
5588fecb35c9673a8bd6faabd4d03045e9b1d36c45James Lemieux        LogUtils.v("AlarmKlaxon.start()");
56ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
57ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        if (!AlarmInstance.NO_RINGTONE_URI.equals(instance.mRingtone)) {
580777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux            final long crescendoDuration = DataModel.getDataModel().getAlarmCrescendoDuration();
590777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux            getAsyncRingtonePlayer(context).play(instance.mRingtone, crescendoDuration);
60ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        }
61ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
62ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        if (instance.mVibrate) {
6309c1f0e96743fcde110ecd1160ab55cdfaec12c0Annie Chin            final Vibrator vibrator = getVibrator(context);
64da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux            if (Utils.isLOrLater()) {
65da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux                vibrateLOrLater(vibrator);
662a82b07ca6db0547bf55aca3cf13542e2434bdafJustin Klaassen            } else {
670777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux                vibrator.vibrate(VIBRATE_PATTERN, 0);
682a82b07ca6db0547bf55aca3cf13542e2434bdafJustin Klaassen            }
69ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        }
70ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
71ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        sStarted = true;
72ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
73ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
74da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
75da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux    private static void vibrateLOrLater(Vibrator vibrator) {
760777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux        vibrator.vibrate(VIBRATE_PATTERN, 0, new AudioAttributes.Builder()
77da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux                .setUsage(AudioAttributes.USAGE_ALARM)
78da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
79da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux                .build());
80da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux    }
81da6c5b10503f31b0e8d12bf7200278151ec4561fJames Lemieux
8209c1f0e96743fcde110ecd1160ab55cdfaec12c0Annie Chin    private static Vibrator getVibrator(Context context) {
8309c1f0e96743fcde110ecd1160ab55cdfaec12c0Annie Chin        return ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE));
8409c1f0e96743fcde110ecd1160ab55cdfaec12c0Annie Chin    }
8509c1f0e96743fcde110ecd1160ab55cdfaec12c0Annie Chin
8695559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux    private static synchronized AsyncRingtonePlayer getAsyncRingtonePlayer(Context context) {
8795559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux        if (sAsyncRingtonePlayer == null) {
880777a082e248c33c2e5a32690bfcdbd5de7d3f9eJames Lemieux            sAsyncRingtonePlayer = new AsyncRingtonePlayer(context.getApplicationContext());
89ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        }
90ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
9195559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux        return sAsyncRingtonePlayer;
92ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
9395559b2952cb1f1492355f0ab572d40b8a2d000eJames Lemieux}