GitNex-Android-App/app/src/main/java/org/mian/gitnex/notifications/Notifications.java

143 lines
4.5 KiB
Java

package org.mian.gitnex.notifications;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import androidx.core.app.NotificationManagerCompat;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.concurrent.TimeUnit;
import org.mian.gitnex.R;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB;
/**
* @author opyale
*/
public class Notifications {
public static int uniqueNotificationId(Context context) {
TinyDB tinyDB = TinyDB.getInstance(context);
int previousNotificationId = tinyDB.getInt("previousNotificationId", 0);
int nextPreviousNotificationId =
previousNotificationId == Integer.MAX_VALUE ? 0 : previousNotificationId + 1;
tinyDB.putInt("previousNotificationId", nextPreviousNotificationId);
return previousNotificationId;
}
public static void createChannels(Context context) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create new notification channels
NotificationChannel mainChannel =
new NotificationChannel(
Constants.mainNotificationChannelId,
context.getString(R.string.mainNotificationChannelName),
NotificationManager.IMPORTANCE_DEFAULT);
mainChannel.setDescription(
context.getString(R.string.mainNotificationChannelDescription));
NotificationChannel downloadChannel =
new NotificationChannel(
Constants.downloadNotificationChannelId,
context.getString(R.string.fileViewerNotificationChannelName),
NotificationManager.IMPORTANCE_LOW);
downloadChannel.setDescription(
context.getString(R.string.fileViewerNotificationChannelDescription));
notificationManager.createNotificationChannel(mainChannel);
notificationManager.createNotificationChannel(downloadChannel);
}
}
public static void stopWorker(Context context) {
WorkManager.getInstance(context).cancelAllWorkByTag(Constants.notificationsWorkerId);
}
public static void startWorker(Context context) {
TinyDB tinyDB = TinyDB.getInstance(context);
int delay;
if (tinyDB.getInt("notificationsPollingDelayId") == 0) {
delay = 15;
} else if (tinyDB.getInt("notificationsPollingDelayId") == 1) {
delay = 30;
} else if (tinyDB.getInt("notificationsPollingDelayId") == 2) {
delay = 45;
} else if (tinyDB.getInt("notificationsPollingDelayId") == 3) {
delay = 60;
} else {
delay = Constants.defaultPollingDelay;
}
if (tinyDB.getBoolean("notificationsEnabled", true)) {
if (!NotificationManagerCompat.from(context).areNotificationsEnabled()) {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(context)
.setTitle(R.string.pageTitleNotifications)
.setMessage(context.getString(R.string.openAppSettings))
.setNeutralButton(
R.string.cancelButton, (dialog, which) -> dialog.dismiss())
.setPositiveButton(
R.string.isOpen,
(dialog, which) -> {
Intent intent =
new Intent(
Settings
.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri =
Uri.fromParts(
"package",
context.getPackageName(),
null);
intent.setData(uri);
context.startActivity(intent);
});
materialAlertDialogBuilder.create().show();
return;
}
Constraints.Builder constraints =
new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(false)
.setRequiresStorageNotLow(false)
.setRequiresCharging(false);
constraints.setRequiresDeviceIdle(false);
PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(
NotificationsWorker.class, delay, TimeUnit.MINUTES)
.setConstraints(constraints.build())
.addTag(Constants.notificationsWorkerId)
.build();
WorkManager.getInstance(context)
.enqueueUniquePeriodicWork(
Constants.notificationsWorkerId,
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
periodicWorkRequest);
}
}
}