Added app shortcut to start the stopwatch
This commit is contained in:
parent
7e4301b81d
commit
9dc2c48df6
9 changed files with 73 additions and 2 deletions
|
@ -37,6 +37,7 @@
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.TOGGLE_STOPWATCH" />
|
||||||
<action android:name="android.intent.action.SHOW_ALARMS" />
|
<action android:name="android.intent.action.SHOW_ALARMS" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
|
@ -3,6 +3,11 @@ package com.simplemobiletools.clock
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.ShortcutInfo
|
||||||
|
import android.content.pm.ShortcutManager
|
||||||
|
import android.graphics.drawable.Icon
|
||||||
|
import android.os.Build
|
||||||
import android.os.CountDownTimer
|
import android.os.CountDownTimer
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
|
@ -11,8 +16,9 @@ import androidx.lifecycle.LifecycleObserver
|
||||||
import androidx.lifecycle.OnLifecycleEvent
|
import androidx.lifecycle.OnLifecycleEvent
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner
|
import androidx.lifecycle.ProcessLifecycleOwner
|
||||||
import com.facebook.stetho.Stetho
|
import com.facebook.stetho.Stetho
|
||||||
|
import com.simplemobiletools.clock.activities.SplashActivity
|
||||||
import com.simplemobiletools.clock.extensions.*
|
import com.simplemobiletools.clock.extensions.*
|
||||||
import com.simplemobiletools.clock.helpers.Stopwatch
|
import com.simplemobiletools.clock.helpers.*
|
||||||
import com.simplemobiletools.clock.helpers.Stopwatch.State
|
import com.simplemobiletools.clock.helpers.Stopwatch.State
|
||||||
import com.simplemobiletools.clock.models.TimerEvent
|
import com.simplemobiletools.clock.models.TimerEvent
|
||||||
import com.simplemobiletools.clock.models.TimerState
|
import com.simplemobiletools.clock.models.TimerState
|
||||||
|
@ -40,6 +46,23 @@ class App : Application(), LifecycleObserver {
|
||||||
}
|
}
|
||||||
|
|
||||||
checkUseEnglish()
|
checkUseEnglish()
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||||
|
val shortcutManager = getSystemService(ShortcutManager::class.java)
|
||||||
|
val intent = Intent(this, SplashActivity::class.java).apply {
|
||||||
|
putExtra(OPEN_TAB, TAB_STOPWATCH)
|
||||||
|
putExtra(TOGGLE_STOPWATCH, true)
|
||||||
|
action = "android.intent.action.TOGGLE_STOPWATCH"
|
||||||
|
}
|
||||||
|
val shortcut = ShortcutInfo.Builder(this, "id1")
|
||||||
|
.setShortLabel("Stopwatch")
|
||||||
|
.setLongLabel("Start Stopwatch")
|
||||||
|
.setIcon(Icon.createWithResource(this, R.drawable.ic_stopwatch_vector))
|
||||||
|
.setIntent(
|
||||||
|
intent
|
||||||
|
)
|
||||||
|
.build()
|
||||||
|
shortcutManager.dynamicShortcuts = listOf(shortcut)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onTerminate() {
|
override fun onTerminate() {
|
||||||
|
|
|
@ -106,6 +106,11 @@ class MainActivity : SimpleActivity() {
|
||||||
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
|
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
|
||||||
(view_pager.adapter as ViewPagerAdapter).updateTimerPosition(timerId)
|
(view_pager.adapter as ViewPagerAdapter).updateTimerPosition(timerId)
|
||||||
}
|
}
|
||||||
|
if (tabToOpen == TAB_STOPWATCH) {
|
||||||
|
if (intent.getBooleanExtra(TOGGLE_STOPWATCH, false)) {
|
||||||
|
(view_pager.adapter as ViewPagerAdapter).startStopWatch()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
super.onNewIntent(intent)
|
super.onNewIntent(intent)
|
||||||
}
|
}
|
||||||
|
@ -152,7 +157,9 @@ class MainActivity : SimpleActivity() {
|
||||||
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
|
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
|
||||||
viewPagerAdapter.updateTimerPosition(timerId)
|
viewPagerAdapter.updateTimerPosition(timerId)
|
||||||
}
|
}
|
||||||
|
if (tabToOpen == TAB_STOPWATCH) {
|
||||||
|
config.toggleStopWatch = intent.getBooleanExtra(TOGGLE_STOPWATCH, false)
|
||||||
|
}
|
||||||
view_pager.offscreenPageLimit = TABS_COUNT - 1
|
view_pager.offscreenPageLimit = TABS_COUNT - 1
|
||||||
view_pager.currentItem = tabToOpen
|
view_pager.currentItem = tabToOpen
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,13 @@ class SplashActivity : BaseSplashActivity() {
|
||||||
startActivity(this)
|
startActivity(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
intent?.action == "android.intent.action.TOGGLE_STOPWATCH" -> {
|
||||||
|
Intent(this, MainActivity::class.java).apply {
|
||||||
|
putExtra(OPEN_TAB, TAB_STOPWATCH)
|
||||||
|
putExtra(TOGGLE_STOPWATCH, intent.getBooleanExtra(TOGGLE_STOPWATCH, false))
|
||||||
|
startActivity(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
intent.extras?.containsKey(OPEN_TAB) == true -> {
|
intent.extras?.containsKey(OPEN_TAB) == true -> {
|
||||||
Intent(this, MainActivity::class.java).apply {
|
Intent(this, MainActivity::class.java).apply {
|
||||||
putExtra(OPEN_TAB, intent.getIntExtra(OPEN_TAB, TAB_CLOCK))
|
putExtra(OPEN_TAB, intent.getIntExtra(OPEN_TAB, TAB_CLOCK))
|
||||||
|
|
|
@ -12,6 +12,7 @@ import com.simplemobiletools.clock.helpers.TABS_COUNT
|
||||||
import com.simplemobiletools.clock.helpers.TAB_ALARM
|
import com.simplemobiletools.clock.helpers.TAB_ALARM
|
||||||
import com.simplemobiletools.clock.helpers.TAB_CLOCK
|
import com.simplemobiletools.clock.helpers.TAB_CLOCK
|
||||||
import com.simplemobiletools.clock.helpers.TAB_TIMER
|
import com.simplemobiletools.clock.helpers.TAB_TIMER
|
||||||
|
import com.simplemobiletools.clock.helpers.TAB_STOPWATCH
|
||||||
import com.simplemobiletools.commons.models.AlarmSound
|
import com.simplemobiletools.commons.models.AlarmSound
|
||||||
|
|
||||||
class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
|
class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
|
||||||
|
@ -57,4 +58,8 @@ class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
|
||||||
fun updateTimerPosition(timerId: Int) {
|
fun updateTimerPosition(timerId: Int) {
|
||||||
(fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId)
|
(fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun startStopWatch() {
|
||||||
|
(fragments[TAB_STOPWATCH] as? StopwatchFragment)?.startStopWatch()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,11 @@ class StopwatchFragment : Fragment() {
|
||||||
if (Stopwatch.laps.isNotEmpty()) {
|
if (Stopwatch.laps.isNotEmpty()) {
|
||||||
updateSorting(Lap.sorting)
|
updateSorting(Lap.sorting)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (requireContext().config.toggleStopWatch) {
|
||||||
|
requireContext().config.toggleStopWatch = false
|
||||||
|
startStopWatch()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
|
@ -185,6 +190,12 @@ class StopwatchFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun startStopWatch() {
|
||||||
|
if (Stopwatch.state == Stopwatch.State.STOPPED) {
|
||||||
|
togglePlayPause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateLaps() {
|
private fun updateLaps() {
|
||||||
stopwatchAdapter.updateItems(Stopwatch.laps)
|
stopwatchAdapter.updateItems(Stopwatch.laps)
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,10 @@ class Config(context: Context) : BaseConfig(context) {
|
||||||
get() = prefs.getString(TIMER_LABEL, null)
|
get() = prefs.getString(TIMER_LABEL, null)
|
||||||
set(label) = prefs.edit().putString(TIMER_LABEL, label).apply()
|
set(label) = prefs.edit().putString(TIMER_LABEL, label).apply()
|
||||||
|
|
||||||
|
var toggleStopWatch: Boolean
|
||||||
|
get() = prefs.getBoolean(TOGGLE_STOPWATCH, false)
|
||||||
|
set(label) = prefs.edit().putBoolean(TOGGLE_STOPWATCH, label).apply()
|
||||||
|
|
||||||
var alarmSort: Int
|
var alarmSort: Int
|
||||||
get() = prefs.getInt(ALARMS_SORT_BY, SORT_BY_CREATION_ORDER)
|
get() = prefs.getInt(ALARMS_SORT_BY, SORT_BY_CREATION_ORDER)
|
||||||
set(alarmSort) = prefs.edit().putInt(ALARMS_SORT_BY, alarmSort).apply()
|
set(alarmSort) = prefs.edit().putInt(ALARMS_SORT_BY, alarmSort).apply()
|
||||||
|
|
|
@ -13,6 +13,7 @@ const val TIMER_SOUND_URI = "timer_sound_uri"
|
||||||
const val TIMER_SOUND_TITLE = "timer_sound_title"
|
const val TIMER_SOUND_TITLE = "timer_sound_title"
|
||||||
const val TIMER_CHANNEL_ID = "timer_channel_id"
|
const val TIMER_CHANNEL_ID = "timer_channel_id"
|
||||||
const val TIMER_LABEL = "timer_label"
|
const val TIMER_LABEL = "timer_label"
|
||||||
|
const val TOGGLE_STOPWATCH = "toggle_stopwatch"
|
||||||
const val TIMER_MAX_REMINDER_SECS = "timer_max_reminder_secs"
|
const val TIMER_MAX_REMINDER_SECS = "timer_max_reminder_secs"
|
||||||
const val ALARM_MAX_REMINDER_SECS = "alarm_max_reminder_secs"
|
const val ALARM_MAX_REMINDER_SECS = "alarm_max_reminder_secs"
|
||||||
const val ALARM_LAST_CONFIG = "alarm_last_config"
|
const val ALARM_LAST_CONFIG = "alarm_last_config"
|
||||||
|
|
12
app/src/main/res/xml-v25/shortcuts.xml
Normal file
12
app/src/main/res/xml-v25/shortcuts.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<shortcut
|
||||||
|
android:enabled="true"
|
||||||
|
android:icon="@drawable/ic_stopwatch_vector"
|
||||||
|
android:shortcutId="compose"
|
||||||
|
android:shortcutShortLabel="@string/startup">
|
||||||
|
<intent
|
||||||
|
android:action="FLAG_ACTIVITY_NEW_TASK"
|
||||||
|
android:targetClass="com.simplemobiletools.clock.App"
|
||||||
|
android:targetPackage="com.simplemobiletools.clock" />
|
||||||
|
</shortcut>
|
||||||
|
</shortcuts>
|
Loading…
Reference in a new issue