/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.calendar.alerts import android.app.Notification import android.app.NotificationManager import android.app.Service import android.content.Intent import android.os.IBinder import android.os.Looper import android.provider.CalendarContract.CalendarAlerts import java.util.ArrayList /** * This service is used to handle calendar event reminders. */ class AlertService : Service() { @Volatile private var mServiceLooper: Looper? = null // Added wrapper for testing class NotificationWrapper { var mNotification: Notification var mEventId: Long = 0 var mBegin: Long = 0 var mEnd: Long = 0 var mNw: ArrayList? = null constructor( n: Notification, notificationId: Int, eventId: Long, startMillis: Long, endMillis: Long, doPopup: Boolean ) { mNotification = n mEventId = eventId mBegin = startMillis mEnd = endMillis // popup? // notification id? } constructor(n: Notification) { mNotification = n } fun add(nw: NotificationWrapper?) { val temp = mNw if (temp == null) { mNw = ArrayList() } mNw?.add(nw as AlertService.NotificationWrapper) } } // Added wrapper for testing class NotificationMgrWrapper(nm: NotificationManager) : NotificationMgr() { var mNm: NotificationManager @Override override fun cancel(id: Int) { mNm.cancel(id) } @Override override fun notify(id: Int, nw: NotificationWrapper?) { mNm.notify(id, nw?.mNotification) } init { mNm = nm } } internal class NotificationInfo( var eventName: String, var location: String, var description: String, var startMillis: Long, var endMillis: Long, var eventId: Long, var allDay: Boolean, var newAlert: Boolean ) @Override override fun onCreate() { } @Override override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { return START_REDELIVER_INTENT } @Override override fun onDestroy() { mServiceLooper?.quit() } @Override override fun onBind(intent: Intent?): IBinder? { return null } companion object { const val DEBUG = true private const val TAG = "AlertService" val ALERT_PROJECTION = arrayOf( CalendarAlerts._ID, // 0 CalendarAlerts.EVENT_ID, // 1 CalendarAlerts.STATE, // 2 CalendarAlerts.TITLE, // 3 CalendarAlerts.EVENT_LOCATION, // 4 CalendarAlerts.SELF_ATTENDEE_STATUS, // 5 CalendarAlerts.ALL_DAY, // 6 CalendarAlerts.ALARM_TIME, // 7 CalendarAlerts.MINUTES, // 8 CalendarAlerts.BEGIN, // 9 CalendarAlerts.END, // 10 CalendarAlerts.DESCRIPTION ) private const val ALERT_INDEX_ID = 0 private const val ALERT_INDEX_EVENT_ID = 1 private const val ALERT_INDEX_STATE = 2 private const val ALERT_INDEX_TITLE = 3 private const val ALERT_INDEX_EVENT_LOCATION = 4 private const val ALERT_INDEX_SELF_ATTENDEE_STATUS = 5 private const val ALERT_INDEX_ALL_DAY = 6 private const val ALERT_INDEX_ALARM_TIME = 7 private const val ALERT_INDEX_MINUTES = 8 private const val ALERT_INDEX_BEGIN = 9 private const val ALERT_INDEX_END = 10 private const val ALERT_INDEX_DESCRIPTION = 11 private val ACTIVE_ALERTS_SELECTION = ("(" + CalendarAlerts.STATE.toString() + "=? OR " + CalendarAlerts.STATE.toString() + "=?) AND " + CalendarAlerts.ALARM_TIME.toString() + "<=") private val ACTIVE_ALERTS_SELECTION_ARGS = arrayOf( Integer.toString(CalendarAlerts.STATE_FIRED), Integer.toString(CalendarAlerts.STATE_SCHEDULED) ) private const val ACTIVE_ALERTS_SORT = "begin DESC, end DESC" private val DISMISS_OLD_SELECTION: String = (CalendarAlerts.END.toString() + "