Skip to content

Commit e2407ce

Browse files
committed
feat: expose shortcuts dynamically in code
1 parent 3e10784 commit e2407ce

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ android {
4747
applicationId = "com.ilseon"
4848
minSdk = 24
4949
targetSdk = 36
50-
versionCode = 117
51-
versionName = "0.38.0"
50+
versionCode = 118
51+
versionName = "0.38.1"
5252

5353
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
5454
}

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
<category android:name="android.intent.category.BROWSABLE" />
6060
<data android:scheme="ilseon" android:host="play-voice-memo" />
6161
</intent-filter>
62+
<meta-data
63+
android:name="android.app.shortcuts"
64+
android:resource="@xml/shortcuts" />
6265
</activity>
6366

6467
<activity
@@ -71,9 +74,6 @@
7174
<action android:name="com.ilseon.action.NEW_VOICE_MEMO" />
7275
<category android:name="android.intent.category.DEFAULT" />
7376
</intent-filter>
74-
<meta-data
75-
android:name="android.app.shortcuts"
76-
android:resource="@xml/shortcuts" />
7777
</activity>
7878

7979
<receiver

app/src/main/java/com/ilseon/MainActivity.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,15 @@ import androidx.compose.ui.Alignment
7070
import androidx.compose.ui.Modifier
7171
import androidx.compose.ui.draw.clip
7272
import androidx.compose.ui.draw.rotate
73+
import androidx.compose.ui.graphics.vector.ImageVector
7374
import androidx.compose.ui.platform.LocalContext
7475
import androidx.compose.ui.text.font.FontWeight
7576
import androidx.compose.ui.unit.dp
7677
import androidx.compose.ui.unit.sp
7778
import androidx.core.content.ContextCompat
79+
import androidx.core.content.pm.ShortcutInfoCompat
80+
import androidx.core.content.pm.ShortcutManagerCompat
81+
import androidx.core.graphics.drawable.IconCompat
7882
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
7983
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
8084
import androidx.lifecycle.lifecycleScope
@@ -160,6 +164,7 @@ class MainActivity : ComponentActivity() {
160164

161165
if (onboardingManager.isOnboardingCompleted()) {
162166
fuelCheckScheduler.scheduleNextFuelCheck()
167+
publishShortcuts(this)
163168
}
164169

165170
setContent {
@@ -817,6 +822,41 @@ class MainActivity : ComponentActivity() {
817822
super.onNewIntent(intent)
818823
intentState.value = intent
819824
}
825+
826+
private fun publishShortcuts(context: Context) {
827+
val voiceShortcut = ShortcutInfoCompat.Builder(context, "instant_record")
828+
.setShortLabel("Instant Record")
829+
.setLongLabel("Start recording a voice memo immediately")
830+
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_outline_mic_24))
831+
.setIntent(
832+
Intent(context, ActionTrampolineActivity::class.java).apply {
833+
action = "com.ilseon.action.NEW_VOICE_MEMO"
834+
}
835+
)
836+
.build()
837+
838+
val taskShortcut = ShortcutInfoCompat.Builder(context, "new_task")
839+
.setShortLabel("New Task")
840+
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_outline_add_task_24))
841+
.setIntent(
842+
Intent(context, ActionTrampolineActivity::class.java).apply {
843+
action = "com.ilseon.action.NEW_TASK"
844+
}
845+
)
846+
.build()
847+
848+
val ideaShortcut = ShortcutInfoCompat.Builder(context, "new_idea")
849+
.setShortLabel("New Idea")
850+
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_outline_lightbulb_24))
851+
.setIntent(
852+
Intent(context, ActionTrampolineActivity::class.java).apply {
853+
action = "com.ilseon.action.NEW_IDEA"
854+
}
855+
)
856+
.build()
857+
858+
ShortcutManagerCompat.addDynamicShortcuts(context, listOf(voiceShortcut, taskShortcut, ideaShortcut))
859+
}
820860
}
821861

822862
@Composable

0 commit comments

Comments
 (0)