diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aca6ff07..9c3af604 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -37,6 +37,7 @@
android:theme="@style/SplashTheme">
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/App.kt b/app/src/main/kotlin/com/simplemobiletools/clock/App.kt
index e94f8560..c8406780 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/App.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/App.kt
@@ -3,6 +3,11 @@ package com.simplemobiletools.clock
import android.app.Application
import android.app.NotificationManager
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.Handler
import android.os.Looper
@@ -11,8 +16,9 @@ import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ProcessLifecycleOwner
import com.facebook.stetho.Stetho
+import com.simplemobiletools.clock.activities.SplashActivity
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.models.TimerEvent
import com.simplemobiletools.clock.models.TimerState
@@ -40,6 +46,23 @@ class App : Application(), LifecycleObserver {
}
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() {
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/MainActivity.kt
index 8e9739a5..c5cdae54 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/MainActivity.kt
@@ -106,6 +106,11 @@ class MainActivity : SimpleActivity() {
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
(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)
}
@@ -152,7 +157,9 @@ class MainActivity : SimpleActivity() {
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
viewPagerAdapter.updateTimerPosition(timerId)
}
-
+ if (tabToOpen == TAB_STOPWATCH) {
+ config.toggleStopWatch = intent.getBooleanExtra(TOGGLE_STOPWATCH, false)
+ }
view_pager.offscreenPageLimit = TABS_COUNT - 1
view_pager.currentItem = tabToOpen
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/SplashActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/SplashActivity.kt
index d2d8c736..ebd66be2 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/activities/SplashActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/SplashActivity.kt
@@ -13,6 +13,13 @@ class SplashActivity : BaseSplashActivity() {
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(this, MainActivity::class.java).apply {
putExtra(OPEN_TAB, intent.getIntExtra(OPEN_TAB, TAB_CLOCK))
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/ViewPagerAdapter.kt
index 6f795b98..f5517f93 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/adapters/ViewPagerAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/ViewPagerAdapter.kt
@@ -12,6 +12,7 @@ import com.simplemobiletools.clock.helpers.TABS_COUNT
import com.simplemobiletools.clock.helpers.TAB_ALARM
import com.simplemobiletools.clock.helpers.TAB_CLOCK
import com.simplemobiletools.clock.helpers.TAB_TIMER
+import com.simplemobiletools.clock.helpers.TAB_STOPWATCH
import com.simplemobiletools.commons.models.AlarmSound
class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
@@ -57,4 +58,8 @@ class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
fun updateTimerPosition(timerId: Int) {
(fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId)
}
+
+ fun startStopWatch() {
+ (fragments[TAB_STOPWATCH] as? StopwatchFragment)?.startStopWatch()
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
index c59cdcaa..af20b6de 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
@@ -91,6 +91,11 @@ class StopwatchFragment : Fragment() {
if (Stopwatch.laps.isNotEmpty()) {
updateSorting(Lap.sorting)
}
+
+ if (requireContext().config.toggleStopWatch) {
+ requireContext().config.toggleStopWatch = false
+ startStopWatch()
+ }
}
override fun onPause() {
@@ -185,6 +190,12 @@ class StopwatchFragment : Fragment() {
}
}
+ fun startStopWatch() {
+ if (Stopwatch.state == Stopwatch.State.STOPPED) {
+ togglePlayPause()
+ }
+ }
+
private fun updateLaps() {
stopwatchAdapter.updateItems(Stopwatch.laps)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt
index e8abf2b8..6ecddafd 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt
@@ -49,6 +49,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getString(TIMER_LABEL, null)
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
get() = prefs.getInt(ALARMS_SORT_BY, SORT_BY_CREATION_ORDER)
set(alarmSort) = prefs.edit().putInt(ALARMS_SORT_BY, alarmSort).apply()
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
index 57590f6e..0535f600 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
@@ -13,6 +13,7 @@ const val TIMER_SOUND_URI = "timer_sound_uri"
const val TIMER_SOUND_TITLE = "timer_sound_title"
const val TIMER_CHANNEL_ID = "timer_channel_id"
const val TIMER_LABEL = "timer_label"
+const val TOGGLE_STOPWATCH = "toggle_stopwatch"
const val TIMER_MAX_REMINDER_SECS = "timer_max_reminder_secs"
const val ALARM_MAX_REMINDER_SECS = "alarm_max_reminder_secs"
const val ALARM_LAST_CONFIG = "alarm_last_config"
diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml
new file mode 100644
index 00000000..faf80e14
--- /dev/null
+++ b/app/src/main/res/xml-v25/shortcuts.xml
@@ -0,0 +1,12 @@
+
+
+
+
+