Merge pull request #80 from esensar/feature/60-row-column-count-customization

Add support for customizing row and column count in home grid
This commit is contained in:
Tibor Kaputa 2023-07-19 16:03:13 +02:00 committed by GitHub
commit 240c568d1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 334 additions and 73 deletions

View File

@ -161,8 +161,8 @@ class MainActivity : SimpleActivity(), FlingListener {
}
}
for (checkedYCell in 0 until COLUMN_COUNT) {
for (checkedXCell in 0 until ROW_COUNT - 1) {
for (checkedYCell in 0 until config.homeColumnCount) {
for (checkedXCell in 0 until config.homeRowCount - 1) {
val wantedCell = Pair(checkedXCell, checkedYCell)
if (!occupiedCells.contains(wantedCell)) {
return Rect(wantedCell.first, wantedCell.second, wantedCell.first, wantedCell.second)
@ -218,6 +218,10 @@ class MainActivity : SimpleActivity(), FlingListener {
window.navigationBarColor = Color.TRANSPARENT
}
home_screen_grid?.resizeGrid(
newRowCount = config.homeRowCount,
newColumnCount = config.homeColumnCount
)
(all_apps_fragment as? AllAppsFragment)?.onResume()
}
@ -436,11 +440,12 @@ class MainActivity : SimpleActivity(), FlingListener {
}, ANIMATION_DURATION)
}
fun homeScreenLongPressed(x: Float, y: Float) {
fun homeScreenLongPressed(eventX: Float, eventY: Float) {
if (isAllAppsFragmentExpanded()) {
return
}
val (x, y) = home_screen_grid.intoViewSpaceCoords(eventX, eventY)
mIgnoreMoveEvents = true
val clickedGridItem = home_screen_grid.isClickingGridItem(x.toInt(), y.toInt())
if (clickedGridItem != null) {
@ -452,8 +457,9 @@ class MainActivity : SimpleActivity(), FlingListener {
showMainLongPressMenu(x, y)
}
fun homeScreenClicked(x: Float, y: Float) {
fun homeScreenClicked(eventX: Float, eventY: Float) {
home_screen_grid.hideResizeLines()
val (x, y) = home_screen_grid.intoViewSpaceCoords(eventX, eventY)
val clickedGridItem = home_screen_grid.isClickingGridItem(x.toInt(), y.toInt())
if (clickedGridItem != null) {
performItemClick(clickedGridItem)
@ -492,7 +498,7 @@ class MainActivity : SimpleActivity(), FlingListener {
mLongPressedIcon = gridItem
val anchorY = if (isOnAllAppsFragment || gridItem.type == ITEM_TYPE_WIDGET) {
y
} else if (gridItem.top == ROW_COUNT - 1) {
} else if (gridItem.top == config.homeRowCount - 1) {
home_screen_grid.sideMargins.top + (gridItem.top * home_screen_grid.cellHeight.toFloat())
} else {
(gridItem.top * home_screen_grid.cellHeight.toFloat())
@ -722,7 +728,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, config.homeRowCount - 1, 0, config.homeRowCount - 1, defaultDialerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null)
homeScreenGridItems.add(dialerIcon)
}
} catch (e: Exception) {
@ -732,7 +738,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, config.homeRowCount - 1, 1, config.homeRowCount - 1, defaultSMSMessengerPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null)
homeScreenGridItems.add(SMSMessengerIcon)
}
} catch (e: Exception) {
@ -744,7 +750,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, config.homeRowCount - 1, 2, config.homeRowCount - 1, defaultBrowserPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null)
homeScreenGridItems.add(browserIcon)
}
} catch (e: Exception) {
@ -755,7 +761,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, config.homeRowCount - 1, 3, config.homeRowCount - 1, storePackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null)
homeScreenGridItems.add(storeIcon)
}
}
@ -768,7 +774,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, config.homeRowCount - 1, 4, config.homeRowCount - 1, defaultCameraPackage, "", title, ITEM_TYPE_ICON, "", -1, "", "", null)
homeScreenGridItems.add(cameraIcon)
}
} catch (e: Exception) {

View File

@ -12,6 +12,9 @@ import com.simplemobiletools.launcher.BuildConfig
import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.extensions.config
import com.simplemobiletools.launcher.helpers.MAX_COLUMN_COUNT
import com.simplemobiletools.launcher.helpers.MAX_ROW_COUNT
import com.simplemobiletools.launcher.helpers.MIN_COLUMN_COUNT
import com.simplemobiletools.launcher.helpers.MIN_ROW_COUNT
import kotlinx.android.synthetic.main.activity_settings.*
import java.util.Locale
import kotlin.system.exitProcess
@ -37,11 +40,13 @@ class SettingsActivity : SimpleActivity() {
setupUseEnglish()
setupDrawerColumnCount()
setupDrawerSearchBar()
setupHomeRowCount()
setupHomeColumnCount()
setupLanguage()
setupManageHiddenIcons()
updateTextColors(settings_holder)
arrayOf(settings_color_customization_section_label, settings_general_settings_label, settings_drawer_settings_label).forEach {
arrayOf(settings_color_customization_section_label, settings_general_settings_label, settings_drawer_settings_label, settings_home_screen_label).forEach {
it.setTextColor(getProperPrimaryColor())
}
}
@ -115,6 +120,44 @@ class SettingsActivity : SimpleActivity() {
}
}
private fun setupHomeRowCount() {
val currentRowCount = config.homeRowCount
settings_home_screen_row_count.text = currentRowCount.toString()
settings_home_screen_row_count_holder.setOnClickListener {
val items = ArrayList<RadioItem>()
for (i in MIN_ROW_COUNT..MAX_ROW_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(R.plurals.row_counts, i, i)))
}
RadioGroupDialog(this, items, currentRowCount) {
val newRowCount = it as Int
if (currentRowCount != newRowCount) {
config.homeRowCount = newRowCount
setupHomeRowCount()
}
}
}
}
private fun setupHomeColumnCount() {
val currentColumnCount = config.homeColumnCount
settings_home_screen_column_count.text = currentColumnCount.toString()
settings_home_screen_column_count_holder.setOnClickListener {
val items = ArrayList<RadioItem>()
for (i in MIN_COLUMN_COUNT..MAX_COLUMN_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(R.plurals.column_counts, i, i)))
}
RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) {
config.homeColumnCount = newColumnCount
setupHomeColumnCount()
}
}
}
}
private fun setupLanguage() {
settings_language.text = Locale.getDefault().displayLanguage
settings_language_holder.beVisibleIf(isTiramisuPlus())

View File

@ -18,6 +18,7 @@ import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.activities.MainActivity
import com.simplemobiletools.launcher.adapters.WidgetsAdapter
import com.simplemobiletools.launcher.extensions.config
import com.simplemobiletools.launcher.extensions.getInitialCellSize
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_SHORTCUT
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_WIDGET
@ -238,6 +239,11 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
}
override fun onWidgetLongPressed(appWidget: AppWidget) {
if (appWidget.heightCells > context.config.homeRowCount - 1 || appWidget.widthCells > context.config.homeColumnCount) {
context.showErrorToast(context.getString(R.string.widget_too_big))
return
}
val type = if (appWidget.isShortcut) {
ITEM_TYPE_SHORTCUT
} else {

View File

@ -13,6 +13,14 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(WAS_HOME_SCREEN_INIT, false)
set(wasHomeScreenInit) = prefs.edit().putBoolean(WAS_HOME_SCREEN_INIT, wasHomeScreenInit).apply()
var homeColumnCount: Int
get() = prefs.getInt(HOME_COLUMN_COUNT, COLUMN_COUNT)
set(homeColumnCount) = prefs.edit().putInt(HOME_COLUMN_COUNT, homeColumnCount).apply()
var homeRowCount: Int
get() = prefs.getInt(HOME_ROW_COUNT, ROW_COUNT)
set(homeRowCount) = prefs.edit().putInt(HOME_ROW_COUNT, homeRowCount).apply()
var drawerColumnCount: Int
get() = prefs.getInt(DRAWER_COLUMN_COUNT, context.resources.getInteger(R.integer.portrait_column_count))
set(drawerColumnCount) = prefs.edit().putInt(DRAWER_COLUMN_COUNT, drawerColumnCount).apply()

View File

@ -5,12 +5,17 @@ const val WIDGET_LIST_ITEMS_HOLDER = 1
// shared prefs
const val WAS_HOME_SCREEN_INIT = "was_home_screen_init"
const val HOME_ROW_COUNT = "home_row_count"
const val HOME_COLUMN_COUNT = "home_column_count"
const val DRAWER_COLUMN_COUNT = "drawer_column_count"
const val SHOW_SEARCH_BAR = "show_search_bar"
// default home screen grid size
const val ROW_COUNT = 6
const val COLUMN_COUNT = 5
const val MIN_ROW_COUNT = 2
const val MAX_ROW_COUNT = 15
const val MIN_COLUMN_COUNT = 2
const val MAX_COLUMN_COUNT = 15
const val UNINSTALL_APP_REQUEST_CODE = 50

View File

@ -26,16 +26,29 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isSPlus
import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.activities.MainActivity
import com.simplemobiletools.launcher.extensions.config
import com.simplemobiletools.launcher.extensions.getDrawableForPackageName
import com.simplemobiletools.launcher.extensions.homeScreenGridItemsDB
import com.simplemobiletools.launcher.helpers.*
import com.simplemobiletools.launcher.models.HomeScreenGridItem
import kotlinx.android.synthetic.main.activity_main.view.*
import kotlin.math.abs
import kotlin.math.floor
import kotlin.math.min
class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : RelativeLayout(context, attrs, defStyle) {
constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
private var iconMargin = context.resources.getDimension(R.dimen.icon_side_margin).toInt()
private var columnCount = context.config.homeColumnCount
private var rowCount = context.config.homeRowCount
private var cellXCoords = ArrayList<Int>(columnCount)
private var cellYCoords = ArrayList<Int>(rowCount)
var cellWidth = 0
var cellHeight = 0
private var extraXMargin = 0
private var extraYMargin = 0
private var iconMargin = (context.resources.getDimension(R.dimen.icon_side_margin) * 5 / columnCount).toInt()
private var labelSideMargin = context.resources.getDimension(R.dimen.small_margin).toInt()
private var roundedCornerRadius = context.resources.getDimension(R.dimen.activity_margin)
private var textPaint: TextPaint
@ -43,14 +56,9 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
private var draggedItem: HomeScreenGridItem? = null
private var resizedWidget: HomeScreenGridItem? = null
private var isFirstDraw = true
private var redrawWidgets = false
private var iconSize = 0
// let's use a 6x5 grid for now with 1 special row at the bottom, prefilled with default apps
private var cellXCoords = ArrayList<Int>(COLUMN_COUNT)
private var cellYCoords = ArrayList<Int>(ROW_COUNT)
var cellWidth = 0
var cellHeight = 0
// apply fake margins at the home screen. Real ones would cause the icons be cut at dragging at screen sides
var sideMargins = Rect()
@ -115,6 +123,19 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
}
}
fun resizeGrid(newRowCount: Int, newColumnCount: Int) {
if (columnCount != newColumnCount || rowCount != newRowCount) {
rowCount = newRowCount
columnCount = newColumnCount
cellXCoords = ArrayList(columnCount)
cellYCoords = ArrayList(rowCount)
gridCenters.clear()
iconMargin = (context.resources.getDimension(R.dimen.icon_side_margin) * 5 / columnCount).toInt()
redrawWidgets = true
redrawGrid()
}
}
fun removeAppIcon(item: HomeScreenGridItem) {
ensureBackgroundThread {
removeItemFromHomeScreen(item)
@ -207,10 +228,14 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
item.left = cellsRect.left
item.top = cellsRect.top
item.right = cellsRect.right
item.bottom = cellsRect.bottom
item.bottom = if (cellsRect.bottom > rowCount - 2) {
rowCount - 2
} else {
cellsRect.bottom
}
updateWidgetPositionAndSize(widgetView, item)
ensureBackgroundThread {
context.homeScreenGridItemsDB.updateItemPosition(cellsRect.left, cellsRect.top, cellsRect.right, cellsRect.bottom, item.id!!)
context.homeScreenGridItemsDB.updateItemPosition(item.left, item.top, item.right, item.bottom, item.id!!)
}
}
@ -385,7 +410,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
} else {
context.homeScreenGridItemsDB.updateItemPosition(widgetItem.left, widgetItem.top, widgetItem.right, widgetItem.bottom, widgetItem.id!!)
val widgetView = widgetViews.firstOrNull { it.tag == widgetItem.widgetId }
if (widgetView != null) {
if (widgetView != null && !widgetItem.outOfBounds()) {
post {
widgetView.x = calculateWidgetX(widgetItem.left)
widgetView.y = calculateWidgetY(widgetItem.top)
@ -490,9 +515,9 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
return Size(widgetWidth, widgetHeight)
}
private fun calculateWidgetX(leftCell: Int) = leftCell * cellWidth + sideMargins.left.toFloat()
private fun calculateWidgetX(leftCell: Int) = cellXCoords[leftCell] + sideMargins.left.toFloat() + extraXMargin
private fun calculateWidgetY(topCell: Int) = topCell * cellHeight + sideMargins.top.toFloat()
private fun calculateWidgetY(topCell: Int) = cellYCoords[topCell] + sideMargins.top.toFloat() + extraYMargin
// convert stuff like 102x192 to grid cells like 0x1
private fun getClosestGridCells(center: Pair<Int, Int>): Pair<Int, Int>? {
@ -530,20 +555,24 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
}
gridItems.filter { it.drawable != null && it.type == ITEM_TYPE_ICON || it.type == ITEM_TYPE_SHORTCUT }.forEach { item ->
if (item.id != draggedItem?.id) {
val drawableX = cellXCoords[item.left] + iconMargin + sideMargins.left
if (item.outOfBounds()) {
return@forEach
}
if (item.id != draggedItem?.id) {
val drawableX = cellXCoords[item.left] + iconMargin + extraXMargin + sideMargins.left
if (item.top == rowCount - 1) {
val drawableY = cellYCoords[item.top] + cellHeight - iconMargin - iconSize + sideMargins.top
// icons at the bottom are drawn at the bottom of the grid and they have no label
if (item.top == ROW_COUNT - 1) {
val drawableY = cellYCoords[item.top] + cellHeight - iconSize - iconMargin * 2 + sideMargins.top
item.drawable!!.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize)
} else {
val drawableY = cellYCoords[item.top] + iconSize / 2 + sideMargins.top
val drawableY = cellYCoords[item.top] + iconMargin + extraYMargin + sideMargins.top
item.drawable!!.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize)
if (item.id != draggedItem?.id && item.title.isNotEmpty()) {
val textX = cellXCoords[item.left].toFloat() + labelSideMargin + sideMargins.left
val textY = cellYCoords[item.top] + iconSize * 1.5f + labelSideMargin + sideMargins.top
val textY = cellYCoords[item.top].toFloat() + iconSize + iconMargin + extraYMargin + labelSideMargin + sideMargins.top
val staticLayout = StaticLayout.Builder
.obtain(item.title, 0, item.title.length, textPaint, cellWidth - 2 * labelSideMargin)
.setMaxLines(2)
@ -562,29 +591,30 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
}
}
if (isFirstDraw) {
gridItems.filter { it.type == ITEM_TYPE_WIDGET }.forEach { item ->
bindWidget(item, true)
if (isFirstDraw || redrawWidgets) {
gridItems.filter { it.type == ITEM_TYPE_WIDGET && !it.outOfBounds() }.forEach { item ->
bindWidget(item, isFirstDraw)
}
redrawWidgets = false
}
if (draggedItem != null && draggedItemCurrentCoords.first != -1 && draggedItemCurrentCoords.second != -1) {
if (draggedItem!!.type == ITEM_TYPE_ICON || draggedItem!!.type == ITEM_TYPE_SHORTCUT) {
// draw a circle under the current cell
val center = gridCenters.minBy {
Math.abs(it.first - draggedItemCurrentCoords.first + sideMargins.left) + Math.abs(it.second - draggedItemCurrentCoords.second + sideMargins.top)
abs(it.first - draggedItemCurrentCoords.first + sideMargins.left) + abs(it.second - draggedItemCurrentCoords.second + sideMargins.top)
}
val gridCells = getClosestGridCells(center)
if (gridCells != null) {
val shadowX = cellXCoords[gridCells.first] + iconMargin.toFloat() + iconSize / 2 + sideMargins.left
val shadowY = if (gridCells.second == ROW_COUNT - 1) {
cellYCoords[gridCells.second] + cellHeight - iconSize / 2 - iconMargin * 2
val shadowX = cellXCoords[gridCells.first] + iconMargin + iconSize / 2f + extraXMargin + sideMargins.left
val shadowY = if (gridCells.second == rowCount - 1) {
cellYCoords[gridCells.second] + cellHeight - iconMargin - iconSize / 2f
} else {
cellYCoords[gridCells.second] + iconSize
cellYCoords[gridCells.second] + iconMargin + iconSize / 2f + extraYMargin
} + sideMargins.top
canvas.drawCircle(shadowX, shadowY.toFloat(), iconSize / 2f, dragShadowCirclePaint)
canvas.drawCircle(shadowX, shadowY, iconSize / 2f, dragShadowCirclePaint)
}
// show the app icon itself at dragging, move it above the finger a bit to make it visible
@ -602,10 +632,10 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
val gridCells = getClosestGridCells(center)
if (gridCells != null) {
val widgetRect = getWidgetOccupiedRect(gridCells)
val leftSide = widgetRect.left * cellWidth + sideMargins.left + iconMargin.toFloat()
val topSide = widgetRect.top * cellHeight + sideMargins.top + iconMargin.toFloat()
val rightSide = leftSide + draggedItem!!.getWidthInCells() * cellWidth - sideMargins.right - iconMargin.toFloat()
val bottomSide = topSide + draggedItem!!.getHeightInCells() * cellHeight - sideMargins.top
val leftSide = calculateWidgetX(widgetRect.left)
val topSide = calculateWidgetY(widgetRect.top)
val rightSide = leftSide + draggedItem!!.getWidthInCells() * cellWidth
val bottomSide = topSide + draggedItem!!.getHeightInCells() * cellHeight
canvas.drawRoundRect(leftSide, topSide, rightSide, bottomSide, roundedCornerRadius, roundedCornerRadius, dragShadowCirclePaint)
}
@ -630,14 +660,24 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
}
private fun fillCellSizes() {
cellWidth = getFakeWidth() / COLUMN_COUNT
cellHeight = getFakeHeight() / ROW_COUNT
iconSize = cellWidth - 2 * iconMargin
for (i in 0 until COLUMN_COUNT) {
cellWidth = getFakeWidth() / context.config.homeColumnCount
cellHeight = getFakeHeight() / context.config.homeRowCount
extraXMargin = if (cellWidth > cellHeight) {
(cellWidth - cellHeight) / 2
} else {
0
}
extraYMargin = if (cellHeight > cellWidth) {
(cellHeight - cellWidth) / 2
} else {
0
}
iconSize = min(cellWidth, cellHeight) - 2 * iconMargin
for (i in 0 until context.config.homeColumnCount) {
cellXCoords.add(i, i * cellWidth)
}
for (i in 0 until ROW_COUNT) {
for (i in 0 until context.config.homeRowCount) {
cellYCoords.add(i, i * cellHeight)
}
@ -666,27 +706,33 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
fillCellSizes()
}
val clickableLeft = item.left * cellWidth + sideMargins.left
val clickableTop = cellYCoords[item.top] + iconSize / 3 + sideMargins.top
return Rect(clickableLeft, clickableTop, clickableLeft + cellWidth, clickableTop + iconSize * 2)
val clickableLeft = cellXCoords[item.left] + sideMargins.left + extraXMargin
val clickableTop = if (item.top == rowCount - 1) {
cellYCoords[item.top] + cellHeight - iconSize - iconMargin
} else {
cellYCoords[item.top] - iconMargin + extraYMargin
} + sideMargins.top
return Rect(clickableLeft, clickableTop, clickableLeft + iconSize + 2 * iconMargin, clickableTop + iconSize + 2 * iconMargin)
}
// drag the center of the widget, not the top left corner
private fun getWidgetOccupiedRect(item: Pair<Int, Int>): Rect {
val left = item.first - Math.floor((draggedItem!!.getWidthInCells() - 1) / 2.0).toInt()
val left = item.first - floor((draggedItem!!.getWidthInCells() - 1) / 2.0).toInt()
val rect = Rect(left, item.second, left + draggedItem!!.getWidthInCells() - 1, item.second + draggedItem!!.getHeightInCells() - 1)
if (rect.left < 0) {
rect.right -= rect.left
rect.left = 0
} else if (rect.right > COLUMN_COUNT - 1) {
val diff = rect.right - COLUMN_COUNT + 1
} else if (rect.right > columnCount - 1) {
val diff = rect.right - columnCount + 1
rect.right -= diff
rect.left -= diff
}
// do not allow placing widgets at the bottom row, that is for pinned default apps
if (rect.bottom >= ROW_COUNT - 1) {
val diff = rect.bottom - ROW_COUNT + 2
if (rect.top < 0) {
rect.bottom -= rect.top
rect.top = 0
} else if (rect.bottom > rowCount - 2) {
val diff = rect.bottom - rowCount + 2
rect.bottom -= diff
rect.top -= diff
}
@ -696,6 +742,10 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
fun isClickingGridItem(x: Int, y: Int): HomeScreenGridItem? {
for (gridItem in gridItems) {
if (gridItem.outOfBounds()) {
continue
}
if (gridItem.type == ITEM_TYPE_ICON || gridItem.type == ITEM_TYPE_SHORTCUT) {
val rect = getClickableRect(gridItem)
if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {
@ -716,6 +766,18 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
return null
}
fun intoViewSpaceCoords(screenSpaceX: Float, screenSpaceY: Float): Pair<Float, Float> {
val viewLocation = IntArray(2)
getLocationOnScreen(viewLocation)
val x = screenSpaceX - viewLocation[0]
val y = screenSpaceY - viewLocation[1]
return Pair(x, y)
}
private fun HomeScreenGridItem.outOfBounds(): Boolean {
return (left >= cellXCoords.size || right >= cellXCoords.size || top >= cellYCoords.size || bottom >= cellYCoords.size)
}
private inner class HomeScreenGridTouchHelper(host: View) : ExploreByTouchHelper(host) {
override fun getVirtualViewAt(x: Float, y: Float): Int {
val item = isClickingGridItem(x.toInt(), y.toInt())
@ -769,6 +831,5 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
return false
}
}
}

View File

@ -9,10 +9,9 @@ import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.RelativeLayout
import com.simplemobiletools.launcher.R
import com.simplemobiletools.launcher.extensions.config
import com.simplemobiletools.launcher.extensions.getCellCount
import com.simplemobiletools.launcher.helpers.COLUMN_COUNT
import com.simplemobiletools.launcher.helpers.MAX_CLICK_DURATION
import com.simplemobiletools.launcher.helpers.ROW_COUNT
import com.simplemobiletools.launcher.models.HomeScreenGridItem
@SuppressLint("ViewConstructor")
@ -76,8 +75,8 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
it.provider.className == gridItem.className
} ?: return
minResizeWidthCells = Math.min(COLUMN_COUNT, context.getCellCount(providerInfo.minResizeWidth))
minResizeHeightCells = Math.min(ROW_COUNT, context.getCellCount(providerInfo.minResizeHeight))
minResizeWidthCells = Math.min(context.config.homeColumnCount, context.getCellCount(providerInfo.minResizeWidth))
minResizeHeightCells = Math.min(context.config.homeRowCount, context.getCellCount(providerInfo.minResizeHeight))
redrawFrame()
occupiedCells.clear()
@ -224,7 +223,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
}
}
if (wantedBottomCellY == ROW_COUNT - 1) {
if (wantedBottomCellY == context.config.homeRowCount - 1) {
areAllCellsFree = false
}
@ -322,7 +321,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
}
}
if (wantedBottomCellY == ROW_COUNT - 1) {
if (wantedBottomCellY == context.config.homeRowCount - 1) {
areAllCellsFree = false
}

View File

@ -176,7 +176,7 @@
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_bottom_corners">
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_search_bar"
@ -186,6 +186,65 @@
android:text="@string/show_search" />
</RelativeLayout>
<include
android:id="@+id/settings_drawer_settings_divider"
layout="@layout/divider" />
<TextView
android:id="@+id/settings_home_screen_label"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/home_screen_settings" />
<RelativeLayout
android:id="@+id/settings_home_screen_row_count_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_home_screen_row_count_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/row_count" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_home_screen_row_count"
style="@style/SettingsTextValueStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_home_screen_row_count_label"
tools:text="3" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_home_screen_column_count_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_home_screen_column_count_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/column_count" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_home_screen_column_count"
style="@style/SettingsTextValueStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_home_screen_column_count_label"
tools:text="3" />
</RelativeLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -12,8 +12,10 @@
<string name="hidden_icons">اﻷيقونات المخفية</string>
<string name="hidden_icons_placeholder">لا يمكن إلغاء تثبيت بعض التطبيقات بسبب قيود النظام، ولكن يمكن إخفاء أيقوناتها لتجنب ظهورها.</string>
<string name="app_drawer_settings">درج التطبيق</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Скрити икони</string>
<string name="hidden_icons_placeholder">Някои приложения не могат да бъдат деинсталирани поради системни ограничения, но можете поне да скриете иконите им, за да не ги виждате.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Icones ocultes</string>
<string name="hidden_icons_placeholder">Algunes aplicacions no es poden desinstal·lar a causa de les restriccions del sistema, però almenys podeu ocultar les seves icones per evitar que es vegin.</string>
<string name="app_drawer_settings">Calaix d\'aplicacions</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Skryté ikony</string>
<string name="hidden_icons_placeholder">Některé aplikace nelze kvůli systémovým omezením odinstalovat. Ale můžete alespoň skrýt jejich ikony, abyste je neviděli.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Ausgeblendete Symbole</string>
<string name="hidden_icons_placeholder">Einige Apps können aufgrund von Systemeinschränkungen nicht deinstalliert werden, aber du kannst zumindest ihre Symbole ausblenden, um sie nicht zu sehen.</string>
<string name="app_drawer_settings">App-Schublade</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Κρυφά εικονίδια</string>
<string name="hidden_icons_placeholder">Ορισμένες εφαρμογές δεν μπορούν να απεγκατασταθούν λόγω περιορισμών του συστήματος, αλλά μπορείτε να αποκρύψετε τα εικονίδια τους για να μην φαίνονται.</string>
<string name="app_drawer_settings">Συρτάρι εφαρμογών</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Iconos ocultos</string>
<string name="hidden_icons_placeholder">Algunas aplicaciones no se pueden desinstalar debido a las restricciones del sistema, pero al menos puedes ocultar sus iconos para evitar verlas.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Peidetud ikoonid</string>
<string name="hidden_icons_placeholder">Mõnda rakendust ei saa süsteemipiirangute tõttu eemaldada. Selleks, et neid mitte näha, võid vähemalt nende ikoonid ära peita.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Piilotetut kuvakkeet</string>
<string name="hidden_icons_placeholder">Joitakin sovelluksia ei ole järjestelmärajoitusten vuoksi mahdollista poistaa, mutta voit kuitenkin piilottaa niiden kuvakkeet näkyvistä.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Icônes cachées</string>
<string name="hidden_icons_placeholder">Certaines applications ne peuvent pas être désinstallées en raison de restrictions du système, mais vous pouvez au moins masquer leurs icônes pour éviter de les voir.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Iconas ocultas</string>
<string name="hidden_icons_placeholder">Algunhas aplicacións non se poden desinstalar debido ás restricións do sistema, pero polo menos podes ocultar as súas iconas para evitar velas.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Skrivene ikone</string>
<string name="hidden_icons_placeholder">Neke aplikacije se ne mogu deinstalirati zbog ograničenja sustava, ali njihove ikone možeš sakriti.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Rejtett ikonok</string>
<string name="hidden_icons_placeholder">Egyes alkalmazások rendszerkorlátozások miatt nem távolíthatók el, de legalább elrejtheti az ikonjaikat, hogy ne lássa őket.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Ikon tersembunyi</string>
<string name="hidden_icons_placeholder">Beberapa aplikasi tidak dapat di-uninstal karena keterbatasan sistem, tetapi Anda masih dapat menyembunyikan ikon mereka untuk menyembunyikannya.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Icone nascoste</string>
<string name="hidden_icons_placeholder">Alcune applicazioni non possono essere disinstallate a causa di restrizioni di sistema, ma è possibile almeno nascondere le loro icone per evitare di vederle.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">אייקונים נסתרים</string>
<string name="hidden_icons_placeholder">חלק מהאפליקציות לא ניתנות להסרה עקב הגבלות מערכת, לפחות אתה יכול להחביא את האייקונים כדי לא לראותם במסך הבית.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">非表示のアイコン</string>
<string name="hidden_icons_placeholder">一部のアプリはシステムの制限によりアンインストールできませんが、非表示によって表示されないようにすることはできます。</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Hidden icons</string>
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">മറഞ്ഞിരിക്കുന്ന ബിംബ</string>
<string name="hidden_icons_placeholder">സിസ്റ്റം നിയന്ത്രണങ്ങൾ കാരണം ചില ആപ്പുകൾ അൺഇൻസ്‌റ്റാൾ ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവ കാണാതിരിക്കാൻ നിങ്ങൾക്ക് അവയുടെ ഐക്കണുകളെങ്കിലും മറയ്‌ക്കാം.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Skjulte ikoner</string>
<string name="hidden_icons_placeholder">Noen apper kan ikke avinstalleres pga. systemrestriksjoner, men du kan i det minste skjule deres ikoner for å unngå å se dem.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Verborgen iconen</string>
<string name="hidden_icons_placeholder">Sommige apps kunnen niet worden verwijderd van het systeem, maar hun iconen kunnen wel worden verborgen.</string>
<string name="app_drawer_settings">App-overzicht</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">لُکاۓ آئیکون</string>
<string name="hidden_icons_placeholder">سِسٹم پابندیاں کرکے کجھ اَیپاں اݨ‌اینسٹال کر نہیں سکیاں، پر تسیں آئیکون لُکا سکدے او۔</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Ukryte ikony</string>
<string name="hidden_icons_placeholder">Niektórych aplikacji nie można odinstalować ze względu na ograniczenia systemowe, ale możesz przynajmniej ukryć ich ikony, aby ich nie widzieć.</string>
<string name="app_drawer_settings">Szuflada aplikacji</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Ícones ocultos</string>
<string name="hidden_icons_placeholder">Alguns aplicativos não podem ser desinstalados devido a restrições do sistema, mas você pode ao menos ocultar seus ícones para evitar vê-los.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Ícones ocultos</string>
<string name="hidden_icons_placeholder">Algumas aplicações não podem ser desinstaladas mas pode ocultar os seus ícones.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Hidden icons</string>
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Скрытые значки</string>
<string name="hidden_icons_placeholder">Некоторые приложения нельзя удалить из-за системных ограничений, но можно скрыть их значки.</string>
<string name="app_drawer_settings">Панель приложения</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Skryté ikonky</string>
<string name="hidden_icons_placeholder">Niektoré apky nemôžu byť odinštalované kvôli systémovým obmedzeniam, viete ich ale aspoň skryť, aby ste ich nevideli.</string>
<string name="app_drawer_settings">Zoznam apiek</string>
<string name="home_screen_settings">Domáca obrazovka</string>
<string name="widget_too_big">Widget je príliš veľký pre súčasnú domácu obrazovku</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Skrite ikone</string>
<string name="hidden_icons_placeholder">Določenih aplikacij zaradi sistemskih omejitev ni mogoče odstraniti, njihove ikone pa skrijete, da jih ne vidite.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Скривене иконе</string>
<string name="hidden_icons_placeholder">Неке апликације се не могу деинсталирати због системских ограничења, али можете барем сакрити њихове иконе да их не видите.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Dolda ikoner</string>
<string name="hidden_icons_placeholder">Vissa appar kan inte avinstalleras på grund av systembegränsningar, men du kan åtminstone dölja deras ikoner för att slippa se dem.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Gizli simgeler</string>
<string name="hidden_icons_placeholder">Bazı uygulamalar sistem kısıtlamaları nedeniyle kaldırılamaz, ancak en azından onları görmemek için simgelerini gizleyebilirsiniz.</string>
<string name="app_drawer_settings">Uygulama çekmecesi</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">Приховані піктограми</string>
<string name="hidden_icons_placeholder">Деякі застосунки не можна видалити через системні обмеження, але ви можете принаймні приховати їх піктограми, щоб уникнути їх перегляду.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">ⵜⵉⵙⵓⵔⴰ ⵉⴼⴼⵔⵏ</string>
<string name="hidden_icons_placeholder">ⵓⵔ ⵜⵣⵔⵉⵏ ⵜⵓⵙⵙⵔⴰ ⴽⵔⴰ ⵜⵙⵏⵙⵉⵡⵉⵏ ⵙ ⵜⵎⵏⵜⵉⵍⵜ ⵉⵙⵍⴳⵏⵏ ⵓⵏⴳⵔⴰⵡ, ⵎⴰⵛⴰ ⵜⵣⵔⵉ ⵜⵓⴼⴼⵔⴰ ⵜⵙⵓⵔⴰ ⵏⵏⵙⵏⵜ ⵃⵎⴰ ⵓⵔ ⴷ ⵜⵜⴹⵀⴰⵕⵏⵜ.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,4 +12,6 @@
<string name="hidden_icons">隐藏的图标</string>
<string name="hidden_icons_placeholder">某些应用因系统限制而无法卸载, 但你至少可以隐藏它们的图标避免看见它们。</string>
<string name="app_drawer_settings">应用抽屉</string>
</resources>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
</resources>

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">隱藏圖示</string>
<string name="hidden_icons_placeholder">由於系統限制,有些應用程式無法被移除,但您至少可以將它們的圖示隱藏起來,避免看到它們。</string>
<string name="app_drawer_settings">應用程式抽屜</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -12,6 +12,8 @@
<string name="hidden_icons">Hidden icons</string>
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
<string name="app_drawer_settings">App drawer</string>
<string name="home_screen_settings">Home screen</string>
<string name="widget_too_big">Widget is too big for current home screen size</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res