11 Commits
1.1.2 ... 1.1.3

Author SHA1 Message Date
fossifybot[bot]
0608d59b00 chore(release): v1.1.3 (6) (#176)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-06-19 17:48:09 +05:30
AND
f2c4c99255 chore(l10n): update Macedonian translations
Currently translated at 5.8% (1 of 17 strings)

Translation: Fossify/Launcher
Translate-URL: https://hosted.weblate.org/projects/fossify/launcher/mk/
Via: Weblate
2025-06-19 17:47:24 +05:30
elid
8d7458688e chore(l10n): update Hebrew translations
Currently translated at 100.0% (17 of 17 strings)

Translation: Fossify/Launcher
Translate-URL: https://hosted.weblate.org/projects/fossify/launcher/he/
Via: Weblate
2025-06-19 17:47:24 +05:30
Oasis Tri
41233ba439 chore(l10n): update French translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/Launcher metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/launcher-metadata/fr/
Via: Weblate
2025-06-19 17:47:24 +05:30
OlliesGudh
47dfcc7c6a chore(l10n): update Portuguese (Brazil) translations
Currently translated at 100.0% (17 of 17 strings)

Translation: Fossify/Launcher
Translate-URL: https://hosted.weblate.org/projects/fossify/launcher/pt_BR/
Via: Weblate
2025-06-19 17:47:24 +05:30
Naveen Singh
f3f2eb8500 fix: address various errors and crashes (#175)
* fix: avoid passing illegal arguments when converting to bitmap

* fix: handle null shortcutInfo gracefully

* style: format code

* fix: use read-only list to avoid concurrent modifications

* fix: use safe calls to prevent NPEs

* style: format code

* fix: catch exceptions from `AppWidgetHost.stopListening()`

* docs: update changelog
2025-06-19 16:54:55 +05:30
dependabot[bot]
598da18f7d chore(deps): bump fastlane from 2.227.2 to 2.228.0 (#173)
Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.2 to 2.228.0.
- [Release notes](https://github.com/fastlane/fastlane/releases)
- [Changelog](https://github.com/fastlane/fastlane/blob/master/CHANGELOG.latest.md)
- [Commits](https://github.com/fastlane/fastlane/compare/fastlane/2.227.2...fastlane/2.228.0)

---
updated-dependencies:
- dependency-name: fastlane
  dependency-version: 2.228.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 09:36:07 +05:30
dependabot[bot]
a09315cb60 chore(deps): bump com.google.devtools.ksp (#171)
Bumps [com.google.devtools.ksp](https://github.com/google/ksp) from 2.1.21-2.0.1 to 2.1.21-2.0.2.
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.1.21-2.0.1...2.1.21-2.0.2)

---
updated-dependencies:
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.1.21-2.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 09:35:22 +05:30
dependabot[bot]
6905d13a65 chore(deps): bump org.fossify:commons from 3.0.3 to 3.0.5 (#172)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 3.0.3 to 3.0.5.
- [Commits](https://github.com/FossifyOrg/commons/compare/3.0.3...3.0.5)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 3.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 09:35:09 +05:30
dependabot[bot]
afc7d0fea3 chore(deps): bump org.fossify:commons from 2.0.1 to 3.0.3 (#168)
Bumps org.fossify:commons from 2.0.1 to 3.0.3.

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-10 10:22:07 +05:30
Naveen Singh
80160e72d1 ci: add fastlane metadata validation and update release trigger
* ci: auto trigger release pull requests when on changelog update

* chore: add code owners

* ci: add fastlane metadata validation
2025-06-09 14:48:55 +05:30
16 changed files with 674 additions and 285 deletions

View File

@@ -1,2 +1,2 @@
# Auto-generated file. DO NOT EDIT.
1.1.2
1.1.3

View File

@@ -22,8 +22,6 @@ updates:
prefix: "chore"
prefix-development: "chore"
include: "scope"
assignees:
- "naveensingh"
- package-ecosystem: "gradle"
directory: "/"
@@ -37,8 +35,6 @@ updates:
prefix: "chore"
prefix-development: "chore"
include: "scope"
assignees:
- "naveensingh"
- package-ecosystem: "github-actions"
directory: "/"
@@ -48,5 +44,3 @@ updates:
prefix: "chore"
prefix-development: "chore"
include: "scope"
assignees:
- "naveensingh"

View File

@@ -4,6 +4,10 @@ on:
repository_dispatch:
types: [prepare-release]
workflow_dispatch:
push:
branches: [main]
paths:
- "CHANGELOG.md"
jobs:
call-release-pr:

View File

@@ -0,0 +1,15 @@
name: Fastlane metadata validation
on:
push:
branches: [main]
paths:
- "fastlane/**"
pull_request:
branches: [main]
paths:
- "fastlane/**"
jobs:
validate:
uses: FossifyOrg/.github/.github/workflows/validate-fastlane-metadata.yml@main

View File

@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [1.1.3] - 2025-06-19
### Changed
- Updated translations
### Fixed
- Addressed frequently occurring crashes ([#6])
## [1.1.2] - 2025-06-06
### Changed
@@ -55,7 +65,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Initial release
[Unreleased]: https://github.com/FossifyOrg/Launcher/compare/1.1.2...HEAD
[Unreleased]: https://github.com/FossifyOrg/Launcher/compare/1.1.3...HEAD
[1.1.3]: https://github.com/FossifyOrg/Launcher/compare/1.1.2...1.1.3
[1.1.2]: https://github.com/FossifyOrg/Launcher/compare/1.1.1...1.1.2
[1.1.1]: https://github.com/FossifyOrg/Launcher/compare/1.1.0...1.1.1
[1.1.0]: https://github.com/FossifyOrg/Launcher/compare/1.0.1...1.1.0
@@ -63,6 +74,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[1.0.0]: https://github.com/FossifyOrg/Launcher/releases/tag/1.0.0
[#5]: https://github.com/FossifyOrg/Launcher/issues/5
[#6]: https://github.com/FossifyOrg/Launcher/issues/6
[#44]: https://github.com/FossifyOrg/Launcher/issues/44
[#51]: https://github.com/FossifyOrg/Launcher/issues/51
[#63]: https://github.com/FossifyOrg/Launcher/issues/63

1
CODEOWNERS Normal file
View File

@@ -0,0 +1 @@
* @naveensingh

View File

@@ -10,26 +10,26 @@ GEM
public_suffix (>= 2.0.2, < 7.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.2)
aws-partitions (1.1097.0)
aws-sdk-core (3.223.0)
aws-eventstream (1.4.0)
aws-partitions (1.1116.0)
aws-sdk-core (3.225.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.100.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-kms (1.105.0)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.185.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-s3 (1.189.1)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.11.0)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
base64 (0.3.0)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
@@ -71,7 +71,7 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.227.2)
fastlane (2.228.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -160,7 +160,7 @@ GEM
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.11.3)
json (2.12.2)
jwt (2.10.1)
base64
logger (1.7.0)
@@ -170,13 +170,13 @@ GEM
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.2.1)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.2)
public_suffix (6.0.2)
rake (13.2.1)
rake (13.3.0)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)

View File

@@ -2,7 +2,6 @@ package org.fossify.home.activities
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.app.admin.DevicePolicyManager
import android.app.role.RoleManager
import android.appwidget.AppWidgetHost
@@ -10,7 +9,6 @@ import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProviderInfo
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.LauncherApps
@@ -20,7 +18,6 @@ import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -97,6 +94,7 @@ import org.fossify.home.receivers.LockDeviceAdminReceiver
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
import androidx.core.net.toUri
class MainActivity : SimpleActivity(), FlingListener {
private var mTouchDownX = -1
@@ -222,7 +220,7 @@ class MainActivity : SimpleActivity(), FlingListener {
if (!showIcon) {
try {
launchersDB.deleteById(it.id!!)
} catch (ignored: Exception) {
} catch (_: Exception) {
}
}
showIcon
@@ -248,7 +246,11 @@ class MainActivity : SimpleActivity(), FlingListener {
override fun onStop() {
super.onStop()
binding.homeScreenGrid.root.appWidgetHost.stopListening()
try {
binding.homeScreenGrid.root.appWidgetHost.stopListening()
} catch (_: Exception) {
}
wasJustPaused = false
}
@@ -283,19 +285,20 @@ class MainActivity : SimpleActivity(), FlingListener {
}
}
REQUEST_ALLOW_BINDING_WIDGET -> mActionOnCanBindWidget?.invoke(resultCode == Activity.RESULT_OK)
REQUEST_CONFIGURE_WIDGET -> mActionOnWidgetConfiguredWidget?.invoke(resultCode == Activity.RESULT_OK)
REQUEST_ALLOW_BINDING_WIDGET -> mActionOnCanBindWidget?.invoke(resultCode == RESULT_OK)
REQUEST_CONFIGURE_WIDGET -> mActionOnWidgetConfiguredWidget?.invoke(resultCode == RESULT_OK)
REQUEST_CREATE_SHORTCUT -> {
if (resultCode == Activity.RESULT_OK && resultData != null) {
if (resultCode == RESULT_OK && resultData != null) {
val launcherApps =
applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
applicationContext.getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
if (launcherApps.hasShortcutHostPermission()) {
val item = launcherApps.getPinItemRequest(resultData)
val shortcutInfo = item?.shortcutInfo ?: return
if (item.accept()) {
val shortcutId = item.shortcutInfo?.id!!
val label = item.shortcutInfo.getLabel()
val shortcutId = shortcutInfo.id
val label = shortcutInfo.getLabel()
val icon = launcherApps.getShortcutBadgedIconDrawable(
item.shortcutInfo!!,
shortcutInfo,
resources.displayMetrics.densityDpi
)
mActionOnAddShortcut?.invoke(shortcutId, label, icon)
@@ -324,7 +327,7 @@ class MainActivity : SimpleActivity(), FlingListener {
try {
mDetector.onTouchEvent(event)
} catch (ignored: Exception) {
} catch (_: Exception) {
}
when (event.actionMasked) {
@@ -436,17 +439,15 @@ class MainActivity : SimpleActivity(), FlingListener {
private fun handleIntentAction(intent: Intent) {
if (intent.action == LauncherApps.ACTION_CONFIRM_PIN_SHORTCUT) {
val launcherApps =
applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
applicationContext.getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
val item = launcherApps.getPinItemRequest(intent)
if (item.shortcutInfo == null) {
return
}
val shortcutInfo = item?.shortcutInfo ?: return
ensureBackgroundThread {
val shortcutId = item.shortcutInfo?.id!!
val label = item.shortcutInfo.getLabel()
val shortcutId = shortcutInfo.id
val label = shortcutInfo.getLabel()
val icon = launcherApps.getShortcutBadgedIconDrawable(
item.shortcutInfo!!,
shortcutInfo,
resources.displayMetrics.densityDpi
)
val (page, rect) = findFirstEmptyCell()
@@ -457,7 +458,7 @@ class MainActivity : SimpleActivity(), FlingListener {
right = rect.right,
bottom = rect.bottom,
page = page,
packageName = item.shortcutInfo!!.`package`,
packageName = shortcutInfo.`package`,
activityName = "",
title = label,
type = ITEM_TYPE_SHORTCUT,
@@ -479,7 +480,7 @@ class MainActivity : SimpleActivity(), FlingListener {
try {
item.accept()
binding.homeScreenGrid.root.storeAndShowGridItem(gridItem)
} catch (ignored: IllegalStateException) {
} catch (_: IllegalStateException) {
}
}
}
@@ -573,6 +574,8 @@ class MainActivity : SimpleActivity(), FlingListener {
window.navigationBarColor = resources.getColor(R.color.semitransparent_navigation)
binding.homeScreenGrid.root.fragmentExpanded()
binding.homeScreenGrid.root.hideResizeLines()
@SuppressLint("AccessibilityFocus")
fragment.root.performAccessibilityAction(
AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS,
null
@@ -641,7 +644,7 @@ class MainActivity : SimpleActivity(), FlingListener {
}
val devicePolicyManager =
getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager
val isLockDeviceAdminActive = devicePolicyManager.isAdminActive(
ComponentName(this, LockDeviceAdminReceiver::class.java)
)
@@ -694,7 +697,7 @@ class MainActivity : SimpleActivity(), FlingListener {
val userHandle = android.os.Process.myUserHandle()
val shortcutBounds = binding.homeScreenGrid.root.getClickableRect(clickedGridItem)
val launcherApps =
applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
applicationContext.getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
launcherApps.startShortcut(packageName, id, shortcutBounds, null, userHandle)
}
}
@@ -718,7 +721,7 @@ class MainActivity : SimpleActivity(), FlingListener {
x: Float,
y: Float,
gridItem: HomeScreenGridItem,
isOnAllAppsFragment: Boolean
isOnAllAppsFragment: Boolean,
) {
binding.homeScreenGrid.root.hideResizeLines()
mLongPressedIcon = gridItem
@@ -813,7 +816,7 @@ class MainActivity : SimpleActivity(), FlingListener {
Intent(Intent.ACTION_SET_WALLPAPER).apply {
startActivity(this)
}
} catch (e: ActivityNotFoundException) {
} catch (_: ActivityNotFoundException) {
toast(org.fossify.commons.R.string.no_app_found)
} catch (e: Exception) {
showErrorToast(e)
@@ -883,7 +886,7 @@ class MainActivity : SimpleActivity(), FlingListener {
}
private class MyGestureListener(
private val flingListener: FlingListener
private val flingListener: FlingListener,
) : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(event: MotionEvent): Boolean {
(flingListener as MainActivity).homeScreenClicked(event.x, event.y)
@@ -899,7 +902,7 @@ class MainActivity : SimpleActivity(), FlingListener {
event1: MotionEvent?,
event2: MotionEvent,
velocityX: Float,
velocityY: Float
velocityY: Float,
): Boolean {
// ignore fling events just after releasing an icon from dragging
if (System.currentTimeMillis() - mLastUpEvent < 500L) {
@@ -955,7 +958,7 @@ class MainActivity : SimpleActivity(), FlingListener {
Class.forName("android.app.StatusBarManager")
.getMethod("expandNotificationsPanel")
.invoke(getSystemService("statusbar"))
} catch (e: Exception) {
} catch (_: Exception) {
}
}
}
@@ -1004,9 +1007,16 @@ class MainActivity : SimpleActivity(), FlingListener {
}
val label = info.loadLabel(packageManager).toString()
val drawable =
info.loadIcon(packageManager) ?: getDrawableForPackageName(packageName) ?: continue
val placeholderColor = calculateAverageColor(drawable.toBitmap())
val drawable = info.loadIcon(packageManager)
?: getDrawableForPackageName(packageName)
?: continue
val bitmap = drawable.toBitmap(
width = max(drawable.intrinsicWidth, 1),
height = max(drawable.intrinsicHeight, 1),
config = Bitmap.Config.ARGB_8888
)
val placeholderColor = calculateAverageColor(bitmap)
allApps.add(
AppLauncher(
id = null,
@@ -1015,7 +1025,7 @@ class MainActivity : SimpleActivity(), FlingListener {
activityName = activityName,
order = 0,
thumbnailColor = placeholderColor,
drawable = drawable.toBitmap().toDrawable(resources)
drawable = bitmap.toDrawable(resources)
)
)
}
@@ -1028,7 +1038,7 @@ class MainActivity : SimpleActivity(), FlingListener {
val homeScreenGridItems = ArrayList<HomeScreenGridItem>()
try {
val defaultDialerPackage =
(getSystemService(Context.TELECOM_SERVICE) as TelecomManager).defaultDialerPackage
(getSystemService(TELECOM_SERVICE) as TelecomManager).defaultDialerPackage
appLaunchers.firstOrNull { it.packageName == defaultDialerPackage }?.apply {
val dialerIcon =
HomeScreenGridItem(
@@ -1051,7 +1061,7 @@ class MainActivity : SimpleActivity(), FlingListener {
)
homeScreenGridItems.add(dialerIcon)
}
} catch (e: Exception) {
} catch (_: Exception) {
}
try {
@@ -1078,11 +1088,11 @@ class MainActivity : SimpleActivity(), FlingListener {
)
homeScreenGridItems.add(messengerIcon)
}
} catch (e: Exception) {
} catch (_: Exception) {
}
try {
val browserIntent = Intent("android.intent.action.VIEW", Uri.parse("http://"))
val browserIntent = Intent(Intent.ACTION_VIEW, "http://".toUri())
val resolveInfo =
packageManager.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY)
val defaultBrowserPackage = resolveInfo!!.activityInfo.packageName
@@ -1108,7 +1118,7 @@ class MainActivity : SimpleActivity(), FlingListener {
)
homeScreenGridItems.add(browserIcon)
}
} catch (e: Exception) {
} catch (_: Exception) {
}
try {
@@ -1141,7 +1151,7 @@ class MainActivity : SimpleActivity(), FlingListener {
homeScreenGridItems.add(storeIcon)
}
}
} catch (e: Exception) {
} catch (_: Exception) {
}
try {
@@ -1171,7 +1181,7 @@ class MainActivity : SimpleActivity(), FlingListener {
)
homeScreenGridItems.add(cameraIcon)
}
} catch (e: Exception) {
} catch (_: Exception) {
}
homeScreenGridItemsDB.insertAll(homeScreenGridItems)
@@ -1181,7 +1191,7 @@ class MainActivity : SimpleActivity(), FlingListener {
appWidgetManager: AppWidgetManager,
appWidgetId: Int,
appWidgetInfo: AppWidgetProviderInfo,
callback: (canBind: Boolean) -> Unit
callback: (canBind: Boolean) -> Unit,
) {
mActionOnCanBindWidget = null
val canCreateWidget =
@@ -1201,7 +1211,7 @@ class MainActivity : SimpleActivity(), FlingListener {
fun handleWidgetConfigureScreen(
appWidgetHost: AppWidgetHost,
appWidgetId: Int,
callback: (canBind: Boolean) -> Unit
callback: (canBind: Boolean) -> Unit,
) {
mActionOnWidgetConfiguredWidget = callback
appWidgetHost.startAppWidgetConfigureActivityForResult(
@@ -1215,7 +1225,7 @@ class MainActivity : SimpleActivity(), FlingListener {
fun handleShorcutCreation(
activityInfo: ActivityInfo,
callback: (shortcutId: String, label: String, icon: Drawable) -> Unit
callback: (shortcutId: String, label: String, icon: Drawable) -> Unit,
) {
mActionOnAddShortcut = callback
val componentName = ComponentName(activityInfo.packageName, activityInfo.name)

View File

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
<resources>
<string name="app_launcher_name">משגר</string>
<string name="launcher_settings">הגדרות משגר</string>
<string name="app_info">מידע על האפליקציה</string>
<string name="app_info">פרטי אפליקציה</string>
<string name="touch_hold_widget">לחיצה ארוכה על הווידג\'ט וגרירה שלו במסך הראשי</string>
<string name="uninstall">הסרה</string>
<string name="hide_icon">הסתר אייקון</string>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_launcher_name">Покренувач</string>
</resources>

View File

@@ -13,7 +13,7 @@
<string name="close_app_drawer_on_app_open">Fechar gaveta de aplicativos ao abrir um aplicativo</string>
<string name="home_screen_settings">Tela inicial</string>
<string name="widget_too_big">O widget é muito grande para o tamanho atual da tela inicial</string>
<string name="app_launcher_name">Fossify - Launcher</string>
<string name="app_launcher_name">Iniciador</string>
<string name="double_tap_to_lock">Toque duas vezes para bloquear a tela</string>
<string name="lock_device_admin_hint">Para habilitar o recurso de toque duplo para bloquear a tela, você precisa conceder permissão de administrador. Observe que o aplicativo não pode ser desinstalado até que essa permissão seja removida.</string>
<string name="lock_device_admin_warning">Desativar a permissão de administrador desabilitará o recurso de toque duplo para bloquear a tela.</string>

View File

@@ -0,0 +1,8 @@
Changed:
• Updated translations
Fixed:
• Addressed frequently occurring crashes

View File

@@ -1,17 +1,17 @@
Le Lanceur Fossify est votre passerelle vers une expérience d'écran d'accueil rapide, personnalisée et respectueuse de la vie privée. Pas de publicités, pas de surabondance, juste un lanceur fluide et efficace conçu pour s'adapter à votre style et à vos préférences uniques.<br><br>
Fossify Launcher est votre passerelle vers une expérience d'écran d'accueil rapide, personnalisée et respectueuse de la vie privée. Pas de publicités, pas de surabondance, juste un lanceur fluide et efficace conçu pour s'adapter à votre style et à vos préférences uniques.<br><br>
<b>🚀 NAVIGATION ULTRA-RAPIDE :</b><br>
Naviguez sur votre appareil avec rapidité et précision. Le Lanceur Fossify est optimisé pour être réactif et fluide, vous donnant un accès instantané à vos applications préférées sans décalage.<br><br>
Naviguez sur votre appareil avec rapidité et précision. Fossify Launcher est optimisé pour être réactif et fluide, vous donnant un accès instantané à vos applications préférées sans décalage.<br><br>
<b>🎨 PERSONNALISATION COMPLÈTE :</b><br>
Personnalisez votre écran d'accueil avec des thèmes dynamiques, des couleurs personnalisées et des mises en page. Personnalisez votre lanceur en fonction de votre style avec des outils faciles à utiliser qui vous permettent de créer une configuration vraiment unique.<br><br>
<b>🖼️ PRISE EN CHARGE COMPLÈTE DES WIDGETS :</b><br>
Intégrez facilement des widgets entièrement redimensionnables. Que vous ayez besoin d'horloges, de calendriers ou d'autres outils pratiques, le Lanceur Fossify veille à ce qu'ils s'intègrent parfaitement dans la conception de votre écran d'accueil.<br><br>
Intégrez facilement des widgets entièrement redimensionnables. Que vous ayez besoin d'horloges, de calendriers ou d'autres outils pratiques, Fossify Launcher veille à ce qu'ils s'intègrent parfaitement dans la conception de votre écran d'accueil.<br><br>
<b>📱 PAS D'ENCOMBREMENT INDÉSIRABLE :</b><br>
Gérez facilement vos applications en les masquant ou en les désinstallant en quelques clics, pour garder votre écran d'accueil organisé et sans encombrement.<br><br>
<b>🔒 CONFIDENTIALITÉ ET SÉCURITÉ :</b><br>
Votre vie privée est au cœur du Lanceur Fossify. Sans accès à Internet et sans autorisations intrusives, vos données restent avec vous. Pas de suivi, pas de publicités : juste un lanceur conçu pour respecter votre vie privée.<br><br>
Votre vie privée est au cœur de Fossify Launcher. Sans accès à Internet et sans autorisations intrusives, vos données restent avec vous. Pas de suivi, pas de publicités : juste un lanceur conçu pour respecter votre vie privée.<br><br>
<b>🌐 ASSURANCE OPEN SOURCE :</b><br>
Le Lanceur Fossify est construit sur une base open source, vous permettant de consulter notre code sur GitHub, favorisant la confiance et une communauté engagée en faveur de la confidentialité.<br><br>
Trouvez votre équilibre entre vitesse, personnalisation et confidentialité avec le Lanceur Fossify.<br><br>
Fossify Launcher est construit sur une base open source, qui vous permet de consulter notre code sur GitHub, favorisant la confiance et une communauté engagée en faveur de la confidentialité.<br><br>
Trouvez votre équilibre entre vitesse, personnalisation et confidentialité avec Fossify Launcher.<br><br>
Découvrez d'autres applications Fossify : https://www.fossify.org<br>
Code open source : https://www.github.com/FossifyOrg<br>
Rejoignez la communauté sur Reddit : https://www.reddit.com/r/Fossify<br>

View File

@@ -5,6 +5,6 @@ android.nonTransitiveRClass=true
org.gradle.jvmargs=-Xmx4096M
# Versioning
VERSION_NAME=1.1.2
VERSION_CODE=5
VERSION_NAME=1.1.3
VERSION_CODE=6
APP_ID=org.fossify.home

View File

@@ -2,13 +2,13 @@
#jetbrains
kotlin = "2.1.21"
#KSP
ksp = "2.1.21-2.0.1"
ksp = "2.1.21-2.0.2"
#Detekt
detekt = "1.23.8"
#Room
room = "2.7.1"
#Fossify
commons = "2.0.1"
commons = "3.0.5"
#Gradle
gradlePlugins-agp = "8.10.1"
#build