123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /*
- Polassis: personal voice assistant for Android devices
- Copyright (C) 2018 Maksymilian Graczyk
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package com.mg.polassis.gui;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.content.SharedPreferences;
- import android.graphics.Color;
- import android.media.AudioAttributes;
- import android.media.AudioManager;
- import android.media.SoundPool;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.IBinder;
- import android.os.PowerManager;
- import android.preference.PreferenceManager;
- import android.view.View;
- import android.view.WindowManager;
- import android.widget.TextView;
- import com.mg.polassis.R;
- import com.mg.polassis.misc.Assistant;
- import com.mg.polassis.service.TextToSpeechService;
- import com.mg.polassis.misc.Translations;
- import java.util.Calendar;
- import java.util.GregorianCalendar;
- import java.util.Timer;
- import java.util.TimerTask;
- public class AlarmActivity extends Activity {
- private SoundPool soundPool;
- private int clockStreamID;
- private int clockSoundID;
- private Timer blinkingTextTimer;
- private TextView timeText;
- private TextView titleText;
- private final Handler handler = new Handler();
- private TextToSpeechService textToSpeechService;
- private String toBeSaid;
- private final ServiceConnection textToSpeechServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- textToSpeechService = ((TextToSpeechService.TextToSpeechBinder)service).getService();
- if (toBeSaid != null)
- {
- textToSpeechService.speak(toBeSaid, AudioManager.STREAM_ALARM);
- toBeSaid = null;
- }
- }
- @Override
- public void onServiceDisconnected(ComponentName name) {
- textToSpeechService = null;
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_timer);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
- bindService(new Intent(this, TextToSpeechService.class), textToSpeechServiceConnection, BIND_AUTO_CREATE);
- timeText = (TextView) findViewById(R.id.noTimeRemaining);
- timeText.setShadowLayer(15, 4, 4, Color.BLACK);
- titleText = (TextView) findViewById(R.id.timeIsUp);
- titleText.setShadowLayer(15, 4, 4, Color.BLACK);
- PowerManager.WakeLock wakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "WakeUp");
- if (!((PowerManager) getSystemService(POWER_SERVICE)).isScreenOn()) {
- wakeLock.acquire();
- wakeLock.release();
- }
- if (!Assistant.inForeground)
- sendBroadcast(new Intent().setAction("com.mg.polassis.ACTION_FINISH"));
- if (getIntent() == null) prepareForTimer();
- else if (getIntent().getBooleanExtra("alarm", false)) prepareForAlarmClock();
- else if (getIntent().getBooleanExtra("reminder", false)) prepareForReminder();
- else prepareForTimer();
- }
- private void startAlarmSound(final boolean continuous)
- {
- if (android.os.Build.VERSION.SDK_INT >= 21)
- {
- SoundPool.Builder builder = new SoundPool.Builder();
- AudioAttributes.Builder attributesBuilder = new AudioAttributes.Builder();
- attributesBuilder.setUsage(AudioAttributes.USAGE_ALARM);
- builder.setAudioAttributes(attributesBuilder.build());
- builder.setMaxStreams(1);
- soundPool = builder.build();
- }
- else soundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);
- soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
- @Override
- public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
- clockStreamID = soundPool.play(clockSoundID, 1.0f, 1.0f, Integer.MAX_VALUE, (continuous ? -1 : 0), 1.0f);
- }
- });
- clockSoundID = soundPool.load(this, R.raw.timer, 1);
- }
- private void prepareForAlarmClock()
- {
- titleText.setText(Translations.getStringResource(this, "alarm_message"));
- timeText.setVisibility(View.INVISIBLE);
- SharedPreferences alarmsPreferences = getSharedPreferences("alarms", MODE_PRIVATE);
- GregorianCalendar calendar = new GregorianCalendar();
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- alarmsPreferences.edit().remove(Long.toString(calendar.getTimeInMillis())).apply();
- if (android.os.Build.VERSION.SDK_INT < 21 && alarmsPreferences.getAll().keySet().size() == 0)
- sendBroadcast(new Intent("android.intent.action.ALARM_CHANGED").putExtra("alarmSet", false));
- startAlarmSound(true);
- }
- private void prepareForTimer()
- {
- titleText.setText(Translations.getStringResource(this, "time_is_up"));
- timeText.setVisibility(View.VISIBLE);
- blinkingTextTimer = new Timer();
- blinkingTextTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- handler.post(new Runnable() {
- @Override
- public void run() {
- if (timeText.getVisibility() == View.INVISIBLE)
- timeText.setVisibility(View.VISIBLE);
- else timeText.setVisibility(View.INVISIBLE);
- }
- });
- }
- }, 400, 400);
- startAlarmSound(true);
- }
- private void prepareForReminder()
- {
- String reminderTitle = getIntent().getStringExtra("title");
- titleText.setText(reminderTitle);
- timeText.setVisibility(View.INVISIBLE);
- SharedPreferences remindersPreferences = getSharedPreferences("reminders", MODE_PRIVATE);
- GregorianCalendar calendar = new GregorianCalendar();
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- remindersPreferences.edit().remove(Long.toString(calendar.getTimeInMillis())).apply();
- if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("text_to_speech", true))
- {
- toBeSaid = Translations.getStringResource(this, "reminder") + reminderTitle;
- if (textToSpeechService != null)
- {
- textToSpeechService.speak(toBeSaid, AudioManager.STREAM_ALARM);
- toBeSaid = null;
- }
- }
- else startAlarmSound(false);
- }
- public void onStopClick(View v)
- {
- finish();
- }
- public void onStop()
- {
- super.onStop();
- if (isFinishing()) {
- unbindService(textToSpeechServiceConnection);
- if (blinkingTextTimer != null) {
- blinkingTextTimer.cancel();
- blinkingTextTimer = null;
- }
- if (soundPool != null)
- {
- soundPool.stop(clockStreamID);
- soundPool.unload(clockSoundID);
- soundPool.release();
- soundPool = null;
- }
- }
- }
- }
|