@@ -9,29 +9,32 @@ import android.content.BroadcastReceiver
99import android.content.Context
1010import android.content.Intent
1111import android.content.IntentFilter
12- import android.content.pm.PackageManager
1312import android.graphics.Color
13+ import android.icu.text.SimpleDateFormat
14+ import android.icu.util.Calendar
1415import android.os.Build
1516import android.os.CountDownTimer
17+ import android.os.Handler
18+ import android.os.SystemClock
1619import android.util.Log
1720import android.view.View
1821import android.widget.RemoteViews
1922import androidx.core.app.NotificationCompat
20- import com.facebook.react.bridge.Callback
23+ import com.facebook.react.bridge.Arguments
2124import com.facebook.react.bridge.ReactApplicationContext
2225import com.facebook.react.bridge.ReactContextBaseJavaModule
2326import com.facebook.react.bridge.ReactMethod
2427import com.facebook.react.bridge.ReadableMap
28+ import com.facebook.react.bridge.WritableMap
2529import com.facebook.react.modules.core.DeviceEventManagerModule
26- import org.json.JSONObject
27- import com.facebook.react.bridge.WritableMap;
28- import com.facebook.react.bridge.Arguments;
30+ import java.util.*
31+ import kotlin.time.milliseconds
2932
3033
3134class CustomTimerNotificationModule : ReactContextBaseJavaModule {
3235 var loading : Boolean = false ;
33- var firstForegound : Boolean = true ;
34- var ifCancel = false ;
36+ var foregound : Boolean = false ;
37+
3538 lateinit var notificationManager: NotificationManager
3639 lateinit var builder: Notification .Builder
3740 val channelId: String = " 255"
@@ -47,13 +50,13 @@ class CustomTimerNotificationModule: ReactContextBaseJavaModule {
4750 myContext.registerReceiver(object : BroadcastReceiver () {
4851 override fun onReceive (context : Context , intent : Intent ) {
4952 try {
50-
51- ifCancel = true
5253 val extras = intent.extras
5354 val params: WritableMap = Arguments .createMap()
5455 params.putInt(" id" , extras!! .getInt(" id" ))
5556 params.putString(" action" , extras!! .getString(" action" ))
5657 params.putString(" payload" , extras!! .getString(" payload" ))
58+ removeNotification(extras!! .getInt(" id" ),foregound)
59+
5760 sendEvent(" notificationClick" , params)
5861 } catch (e: Exception ) {
5962 println (e)
@@ -87,6 +90,17 @@ class CustomTimerNotificationModule: ReactContextBaseJavaModule {
8790 val payload = objectData.getString(" payload" );
8891 val id = objectData.getInt(" id" );
8992
93+ val datetime = objectData.getString(" date" )
94+ val sdf = SimpleDateFormat (" dd-MM-yyyy HH:mm:ss" , Locale .ENGLISH )
95+
96+ val startTime = SystemClock .elapsedRealtime()
97+ val endTime: Calendar = Calendar .getInstance()
98+ endTime.time = sdf.parse(datetime)
99+
100+ val now = Date ()
101+ val elapsed: Long = now.getTime() - endTime.timeInMillis
102+ val remainingTime = startTime - elapsed
103+
90104 val intent = Intent (myContext, NotificationEventReceiver ::class .java)
91105 intent.flags = Intent .FLAG_ACTIVITY_CLEAR_TOP or Intent .FLAG_ACTIVITY_NEW_TASK
92106 intent.putExtra(" id" ,id);
@@ -104,17 +118,16 @@ class CustomTimerNotificationModule: ReactContextBaseJavaModule {
104118 val notificationLayout = RemoteViews (packageName, R .layout.notification_open);
105119 notificationLayout.setTextViewText(R .id.title,title)
106120 notificationLayout.setTextViewText(R .id.text,body)
107- notificationLayout.setTextViewText(R .id.timer,remainingTime)
121+
122+ // notificationLayout.setTextViewText(R.id.timer,remainingTime)
123+ notificationLayout.setChronometerCountDown(R .id.simpleChronometer, true );
124+ notificationLayout.setChronometer(R .id.simpleChronometer, remainingTime, (" %sM:%sS" ), true );
125+
108126
109127// try {
110128// notificationLayout.setTextColor(R.id.timer , Color.parseColor(objectData.getString("timeColor")));
111129// } catch (e:Exception){}
112130
113- if (visbleTimer){
114- notificationLayout.setViewVisibility (R .id.timer,
115- View .INVISIBLE )
116- }
117-
118131 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
119132 val notificationChannel =
120133 NotificationChannel (channelId, " Timer" , NotificationManager .IMPORTANCE_HIGH )
@@ -127,7 +140,6 @@ class CustomTimerNotificationModule: ReactContextBaseJavaModule {
127140 val notificationBuilder: NotificationCompat .Builder =
128141 NotificationCompat .Builder (myContext,channelId)
129142 notificationBuilder.setAutoCancel(true )
130- .setWhen(System .currentTimeMillis())
131143 .setSmallIcon(myContext.getResources().getIdentifier(" ic_launcher" , " mipmap" , myContext.getPackageName()))
132144 .setContentTitle(title)
133145 .setContentText(body)
@@ -137,70 +149,54 @@ class CustomTimerNotificationModule: ReactContextBaseJavaModule {
137149 .setContentIntent(pendingIntent)
138150 .setDeleteIntent(onDismissPendingIntent)
139151 .setPriority(NotificationCompat .PRIORITY_HIGH )
140- return notificationBuilder
152+ .setWhen(endTime.getTimeInMillis());
153+ val handler = Handler ()
154+ handler.postDelayed({
155+ notificationLayout.setChronometer(R .id.simpleChronometer, remainingTime, (" %sM:%sS" ), false );
156+ try {
157+ val remove = objectData.getBoolean(" remove" );
158+ val foreground = objectData.getBoolean(" foreground" );
159+ if (remove){
160+ removeNotification(id,foreground)
161+ } else {
162+ notificationLayout.setViewVisibility (R .id.simpleChronometer,
163+ View .INVISIBLE )
164+ }
165+ } catch (e: Exception ){}
141166
167+ notificationBuilder.setCustomContentView(notificationLayout)
168+ notificationManager.notify(id,notificationBuilder.build())
169+ }, Math .abs(elapsed))
170+ return notificationBuilder
142171 }
172+
143173fun updatePop (objectData : ReadableMap ,remainingTime : String ,visbleTimer : Boolean ){
144174 val id = objectData.getInt(" id" );
145175 val notificationBuilder: NotificationCompat .Builder = notificationPop(objectData,remainingTime,visbleTimer)
146176 notificationManager.notify(id,notificationBuilder.build())
147177}
148178 fun removeNotification (id : Int ,foreground : Boolean ) {
149-
150179 val notificationManager = myContext.getSystemService(NotificationManager ::class .java)
151180 if (foreground)
152181 ForegroundService .stopService(myContext)
153182 else
154183 notificationManager.cancel( id ) ;
155184 }
156- fun countdown (objectData : ReadableMap ,sec : Int ) {
157- val secLong = sec.toLong()* 1000 ;
158- val id = objectData.getInt(" id" );
159- val foreground = objectData.getBoolean(" foreground" );
160-
161- object : CountDownTimer (secLong, 1000 ) {
162- override fun onTick (millisUntilFinished : Long ) {
163- val remainingSec: Int = (millisUntilFinished / 1000 ).toInt()
164- val min = convert((remainingSec/ 60 ).toInt().toString())
165- val secInMin = convert((remainingSec% 60 ).toInt().toString())
166- val remainingTime: String = " $min : $secInMin "
167- if (ifCancel){
168- cancel();
169- if (foreground){
170- ForegroundService .stopService(myContext)
171- }
172- }
173- else {
174- if (foreground&& firstForegound){
175- firstForegound= false
176- ForegroundService .startService(myContext,objectData,remainingTime)
177- } else
178- updatePop(objectData,remainingTime,false )
185+ @ReactMethod
186+ fun TimerNotification (objectData : ReadableMap ) {
179187
180- }
181- }
188+ val remainingSec: Int = (10000 / 1000 ).toInt()
189+ val min = convert((remainingSec/ 60 ).toInt().toString())
190+ val secInMin = convert((remainingSec% 60 ).toInt().toString())
191+ val remainingTime: String = " $min : $secInMin "
182192
183- override fun onFinish () {
184- try {
185- val remove = objectData.getBoolean(" remove" );
186- if (remove){
187- removeNotification(id,foreground)
188- } else {
189- println (" onFinish" )
190- updatePop(objectData," " ,true )
191- }
192- } catch (e: Exception ){}
193+ val foreground = objectData.getBoolean(" foreground" );
193194
194- }
195- }.start()
196- }
197-
198- @ReactMethod
199- fun TimerNotification (objectData : ReadableMap ) {
200- firstForegound= true ;
201- ifCancel = false ;
202- val sec = objectData.getInt(" sec" );
203- countdown(objectData,sec)
195+ if (foreground){
196+ foregound= true ;
197+ ForegroundService .startService(myContext,objectData)
198+ } else
199+ updatePop(objectData,remainingTime,false )
204200 // promise.resolve(a * b)
205201
206202 }
0 commit comments