From 8d10e9115a327e7ceb30b18e5d46d9e71589c719 Mon Sep 17 00:00:00 2001 From: jacques Date: Fri, 11 Sep 2020 17:21:01 +0200 Subject: [PATCH] End merge feature/fixNotification --- .../pilldroid/MedicamentListActivity.java | 33 ++++- .../foucry/pilldroid/PillDroidJobService.java | 132 +++++++++++++++--- app/src/main/res/values-fr-rFR/strings.xml | 12 +- app/src/main/res/values/strings.xml | 3 +- 4 files changed, 149 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java index 6a9daee..3ed013e 100644 --- a/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java +++ b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java @@ -1,6 +1,9 @@ package net.foucry.pilldroid; import android.app.NotificationManager; +import android.app.job.JobInfo; +import android.app.job.JobScheduler; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -38,7 +41,7 @@ import java.util.Locale; import static net.foucry.pilldroid.UtilDate.date2String; import static net.foucry.pilldroid.Utils.intRandomExclusive; -import net.foucry.pilldroid.PillDroidJobService; + /** * An activity representing a list of Medicaments. This activity * has different presentations for handset and tablet-size devices. On @@ -216,11 +219,13 @@ public class MedicamentListActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } - public void onPause() { super.onPause(); + scheduleJob(); + } - (); + public void onResume() { + super.onResume(); } /** scanNow @@ -360,6 +365,28 @@ public class MedicamentListActivity extends AppCompatActivity { mAdapter.addItem(med); dbHelper.addDrug(med); } + public void scheduleJob() { + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + + ComponentName componentName = new ComponentName(this, PillDroidJobService.class); + JobInfo info = new JobInfo.Builder(24560, componentName) + .setPersisted(true) + .setPeriodic(15 *60 *1000) + .build(); + JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); + int resultCode = scheduler.schedule(info); + if (resultCode == JobScheduler.RESULT_SUCCESS) { + Log.d(TAG, ("Job scheduled " + UtilDate.convertDate(now.getTime()+15 * 60*1000))); + } else { + Log.d(TAG, "Job scheduling failed"); + } + } + public void cancelJob(View v) { + JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); + scheduler.cancel(24560); + Log.d(TAG, "Job cancelled"); + } private void setupRecyclerView(@NonNull RecyclerView recyclerView) { recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getApplicationContext())); diff --git a/app/src/main/java/net/foucry/pilldroid/PillDroidJobService.java b/app/src/main/java/net/foucry/pilldroid/PillDroidJobService.java index ae6a156..2793ae0 100644 --- a/app/src/main/java/net/foucry/pilldroid/PillDroidJobService.java +++ b/app/src/main/java/net/foucry/pilldroid/PillDroidJobService.java @@ -1,42 +1,134 @@ package net.foucry.pilldroid; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.app.job.JobParameters; import android.app.job.JobService; -import android.os.Handler; -import android.os.Message; +import android.icu.util.Calendar; import android.util.Log; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +import java.util.Date; +import java.util.List; + /** * Created by jacques on 17/09/16. */ + public class PillDroidJobService extends JobService { - private static final String TAG = "JobService"; + private static final String TAG = JobService.class.getName(); + private boolean jobCancelled = false; + private String CHANNEL_ID = "pillDroid"; + private DBHelper dbHelper = new DBHelper(this); - private Handler mJobHandler = new Handler(new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { -// Toast.makeText( getApplicationContext(), "PillDroid - Calcul nouveau stocks", Toast.LENGTH_SHORT).show(); -// MedicamentListActivity.newStockCalculation(getApplicationContext()); - - jobFinished( (JobParameters) msg.obj,false); - return true; - } - }); @Override - public boolean onStartJob (JobParameters params) { - Log.i(TAG, "on Start Job: " + params.getJobId()); - mJobHandler.sendMessage(Message.obtain(mJobHandler, 1,params)); - return false; + public boolean onStartJob(JobParameters params) { + Log.d(TAG, "Job started"); + createNotificationChannel(); + doBackgroundWork(params); + + return true; } + /** + * Grab sorted list of medicaments + * test dateAlert of the first of the list + * if dateAlert < now + * schedule notification + * @param JobParameters params + */ + private void doBackgroundWork(final JobParameters params) { + + if (jobCancelled) { + return; + } + List medicaments = dbHelper.getAllDrugs(); + + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + + long dateSchedule; + + Medicament firstMedicament = null; + + try { + firstMedicament = medicaments.get(0); + } + catch (Exception ignored){} + + if (firstMedicament != null) { + Date dateAlert = UtilDate.removeDaysToDate(firstMedicament.getAlertThreshold(), firstMedicament.getDateEndOfStock()); + + if (dateAlert.getTime() < now.getTime()) { + dateSchedule = now.getTime() + 120000; // If dateAlert < now we schedule an alert for now + 120 seconds + } else { + dateSchedule = dateAlert.getTime(); // If dateAlert > now we use dateAlert as scheduleDate + } + + long delay = dateSchedule - now.getTime(); + scheduleNotification(delay); + } + + Log.d(TAG, "Job finished"); + jobFinished(params, false); + } + + @Override public boolean onStopJob(JobParameters params) { - mJobHandler.removeMessages(1); - return false; + Log.d(TAG, "Job cancelled before completion"); + jobCancelled = true; + return true; } + /** + * Schedule Notification for the delay + * @param Context context + * @param long delay - date for the notification in millisecond + */ + private void scheduleNotification(long delay) { + Log.d(TAG, "scheduleNotification delay == " + delay); + createNotificationChannel(); + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_pill) + .setContentTitle(getString(R.string.app_name)) + .setContentText(getString(R.string.notification_text)) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setAutoCancel(true); -} + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); + int notificationId = 666; + notificationManager.notify(notificationId, builder.build()); + } + + /** + * createNotificationChannelid for android API >= 28 + */ + private void createNotificationChannel() { + + Log.d(TAG, "start create notification channel"); + CharSequence name = getString(R.string.channel_name); + String description = getString(R.string.channel_description); + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); + channel.setDescription(description); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = getSystemService(NotificationManager.class); + try { + notificationManager.createNotificationChannel(channel); + } catch (Exception e) { + // This will catch any exception, because they are all descended from Exception + Log.e(TAG, e.toString()); + //At the level Exception Class handle the error in Exception Table + // Exception Create That Error Object and throw it + //E.g: FileNotFoundException ,etc + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 1819058..bc93f2d 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -21,11 +21,9 @@ Utilisez le clavier Vue de détail Scanner un code barre de médicament - Save - Allumez/Eteindre le Flash - Entrez le code CIP 13 ici… + Enrefistrez + Allumez/Éteignez le Flash + Enter cip 13 here.. Enter CIP 13 - Saisissez le code CIP13 avec le clavier - Vous devez passer à la pharmacie - - + Saissisez le code CIP 13 à l\'aide du clavier + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8bd45a8..efafef6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,5 +25,6 @@ Toggle Flash Enter cip 13 here.. Enter CIP 13 - PillDroid Channel + PillDroid_NotificationChannel + PillDroidChannel