Skip to content

Commit 8202e5d

Browse files
authored
Merge pull request #122 from esensar/feature/49-app-shortcuts
Add support for app shortcuts
2 parents 5b2bd75 + ab8164c commit 8202e5d

File tree

3 files changed

+79
-30
lines changed

3 files changed

+79
-30
lines changed

app/src/main/kotlin/com/simplemobiletools/launcher/extensions/Activity.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ package com.simplemobiletools.launcher.extensions
22

33
import android.app.Activity
44
import android.content.ComponentName
5+
import android.content.Context
56
import android.content.Intent
67
import android.content.pm.ApplicationInfo
8+
import android.content.pm.LauncherApps
79
import android.content.res.ColorStateList
10+
import android.graphics.Rect
811
import android.net.Uri
12+
import android.os.Process
913
import android.provider.Settings
1014
import android.view.ContextThemeWrapper
1115
import android.view.Gravity
16+
import android.view.Menu
1217
import android.view.View
1318
import android.widget.PopupMenu
19+
import androidx.core.graphics.drawable.toBitmap
20+
import androidx.core.graphics.drawable.toDrawable
21+
import androidx.core.view.MenuCompat
1422
import androidx.core.view.forEach
1523
import com.google.android.material.color.MaterialColors
1624
import com.simplemobiletools.commons.extensions.getPopupMenuTheme
@@ -91,6 +99,43 @@ fun Activity.handleGridItemPopupMenu(anchorView: View, gridItem: HomeScreenGridI
9199
menu.findItem(R.id.app_info).isVisible = gridItem.type == ITEM_TYPE_ICON
92100
menu.findItem(R.id.uninstall).isVisible = gridItem.type == ITEM_TYPE_ICON && canAppBeUninstalled(gridItem.packageName)
93101
menu.findItem(R.id.remove).isVisible = !isOnAllAppsFragment
102+
103+
val launcherApps = applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
104+
val shortcuts = if (launcherApps.hasShortcutHostPermission()) {
105+
try {
106+
val query = LauncherApps.ShortcutQuery().setQueryFlags(
107+
LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC or LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST or LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED
108+
).setPackage(gridItem.packageName)
109+
launcherApps.getShortcuts(query, Process.myUserHandle())
110+
} catch (e: Exception) {
111+
null
112+
}
113+
} else {
114+
null
115+
}
116+
117+
val hasShortcuts = !shortcuts.isNullOrEmpty()
118+
MenuCompat.setGroupDividerEnabled(menu, hasShortcuts)
119+
menu.setGroupVisible(R.id.group_shortcuts, hasShortcuts)
120+
if (hasShortcuts) {
121+
val iconSize = resources.getDimensionPixelSize(R.dimen.menu_icon_size)
122+
shortcuts?.forEach {
123+
menu.add(R.id.group_shortcuts, Menu.NONE, Menu.NONE, it.longLabel)
124+
.setIcon(
125+
launcherApps.getShortcutIconDrawable(it, resources.displayMetrics.densityDpi).toBitmap(width = iconSize, height = iconSize)
126+
.toDrawable(resources)
127+
)
128+
.setOnMenuItemClickListener { _ ->
129+
listener.onAnyClick()
130+
val id = it.id
131+
val packageName = it.`package`
132+
val userHandle = Process.myUserHandle()
133+
launcherApps.startShortcut(packageName, id, Rect(), null, userHandle)
134+
true
135+
}
136+
}
137+
}
138+
94139
setOnMenuItemClickListener { item ->
95140
listener.onAnyClick()
96141
when (item.itemId) {
Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,37 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<menu xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto">
4-
<item
5-
android:id="@+id/app_info"
6-
android:icon="@drawable/ic_info_vector"
7-
android:title="@string/app_info"
8-
app:showAsAction="always" />
9-
<item
10-
android:id="@+id/hide_icon"
11-
android:icon="@drawable/ic_hide_vector"
12-
android:title="@string/hide"
13-
app:showAsAction="always" />
14-
<item
15-
android:id="@+id/resize"
16-
android:icon="@drawable/ic_resize_vector"
17-
android:title="@string/resize"
18-
app:showAsAction="always" />
19-
<item
20-
android:id="@+id/rename"
21-
android:icon="@drawable/ic_rename_vector"
22-
android:title="@string/rename"
23-
app:showAsAction="always" />
24-
<item
25-
android:id="@+id/remove"
26-
android:icon="@drawable/ic_cross_vector"
27-
android:title="@string/remove"
28-
app:showAsAction="always" />
29-
<item
30-
android:id="@+id/uninstall"
31-
android:icon="@drawable/ic_delete_vector"
32-
android:title="@string/uninstall"
33-
app:showAsAction="always" />
4+
<group android:id="@+id/group_main">
5+
<item
6+
android:id="@+id/app_info"
7+
android:icon="@drawable/ic_info_vector"
8+
android:title="@string/app_info"
9+
app:showAsAction="always" />
10+
<item
11+
android:id="@+id/hide_icon"
12+
android:icon="@drawable/ic_hide_vector"
13+
android:title="@string/hide"
14+
app:showAsAction="always" />
15+
<item
16+
android:id="@+id/resize"
17+
android:icon="@drawable/ic_resize_vector"
18+
android:title="@string/resize"
19+
app:showAsAction="always" />
20+
<item
21+
android:id="@+id/rename"
22+
android:icon="@drawable/ic_rename_vector"
23+
android:title="@string/rename"
24+
app:showAsAction="always" />
25+
<item
26+
android:id="@+id/remove"
27+
android:icon="@drawable/ic_cross_vector"
28+
android:title="@string/remove"
29+
app:showAsAction="always" />
30+
<item
31+
android:id="@+id/uninstall"
32+
android:icon="@drawable/ic_delete_vector"
33+
android:title="@string/uninstall"
34+
app:showAsAction="always" />
35+
</group>
36+
<group android:id="@+id/group_shortcuts" />
3437
</menu>

app/src/main/res/values/dimens.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
<dimen name="page_indicator_margin">6dp</dimen>
1212
<dimen name="min_folder_view_height">200dp</dimen>
1313
<dimen name="max_folder_view_height">500dp</dimen>
14+
<dimen name="menu_icon_size">24dp</dimen>
1415
</resources>

0 commit comments

Comments
 (0)