Untitled

 avatar
unknown
plain_text
10 months ago
7.2 kB
1
Indexable
package com.example.alarmclock.utils

import android.annotation.SuppressLint
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Parcel
import android.os.Parcelable
import android.util.Log
import android.widget.TextView
import android.widget.Toast
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.FRIDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.MONDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.RECURRING
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.SATURDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.SUNDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.THURSDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.TITLE
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.TUESDAY
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.VIBRATION
import com.example.alarmclock.broadcastreceiver.AlarmBroadcastReceiver.Companion.WEDNESDAY
import java.util.*

@Entity(tableName = "alarm_table")
class Alarm(
    var hour: Int,
    var minute: Int,
    var title: String?,
    var created: Long,
    var isStarted: Boolean,
    var isRecurring: Boolean,
    var isVibration: Boolean,
    var isMonday: Boolean,
    var isTuesday: Boolean,
    var isWednesday: Boolean,
    var isThursday: Boolean,
    var isFriday: Boolean,
    var isSaturday: Boolean,
    var isSunday: Boolean
) : Parcelable {

    @PrimaryKey(autoGenerate = true)
    var alarmId: Int = 0

    constructor(parcel: Parcel) : this(
        parcel.readInt(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readLong(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte(),
        parcel.readByte() != 0.toByte()
    ) {
        alarmId = parcel.readInt()
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(hour)
        parcel.writeInt(minute)
        parcel.writeString(title)
        parcel.writeLong(created)
        parcel.writeByte(if (isStarted) 1 else 0)
        parcel.writeByte(if (isRecurring) 1 else 0)
        parcel.writeByte(if (isVibration) 1 else 0)
        parcel.writeByte(if (isMonday) 1 else 0)
        parcel.writeByte(if (isTuesday) 1 else 0)
        parcel.writeByte(if (isWednesday) 1 else 0)
        parcel.writeByte(if (isThursday) 1 else 0)
        parcel.writeByte(if (isFriday) 1 else 0)
        parcel.writeByte(if (isSaturday) 1 else 0)
        parcel.writeByte(if (isSunday) 1 else 0)
        parcel.writeInt(alarmId)
    }


    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Alarm> {
        override fun createFromParcel(parcel: Parcel): Alarm {
            return Alarm(parcel)
        }

        override fun newArray(size: Int): Array<Alarm?> {
            return arrayOfNulls(size)
        }
    }

    @SuppressLint("DefaultLocale")
    fun schedule(context: Context) {
        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(context, AlarmBroadcastReceiver::class.java).apply {
            putExtra(RECURRING, isRecurring)
            putExtra(MONDAY, isMonday)
            putExtra(TUESDAY, isTuesday)
            putExtra(WEDNESDAY, isWednesday)
            putExtra(THURSDAY, isThursday)
            putExtra(FRIDAY, isFriday)
            putExtra(SATURDAY, isSaturday)
            putExtra(SUNDAY, isSunday)
            putExtra(TITLE, title)
            putExtra(VIBRATION, isVibration)
        }
        val alarmPendingIntent = PendingIntent.getBroadcast(context, alarmId, intent, 0)
        val calendar = Calendar.getInstance().apply {
            timeInMillis = System.currentTimeMillis()
            set(Calendar.HOUR_OF_DAY, hour)
            set(Calendar.MINUTE, minute)
            set(Calendar.SECOND, 0)
            set(Calendar.MILLISECOND, 0)
            if (timeInMillis <= System.currentTimeMillis()) {
                set(Calendar.DAY_OF_MONTH, get(Calendar.DAY_OF_MONTH) + 1)
            }
        }

        if (!isRecurring) {
            val toastText = try {
                String.format(
                    "Báo thức một lần được lên lịch cho %s lúc %02d:%02d", DayUtil.toDay(
                        calendar.get(Calendar.DAY_OF_WEEK)
                    ), hour, minute, alarmId
                )
            } catch (e: Exception) {
                e.printStackTrace()
                null
            }
            Toast.makeText(context, toastText, Toast.LENGTH_LONG).show()
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, alarmPendingIntent)
        } else {
            val toastText = String.format(
                "Takrorlanuvchi signal rejalashtirilgan %s ga %02d:%02d",
                recurringDaysText, hour, minute, alarmId
            )
            Toast.makeText(context, toastText, Toast.LENGTH_LONG).show()
            val RUN_DAILY = (24 * 60 * 60 * 1000).toLong()
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, RUN_DAILY, alarmPendingIntent)
        }
        isStarted = true
    }
    fun cancelAlarm(context: Context) {
        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(context, AlarmBroadcastReceiver::class.java)
        val alarmPendingIntent = PendingIntent.getBroadcast(context, alarmId, intent, 0)
        alarmManager.cancel(alarmPendingIntent)
        isStarted = false
        val toastText = String.format("Đã hủy báo thức %02d:%02d", hour, minute)
        Toast.makeText(context, toastText, Toast.LENGTH_SHORT).show()
        Log.i("Cancel", toastText)
    }



    val recurringDaysText: String?
        get() {
            if (!isRecurring) {
                return null
            }
            var days = ""
            if (isMonday) {
                days += "Thứ Hai "
            }
            if (isTuesday) {
                days += "Thứ Ba "
            }
            if (isWednesday) {
                days += "Thứ Tư "
            }
            if (isThursday) {
                days += "Thứ Năm "
            }
            if (isFriday) {
                days += "Thứ Sáu "
            }
            if (isSaturday) {
                days += "Thứ Bảy "
            }
            if (isSunday) {
                days += "Chủ Nhật "
            }
            return days
        }

}
Editor is loading...
Leave a Comment