@@ -11,10 +11,12 @@ import android.content.ComponentName
1111import android.content.Context
1212import android.content.Intent
1313import android.content.pm.ActivityInfo
14+ import android.content.pm.LauncherApps
1415import android.content.pm.PackageManager
1516import android.content.res.Configuration
1617import android.graphics.Bitmap
1718import android.graphics.Color
19+ import android.graphics.Rect
1820import android.net.Uri
1921import android.os.Bundle
2022import android.os.Handler
@@ -85,6 +87,65 @@ class MainActivity : SimpleActivity(), FlingListener {
8587 fragment.y = mScreenHeight.toFloat()
8688 fragment.beVisible()
8789 }
90+
91+ if (intent.action == LauncherApps .ACTION_CONFIRM_PIN_SHORTCUT ) {
92+ val launcherApps = applicationContext.getSystemService(Context .LAUNCHER_APPS_SERVICE ) as LauncherApps
93+ val item = launcherApps.getPinItemRequest(intent)
94+ if (item.shortcutInfo == null ) {
95+ return
96+ }
97+
98+ ensureBackgroundThread {
99+ val shortcutId = item.shortcutInfo?.id!!
100+ val label = item.shortcutInfo?.shortLabel?.toString() ? : item.shortcutInfo?.longLabel?.toString() ? : " "
101+ val icon = launcherApps.getShortcutIconDrawable(item.shortcutInfo!! , resources.displayMetrics.densityDpi)
102+ val rect = findFirstEmptyCell() ? : return @ensureBackgroundThread
103+ val gridItem = HomeScreenGridItem (
104+ null ,
105+ rect.left,
106+ rect.top,
107+ rect.right,
108+ rect.bottom,
109+ item.shortcutInfo!! .`package`,
110+ label,
111+ ITEM_TYPE_SHORTCUT ,
112+ " " ,
113+ - 1 ,
114+ " " ,
115+ shortcutId,
116+ icon.toBitmap(),
117+ icon
118+ )
119+
120+ // delay showing the shortcut both to let the user see adding it in realtime and hackily avoid concurrent modification exception at HomeScreenGrid
121+ Thread .sleep(2000 )
122+ item.accept()
123+ home_screen_grid.storeAndShowGridItem(gridItem)
124+ }
125+ }
126+ }
127+
128+ private fun findFirstEmptyCell (): Rect ? {
129+ val gridItems = homeScreenGridItemsDB.getAllItems() as ArrayList <HomeScreenGridItem >
130+ val occupiedCells = ArrayList <Pair <Int , Int >>()
131+ gridItems.forEach { item ->
132+ for (xCell in item.left.. item.right) {
133+ for (yCell in item.top.. item.bottom) {
134+ occupiedCells.add(Pair (xCell, yCell))
135+ }
136+ }
137+ }
138+
139+ for (checkedYCell in 0 until COLUMN_COUNT ) {
140+ for (checkedXCell in 0 until ROW_COUNT - 1 ) {
141+ val wantedCell = Pair (checkedXCell, checkedYCell)
142+ if (! occupiedCells.contains(wantedCell)) {
143+ return Rect (wantedCell.first, wantedCell.second, wantedCell.first, wantedCell.second)
144+ }
145+ }
146+ }
147+
148+ return null
88149 }
89150
90151 override fun onResume () {
@@ -330,7 +391,12 @@ class MainActivity : SimpleActivity(), FlingListener {
330391 if (clickedGridItem.type == ITEM_TYPE_ICON ) {
331392 launchApp(clickedGridItem.packageName)
332393 } else if (clickedGridItem.type == ITEM_TYPE_SHORTCUT ) {
333- launchShortcutIntent(clickedGridItem)
394+ val id = clickedGridItem.shortcutId
395+ val packageName = clickedGridItem.packageName
396+ val userHandle = android.os.Process .myUserHandle()
397+ val shortcutBounds = home_screen_grid.getClickableRect(clickedGridItem)
398+ val launcherApps = applicationContext.getSystemService(Context .LAUNCHER_APPS_SERVICE ) as LauncherApps
399+ launcherApps.startShortcut(packageName, id, shortcutBounds, null , userHandle)
334400 }
335401 }
336402 }
@@ -527,7 +593,7 @@ class MainActivity : SimpleActivity(), FlingListener {
527593 try {
528594 val defaultDialerPackage = (getSystemService(Context .TELECOM_SERVICE ) as TelecomManager ).defaultDialerPackage
529595 appLaunchers.firstOrNull { it.packageName == defaultDialerPackage }?.apply {
530- val dialerIcon = HomeScreenGridItem (null , 0 , ROW_COUNT - 1 , 0 , ROW_COUNT - 1 , defaultDialerPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , null )
596+ val dialerIcon = HomeScreenGridItem (null , 0 , ROW_COUNT - 1 , 0 , ROW_COUNT - 1 , defaultDialerPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , " " , null )
531597 homeScreenGridItems.add(dialerIcon)
532598 }
533599 } catch (e: Exception ) {
@@ -537,7 +603,7 @@ class MainActivity : SimpleActivity(), FlingListener {
537603 val defaultSMSMessengerPackage = Telephony .Sms .getDefaultSmsPackage(this )
538604 appLaunchers.firstOrNull { it.packageName == defaultSMSMessengerPackage }?.apply {
539605 val SMSMessengerIcon =
540- HomeScreenGridItem (null , 1 , ROW_COUNT - 1 , 1 , ROW_COUNT - 1 , defaultSMSMessengerPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , null )
606+ HomeScreenGridItem (null , 1 , ROW_COUNT - 1 , 1 , ROW_COUNT - 1 , defaultSMSMessengerPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , " " , null )
541607 homeScreenGridItems.add(SMSMessengerIcon )
542608 }
543609 } catch (e: Exception ) {
@@ -549,7 +615,7 @@ class MainActivity : SimpleActivity(), FlingListener {
549615 val defaultBrowserPackage = resolveInfo!! .activityInfo.packageName
550616 appLaunchers.firstOrNull { it.packageName == defaultBrowserPackage }?.apply {
551617 val browserIcon =
552- HomeScreenGridItem (null , 2 , ROW_COUNT - 1 , 2 , ROW_COUNT - 1 , defaultBrowserPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , null )
618+ HomeScreenGridItem (null , 2 , ROW_COUNT - 1 , 2 , ROW_COUNT - 1 , defaultBrowserPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , " " , null )
553619 homeScreenGridItems.add(browserIcon)
554620 }
555621 } catch (e: Exception ) {
@@ -560,7 +626,7 @@ class MainActivity : SimpleActivity(), FlingListener {
560626 val storePackage = potentialStores.firstOrNull { isPackageInstalled(it) && appLaunchers.map { it.packageName }.contains(it) }
561627 if (storePackage != null ) {
562628 appLaunchers.firstOrNull { it.packageName == storePackage }?.apply {
563- val storeIcon = HomeScreenGridItem (null , 3 , ROW_COUNT - 1 , 3 , ROW_COUNT - 1 , storePackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , null )
629+ val storeIcon = HomeScreenGridItem (null , 3 , ROW_COUNT - 1 , 3 , ROW_COUNT - 1 , storePackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , " " , null )
564630 homeScreenGridItems.add(storeIcon)
565631 }
566632 }
@@ -572,7 +638,7 @@ class MainActivity : SimpleActivity(), FlingListener {
572638 val resolveInfo = packageManager.resolveActivity(cameraIntent, PackageManager .MATCH_DEFAULT_ONLY )
573639 val defaultCameraPackage = resolveInfo!! .activityInfo.packageName
574640 appLaunchers.firstOrNull { it.packageName == defaultCameraPackage }?.apply {
575- val cameraIcon = HomeScreenGridItem (null , 4 , ROW_COUNT - 1 , 4 , ROW_COUNT - 1 , defaultCameraPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , null )
641+ val cameraIcon = HomeScreenGridItem (null , 4 , ROW_COUNT - 1 , 4 , ROW_COUNT - 1 , defaultCameraPackage, title, ITEM_TYPE_ICON , " " , - 1 , " " , " " , null )
576642 homeScreenGridItems.add(cameraIcon)
577643 }
578644 } catch (e: Exception ) {
@@ -581,7 +647,12 @@ class MainActivity : SimpleActivity(), FlingListener {
581647 homeScreenGridItemsDB.insertAll(homeScreenGridItems)
582648 }
583649
584- fun handleWidgetBinding (appWidgetManager : AppWidgetManager , appWidgetId : Int , appWidgetInfo : AppWidgetProviderInfo , callback : (canBind: Boolean ) -> Unit ) {
650+ fun handleWidgetBinding (
651+ appWidgetManager : AppWidgetManager ,
652+ appWidgetId : Int ,
653+ appWidgetInfo : AppWidgetProviderInfo ,
654+ callback : (canBind: Boolean ) -> Unit
655+ ) {
585656 mActionOnCanBindWidget = null
586657 val canCreateWidget = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetInfo.provider)
587658 if (canCreateWidget) {
0 commit comments