Showing
3 changed files
with
76 additions
and
36 deletions
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> | 16 | <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> |
| 17 | <uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" /> | 17 | <uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" /> |
| 18 | <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" /> | 18 | <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" /> |
| 19 | + <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> | ||
| 19 | 20 | ||
| 20 | <application android:largeHeap="true"> | 21 | <application android:largeHeap="true"> |
| 21 | <!-- <meta-data--> | 22 | <!-- <meta-data--> | ... | ... |
| 1 | package ly.warp.sdk.activities; | 1 | package ly.warp.sdk.activities; |
| 2 | 2 | ||
| 3 | +import android.app.AlertDialog; | ||
| 3 | import android.content.Context; | 4 | import android.content.Context; |
| 5 | +import android.content.pm.PackageManager; | ||
| 6 | +import android.os.Build; | ||
| 4 | import android.os.Bundle; | 7 | import android.os.Bundle; |
| 5 | import android.view.MenuItem; | 8 | import android.view.MenuItem; |
| 6 | import android.widget.Toast; | 9 | import android.widget.Toast; |
| 7 | 10 | ||
| 8 | import androidx.annotation.NonNull; | 11 | import androidx.annotation.NonNull; |
| 12 | +import androidx.core.app.ActivityCompat; | ||
| 13 | +import androidx.core.content.ContextCompat; | ||
| 9 | import androidx.fragment.app.Fragment; | 14 | import androidx.fragment.app.Fragment; |
| 10 | import androidx.fragment.app.FragmentActivity; | 15 | import androidx.fragment.app.FragmentActivity; |
| 11 | 16 | ||
| ... | @@ -37,6 +42,7 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation | ... | @@ -37,6 +42,7 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation |
| 37 | 42 | ||
| 38 | private BottomNavigationView mBottomNavigationView; | 43 | private BottomNavigationView mBottomNavigationView; |
| 39 | private Fragment mFragmentToSet = null; | 44 | private Fragment mFragmentToSet = null; |
| 45 | + private static final int REQUEST_NOTIFICATION_PERMISSION = 5000; | ||
| 40 | 46 | ||
| 41 | // =========================================================== | 47 | // =========================================================== |
| 42 | // Methods for/from SuperClass/Interfaces | 48 | // Methods for/from SuperClass/Interfaces |
| ... | @@ -52,6 +58,12 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation | ... | @@ -52,6 +58,12 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation |
| 52 | WarplyManager.getUserCouponsWithCouponsets(mUserCouponsReceiver); | 58 | WarplyManager.getUserCouponsWithCouponsets(mUserCouponsReceiver); |
| 53 | WarplyManager.getCampaigns(mCampaignsCallback); | 59 | WarplyManager.getCampaigns(mCampaignsCallback); |
| 54 | WarplyManager.getUnifiedCouponsDeals(mUnifiedCallback); | 60 | WarplyManager.getUnifiedCouponsDeals(mUnifiedCallback); |
| 61 | + | ||
| 62 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { | ||
| 63 | + if (!hasNotificationPermission()) { | ||
| 64 | + requestNotificationPermission(); | ||
| 65 | + } | ||
| 66 | + } | ||
| 55 | } | 67 | } |
| 56 | 68 | ||
| 57 | @Override | 69 | @Override |
| ... | @@ -103,6 +115,18 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation | ... | @@ -103,6 +115,18 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation |
| 103 | super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)); | 115 | super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)); |
| 104 | } | 116 | } |
| 105 | 117 | ||
| 118 | + @Override | ||
| 119 | + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||
| 120 | + super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||
| 121 | + if (requestCode == REQUEST_NOTIFICATION_PERMISSION) { | ||
| 122 | + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||
| 123 | + Toast.makeText(BaseFragmentActivity.this, "Notifications Permission Granted", Toast.LENGTH_SHORT).show(); | ||
| 124 | + } else { | ||
| 125 | + Toast.makeText(BaseFragmentActivity.this, "Notifications Permission Denied", Toast.LENGTH_SHORT).show(); | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + } | ||
| 129 | + | ||
| 106 | // =========================================================== | 130 | // =========================================================== |
| 107 | // Methods | 131 | // Methods |
| 108 | // =========================================================== | 132 | // =========================================================== |
| ... | @@ -114,6 +138,24 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation | ... | @@ -114,6 +138,24 @@ public class BaseFragmentActivity extends FragmentActivity implements Navigation |
| 114 | mBottomNavigationView.setSelectedItemId(R.id.menu_home); | 138 | mBottomNavigationView.setSelectedItemId(R.id.menu_home); |
| 115 | } | 139 | } |
| 116 | 140 | ||
| 141 | + private boolean hasNotificationPermission() { | ||
| 142 | + return ContextCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + private void requestNotificationPermission() { | ||
| 146 | + if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.POST_NOTIFICATIONS)) { | ||
| 147 | + new AlertDialog.Builder(this) | ||
| 148 | + .setTitle("Notification Permission Needed") | ||
| 149 | + .setMessage("This app needs the Notification permission to keep you updated.") | ||
| 150 | + .setPositiveButton("OK", (dialog, which) -> ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICATION_PERMISSION)) | ||
| 151 | + .setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss()) | ||
| 152 | + .create() | ||
| 153 | + .show(); | ||
| 154 | + } else { | ||
| 155 | + ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICATION_PERMISSION); | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + | ||
| 117 | // =========================================================== | 159 | // =========================================================== |
| 118 | // Inner and Anonymous Classes | 160 | // Inner and Anonymous Classes |
| 119 | // =========================================================== | 161 | // =========================================================== | ... | ... |
| ... | @@ -14,6 +14,7 @@ import android.hardware.SensorEvent; | ... | @@ -14,6 +14,7 @@ import android.hardware.SensorEvent; |
| 14 | import android.hardware.SensorEventListener; | 14 | import android.hardware.SensorEventListener; |
| 15 | import android.hardware.SensorManager; | 15 | import android.hardware.SensorManager; |
| 16 | import android.os.Build; | 16 | import android.os.Build; |
| 17 | +import android.os.Handler; | ||
| 17 | import android.os.IBinder; | 18 | import android.os.IBinder; |
| 18 | 19 | ||
| 19 | import androidx.annotation.Nullable; | 20 | import androidx.annotation.Nullable; |
| ... | @@ -86,12 +87,10 @@ public class WarplyHealthService extends Service implements SensorEventListener | ... | @@ -86,12 +87,10 @@ public class WarplyHealthService extends Service implements SensorEventListener |
| 86 | 87 | ||
| 87 | mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); | 88 | mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); |
| 88 | mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); | 89 | mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); |
| 89 | -// registerStepSensor(); | ||
| 90 | Warply.getInitializer(getApplicationContext()).init(); | 90 | Warply.getInitializer(getApplicationContext()).init(); |
| 91 | WarplyManager.getPacingDetails(new PacingDetailsRequest(), mPacingCallback); | 91 | WarplyManager.getPacingDetails(new PacingDetailsRequest(), mPacingCallback); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | - // @RequiresApi(api = Build.VERSION_CODES.O) | ||
| 95 | @Override | 94 | @Override |
| 96 | public int onStartCommand(Intent intent, int flags, int startId) { | 95 | public int onStartCommand(Intent intent, int flags, int startId) { |
| 97 | NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); | 96 | NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
| ... | @@ -103,45 +102,59 @@ public class WarplyHealthService extends Service implements SensorEventListener | ... | @@ -103,45 +102,59 @@ public class WarplyHealthService extends Service implements SensorEventListener |
| 103 | b.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS); | 102 | b.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS); |
| 104 | b.setChannelId(STEPS_CHANNEL_ID); | 103 | b.setChannelId(STEPS_CHANNEL_ID); |
| 105 | b.setContentTitle(getString(R.string.cos_steps_for_good_notification_title)); | 104 | b.setContentTitle(getString(R.string.cos_steps_for_good_notification_title)); |
| 106 | -// b.setContentText(getString(R.string.cos_steps_for_good_notification_subtitle)); | ||
| 107 | b.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.cos_steps_for_good_notification_subtitle))); | 105 | b.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.cos_steps_for_good_notification_subtitle))); |
| 108 | b.setContentIntent(pbIntent); | 106 | b.setContentIntent(pbIntent); |
| 109 | - b.setAutoCancel(true); | 107 | + b.setAutoCancel(false); //it was true |
| 110 | b.setOngoing(true); | 108 | b.setOngoing(true); |
| 111 | -// b.setCategory(Notification.CATEGORY_SERVICE); | 109 | + b.setPriority(NotificationCompat.PRIORITY_HIGH); |
| 112 | b.setSmallIcon(R.drawable.ic_launcher); | 110 | b.setSmallIcon(R.drawable.ic_launcher); |
| 113 | 111 | ||
| 114 | if (notificationManager != null) { | 112 | if (notificationManager != null) { |
| 115 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { | 113 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { |
| 116 | - NotificationChannel notificationChannel = new NotificationChannel(STEPS_CHANNEL_ID, "steps_notification_channel", NotificationManager.IMPORTANCE_DEFAULT); | 114 | + NotificationChannel notificationChannel = new NotificationChannel(STEPS_CHANNEL_ID, "steps_notification_channel", NotificationManager.IMPORTANCE_HIGH); |
| 117 | notificationManager.createNotificationChannel(notificationChannel); | 115 | notificationManager.createNotificationChannel(notificationChannel); |
| 118 | Notification notification_build = b.setChannelId(STEPS_CHANNEL_ID).build(); | 116 | Notification notification_build = b.setChannelId(STEPS_CHANNEL_ID).build(); |
| 117 | + notification_build.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; | ||
| 119 | this.startForeground(2001, notification_build, ServiceInfo.FOREGROUND_SERVICE_TYPE_HEALTH); | 118 | this.startForeground(2001, notification_build, ServiceInfo.FOREGROUND_SERVICE_TYPE_HEALTH); |
| 120 | } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | 119 | } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
| 121 | - NotificationChannel notificationChannel = new NotificationChannel(STEPS_CHANNEL_ID, "steps_notification_channel", NotificationManager.IMPORTANCE_DEFAULT); | 120 | + NotificationChannel notificationChannel = new NotificationChannel(STEPS_CHANNEL_ID, "steps_notification_channel", NotificationManager.IMPORTANCE_HIGH); |
| 122 | notificationManager.createNotificationChannel(notificationChannel); | 121 | notificationManager.createNotificationChannel(notificationChannel); |
| 123 | Notification notification_build = b.setChannelId(STEPS_CHANNEL_ID).build(); | 122 | Notification notification_build = b.setChannelId(STEPS_CHANNEL_ID).build(); |
| 123 | + notification_build.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; | ||
| 124 | this.startForeground(2001, notification_build); | 124 | this.startForeground(2001, notification_build); |
| 125 | } else { | 125 | } else { |
| 126 | Notification notification_build = b.build(); | 126 | Notification notification_build = b.build(); |
| 127 | + notification_build.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; | ||
| 127 | this.startForeground(2001, notification_build); | 128 | this.startForeground(2001, notification_build); |
| 128 | } | 129 | } |
| 129 | } | 130 | } |
| 130 | 131 | ||
| 131 | - new Thread( | 132 | + /** Old Implementation */ |
| 132 | - () -> { | 133 | +// new Thread( |
| 133 | - while (true) { | 134 | +// () -> { |
| 134 | - sendSteps(); | 135 | +// while (true) { |
| 135 | - try { | 136 | +// sendSteps(); |
| 136 | - Thread.sleep(900000); | 137 | +// try { |
| 137 | - } catch (InterruptedException e) { | 138 | +// Thread.sleep(900000); |
| 138 | - e.printStackTrace(); | 139 | +// } catch (InterruptedException e) { |
| 139 | - } | 140 | +// e.printStackTrace(); |
| 140 | - } | 141 | +// } |
| 141 | - } | 142 | +// } |
| 142 | - ).start(); | 143 | +// } |
| 144 | +// ).start(); | ||
| 145 | + | ||
| 146 | + /** New Implementation */ | ||
| 147 | + // Use Handler instead of Thread for periodic tasks | ||
| 148 | + final Handler handler = new Handler(); | ||
| 149 | + Runnable runnable = new Runnable() { | ||
| 150 | + @Override | ||
| 151 | + public void run() { | ||
| 152 | + sendSteps(); | ||
| 153 | + handler.postDelayed(this, 900000); | ||
| 154 | + } | ||
| 155 | + }; | ||
| 156 | + handler.post(runnable); | ||
| 143 | 157 | ||
| 144 | -// return super.onStartCommand(intent, flags, startId); | ||
| 145 | return Service.START_STICKY; | 158 | return Service.START_STICKY; |
| 146 | } | 159 | } |
| 147 | 160 | ||
| ... | @@ -158,22 +171,6 @@ public class WarplyHealthService extends Service implements SensorEventListener | ... | @@ -158,22 +171,6 @@ public class WarplyHealthService extends Service implements SensorEventListener |
| 158 | sendSteps(); | 171 | sendSteps(); |
| 159 | } | 172 | } |
| 160 | 173 | ||
| 161 | -// @Override | ||
| 162 | -// public void onTaskRemoved(Intent rootIntent) { | ||
| 163 | -// Intent restartServiceIntent = new Intent(getApplicationContext(), WarplyHealthService.class); | ||
| 164 | -// restartServiceIntent.setPackage(getPackageName()); | ||
| 165 | -// | ||
| 166 | -// PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 2002, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); | ||
| 167 | -// AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); | ||
| 168 | -// alarmService.set( | ||
| 169 | -// AlarmManager.ELAPSED_REALTIME, | ||
| 170 | -// SystemClock.elapsedRealtime() + 1000, | ||
| 171 | -// restartServicePendingIntent | ||
| 172 | -// ); | ||
| 173 | -// | ||
| 174 | -// super.onTaskRemoved(rootIntent); | ||
| 175 | -// } | ||
| 176 | - | ||
| 177 | @Nullable | 174 | @Nullable |
| 178 | @Override | 175 | @Override |
| 179 | public IBinder onBind(Intent intent) { | 176 | public IBinder onBind(Intent intent) { | ... | ... |
-
Please register or login to post a comment