Skip to content

Commit

Permalink
Merge pull request Yink#44 from RIP95/master
Browse files Browse the repository at this point in the history
When things get complicated... REFACTOR!
  • Loading branch information
Yink authored Mar 26, 2017
2 parents 4800400 + 151a2bd commit f94bcb9
Show file tree
Hide file tree
Showing 14 changed files with 275 additions and 146 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ android {
minSdkVersion 9
targetSdkVersion 20
versionCode 1
versionName "0.9.5-alpha.3"
versionName "0.9.5-test.2"
}
buildTypes {
release {
Expand Down
10 changes: 8 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
android:allowBackup="true"
Expand Down Expand Up @@ -54,9 +55,14 @@
<service
android:name=".AlarmService"
android:enabled="true" />
<receiver android:name=".AlarmReceiver">
<receiver android:name=".AlarmReceiver" />
<receiver
android:name=".AlarmBootReceiver"
android:enabled="true"
android:exported="true"
android:label="AlarmBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
Expand Down
104 changes: 104 additions & 0 deletions app/src/main/java/com/example/yink/amadeus/Alarm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.example.yink.amadeus;

import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.PowerManager;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;

class Alarm {

private static MediaPlayer m;
private static SharedPreferences settings;
private static Vibrator v;

static final int ALARM_ID = 104859;
static final int ALARM_NOTIFICATION_ID = 102434;

private static final String TAG = "Alarm";
private static boolean isPlaying = false;
private static PowerManager.WakeLock sCpuWakeLock;

static void start(Context context, int ringtone) {

acquireCpuWakeLock(context);

settings = PreferenceManager.getDefaultSharedPreferences(context);

if (settings.getBoolean("vibrate", false)) {
v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
long[] pattern = {500, 2000};
v.vibrate(pattern, 0);
}

m = MediaPlayer.create(context, ringtone);

m.setLooping(true);
m.start();

if (m.isPlaying()) {
isPlaying = true;
}

Log.d(TAG, "Start");

}

static void cancel(Context context) {

settings = PreferenceManager.getDefaultSharedPreferences(context);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, ALARM_ID, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

if (isPlaying) {
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("alarm_toggle", false);
editor.apply();
m.release();
notificationManager.cancel(ALARM_NOTIFICATION_ID);
alarmManager.cancel(pendingIntent);
releaseCpuLock();
isPlaying = false;
if (v != null) {
v.cancel();
}
}

Log.d(TAG, "Cancel");

}

static boolean isPlaying() {
return isPlaying;
}

private static void acquireCpuWakeLock(Context context) {
if (sCpuWakeLock != null) {
return;
}

PowerManager pm =
(PowerManager) context.getSystemService(Context.POWER_SERVICE);
sCpuWakeLock = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, TAG);
sCpuWakeLock.acquire();
}

private static void releaseCpuLock() {
if (sCpuWakeLock != null) {
sCpuWakeLock.release();
sCpuWakeLock = null;
}
}

}
60 changes: 35 additions & 25 deletions app/src/main/java/com/example/yink/amadeus/AlarmActivity.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.example.yink.amadeus;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TimePicker;
Expand All @@ -17,21 +17,15 @@

import java.util.Calendar;

public class AlarmActivity extends Activity {
public class AlarmActivity extends AppCompatActivity {

final String TAG = "Amadeus.Alarm";
AlarmManager alarmManager;
PendingIntent pendingIntent;
TimePicker alarmTimePicker;
ToggleButton alarmToggle;
public static final int alarmCode = 104856;
SharedPreferences settings;
SharedPreferences.Editor editor;
private final String TAG = "AlarmActivity";

@Override
public void onStart() {
super.onStart();
}
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
private TimePicker alarmTimePicker;
private ToggleButton alarmToggle;
private SharedPreferences settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -41,8 +35,9 @@ protected void onCreate(Bundle savedInstanceState) {
alarmTimePicker = (TimePicker) findViewById(R.id.alarmTimePicker);
alarmToggle = (ToggleButton) findViewById(R.id.alarmToggle);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, alarmCode, alarmIntent, PendingIntent.FLAG_NO_CREATE);
pendingIntent = PendingIntent.getBroadcast(this, Alarm.ALARM_ID, new Intent(this, AlarmReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT);

alarmTimePicker.setIs24HourView(settings.getBoolean("24-hour_format", true));

if (settings.getBoolean("alarm_toggle", false)) {
alarmToggle.setChecked(true);
Expand All @@ -52,40 +47,55 @@ protected void onCreate(Bundle savedInstanceState) {
}

public void onToggleClicked(View view) {
editor = settings.edit();
SharedPreferences.Editor editor = settings.edit();

if (alarmToggle.isChecked()) {
editor.putBoolean("alarm_toggle", true);
Calendar calendar = Calendar.getInstance();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.d(TAG, "Current API functions have been executed");
setTime(calendar);
setTime(calendar, editor);
} else {
Log.d(TAG, "Legacy API functions have been executed");
setTimeLegacy(calendar);
setTimeLegacy(calendar, editor);
}

Log.d(TAG, "Alarm On");
} else {
AlarmReceiver.stopRingtone(this);
Alarm.cancel(this);

editor.putBoolean("alarm_toggle", false);
alarmManager.cancel(pendingIntent);
Log.d(TAG, "Alarm Off");
}
editor.apply();
}

@SuppressWarnings("deprecation")
public void setTimeLegacy(Calendar calendar) {
private void setTimeLegacy(Calendar calendar, SharedPreferences.Editor editor) {
calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute());

if (calendar.before(Calendar.getInstance())) {
calendar.add(Calendar.DATE, 1);
}

alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(this, "Alarm has been set for " + alarmTimePicker.getCurrentHour() + " hour(s) " + alarmTimePicker.getCurrentHour() + " minute(s)", Toast.LENGTH_SHORT).show();
editor.putLong("alarm_time", calendar.getTimeInMillis());
Toast.makeText(this, "Alarm has been set for " + alarmTimePicker.getCurrentHour() + " hour(s) " + alarmTimePicker.getCurrentMinute() + " minute(s)", Toast.LENGTH_SHORT).show();
}

@TargetApi(Build.VERSION_CODES.M)
public void setTime(Calendar calendar) {
private void setTime(Calendar calendar, SharedPreferences.Editor editor) {
calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getHour());
calendar.set(Calendar.MINUTE, alarmTimePicker.getMinute());

if (calendar.before(Calendar.getInstance())) {
calendar.add(Calendar.DATE, 1);
}

alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
editor.putLong("alarm_time", calendar.getTimeInMillis());
Toast.makeText(this, "Alarm has been set for " + alarmTimePicker.getHour() + " hour(s) " + alarmTimePicker.getMinute() + " minute(s)", Toast.LENGTH_SHORT).show();
}
}
38 changes: 38 additions & 0 deletions app/src/main/java/com/example/yink/amadeus/AlarmBootReceiver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.example.yink.amadeus;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.util.Log;

public class AlarmBootReceiver extends WakefulBroadcastReceiver {

final String TAG = "AlarmBootReceiver";

@Override
public void onReceive(Context context, Intent intent) {

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);

if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())
&& settings.getBoolean("alarm_toggle", false)) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
Alarm.ALARM_ID, new Intent(context, AlarmReceiver.class), 0);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent);
}
Log.d(TAG, "Alarm has been recovered");
}

}
}
43 changes: 12 additions & 31 deletions app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java
Original file line number Diff line number Diff line change
@@ -1,60 +1,41 @@
package com.example.yink.amadeus;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.preference.PreferenceManager;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.util.Log;

public class AlarmReceiver extends WakefulBroadcastReceiver {
public class AlarmReceiver extends BroadcastReceiver {

static MediaPlayer m;
static boolean isPlaying = false;
static SharedPreferences settings;
static SharedPreferences.Editor editor;
private final String TAG = "AlarmReceiver";

@Override
public void onReceive(Context context, Intent intent) {

Log.d(TAG, "Broadcast received!");

int[] ringtones = {
R.raw.ringtone_gate_of_steiner, R.raw.ringtone_village,
R.raw.ringtone_beginning_of_fight, R.raw.ringtone_easygoingness,
R.raw.ringtone_reunion, R.raw.ringtone_precaution,
R.raw.ringtone_over_the_sky
};

settings = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
int index = Integer.parseInt(settings.getString("ringtone", "0"));

m = MediaPlayer.create(context, ringtones[index]);

m.setLooping(true);
m.start();
Log.d(TAG, "Starting alarm...");

if (m.isPlaying()) {
isPlaying = true;
}
Alarm.start(context, ringtones[index]);

ComponentName comp = new ComponentName(context.getPackageName(),
AlarmService.class.getName());
startWakefulService(context, (intent.setComponent(comp)));
Intent service = new Intent(context, AlarmService.class);
context.startService(service);
setResultCode(Activity.RESULT_OK);
}

public static void stopRingtone(Context context) {
settings = PreferenceManager.getDefaultSharedPreferences(context);
if (isPlaying) {
editor = settings.edit();
editor.putBoolean("alarm_toggle", false);
editor.apply();
m.release();
isPlaying = false;
}
}

public static boolean isPlaying() {
return isPlaying;
}
}
Loading

0 comments on commit f94bcb9

Please sign in to comment.