mirror of
				https://github.com/SimpleMobileTools/Simple-Launcher.git
				synced 2025-06-05 21:59:15 +02:00 
			
		
		
		
	| @@ -50,6 +50,7 @@ import kotlinx.android.synthetic.main.activity_main.* | ||||
| import kotlinx.android.synthetic.main.activity_main.view.* | ||||
| import kotlinx.android.synthetic.main.all_apps_fragment.view.* | ||||
| import kotlinx.android.synthetic.main.widgets_fragment.view.* | ||||
| import kotlin.math.abs | ||||
|  | ||||
| class MainActivity : SimpleActivity(), FlingListener { | ||||
|     private val ANIMATION_DURATION = 150L | ||||
| @@ -118,6 +119,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|                     rect.top, | ||||
|                     rect.right, | ||||
|                     rect.bottom, | ||||
|                     0, | ||||
|                     item.shortcutInfo!!.`package`, | ||||
|                     "", | ||||
|                     label, | ||||
| @@ -641,11 +643,20 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|                 return true | ||||
|             } | ||||
|  | ||||
|             if (velocityY > 0) { | ||||
|                 flingListener.onFlingDown() | ||||
|             } else { | ||||
|                 flingListener.onFlingUp() | ||||
|             if (abs(velocityY) > abs(velocityX)) { | ||||
|                 if (velocityY > 0) { | ||||
|                     flingListener.onFlingDown() | ||||
|                 } else { | ||||
|                     flingListener.onFlingUp() | ||||
|                 } | ||||
|             } else if (abs(velocityX) > abs(velocityY)) { | ||||
|                 if (velocityX > 0) { | ||||
|                     flingListener.onFlingRight() | ||||
|                 } else { | ||||
|                     flingListener.onFlingLeft() | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return true | ||||
|         } | ||||
|  | ||||
| @@ -676,6 +687,14 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onFlingRight() { | ||||
|         home_screen_grid.prevPage(redraw = true) | ||||
|     } | ||||
|  | ||||
|     override fun onFlingLeft() { | ||||
|         home_screen_grid.nextPage(redraw = true) | ||||
|     } | ||||
|  | ||||
|     @SuppressLint("WrongConstant") | ||||
|     fun getAllAppLaunchers(): ArrayList<AppLauncher> { | ||||
|         val hiddenIcons = hiddenIconsDB.getHiddenIcons().map { | ||||
| @@ -722,7 +741,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|             val defaultDialerPackage = (getSystemService(Context.TELECOM_SERVICE) as TelecomManager).defaultDialerPackage | ||||
|             appLaunchers.firstOrNull { it.packageName == defaultDialerPackage }?.apply { | ||||
|                 val dialerIcon = | ||||
|                     HomeScreenGridItem(null, 0, ROW_COUNT - 1, 0, ROW_COUNT - 1, defaultDialerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     HomeScreenGridItem(null, 0, ROW_COUNT - 1, 0, ROW_COUNT - 1, 0, defaultDialerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                 homeScreenGridItems.add(dialerIcon) | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
| @@ -732,7 +751,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|             val defaultSMSMessengerPackage = Telephony.Sms.getDefaultSmsPackage(this) | ||||
|             appLaunchers.firstOrNull { it.packageName == defaultSMSMessengerPackage }?.apply { | ||||
|                 val SMSMessengerIcon = | ||||
|                     HomeScreenGridItem(null, 1, ROW_COUNT - 1, 1, ROW_COUNT - 1, defaultSMSMessengerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     HomeScreenGridItem(null, 1, ROW_COUNT - 1, 1, ROW_COUNT - 1, 0, defaultSMSMessengerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                 homeScreenGridItems.add(SMSMessengerIcon) | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
| @@ -744,7 +763,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|             val defaultBrowserPackage = resolveInfo!!.activityInfo.packageName | ||||
|             appLaunchers.firstOrNull { it.packageName == defaultBrowserPackage }?.apply { | ||||
|                 val browserIcon = | ||||
|                     HomeScreenGridItem(null, 2, ROW_COUNT - 1, 2, ROW_COUNT - 1, defaultBrowserPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     HomeScreenGridItem(null, 2, ROW_COUNT - 1, 2, ROW_COUNT - 1, 0, defaultBrowserPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                 homeScreenGridItems.add(browserIcon) | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
| @@ -755,7 +774,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|             val storePackage = potentialStores.firstOrNull { isPackageInstalled(it) && appLaunchers.map { it.packageName }.contains(it) } | ||||
|             if (storePackage != null) { | ||||
|                 appLaunchers.firstOrNull { it.packageName == storePackage }?.apply { | ||||
|                     val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 3, ROW_COUNT - 1, storePackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     val storeIcon = HomeScreenGridItem(null, 3, ROW_COUNT - 1, 3, ROW_COUNT - 1, 0, storePackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     homeScreenGridItems.add(storeIcon) | ||||
|                 } | ||||
|             } | ||||
| @@ -768,7 +787,7 @@ class MainActivity : SimpleActivity(), FlingListener { | ||||
|             val defaultCameraPackage = resolveInfo!!.activityInfo.packageName | ||||
|             appLaunchers.firstOrNull { it.packageName == defaultCameraPackage }?.apply { | ||||
|                 val cameraIcon = | ||||
|                     HomeScreenGridItem(null, 4, ROW_COUNT - 1, 4, ROW_COUNT - 1, defaultCameraPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                     HomeScreenGridItem(null, 4, ROW_COUNT - 1, 4, ROW_COUNT - 1, 0, defaultCameraPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null) | ||||
|                 homeScreenGridItems.add(cameraIcon) | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
|   | ||||
| @@ -15,7 +15,7 @@ import com.simplemobiletools.launcher.models.AppLauncher | ||||
| import com.simplemobiletools.launcher.models.HiddenIcon | ||||
| import com.simplemobiletools.launcher.models.HomeScreenGridItem | ||||
|  | ||||
| @Database(entities = [AppLauncher::class, HomeScreenGridItem::class, HiddenIcon::class], version = 4) | ||||
| @Database(entities = [AppLauncher::class, HomeScreenGridItem::class, HiddenIcon::class], version = 5) | ||||
| @TypeConverters(Converters::class) | ||||
| abstract class AppsDatabase : RoomDatabase() { | ||||
|  | ||||
| @@ -36,6 +36,7 @@ abstract class AppsDatabase : RoomDatabase() { | ||||
|                             .addMigrations(MIGRATION_1_2) | ||||
|                             .addMigrations(MIGRATION_2_3) | ||||
|                             .addMigrations(MIGRATION_3_4) | ||||
|                             .addMigrations(MIGRATION_4_5) | ||||
|                             .build() | ||||
|                     } | ||||
|                 } | ||||
| @@ -64,5 +65,11 @@ abstract class AppsDatabase : RoomDatabase() { | ||||
|                 database.execSQL("CREATE UNIQUE INDEX `index_hidden_icons_id` ON `hidden_icons` (`id`)") | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private val MIGRATION_4_5 = object : Migration(4, 5) { | ||||
|             override fun migrate(database: SupportSQLiteDatabase) { | ||||
|                 database.execSQL("ALTER TABLE home_screen_grid_items ADD COLUMN page INTEGER NOT NULL DEFAULT 0") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -198,6 +198,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment | ||||
|             -1, | ||||
|             -1, | ||||
|             -1, | ||||
|             0, | ||||
|             appLauncher.packageName, | ||||
|             appLauncher.activityName, | ||||
|             appLauncher.title, | ||||
|   | ||||
| @@ -250,6 +250,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment | ||||
|             -1, | ||||
|             -1, | ||||
|             -1, | ||||
|             0, | ||||
|             appWidget.appPackageName, | ||||
|             "", | ||||
|             "", | ||||
|   | ||||
| @@ -4,4 +4,8 @@ interface FlingListener { | ||||
|     fun onFlingUp() | ||||
|  | ||||
|     fun onFlingDown() | ||||
|  | ||||
|     fun onFlingRight() | ||||
|  | ||||
|     fun onFlingLeft() | ||||
| } | ||||
|   | ||||
| @@ -23,8 +23,8 @@ interface HomeScreenGridItemsDao { | ||||
|     @Query("UPDATE home_screen_grid_items SET title = :title WHERE id = :id") | ||||
|     fun updateItemTitle(title: String, id: Long): Int | ||||
|  | ||||
|     @Query("UPDATE home_screen_grid_items SET `left` = :left, `top` = :top, `right` = :right, `bottom` = :bottom WHERE id = :id") | ||||
|     fun updateItemPosition(left: Int, top: Int, right: Int, bottom: Int, id: Long) | ||||
|     @Query("UPDATE home_screen_grid_items SET `left` = :left, `top` = :top, `right` = :right, `bottom` = :bottom, `page` = :page WHERE id = :id") | ||||
|     fun updateItemPosition(left: Int, top: Int, right: Int, bottom: Int, page: Int, id: Long) | ||||
|  | ||||
|     @Query("DELETE FROM home_screen_grid_items WHERE id = :id") | ||||
|     fun deleteById(id: Long) | ||||
|   | ||||
| @@ -15,6 +15,7 @@ data class HomeScreenGridItem( | ||||
|     @ColumnInfo(name = "top") var top: Int, | ||||
|     @ColumnInfo(name = "right") var right: Int, | ||||
|     @ColumnInfo(name = "bottom") var bottom: Int, | ||||
|     @ColumnInfo(name = "page") var page: Int, | ||||
|     @ColumnInfo(name = "package_name") var packageName: String, | ||||
|     @ColumnInfo(name = "activity_name") var activityName: String,   // needed at apps that create multiple icons at install, not just the launcher | ||||
|     @ColumnInfo(name = "title") var title: String, | ||||
| @@ -31,7 +32,7 @@ data class HomeScreenGridItem( | ||||
|     @Ignore var widthCells: Int = 1, | ||||
|     @Ignore var heightCells: Int = 1 | ||||
| ) { | ||||
|     constructor() : this(null, -1, -1, -1, -1, "", "", "", ITEM_TYPE_ICON, "", -1, "", "", null, null, null, null, 1, 1) | ||||
|     constructor() : this(null, -1, -1, -1, -1, 0, "", "", "", ITEM_TYPE_ICON, "", -1, "", "", null, null, null, null, 1, 1) | ||||
|  | ||||
|     fun getWidthInCells() = if (right == -1 || left == -1) { | ||||
|         widthCells | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import android.text.StaticLayout | ||||
| import android.text.TextPaint | ||||
| import android.text.TextUtils | ||||
| import android.util.AttributeSet | ||||
| import android.util.Log | ||||
| import android.util.Size | ||||
| import android.util.SizeF | ||||
| import android.view.View | ||||
| @@ -51,6 +52,9 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|     var cellWidth = 0 | ||||
|     var cellHeight = 0 | ||||
|  | ||||
|     private var currentPage = 0 | ||||
|     private var pageChangeEnabled = true | ||||
|  | ||||
|     // apply fake margins at the home screen. Real ones would cause the icons be cut at dragging at screen sides | ||||
|     var sideMargins = Rect() | ||||
|  | ||||
| @@ -165,6 +169,11 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|         } | ||||
|  | ||||
|         draggedItemCurrentCoords = Pair(x, y) | ||||
|         if (x > right - sideMargins.right) { | ||||
|             nextOrAdditionalPage() | ||||
|         } else if (x < left + 2 * sideMargins.left) { | ||||
|             prevPage() | ||||
|         } | ||||
|         redrawGrid() | ||||
|     } | ||||
|  | ||||
| @@ -210,7 +219,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                 item.bottom = cellsRect.bottom | ||||
|                 updateWidgetPositionAndSize(widgetView, item) | ||||
|                 ensureBackgroundThread { | ||||
|                     context.homeScreenGridItemsDB.updateItemPosition(cellsRect.left, cellsRect.top, cellsRect.right, cellsRect.bottom, item.id!!) | ||||
|                     context.homeScreenGridItemsDB.updateItemPosition(cellsRect.left, cellsRect.top, cellsRect.right, cellsRect.bottom, item.page, item.id!!) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @@ -249,7 +258,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|             // check if the destination cell is empty | ||||
|             var areAllCellsEmpty = true | ||||
|             val wantedCell = Pair(xIndex, yIndex) | ||||
|             gridItems.forEach { item -> | ||||
|             gridItems.filter { it.page == currentPage }.forEach { item -> | ||||
|                 for (xCell in item.left..item.right) { | ||||
|                     for (yCell in item.top..item.bottom) { | ||||
|                         val cell = Pair(xCell, yCell) | ||||
| @@ -272,9 +281,10 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                         top = yIndex | ||||
|                         right = xIndex | ||||
|                         bottom = yIndex | ||||
|                         page = currentPage | ||||
|  | ||||
|                         ensureBackgroundThread { | ||||
|                             context.homeScreenGridItemsDB.updateItemPosition(left, top, right, bottom, id!!) | ||||
|                             context.homeScreenGridItemsDB.updateItemPosition(left, top, right, bottom, page, id!!) | ||||
|                         } | ||||
|                     } | ||||
|                     redrawIcons = true | ||||
| @@ -286,6 +296,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                         yIndex, | ||||
|                         xIndex, | ||||
|                         yIndex, | ||||
|                         currentPage, | ||||
|                         draggedItem!!.packageName, | ||||
|                         draggedItem!!.activityName, | ||||
|                         draggedItem!!.title, | ||||
| @@ -372,6 +383,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                     top = widgetRect.top | ||||
|                     right = widgetRect.right | ||||
|                     bottom = widgetRect.bottom | ||||
|                     page = currentPage | ||||
|                 } | ||||
|  | ||||
|                 ensureBackgroundThread { | ||||
| @@ -383,7 +395,14 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                             bindWidget(widgetItem, false) | ||||
|                         } | ||||
|                     } else { | ||||
|                         context.homeScreenGridItemsDB.updateItemPosition(widgetItem.left, widgetItem.top, widgetItem.right, widgetItem.bottom, widgetItem.id!!) | ||||
|                         context.homeScreenGridItemsDB.updateItemPosition( | ||||
|                             widgetItem.left, | ||||
|                             widgetItem.top, | ||||
|                             widgetItem.right, | ||||
|                             widgetItem.bottom, | ||||
|                             currentPage, | ||||
|                             widgetItem.id!! | ||||
|                         ) | ||||
|                         val widgetView = widgetViews.firstOrNull { it.tag == widgetItem.widgetId } | ||||
|                         if (widgetView != null) { | ||||
|                             post { | ||||
| @@ -398,6 +417,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                             right = widgetItem.right | ||||
|                             top = widgetItem.top | ||||
|                             bottom = widgetItem.bottom | ||||
|                             page = widgetItem.page | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| @@ -529,7 +549,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|             fillCellSizes() | ||||
|         } | ||||
|  | ||||
|         gridItems.filter { it.drawable != null && it.type == ITEM_TYPE_ICON || it.type == ITEM_TYPE_SHORTCUT }.forEach { item -> | ||||
|         gridItems.filter { (it.drawable != null && it.type == ITEM_TYPE_ICON || it.type == ITEM_TYPE_SHORTCUT) && it.page == currentPage }.forEach { item -> | ||||
|             if (item.id != draggedItem?.id) { | ||||
|                 val drawableX = cellXCoords[item.left] + iconMargin + sideMargins.left | ||||
|  | ||||
| @@ -563,7 +583,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|         } | ||||
|  | ||||
|         if (isFirstDraw) { | ||||
|             gridItems.filter { it.type == ITEM_TYPE_WIDGET }.forEach { item -> | ||||
|             gridItems.filter { it.type == ITEM_TYPE_WIDGET && it.page == currentPage }.forEach { item -> | ||||
|                 bindWidget(item, true) | ||||
|             } | ||||
|         } | ||||
| @@ -771,4 +791,35 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private fun getMaxPage() = gridItems.map { it.page }.max() | ||||
|  | ||||
|     private fun nextOrAdditionalPage(redraw: Boolean = false) { | ||||
|         if (currentPage < getMaxPage() + 1 && pageChangeEnabled) { | ||||
|             currentPage++ | ||||
|             handlePageChange(redraw) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun nextPage(redraw: Boolean = false) { | ||||
|         if (currentPage < getMaxPage() && pageChangeEnabled) { | ||||
|             currentPage++ | ||||
|             handlePageChange(redraw) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun prevPage(redraw: Boolean = false) { | ||||
|         if (currentPage > 0 && pageChangeEnabled) { | ||||
|             currentPage-- | ||||
|             handlePageChange(redraw) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun handlePageChange(redraw: Boolean = false) { | ||||
|         pageChangeEnabled = false | ||||
|         if (redraw) { | ||||
|             redrawGrid() | ||||
|         } | ||||
|         postDelayed({ pageChangeEnabled = true }, 700L) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user