55import android .app .PendingIntent ;
66import android .content .Context ;
77import android .content .Intent ;
8+ import android .content .SharedPreferences ;
9+ import android .content .res .AssetFileDescriptor ;
10+ import android .media .MediaPlayer ;
811import android .support .annotation .Nullable ;
912import android .support .v4 .content .WakefulBroadcastReceiver ;
13+ import android .text .format .DateFormat ;
14+ import android .util .Log ;
1015import android .util .TimeUtils ;
1116
1217import com .facebook .react .bridge .Promise ;
1722import com .facebook .react .uimanager .IllegalViewOperationException ;
1823
1924import 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 ;
2130import static android .R .attr .type ;
2231
2332public 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