Skip to content

Commit fdfd2d0

Browse files
authored
Add files via upload
1 parent 554912e commit fdfd2d0

File tree

6 files changed

+520
-78
lines changed

6 files changed

+520
-78
lines changed
15.8 KB
Binary file not shown.
Lines changed: 134 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,161 @@
11
package com.liang;
22

3+
import android.app.AlertDialog;
4+
import android.app.Notification;
5+
import android.app.NotificationManager;
6+
import android.app.PendingIntent;
37
import android.content.BroadcastReceiver;
48
import android.content.Context;
9+
import android.content.DialogInterface;
510
import android.content.Intent;
11+
import android.graphics.drawable.Drawable;
612
import android.media.MediaPlayer;
713
import android.media.RingtoneManager;
814
import android.net.Uri;
15+
import android.os.CountDownTimer;
16+
import android.os.Vibrator;
17+
import android.view.WindowManager;
918
import android.widget.Toast;
1019

1120
import com.facebook.common.util.UriUtil;
1221

1322
import java.io.IOException;
1423

24+
import static android.content.Context.NOTIFICATION_SERVICE;
25+
1526
/**
1627
* Created by GBLiang on 9/22/2017.
1728
*/
1829

1930
public class RNALarmCeiver extends BroadcastReceiver {
31+
32+
static MediaPlayer player = new MediaPlayer();
33+
34+
35+
2036
@Override
2137
public void onReceive(Context context, Intent intent) {
22-
Uri uri;
23-
String title = intent.getStringExtra(RNAlarmConstants.REACT_NATIVE_ALARM_TITLE);
24-
String musicUri = intent.getStringExtra(RNAlarmConstants.REACT_NATIVE_ALARM_MUSIC_URI);
25-
if(musicUri == null || "".equals(musicUri)){
26-
uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
27-
}else{
28-
uri = UriUtil.parseUriOrNull(musicUri);
38+
39+
if(intent.getExtras().getBoolean("stopNotification")) {
40+
if (player.isPlaying()) {
41+
player.stop();
42+
player.reset();
43+
}
2944
}
45+
else {
46+
47+
Uri uri;
48+
String title = intent.getStringExtra(RNAlarmConstants.REACT_NATIVE_ALARM_TITLE);
49+
String musicUri = intent.getStringExtra(RNAlarmConstants.REACT_NATIVE_ALARM_MUSIC_URI);
50+
if (musicUri == null || "".equals(musicUri)) {
51+
uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
52+
} else {
53+
uri = UriUtil.parseUriOrNull(musicUri);
54+
}
55+
56+
57+
//Toast.makeText(context,title,Toast.LENGTH_SHORT).show();
58+
59+
// AlertDialog.Builder normalDialog =
60+
// new AlertDialog.Builder(context);
61+
// normalDialog.setTitle(title);
62+
// normalDialog.setNegativeButton("关闭",
63+
// new DialogInterface.OnClickListener() {
64+
// @Override
65+
// public void onClick(DialogInterface dialog, int which) {
66+
// dialog.dismiss();
67+
// player.stop();
68+
// }
69+
// });
70+
//
71+
// AlertDialog dialog = normalDialog.create();
72+
// dialog.getWindow()
73+
// .setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
74+
// dialog.show();
75+
76+
PendingIntent pi = PendingIntent.getActivity(context, 100, intent, PendingIntent.FLAG_CANCEL_CURRENT);
77+
78+
Notification.Builder notificationBuilder = new Notification.Builder(context)
79+
.setSmallIcon(android.R.drawable.sym_def_app_icon)//设置小图标
80+
.setVibrate(new long[]{0,6000})
81+
.setContentTitle(title)
82+
.setContentText("闹钟");
83+
3084

31-
Toast.makeText(context,title,Toast.LENGTH_SHORT).show();
32-
33-
final MediaPlayer player = new MediaPlayer();
34-
try {
35-
player.setDataSource(context, uri);
36-
player.setLooping(true);
37-
player.prepareAsync();
38-
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
39-
@Override
40-
public void onPrepared(MediaPlayer mp) {
41-
player.start();
85+
Notification notification = notificationBuilder.build();
86+
notificationBuilder.setDefaults(Notification.DEFAULT_ALL);
87+
notificationBuilder.setFullScreenIntent(pi, true);
88+
notificationBuilder.setDeleteIntent(createOnDismissedIntent(context));
89+
notificationBuilder.setAutoCancel(true);
90+
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
91+
notificationManager.notify(0, notification);
92+
93+
94+
try {
95+
player.setDataSource(context, uri);
96+
player.setLooping(true);
97+
player.prepareAsync();
98+
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
99+
@Override
100+
public void onPrepared(MediaPlayer mp) {
101+
player.start();
102+
new CountDownTimer(50000, 10000) {
103+
public void onTick(long millisUntilFinished) {
104+
105+
}
106+
107+
public void onFinish() {
108+
if (player.isPlaying()) {
109+
player.stop();
110+
player.reset();
111+
}
112+
}
113+
}.start();
114+
}
115+
});
116+
117+
} catch (IOException e) {
118+
uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
119+
//e.printStackTrace();
120+
}
121+
122+
if (musicUri != null && !"".equals(musicUri)) {
123+
try {
124+
125+
player.setDataSource(context, uri);
126+
player.setLooping(true);
127+
player.prepareAsync();
128+
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
129+
@Override
130+
public void onPrepared(MediaPlayer mp) {
131+
player.start();
132+
new CountDownTimer(50000, 10000) {
133+
public void onTick(long millisUntilFinished) {
134+
135+
}
136+
137+
public void onFinish() {
138+
if (player.isPlaying()) {
139+
player.stop();
140+
player.reset();
141+
}
142+
}
143+
}.start();
144+
}
145+
});
146+
} catch (IOException e) {
147+
e.printStackTrace();
42148
}
43-
});
44-
} catch (IOException e) {
45-
e.printStackTrace();
149+
}
46150
}
47151
}
152+
153+
private PendingIntent createOnDismissedIntent(Context context) {
154+
Intent intent = new Intent(RNAlarmConstants.REACT_NATIVE_ALARM);
155+
intent.putExtra("stopNotification", true);
156+
PendingIntent pendingIntent =
157+
PendingIntent.getBroadcast(context,1, intent, 0);
158+
return pendingIntent;
159+
}
160+
48161
}

android/src/main/java/com/liang/RNAlarmModule.java

Lines changed: 135 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
import android.app.PendingIntent;
66
import android.content.Context;
77
import android.content.Intent;
8+
import android.content.SharedPreferences;
9+
import android.content.res.AssetFileDescriptor;
10+
import android.media.MediaPlayer;
811
import android.support.annotation.Nullable;
912
import android.support.v4.content.WakefulBroadcastReceiver;
13+
import android.text.format.DateFormat;
14+
import android.util.Log;
1015
import android.util.TimeUtils;
1116

1217
import com.facebook.react.bridge.Promise;
@@ -17,69 +22,177 @@
1722
import com.facebook.react.uimanager.IllegalViewOperationException;
1823

1924
import java.io.Console;
25+
import java.text.SimpleDateFormat;
26+
import java.util.Calendar;
27+
import java.util.Date;
2028

29+
import static android.R.attr.track;
2130
import static android.R.attr.type;
2231

2332
public class RNAlarmModule extends ReactContextBaseJavaModule {
2433

2534
private final ReactApplicationContext reactContext;
35+
private SharedPreferences sharedPreferences;
2636

2737
public RNAlarmModule(ReactApplicationContext reactContext) {
2838
super(reactContext);
2939
this.reactContext = reactContext;
40+
this.sharedPreferences = reactContext.getSharedPreferences(getName(),Context.MODE_PRIVATE);
3041
}
3142

3243
@Override
3344
public String getName() {
3445
return "RNAlarm";
3546
}
3647

48+
public Boolean getAlarmStatus(String triggerTime){
49+
String value = sharedPreferences.getString(triggerTime, null);
50+
if (value == null)
51+
return null;
52+
else {
53+
return value == "error" ? false : true;
54+
}
55+
}
56+
57+
public void setAlarm1(String triggerTime, String value){
58+
SharedPreferences.Editor editor = sharedPreferences.edit();
59+
editor.putString(triggerTime,value);
60+
editor.commit();
61+
}
62+
3763
@ReactMethod
38-
public void setAlarm(String triggerTime, String title, @Nullable String musicUri, @Nullable Callback successCallback, @Nullable Callback errorCallback) {
64+
public void playTipSound(String fileName){
65+
MediaPlayer mp = new MediaPlayer();
3966
try {
67+
if (mp.isPlaying()) {
68+
mp.stop();
69+
}
70+
if(mp!=null){
71+
mp.release();
72+
mp = new MediaPlayer();
73+
}
74+
AssetFileDescriptor descriptor = reactContext.getResources().getAssets().openFd(fileName + ".mp3");
75+
mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(),
76+
descriptor.getLength());
77+
mp.prepare();
78+
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
79+
@Override
80+
public void onPrepared(MediaPlayer mp) {
81+
mp.setLooping(false);
82+
mp.start();
83+
}
84+
});
85+
}catch(Exception ex){
86+
ex.printStackTrace();
87+
}
88+
89+
}
90+
91+
@ReactMethod
92+
public void initAlarm(@Nullable Callback successCallback){
93+
if(successCallback != null) {
94+
successCallback.invoke(true);
95+
}
96+
}
97+
98+
@ReactMethod
99+
public void clearAlarm(){
100+
SharedPreferences sharedPreferences = reactContext.getSharedPreferences(getName(),Context.MODE_PRIVATE);
101+
SharedPreferences.Editor editor = sharedPreferences.edit();
102+
editor.clear();
103+
}
104+
105+
@ReactMethod
106+
public void setAlarm(String triggerTime, String title, @Nullable String isRetry, @Nullable String musicUri, @Nullable Callback successCallback, @Nullable Callback errorCallback) {
107+
try {
108+
Boolean alarmStatus = getAlarmStatus(triggerTime);
109+
if(isRetry != null && !isRetry.isEmpty())
110+
setAlarm1(triggerTime,null);
111+
112+
if (alarmStatus != null)
113+
{
114+
if (alarmStatus) {
115+
successCallback.invoke();
116+
return;
117+
}else {
118+
errorCallback.invoke();
119+
return;
120+
}
121+
}
122+
40123
AlarmManager alarmManager = (AlarmManager) reactContext.getSystemService(Context.ALARM_SERVICE);
41124
Intent intent = new Intent(RNAlarmConstants.REACT_NATIVE_ALARM);
42125
intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_TITLE,title);
43126
intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_MUSIC_URI, musicUri);
44127
PendingIntent pendingIntent = PendingIntent.getBroadcast(reactContext, type, intent, PendingIntent.FLAG_UPDATE_CURRENT);
45128

46-
long startTime = Long.parseLong(triggerTime);
47-
alarmManager.setExact(AlarmManager.RTC_WAKEUP, startTime, pendingIntent);
48-
if(successCallback != null) {
129+
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
130+
131+
long triggerTimeMillis = Long.parseLong(triggerTime);
132+
Calendar originalTimeCal = Calendar.getInstance();
133+
originalTimeCal.setTimeInMillis(triggerTimeMillis);
134+
Log.w("originalTimeCal",formatter.format(originalTimeCal.getTime()));
135+
136+
Calendar currentTimeCal = Calendar.getInstance();
137+
currentTimeCal.setTime(new Date());
138+
Log.w("currentTimeCal",formatter.format(currentTimeCal.getTime()));
139+
140+
//compare alarm and currentTime
141+
if (triggerTimeMillis - currentTimeCal.getTimeInMillis() > 0)
142+
{
143+
Calendar calendar = Calendar.getInstance();
144+
calendar.setTimeInMillis(triggerTimeMillis);
145+
formatter.format(calendar.getTime());
146+
147+
148+
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTimeMillis, pendingIntent);
149+
setAlarm1(triggerTime,triggerTime);
150+
49151
successCallback.invoke();
152+
return;
153+
154+
}else {
155+
setAlarm1(triggerTime, "error");
156+
if (errorCallback != null) {
157+
// -1 闹钟时间设置不能在当前时间之前
158+
errorCallback.invoke("-1");
159+
return;
160+
}
50161
}
51162

52163
} catch (IllegalViewOperationException e) {
53164
if(errorCallback == null ){
54165
System.out.print(e.toString());
55166
}else{
167+
setAlarm1(triggerTime,"error");
56168
errorCallback.invoke(e.getMessage());
57169
}
58170
} catch (NumberFormatException e) {
59171
if(errorCallback == null ){
60172
System.out.print(e.toString());
61173
}else{
174+
setAlarm1(triggerTime,"error");
62175
errorCallback.invoke(e.getMessage());
63176
}
64177
}
65178
}
66179

67-
@ReactMethod
68-
public void setAlarm(String triggerTime, String title, @Nullable String musicUri, Promise promise) {
69-
try {
70-
AlarmManager alarmManager = (AlarmManager) reactContext.getSystemService(Context.ALARM_SERVICE);
71-
Intent intent = new Intent(RNAlarmConstants.REACT_NATIVE_ALARM);
72-
intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_TITLE,title);
73-
intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_MUSIC_URI, musicUri);
74-
PendingIntent pendingIntent = PendingIntent.getBroadcast(reactContext, type, intent, PendingIntent.FLAG_UPDATE_CURRENT);
75-
76-
long startTime = Long.parseLong(triggerTime);
77-
alarmManager.setExact(AlarmManager.RTC_WAKEUP, startTime, pendingIntent);
78-
promise.resolve(0);
79-
} catch (IllegalViewOperationException e) {
80-
promise.reject(e);
81-
} catch (NumberFormatException e) {
82-
promise.reject(e);
83-
}
84-
}
180+
// @ReactMethod
181+
// public void setAlarm(String triggerTime, String title, @Nullable String musicUri, Promise promise) {
182+
// try {
183+
// AlarmManager alarmManager = (AlarmManager) reactContext.getSystemService(Context.ALARM_SERVICE);
184+
// Intent intent = new Intent(RNAlarmConstants.REACT_NATIVE_ALARM);
185+
// intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_TITLE,title);
186+
// intent.putExtra(RNAlarmConstants.REACT_NATIVE_ALARM_MUSIC_URI, musicUri);
187+
// PendingIntent pendingIntent = PendingIntent.getBroadcast(reactContext, type, intent, PendingIntent.FLAG_UPDATE_CURRENT);
188+
//
189+
// long startTime = Long.parseLong(triggerTime);
190+
// alarmManager.setExact(AlarmManager.RTC_WAKEUP, startTime, pendingIntent);
191+
// promise.resolve(0);
192+
// } catch (IllegalViewOperationException e) {
193+
// promise.reject(e);
194+
// } catch (NumberFormatException e) {
195+
// promise.reject(e);
196+
// }
197+
// }
85198
}

0 commit comments

Comments
 (0)