11package com.simplemobiletools.flashlight.activities
22
33import android.annotation.SuppressLint
4+ import android.app.AlarmManager
5+ import android.content.Context
46import android.content.Intent
57import android.content.pm.ActivityInfo
68import android.content.pm.ShortcutInfo
9+ import android.graphics.drawable.ColorDrawable
710import android.graphics.drawable.Icon
811import android.graphics.drawable.LayerDrawable
912import android.os.Bundle
1013import android.view.WindowManager
1114import android.widget.ImageView
15+ import com.simplemobiletools.commons.dialogs.PermissionRequiredDialog
16+ import com.simplemobiletools.commons.dialogs.RadioGroupDialog
1217import com.simplemobiletools.commons.extensions.*
13- import com.simplemobiletools.commons.helpers.LICENSE_EVENT_BUS
14- import com.simplemobiletools.commons.helpers.PERMISSION_CAMERA
15- import com.simplemobiletools.commons.helpers.isNougatMR1Plus
16- import com.simplemobiletools.commons.helpers.isNougatPlus
18+ import com.simplemobiletools.commons.helpers.*
1719import com.simplemobiletools.commons.models.FAQItem
20+ import com.simplemobiletools.commons.models.RadioItem
1821import com.simplemobiletools.flashlight.BuildConfig
1922import com.simplemobiletools.flashlight.R
2023import com.simplemobiletools.flashlight.databinding.ActivityMainBinding
24+ import com.simplemobiletools.flashlight.dialogs.SleepTimerCustomDialog
2125import com.simplemobiletools.flashlight.extensions.config
22- import com.simplemobiletools.flashlight.helpers.CameraTorchListener
23- import com.simplemobiletools.flashlight.helpers.MIN_BRIGHTNESS_LEVEL
24- import com.simplemobiletools.flashlight.helpers.MyCameraImpl
26+ import com.simplemobiletools.flashlight.helpers.*
2527import com.simplemobiletools.flashlight.models.Events
2628import org.greenrobot.eventbus.EventBus
2729import org.greenrobot.eventbus.Subscribe
30+ import org.greenrobot.eventbus.ThreadMode
2831import java.util.*
2932
3033class MainActivity : SimpleActivity () {
@@ -74,6 +77,8 @@ class MainActivity : SimpleActivity() {
7477 stroboscopeBtn.setOnClickListener {
7578 toggleStroboscope(false )
7679 }
80+
81+ sleepTimerStop.setOnClickListener { stopSleepTimer() }
7782 }
7883
7984 setupStroboscope()
@@ -110,6 +115,9 @@ class MainActivity : SimpleActivity() {
110115 }
111116 }
112117
118+ binding.sleepTimerHolder.background = ColorDrawable (getProperBackgroundColor())
119+ binding.sleepTimerStop.applyColorFilter(getProperTextColor())
120+
113121 requestedOrientation = if (config.forcePortraitMode) ActivityInfo .SCREEN_ORIENTATION_PORTRAIT else ActivityInfo .SCREEN_ORIENTATION_SENSOR
114122 invalidateOptionsMenu()
115123
@@ -126,6 +134,11 @@ class MainActivity : SimpleActivity() {
126134 super .onStart()
127135 mBus!! .register(this )
128136
137+ if (config.sleepInTS == 0L ) {
138+ binding.sleepTimerHolder.beGone()
139+ (getSystemService(Context .ALARM_SERVICE ) as AlarmManager ).cancel(getShutDownPendingIntent())
140+ }
141+
129142 if (mCameraImpl == null ) {
130143 setupCameraImpl()
131144 }
@@ -146,6 +159,7 @@ class MainActivity : SimpleActivity() {
146159 when (menuItem.itemId) {
147160 R .id.more_apps_from_us -> launchMoreAppsFromUsIntent()
148161 R .id.settings -> launchSettings()
162+ R .id.sleep_timer -> showSleepTimer()
149163 R .id.about -> launchAbout()
150164 else -> return @setOnMenuItemClickListener false
151165 }
@@ -279,6 +293,85 @@ class MainActivity : SimpleActivity() {
279293 mCameraImpl = null
280294 }
281295
296+ private fun showSleepTimer (force : Boolean = false) {
297+ val alarmManager = getSystemService(Context .ALARM_SERVICE ) as AlarmManager
298+ if (isSPlus() && ! alarmManager.canScheduleExactAlarms() && ! force) {
299+ PermissionRequiredDialog (
300+ this ,
301+ com.simplemobiletools.commons.R .string.allow_alarm_sleep_timer,
302+ positiveActionCallback = { openRequestExactAlarmSettings(baseConfig.appId) },
303+ negativeActionCallback = { showSleepTimer(true ) }
304+ )
305+ return
306+ }
307+
308+ val items = ArrayList (listOf (10 , 30 , 60 , 5 * 60 , 10 * 60 , 30 * 60 ).map {
309+ RadioItem (it, secondsToString(it))
310+ })
311+
312+ if (items.none { it.id == config.lastSleepTimerSeconds }) {
313+ items.add(RadioItem (config.lastSleepTimerSeconds, secondsToString(config.lastSleepTimerSeconds)))
314+ }
315+
316+ items.sortBy { it.id }
317+ items.add(RadioItem (- 1 , getString(R .string.custom)))
318+
319+ RadioGroupDialog (this , items, config.lastSleepTimerSeconds) {
320+ if (it as Int == - 1 ) {
321+ SleepTimerCustomDialog (this ) {
322+ if (it > 0 ) {
323+ pickedSleepTimer(it)
324+ }
325+ }
326+ } else if (it > 0 ) {
327+ pickedSleepTimer(it)
328+ }
329+ }
330+ }
331+
332+ private fun secondsToString (seconds : Int ): String {
333+ val finalHours = seconds / 3600
334+ val finalMinutes = (seconds / 60 ) % 60
335+ val finalSeconds = seconds % 60
336+ val parts = mutableListOf<String >()
337+ if (finalHours != 0 ) {
338+ parts.add(resources.getQuantityString(R .plurals.hours, finalHours, finalHours))
339+ }
340+ if (finalMinutes != 0 ) {
341+ parts.add(resources.getQuantityString(R .plurals.minutes, finalMinutes, finalMinutes))
342+ }
343+ if (finalSeconds != 0 ) {
344+ parts.add(resources.getQuantityString(R .plurals.seconds, finalSeconds, finalSeconds))
345+ }
346+ return parts.joinToString(separator = " " )
347+ }
348+
349+ private fun pickedSleepTimer (seconds : Int ) {
350+ config.lastSleepTimerSeconds = seconds
351+ config.sleepInTS = System .currentTimeMillis() + seconds * 1000
352+ startSleepTimer()
353+ }
354+
355+ private fun startSleepTimer () {
356+ binding.sleepTimerHolder.fadeIn()
357+ startSleepTimerCountDown()
358+ }
359+
360+ private fun stopSleepTimer () {
361+ binding.sleepTimerHolder.fadeOut()
362+ stopSleepTimerCountDown()
363+ }
364+
365+ @Subscribe(threadMode = ThreadMode .MAIN )
366+ fun sleepTimerChanged (event : Events .SleepTimerChanged ) {
367+ binding.sleepTimerValue.text = event.seconds.getFormattedDuration()
368+ binding.sleepTimerHolder.beVisible()
369+
370+ if (event.seconds == 0 ) {
371+ finish()
372+ }
373+ }
374+
282375 @Subscribe
283376 fun stateChangedEvent (event : Events .StateChanged ) {
284377 checkState(event.isEnabled)
0 commit comments