package ml.docilealligator.infinityforreddit.settings; import android.Manifest; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.view.View; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.preference.ListPreference; import androidx.preference.SwitchPreference; import androidx.work.Constraints; import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.NetworkType; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Named; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.worker.PullNotificationWorker; import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.customviews.CustomFontPreferenceFragmentCompat; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; /** * A simple {@link Fragment} subclass. */ public class NotificationPreferenceFragment extends CustomFontPreferenceFragmentCompat { @Inject @Named("default") SharedPreferences sharedPreferences; @Inject @Named("internal") SharedPreferences mInternalSharedPreferences; private boolean enableNotification; private long notificationInterval; private WorkManager workManager; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.notification_preferences, rootKey); workManager = WorkManager.getInstance(activity); ((Infinity) activity.getApplication()).getAppComponent().inject(this); SwitchPreference enableNotificationSwitchPreference = findPreference(SharedPreferencesUtils.ENABLE_NOTIFICATION_KEY); ListPreference notificationIntervalListPreference = findPreference(SharedPreferencesUtils.NOTIFICATION_INTERVAL_KEY); enableNotification = sharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_NOTIFICATION_KEY, true); notificationInterval = Long.parseLong(sharedPreferences.getString(SharedPreferencesUtils.NOTIFICATION_INTERVAL_KEY, "1")); if (enableNotification) { if (notificationIntervalListPreference != null) { notificationIntervalListPreference.setVisible(true); } } if (enableNotificationSwitchPreference != null) { enableNotificationSwitchPreference.setOnPreferenceChangeListener((preference, newValue) -> { enableNotification = ((Boolean) newValue); if (notificationIntervalListPreference != null) { notificationIntervalListPreference.setVisible(enableNotification); } if (enableNotification) { TimeUnit timeUnit = (notificationInterval == 15 || notificationInterval == 30) ? TimeUnit.MINUTES : TimeUnit.HOURS; Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build(); PeriodicWorkRequest pullNotificationRequest = new PeriodicWorkRequest.Builder(PullNotificationWorker.class, notificationInterval, timeUnit) .setConstraints(constraints) .setInitialDelay(notificationInterval, timeUnit) .build(); workManager.enqueueUniquePeriodicWork(PullNotificationWorker.UNIQUE_WORKER_NAME, ExistingPeriodicWorkPolicy.REPLACE, pullNotificationRequest); } else { workManager.cancelUniqueWork(PullNotificationWorker.UNIQUE_WORKER_NAME); } return true; }); } if (notificationIntervalListPreference != null) { notificationIntervalListPreference.setOnPreferenceChangeListener((preference, newValue) -> { notificationInterval = Long.parseLong((String) newValue); if (enableNotification) { TimeUnit timeUnit = (notificationInterval == 15 || notificationInterval == 30) ? TimeUnit.MINUTES : TimeUnit.HOURS; Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build(); PeriodicWorkRequest pullNotificationRequest = new PeriodicWorkRequest.Builder(PullNotificationWorker.class, notificationInterval, timeUnit) .setConstraints(constraints) .setInitialDelay(notificationInterval, timeUnit) .build(); workManager.enqueueUniquePeriodicWork(PullNotificationWorker.UNIQUE_WORKER_NAME, ExistingPeriodicWorkPolicy.REPLACE, pullNotificationRequest); } else { workManager.cancelUniqueWork(PullNotificationWorker.UNIQUE_WORKER_NAME); } return true; }); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { ActivityResultLauncher requestNotificationPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> { mInternalSharedPreferences.edit().putBoolean(SharedPreferencesUtils.HAS_REQUESTED_NOTIFICATION_PERMISSION, true).apply(); if (!result) { activity.showSnackbar(R.string.denied_notification_permission, R.string.go_to_settings, new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", activity.getPackageName(), null); intent.setData(uri); startActivity(intent); } }); } }); if (ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { requestNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS); } } } }