Skip to content

Commit 818f0d0

Browse files
committed
Add dynamic App Shortcuts for external automation (Tasker/Samsung Routines)
Register toggle/start/stop shortcuts via ShortcutManagerCompat on app launch, enabling Samsung Routines and other launchers to control the Clash service through long-press app icon shortcuts.
1 parent 406e400 commit 818f0d0

3 files changed

Lines changed: 58 additions & 0 deletions

File tree

app/src/main/java/com/github/kr328/clash/MainApplication.kt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@ package com.github.kr328.clash
22

33
import android.app.Application
44
import android.content.Context
5+
import android.content.Intent
6+
import androidx.core.content.pm.ShortcutInfoCompat
7+
import androidx.core.content.pm.ShortcutManagerCompat
8+
import androidx.core.graphics.drawable.IconCompat
59
import com.github.kr328.clash.common.Global
610
import com.github.kr328.clash.common.compat.currentProcessName
11+
import com.github.kr328.clash.common.constants.Intents
712
import com.github.kr328.clash.common.log.Log
813
import com.github.kr328.clash.remote.Remote
914
import com.github.kr328.clash.service.util.sendServiceRecreated
1015
import com.github.kr328.clash.util.clashDir
1116
import java.io.File
1217
import java.io.FileOutputStream
18+
import com.github.kr328.clash.design.R as DesignR
1319

1420

1521
@Suppress("unused")
@@ -30,11 +36,49 @@ class MainApplication : Application() {
3036

3137
if (processName == packageName) {
3238
Remote.launch()
39+
setupShortcuts()
3340
} else {
3441
sendServiceRecreated()
3542
}
3643
}
3744

45+
private fun setupShortcuts() {
46+
val toggle = ShortcutInfoCompat.Builder(this, "toggle_clash")
47+
.setShortLabel(getString(DesignR.string.shortcut_toggle_short))
48+
.setLongLabel(getString(DesignR.string.shortcut_toggle_long))
49+
.setIcon(IconCompat.createWithResource(this, DesignR.drawable.ic_baseline_swap_vertical_circle))
50+
.setIntent(
51+
Intent(Intents.ACTION_TOGGLE_CLASH)
52+
.setClassName(this, ExternalControlActivity::class.java.name)
53+
)
54+
.setRank(0)
55+
.build()
56+
57+
val start = ShortcutInfoCompat.Builder(this, "start_clash")
58+
.setShortLabel(getString(DesignR.string.shortcut_start_short))
59+
.setLongLabel(getString(DesignR.string.shortcut_start_long))
60+
.setIcon(IconCompat.createWithResource(this, DesignR.drawable.ic_baseline_flash_on))
61+
.setIntent(
62+
Intent(Intents.ACTION_START_CLASH)
63+
.setClassName(this, ExternalControlActivity::class.java.name)
64+
)
65+
.setRank(1)
66+
.build()
67+
68+
val stop = ShortcutInfoCompat.Builder(this, "stop_clash")
69+
.setShortLabel(getString(DesignR.string.shortcut_stop_short))
70+
.setLongLabel(getString(DesignR.string.shortcut_stop_long))
71+
.setIcon(IconCompat.createWithResource(this, DesignR.drawable.ic_baseline_stop))
72+
.setIntent(
73+
Intent(Intents.ACTION_STOP_CLASH)
74+
.setClassName(this, ExternalControlActivity::class.java.name)
75+
)
76+
.setRank(2)
77+
.build()
78+
79+
ShortcutManagerCompat.setDynamicShortcuts(this, listOf(toggle, start, stop))
80+
}
81+
3882
private fun extractGeoFiles() {
3983
clashDir.mkdirs()
4084

design/src/main/res/values-zh/strings.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,11 @@
262262
<string name="external_control_stopped">Clash.Meta 服务已停止</string>
263263
<string name="import_from_qr_no_permission">相机权限受限,请前往设置开启。</string>
264264
<string name="import_from_qr_exception">发生系统未知异常,操作失败。</string>
265+
266+
<string name="shortcut_toggle_short">切换 Clash</string>
267+
<string name="shortcut_toggle_long">切换 Clash 服务启停</string>
268+
<string name="shortcut_start_short">启动 Clash</string>
269+
<string name="shortcut_start_long">启动 Clash 服务</string>
270+
<string name="shortcut_stop_short">停止 Clash</string>
271+
<string name="shortcut_stop_long">停止 Clash 服务</string>
265272
</resources>

design/src/main/res/values/strings.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,4 +350,11 @@
350350
<string name="hide_from_recents_desc">Hide app from the Recent apps screen</string>
351351
<string name="import_from_qr_no_permission">Camera access is restricted. Please enable it in Settings.</string>
352352
<string name="import_from_qr_exception">An unhandled system exception occurred.</string>
353+
354+
<string name="shortcut_toggle_short">Toggle Clash</string>
355+
<string name="shortcut_toggle_long">Toggle Clash service on/off</string>
356+
<string name="shortcut_start_short">Start Clash</string>
357+
<string name="shortcut_start_long">Start Clash service</string>
358+
<string name="shortcut_stop_short">Stop Clash</string>
359+
<string name="shortcut_stop_long">Stop Clash service</string>
353360
</resources>

0 commit comments

Comments
 (0)