kbsintranett/app/src/main/java/com/kbs/kbsintranett/NotificationWorker.java

132 lines
No EOL
5.1 KiB
Java

package com.kbs.kbsintranett;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import retrofit2.Response;
public class NotificationWorker extends Worker {
private static final String TAG = "KBS_DEBUG";
public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.d(TAG, "NotificationWorker: Starter sjekk av kalender...");
try {
String url = CalendarManager.getGoogleCalendarUrl();
Response<GoogleCalendarModels.Response> response = RetrofitClient.getApiService().getDirectGoogleEvents(url).execute();
if (response.isSuccessful() && response.body() != null) {
List<CalendarEvent> events = CalendarManager.convertGoogleResponse(response.body());
scheduleAlarms(events);
return Result.success();
} else {
Log.e(TAG, "NotificationWorker: API-kall feilet. Kode: " + response.code());
return Result.retry();
}
} catch (IOException e) {
Log.e(TAG, "NotificationWorker: Nettverksfeil", e);
return Result.retry();
}
}
private void scheduleAlarms(List<CalendarEvent> events) {
Context context = getApplicationContext();
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!alarmManager.canScheduleExactAlarms()) {
Log.e(TAG, "NotificationWorker: MANGLER fortsatt tillatelse!");
return;
}
}
long now = System.currentTimeMillis();
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
int countSet = 0;
for (CalendarEvent event : events) {
try {
if (event.getRawDate().length() == 10) continue;
Date eventDate = null;
if (event.getRawDate().contains("T")) {
String raw = event.getRawDate();
if (raw.length() > 19) raw = raw.substring(0, 19);
eventDate = isoFormat.parse(raw);
}
if (eventDate == null) continue;
long triggerTime = eventDate.getTime() - (event.getReminderMinutes() * 60 * 1000L);
// --- DETALJERT LOGGING FOR Å FEILSØKE ---
if (event.getTitle().toLowerCase().contains("test")) {
Log.d(TAG, "SJEKKER TEST-EVENT:");
Log.d(TAG, " Start: " + eventDate);
Log.d(TAG, " Varsling valgt: " + event.getReminderMinutes() + " min før");
Log.d(TAG, " Alarmtid: " + new Date(triggerTime));
Log.d(TAG, " Nå: " + new Date(now));
if (triggerTime > now) {
Log.d(TAG, " Status: I FREMTIDEN (Alarm skal settes)");
} else {
Log.d(TAG, " Status: I FORTIDEN (Hoppes over)");
}
}
// ----------------------------------------
if (triggerTime > now && triggerTime < (now + 24 * 60 * 60 * 1000L)) {
String uniqueIdString = event.getTitle() + event.getRawDate();
int alarmId = uniqueIdString.hashCode();
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra("TITLE", event.getTitle());
intent.putExtra("MESSAGE", "Starter kl " + event.getTime());
intent.putExtra("ID", alarmId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
alarmId,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
} else {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
}
Log.i(TAG, ">>> ALARM SATT: " + event.getTitle());
countSet++;
}
} catch (Exception e) {
Log.e(TAG, "Feil ved behandling av event: " + event.getTitle(), e);
}
}
if (countSet == 0) {
Log.d(TAG, "Ingen nye alarmer satt (ingen hendelser innenfor neste 24t).");
}
}
}