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 @@ + + + + +