diff options
| author | Omer I.S. <137101815+omeritzics@users.noreply.github.com> | 2025-11-19 12:47:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-19 12:47:12 +0200 |
| commit | fa20bc3aff5078cc618daef68a6e9d5ea7598de5 (patch) | |
| tree | b04f9292cc0d8015f19973514b96edfdb029135d /app/src/main | |
| parent | 2ede966eb52f3c9a392629f91e6852aa4bac0306 (diff) | |
| parent | ddbbc23dfa6f9bfdad5b60181a5c3c7bac702a45 (diff) | |
| download | SidePhOnelauncher-fa20bc3aff5078cc618daef68a6e9d5ea7598de5.tar.gz SidePhOnelauncher-fa20bc3aff5078cc618daef68a6e9d5ea7598de5.tar.bz2 SidePhOnelauncher-fa20bc3aff5078cc618daef68a6e9d5ea7598de5.zip | |
Merge branch 'tanujnotes:master' into master
Diffstat (limited to 'app/src/main')
95 files changed, 2424 insertions, 701 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8975394..ff2e011 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="app.olauncher"> + xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> @@ -13,6 +12,9 @@ <uses-permission android:name="android.permission.INTERNET" /> <!--Used only for opening alarm app--> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> + <uses-permission + android:name="android.permission.PACKAGE_USAGE_STATS" + tools:ignore="ProtectedPermissions" /> <application android:allowBackup="true" diff --git a/app/src/main/java/app/olauncher/MainActivity.kt b/app/src/main/java/app/olauncher/MainActivity.kt index d0e149e..db4fed0 100644 --- a/app/src/main/java/app/olauncher/MainActivity.kt +++ b/app/src/main/java/app/olauncher/MainActivity.kt @@ -11,17 +11,37 @@ import android.os.Bundle import android.provider.Settings import android.view.View import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS -import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController -import androidx.navigation.Navigation +import androidx.navigation.findNavController import app.olauncher.data.Constants import app.olauncher.data.Prefs import app.olauncher.databinding.ActivityMainBinding -import app.olauncher.helper.* -import java.util.* +import app.olauncher.helper.getColorFromAttr +import app.olauncher.helper.hasBeenDays +import app.olauncher.helper.hasBeenHours +import app.olauncher.helper.hasBeenMinutes +import app.olauncher.helper.isDarkThemeOn +import app.olauncher.helper.isDaySince +import app.olauncher.helper.isDefaultLauncher +import app.olauncher.helper.isEinkDisplay +import app.olauncher.helper.isOlauncherDefault +import app.olauncher.helper.isTablet +import app.olauncher.helper.openUrl +import app.olauncher.helper.rateApp +import app.olauncher.helper.resetLauncherViaFakeActivity +import app.olauncher.helper.setPlainWallpaper +import app.olauncher.helper.shareApp +import app.olauncher.helper.showLauncherSelector +import app.olauncher.helper.showToast +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import java.util.Calendar class MainActivity : AppCompatActivity() { @@ -29,11 +49,12 @@ class MainActivity : AppCompatActivity() { private lateinit var navController: NavController private lateinit var viewModel: MainViewModel private lateinit var binding: ActivityMainBinding + private var timerJob: Job? = null - override fun onBackPressed() { - if (navController.currentDestination?.id != R.id.mainFragment) - super.onBackPressed() - } +// override fun onBackPressed() { +// if (navController.currentDestination?.id != R.id.mainFragment) +// super.onBackPressed() +// } override fun attachBaseContext(context: Context) { val newConfig = Configuration(context.resources.configuration) @@ -44,16 +65,36 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { prefs = Prefs(this) + if (isEinkDisplay()) prefs.appTheme = AppCompatDelegate.MODE_NIGHT_NO AppCompatDelegate.setDefaultNightMode(prefs.appTheme) super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - navController = Navigation.findNavController(this, R.id.nav_host_fragment) - viewModel = ViewModelProvider(this).get(MainViewModel::class.java) + navController = this.findNavController(R.id.nav_host_fragment) + viewModel = ViewModelProvider(this)[MainViewModel::class.java] + + val onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (navController.currentDestination?.id != R.id.mainFragment) { + // then we might want to finish the activity or disable this callback. + if (navController.popBackStack()) { + // Successfully popped back + } else { + // if you want other system/activity level handling + } + } else { + binding.messageLayout.visibility = View.GONE + } + } + } + onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + if (prefs.firstOpen) { viewModel.firstOpen(true) prefs.firstOpen = false + prefs.firstOpenTime = System.currentTimeMillis() + viewModel.resetLauncherLiveData.call() } initClickListeners() @@ -64,6 +105,11 @@ class MainActivity : AppCompatActivity() { window.addFlags(FLAG_LAYOUT_NO_LIMITS) } + override fun onStart() { + super.onStart() + checkTheme() + } + override fun onStop() { backToHomeScreen() super.onStop() @@ -81,13 +127,12 @@ class MainActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - if (prefs.dailyWallpaper && - AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - ) { + AppCompatDelegate.setDefaultNightMode(prefs.appTheme) + if (prefs.dailyWallpaper && AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) { setPlainWallpaper() viewModel.setWallpaperWorker() + recreate() } - recreate() } private fun initClickListeners() { @@ -101,24 +146,58 @@ class MainActivity : AppCompatActivity() { openLauncherChooser(it) } viewModel.resetLauncherLiveData.observe(this) { -// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) - resetDefaultLauncher() -// else -// showLauncherSelector(Constants.REQUEST_CODE_LAUNCHER_SELECTOR) + if (isDefaultLauncher() || Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) + resetLauncherViaFakeActivity() + else + showLauncherSelector(Constants.REQUEST_CODE_LAUNCHER_SELECTOR) + } + viewModel.checkForMessages.observe(this) { + checkForMessages() } viewModel.showDialog.observe(this) { when (it) { + Constants.Dialog.ABOUT -> { + showMessageDialog(getString(R.string.app_name), getString(R.string.welcome_to_olauncher_settings), getString(R.string.okay)) { + binding.messageLayout.visibility = View.GONE + } + } + + Constants.Dialog.WALLPAPER -> { + prefs.wallpaperMsgShown = true + prefs.userState = Constants.UserState.REVIEW + showMessageDialog(getString(R.string.did_you_know), getString(R.string.wallpaper_message), getString(R.string.enable)) { + binding.messageLayout.visibility = View.GONE + prefs.dailyWallpaper = true + viewModel.setWallpaperWorker() + showToast(getString(R.string.your_wallpaper_will_update_shortly)) + } + } + + Constants.Dialog.REVIEW -> { + prefs.userState = Constants.UserState.RATE + showMessageDialog(getString(R.string.hey), getString(R.string.review_message), getString(R.string.leave_a_review)) { + binding.messageLayout.visibility = View.GONE + prefs.rateClicked = true + showToast("😇❤️") + rateApp() + } + } + Constants.Dialog.RATE -> { + prefs.userState = Constants.UserState.SHARE showMessageDialog(getString(R.string.app_name), getString(R.string.rate_us_message), getString(R.string.rate_now)) { binding.messageLayout.visibility = View.GONE prefs.rateClicked = true + showToast("🤩❤️") rateApp() } } Constants.Dialog.SHARE -> { - showMessageDialog(getString(R.string.app_name), getString(R.string.share_message), getString(R.string.share_now)) { + prefs.shareShownTime = System.currentTimeMillis() + showMessageDialog(getString(R.string.hey), getString(R.string.share_message), getString(R.string.share_now)) { binding.messageLayout.visibility = View.GONE + showToast("😊❤️") shareApp() } } @@ -134,6 +213,18 @@ class MainActivity : AppCompatActivity() { binding.messageLayout.visibility = View.GONE } } + + Constants.Dialog.DIGITAL_WELLBEING -> { + showMessageDialog(getString(R.string.screen_time), getString(R.string.app_usage_message), getString(R.string.permission)) { + startActivity(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)) + } + } + + Constants.Dialog.PRO_MESSAGE -> { + showMessageDialog(getString(R.string.hey), getString(R.string.pro_message), getString(R.string.olauncher_pro)) { + openUrl(Constants.URL_OLAUNCHER_PRO) + } + } } } } @@ -146,12 +237,54 @@ class MainActivity : AppCompatActivity() { binding.messageLayout.visibility = View.VISIBLE } + private fun checkForMessages() { + if (prefs.firstOpenTime == 0L) + prefs.firstOpenTime = System.currentTimeMillis() + + when (prefs.userState) { + Constants.UserState.START -> { + if (prefs.firstOpenTime.hasBeenMinutes(10)) + prefs.userState = Constants.UserState.WALLPAPER + } + + Constants.UserState.WALLPAPER -> { + if (prefs.wallpaperMsgShown || prefs.dailyWallpaper) + prefs.userState = Constants.UserState.REVIEW + else if (isOlauncherDefault(this)) + viewModel.showDialog.postValue(Constants.Dialog.WALLPAPER) + } + + Constants.UserState.REVIEW -> { + if (prefs.rateClicked) + prefs.userState = Constants.UserState.SHARE + else if (isOlauncherDefault(this) && prefs.firstOpenTime.hasBeenHours(1)) + viewModel.showDialog.postValue(Constants.Dialog.REVIEW) + } + + Constants.UserState.RATE -> { + if (prefs.rateClicked) + prefs.userState = Constants.UserState.SHARE + else if (isOlauncherDefault(this) + && prefs.firstOpenTime.isDaySince() >= 7 + && Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 16 + ) viewModel.showDialog.postValue(Constants.Dialog.RATE) + } + + Constants.UserState.SHARE -> { + if (isOlauncherDefault(this) && prefs.firstOpenTime.hasBeenDays(14) + && prefs.shareShownTime.isDaySince() >= 70 + && Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 16 + ) viewModel.showDialog.postValue(Constants.Dialog.SHARE) + } + } + } + @SuppressLint("SourceLockedOrientationActivity") private fun setupOrientation() { - if (isTablet(this)) return + if (isTablet(this) || Build.VERSION.SDK_INT == Build.VERSION_CODES.O) + return // In Android 8.0, windowIsTranslucent cannot be used with screenOrientation=portrait - if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } private fun backToHomeScreen() { @@ -168,16 +301,21 @@ class MainActivity : AppCompatActivity() { private fun openLauncherChooser(resetFailed: Boolean) { if (resetFailed) { - val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) - else { - showToast(getString(R.string.search_for_Launcher_or_home_app), Toast.LENGTH_LONG) - Intent(Settings.ACTION_SETTINGS) - } + val intent = Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) startActivity(intent) } } + private fun checkTheme() { + timerJob?.cancel() + timerJob = lifecycleScope.launch { + delay(200) + if ((prefs.appTheme == AppCompatDelegate.MODE_NIGHT_YES && getColorFromAttr(R.attr.primaryColor) != getColor(R.color.white)) + || (prefs.appTheme == AppCompatDelegate.MODE_NIGHT_NO && getColorFromAttr(R.attr.primaryColor) != getColor(R.color.black)) + ) recreate() + } + } + @Deprecated("Deprecated in Java") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) @@ -188,7 +326,8 @@ class MainActivity : AppCompatActivity() { } Constants.REQUEST_CODE_LAUNCHER_SELECTOR -> { - resetDefaultLauncher() + if (resultCode == Activity.RESULT_OK) + resetLauncherViaFakeActivity() } } } diff --git a/app/src/main/java/app/olauncher/MainViewModel.kt b/app/src/main/java/app/olauncher/MainViewModel.kt index d02edac..21579bd 100644 --- a/app/src/main/java/app/olauncher/MainViewModel.kt +++ b/app/src/main/java/app/olauncher/MainViewModel.kt @@ -1,6 +1,9 @@ package app.olauncher import android.app.Application +import android.app.Service.USAGE_STATS_SERVICE +import android.app.usage.UsageEvents +import android.app.usage.UsageStatsManager import android.content.ComponentName import android.content.Context import android.content.pm.LauncherApps @@ -17,14 +20,20 @@ import androidx.work.WorkManager import app.olauncher.data.AppModel import app.olauncher.data.Constants import app.olauncher.data.Prefs +import app.olauncher.helper.AppUsageStats +import app.olauncher.helper.AppUsageStatsBucket import app.olauncher.helper.SingleLiveEvent import app.olauncher.helper.WallpaperWorker +import app.olauncher.helper.convertEpochToMidnight +import app.olauncher.helper.formattedTimeSpent import app.olauncher.helper.getAppsList -import app.olauncher.helper.getHiddenAppsList +import app.olauncher.helper.hasBeenMinutes import app.olauncher.helper.isOlauncherDefault import app.olauncher.helper.showToast import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit +import kotlin.math.max + class MainViewModel(application: Application) : AndroidViewModel(application) { private val appContext by lazy { application.applicationContext } @@ -39,7 +48,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { val isOlauncherDefault = MutableLiveData<Boolean>() val launcherResetFailed = MutableLiveData<Boolean>() val homeAppAlignment = MutableLiveData<Int>() + val screenTimeValue = MutableLiveData<String>() + val showDialog = SingleLiveEvent<String>() + val checkForMessages = SingleLiveEvent<Unit?>() val resetLauncherLiveData = SingleLiveEvent<Unit?>() fun selectedApp(appModel: AppModel, flag: Int) { @@ -196,13 +208,13 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { fun getAppList(includeHiddenApps: Boolean = false) { viewModelScope.launch { - appList.value = getAppsList(appContext, prefs, includeHiddenApps) + appList.value = getAppsList(appContext, prefs, includeRegularApps = true, includeHiddenApps) } } fun getHiddenApps() { viewModelScope.launch { - hiddenApps.value = getHiddenAppsList(appContext, prefs) + hiddenApps.value = getAppsList(appContext, prefs, includeRegularApps = false, includeHiddenApps = true) } } @@ -242,4 +254,101 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { prefs.homeAlignment = gravity homeAppAlignment.value = prefs.homeAlignment } + + fun getTodaysScreenTime() { + if (prefs.screenTimeLastUpdated.hasBeenMinutes(1).not()) return + + val usageStatsManager = appContext.getSystemService(USAGE_STATS_SERVICE) as UsageStatsManager + val appUsageStatsHashMap: MutableMap<String, AppUsageStats> = HashMap() + val beginTime = System.currentTimeMillis().convertEpochToMidnight() + val endTime = System.currentTimeMillis() + val events = usageStatsManager.queryEvents(beginTime, endTime) + val eventsMap: MutableMap<String, MutableList<UsageEvents.Event>> = HashMap() + var currentEvent: UsageEvents.Event + + while (events.hasNextEvent()) { + currentEvent = UsageEvents.Event() + if (events.getNextEvent(currentEvent)) { + when (currentEvent.eventType) { + UsageEvents.Event.ACTIVITY_RESUMED, UsageEvents.Event.ACTIVITY_PAUSED, UsageEvents.Event.ACTIVITY_STOPPED, UsageEvents.Event.FOREGROUND_SERVICE_START, UsageEvents.Event.FOREGROUND_SERVICE_STOP -> { + var packageEvents = eventsMap[currentEvent.packageName] + if (packageEvents == null) + packageEvents = ArrayList(listOf(currentEvent)) + else + packageEvents.add(currentEvent) + eventsMap[currentEvent.packageName] = packageEvents + } + } + } + } + + for ((key, value) in eventsMap) { + val foregroundBucket = AppUsageStatsBucket() + val backgroundBucketMap: MutableMap<String, AppUsageStatsBucket?> = HashMap() + var pos = 0 + while (pos < value.size) { + val event = value[pos] + if (event.className != null) { + var backgroundBucket: AppUsageStatsBucket? = backgroundBucketMap[event.className] + if (backgroundBucket == null) { + backgroundBucket = AppUsageStatsBucket() + backgroundBucketMap[event.className] = backgroundBucket + } + when (event.eventType) { + UsageEvents.Event.ACTIVITY_RESUMED -> foregroundBucket.startMillis = event.timeStamp + + UsageEvents.Event.ACTIVITY_PAUSED, UsageEvents.Event.ACTIVITY_STOPPED -> if (foregroundBucket.startMillis >= foregroundBucket.endMillis) { + if (foregroundBucket.startMillis == 0L) { + foregroundBucket.startMillis = beginTime + } + foregroundBucket.endMillis = event.timeStamp + foregroundBucket.addTotalTime() + } + + UsageEvents.Event.FOREGROUND_SERVICE_START -> backgroundBucket.startMillis = event.timeStamp + UsageEvents.Event.FOREGROUND_SERVICE_STOP -> if (backgroundBucket.startMillis >= backgroundBucket.endMillis) { + if (backgroundBucket.startMillis == 0L) { + backgroundBucket.startMillis = beginTime + } + backgroundBucket.endMillis = event.timeStamp + backgroundBucket.addTotalTime() + } + } + if (pos == value.size - 1) { + if (foregroundBucket.startMillis > foregroundBucket.endMillis) { + foregroundBucket.endMillis = endTime + foregroundBucket.addTotalTime() + } + if (backgroundBucket.startMillis > backgroundBucket.endMillis) { + backgroundBucket.endMillis = endTime + backgroundBucket.addTotalTime() + } + } + } + pos++ + } + + val foregroundEnd: Long = foregroundBucket.endMillis + val totalTimeForeground: Long = foregroundBucket.totalTime + val backgroundEnd: Long = backgroundBucketMap.values + .mapNotNull { it?.endMillis } + .maxOrNull() ?: 0L + + val totalTimeBackground: Long = backgroundBucketMap.values + .mapNotNull { it?.totalTime } + .sum() + + appUsageStatsHashMap[key] = AppUsageStats( + max(foregroundEnd, backgroundEnd), + totalTimeForeground, + backgroundEnd, + totalTimeBackground + ) + } + + val totalTimeInMillis = appUsageStatsHashMap.values.sumOf { it.totalTimeInForegroundMillis } + val viewTimeSpent = appContext.formattedTimeSpent((totalTimeInMillis * 1.1).toLong()) + screenTimeValue.postValue(viewTimeSpent) + prefs.screenTimeLastUpdated = endTime + } }
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/data/AppModel.kt b/app/src/main/java/app/olauncher/data/AppModel.kt index 3064bb9..7c11965 100644 --- a/app/src/main/java/app/olauncher/data/AppModel.kt +++ b/app/src/main/java/app/olauncher/data/AppModel.kt @@ -8,6 +8,7 @@ data class AppModel( val key: CollationKey?, val appPackage: String, val activityClassName: String?, + val isNew: Boolean? = false, val user: UserHandle, ) : Comparable<AppModel> { override fun compareTo(other: AppModel): Int = when { diff --git a/app/src/main/java/app/olauncher/data/Constants.kt b/app/src/main/java/app/olauncher/data/Constants.kt index 6138268..9b6e922 100644 --- a/app/src/main/java/app/olauncher/data/Constants.kt +++ b/app/src/main/java/app/olauncher/data/Constants.kt @@ -8,10 +8,23 @@ object Constants { } object Dialog { + const val ABOUT = "ABOUT" + const val WALLPAPER = "WALLPAPER" + const val REVIEW = "REVIEW" const val RATE = "RATE" const val SHARE = "SHARE" const val HIDDEN = "HIDDEN" const val KEYBOARD = "KEYBOARD" + const val DIGITAL_WELLBEING = "DIGITAL_WELLBEING" + const val PRO_MESSAGE = "PRO_MESSAGE" + } + + object UserState { + const val START = "START" + const val WALLPAPER = "WALLPAPER" + const val REVIEW = "REVIEW" + const val RATE = "RATE" + const val SHARE = "SHARE" } object DateTime { @@ -34,8 +47,8 @@ object Constants { } object TextSize { - const val ONE = 0.7f - const val TWO = 0.8f + const val ONE = 0.6f + const val TWO = 0.75f const val THREE = 0.9f const val FOUR = 1f const val FIVE = 1.1f @@ -43,6 +56,11 @@ object Constants { const val SEVEN = 1.3f } + object CharacterIndicator{ + const val SHOW = 102 + const val HIDE = 101 + } + const val WALL_TYPE_LIGHT = "light" const val WALL_TYPE_DARK = "dark" @@ -71,23 +89,31 @@ object Constants { const val REQUEST_CODE_LAUNCHER_SELECTOR = 678 const val HINT_RATE_US = 15 - const val HINT_SHARE = 25 const val LONG_PRESS_DELAY_MS = 500L + const val ONE_DAY_IN_MILLIS = 86400000L + const val ONE_HOUR_IN_MILLIS = 3600000L + const val ONE_MINUTE_IN_MILLIS = 60000L const val MIN_ANIM_REFRESH_RATE = 10f - const val URL_ABOUT_OLAUNCHER = "https://tanujnotes.notion.site/Olauncher-Minimal-AF-4843e398b05a455bb521b0665b26fbcd" + const val URL_ABOUT_OLAUNCHER = "https://tanujnotes.substack.com/p/olauncher-minimal-af-launcher?utm_source=olauncher" const val URL_OLAUNCHER_PRIVACY = "https://tanujnotes.notion.site/Olauncher-Privacy-Policy-dd6ac5101ddd4b3da9d27057889d44ab" const val URL_DOUBLE_TAP = "https://tanujnotes.notion.site/Double-tap-to-lock-Olauncher-0f7fb103ec1f47d7a90cdfdcd7fb86ef" const val URL_OLAUNCHER_GITHUB = "https://www.github.com/tanujnotes/Olauncher" const val URL_OLAUNCHER_PLAY_STORE = "https://play.google.com/store/apps/details?id=app.olauncher" + const val URL_OLAUNCHER_PRO = "https://play.google.com/store/apps/details?id=app.prolauncher" const val URL_PLAY_STORE_DEV = "https://play.google.com/store/apps/dev?id=7198807840081074933" const val URL_TWITTER_TANUJ = "https://twitter.com/tanujnotes" const val URL_WALLPAPERS = "https://gist.githubusercontent.com/tanujnotes/85e2d0343ace71e76615ac346fbff82b/raw" const val URL_DEFAULT_DARK_WALLPAPER = "https://images.unsplash.com/photo-1512551980832-13df02babc9e" const val URL_DEFAULT_LIGHT_WALLPAPER = "https://images.unsplash.com/photo-1515549832467-8783363e19b6" const val URL_DUCK_SEARCH = "https://duck.co/?q=" + const val URL_DIGITAL_WELLBEING_LEARN_MORE = "https://tanujnotes.substack.com/p/digital-wellbeing-app-on-android?utm_source=olauncher" + const val DIGITAL_WELLBEING_PACKAGE_NAME = "com.google.android.apps.wellbeing" + const val DIGITAL_WELLBEING_ACTIVITY = "com.google.android.apps.wellbeing.settings.TopLevelSettingsActivity" + const val DIGITAL_WELLBEING_SAMSUNG_PACKAGE_NAME = "com.samsung.android.forest" + const val DIGITAL_WELLBEING_SAMSUNG_ACTIVITY = "com.samsung.android.forest.launcher.LauncherActivity" const val WALLPAPER_WORKER_NAME = "WALLPAPER_WORKER_NAME" }
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/data/DrawerCharacterModel.kt b/app/src/main/java/app/olauncher/data/DrawerCharacterModel.kt new file mode 100644 index 0000000..565020c --- /dev/null +++ b/app/src/main/java/app/olauncher/data/DrawerCharacterModel.kt @@ -0,0 +1,6 @@ +package app.olauncher.data + +data class DrawerCharacterModel( + val character: String = "", + val inRange: Boolean = false +)
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/data/Prefs.kt b/app/src/main/java/app/olauncher/data/Prefs.kt index 9235992..758fc74 100644 --- a/app/src/main/java/app/olauncher/data/Prefs.kt +++ b/app/src/main/java/app/olauncher/data/Prefs.kt @@ -9,8 +9,10 @@ class Prefs(context: Context) { private val PREFS_FILENAME = "app.olauncher" private val FIRST_OPEN = "FIRST_OPEN" + private val FIRST_OPEN_TIME = "FIRST_OPEN_TIME" private val FIRST_SETTINGS_OPEN = "FIRST_SETTINGS_OPEN" private val FIRST_HIDE = "FIRST_HIDE" + private val USER_STATE = "USER_STATE" private val LOCK_MODE = "LOCK_MODE" private val HOME_APPS_NUM = "HOME_APPS_NUM" private val AUTO_SHOW_KEYBOARD = "AUTO_SHOW_KEYBOARD" @@ -25,15 +27,19 @@ class Prefs(context: Context) { private val DATE_TIME_VISIBILITY = "DATE_TIME_VISIBILITY" private val SWIPE_LEFT_ENABLED = "SWIPE_LEFT_ENABLED" private val SWIPE_RIGHT_ENABLED = "SWIPE_RIGHT_ENABLED" - private val SCREEN_TIMEOUT = "SCREEN_TIMEOUT" private val HIDDEN_APPS = "HIDDEN_APPS" private val HIDDEN_APPS_UPDATED = "HIDDEN_APPS_UPDATED" private val SHOW_HINT_COUNTER = "SHOW_HINT_COUNTER" private val APP_THEME = "APP_THEME" private val ABOUT_CLICKED = "ABOUT_CLICKED" private val RATE_CLICKED = "RATE_CLICKED" + private val WALLPAPER_MSG_SHOWN = "WALLPAPER_MSG_SHOWN" + private val SHARE_SHOWN_TIME = "SHARE_SHOWN_TIME" private val SWIPE_DOWN_ACTION = "SWIPE_DOWN_ACTION" private val TEXT_SIZE_SCALE = "TEXT_SIZE_SCALE" + private val PRO_MESSAGE_SHOWN = "PRO_MESSAGE_SHOWN" + private val HIDE_SET_DEFAULT_LAUNCHER = "HIDE_SET_DEFAULT_LAUNCHER" + private val SCREEN_TIME_LAST_UPDATED = "SCREEN_TIME_LAST_UPDATED" private val APP_NAME_1 = "APP_NAME_1" private val APP_NAME_2 = "APP_NAME_2" @@ -89,6 +95,10 @@ class Prefs(context: Context) { get() = prefs.getBoolean(FIRST_OPEN, true) set(value) = prefs.edit().putBoolean(FIRST_OPEN, value).apply() + var firstOpenTime: Long + get() = prefs.getLong(FIRST_OPEN_TIME, 0L) + set(value) = prefs.edit().putLong(FIRST_OPEN_TIME, value).apply() + var firstSettingsOpen: Boolean get() = prefs.getBoolean(FIRST_SETTINGS_OPEN, true) set(value) = prefs.edit().putBoolean(FIRST_SETTINGS_OPEN, value).apply() @@ -97,6 +107,10 @@ class Prefs(context: Context) { get() = prefs.getBoolean(FIRST_HIDE, true) set(value) = prefs.edit().putBoolean(FIRST_HIDE, value).apply() + var userState: String + get() = prefs.getString(USER_STATE, Constants.UserState.START).toString() + set(value) = prefs.edit().putString(USER_STATE, value).apply() + var lockModeOn: Boolean get() = prefs.getBoolean(LOCK_MODE, false) set(value) = prefs.edit().putBoolean(LOCK_MODE, value).apply() @@ -157,9 +171,17 @@ class Prefs(context: Context) { get() = prefs.getFloat(TEXT_SIZE_SCALE, 1.0f) set(value) = prefs.edit().putFloat(TEXT_SIZE_SCALE, value).apply() - var screenTimeout: Int - get() = prefs.getInt(SCREEN_TIMEOUT, 30000) // Default: 30 seconds - set(value) = prefs.edit().putInt(SCREEN_TIMEOUT, value).apply() + var proMessageShown: Boolean + get() = prefs.getBoolean(PRO_MESSAGE_SHOWN, false) + set(value) = prefs.edit().putBoolean(PRO_MESSAGE_SHOWN, value).apply() + + var hideSetDefaultLauncher: Boolean + get() = prefs.getBoolean(HIDE_SET_DEFAULT_LAUNCHER, false) + set(value) = prefs.edit().putBoolean(HIDE_SET_DEFAULT_LAUNCHER, value).apply() + + var screenTimeLastUpdated: Long + get() = prefs.getLong(SCREEN_TIME_LAST_UPDATED, 0L) + set(value) = prefs.edit().putLong(SCREEN_TIME_LAST_UPDATED, value).apply() var hiddenApps: MutableSet<String> get() = prefs.getStringSet(HIDDEN_APPS, mutableSetOf()) as MutableSet<String> @@ -181,6 +203,14 @@ class Prefs(context: Context) { get() = prefs.getBoolean(RATE_CLICKED, false) set(value) = prefs.edit().putBoolean(RATE_CLICKED, value).apply() + var wallpaperMsgShown: Boolean + get() = prefs.getBoolean(WALLPAPER_MSG_SHOWN, false) + set(value) = prefs.edit().putBoolean(WALLPAPER_MSG_SHOWN, value).apply() + + var shareShownTime: Long + get() = prefs.getLong(SHARE_SHOWN_TIME, 0L) + set(value) = prefs.edit().putLong(SHARE_SHOWN_TIME, value).apply() + var swipeDownAction: Int get() = prefs.getInt(SWIPE_DOWN_ACTION, Constants.SwipeDownAction.NOTIFICATIONS) set(value) = prefs.edit().putInt(SWIPE_DOWN_ACTION, value).apply() diff --git a/app/src/main/java/app/olauncher/helper/AppFilterHelper.kt b/app/src/main/java/app/olauncher/helper/AppFilterHelper.kt new file mode 100644 index 0000000..271e96e --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/AppFilterHelper.kt @@ -0,0 +1,7 @@ +package app.olauncher.helper + +import app.olauncher.data.AppModel + +interface AppFilterHelper { + fun onAppFiltered(items:List<AppModel>) +}
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/helper/AppUsageStats.kt b/app/src/main/java/app/olauncher/helper/AppUsageStats.kt new file mode 100644 index 0000000..9b69269 --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/AppUsageStats.kt @@ -0,0 +1,21 @@ +package app.olauncher.helper + +import android.os.Build +import androidx.annotation.RequiresApi + +class AppUsageStats( + val lastTimeUsedMillis: Long, + val totalTimeInForegroundMillis: Long, + @get:RequiresApi(Build.VERSION_CODES.Q) val lastTimeForegroundServiceUsedMillis: Long, + @get:RequiresApi(Build.VERSION_CODES.Q) val totalTimeForegroundServiceUsedMillis: Long, +) + +class AppUsageStatsBucket { + var startMillis: Long = 0L + var endMillis: Long = 0L + var totalTime: Long = 0L + + fun addTotalTime() { + this.totalTime += endMillis - startMillis + } +}
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/helper/Extensions.kt b/app/src/main/java/app/olauncher/helper/Extensions.kt index d657daf..ee9d90f 100644 --- a/app/src/main/java/app/olauncher/helper/Extensions.kt +++ b/app/src/main/java/app/olauncher/helper/Extensions.kt @@ -1,18 +1,27 @@ package app.olauncher.helper import android.app.Activity +import android.app.AppOpsManager import android.app.SearchManager import android.app.role.RoleManager import android.content.ComponentName import android.content.Context import android.content.Intent +import android.content.pm.LauncherApps import android.content.pm.PackageManager +import android.content.res.Resources +import android.net.Uri import android.os.Build +import android.os.UserHandle +import android.provider.Settings import android.view.View import android.view.WindowManager import android.view.inputmethod.InputMethodManager import androidx.annotation.RequiresApi +import app.olauncher.BuildConfig +import app.olauncher.R import app.olauncher.data.Constants +import java.util.Calendar fun View.hideKeyboard() { this.clearFocus() @@ -61,6 +70,16 @@ fun Context.resetDefaultLauncher() { } } +fun Context.isDefaultLauncher(): Boolean { + val launcherPackageName = getDefaultLauncherPackage(this) + return BuildConfig.APPLICATION_ID == launcherPackageName +} + +fun Context.resetLauncherViaFakeActivity() { + resetDefaultLauncher() + if (getDefaultLauncherPackage(this).contains(".")) + startActivity(Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS)) +} fun Context.openSearch(query: String? = null) { val intent = Intent(Intent.ACTION_WEB_SEARCH) @@ -78,3 +97,85 @@ fun Context.isEinkDisplay(): Boolean { } } +fun Context.searchOnPlayStore(query: String? = null): Boolean { + return try { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("https://play.google.com/store/search?q=$query&c=apps") + ).addFlags( + Intent.FLAG_ACTIVITY_NO_HISTORY or + Intent.FLAG_ACTIVITY_NEW_DOCUMENT or + Intent.FLAG_ACTIVITY_MULTIPLE_TASK + ) + ) + true + } catch (e: Exception) { + e.printStackTrace() + false + } +} + +fun Context.isPackageInstalled(packageName: String, userHandle: UserHandle = android.os.Process.myUserHandle()): Boolean { + val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps + val activityInfo = launcher.getActivityList(packageName, userHandle) + return activityInfo.size > 0 +} + +@RequiresApi(Build.VERSION_CODES.Q) +fun Context.appUsagePermissionGranted(): Boolean { + val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager + return appOpsManager.unsafeCheckOpNoThrow( + "android:get_usage_stats", + android.os.Process.myUid(), + packageName + ) == AppOpsManager.MODE_ALLOWED +} + +fun Context.formattedTimeSpent(timeSpent: Long): String { + val seconds = timeSpent / 1000 + val minutes = seconds / 60 + val hours = minutes / 60 + val remainingMinutes = minutes % 60 + return when { + timeSpent == 0L -> "0m" + + hours > 0 -> getString( + R.string.time_spent_hour, + hours.toString(), + remainingMinutes.toString() + ) + + minutes > 0 -> { + getString(R.string.time_spent_min, minutes.toString()) + } + + else -> "<1m" + } +} + +fun Long.convertEpochToMidnight(): Long { + val calendar = Calendar.getInstance() + calendar.timeInMillis = this + calendar.set(Calendar.HOUR_OF_DAY, 0) + calendar.set(Calendar.MINUTE, 0) + calendar.set(Calendar.SECOND, 0) + calendar.set(Calendar.MILLISECOND, 0) + return calendar.timeInMillis +} + +fun Long.isDaySince(): Int = ((System.currentTimeMillis().convertEpochToMidnight() - this.convertEpochToMidnight()) + / Constants.ONE_DAY_IN_MILLIS).toInt() + +fun Long.hasBeenDays(days: Int): Boolean = + ((System.currentTimeMillis() - this) / Constants.ONE_DAY_IN_MILLIS) >= days + +fun Long.hasBeenHours(hours: Int): Boolean = + ((System.currentTimeMillis() - this) / Constants.ONE_HOUR_IN_MILLIS) >= hours + +fun Long.hasBeenMinutes(minutes: Int): Boolean = + ((System.currentTimeMillis() - this) / Constants.ONE_MINUTE_IN_MILLIS) >= minutes + +fun Int.dpToPx(): Int { + return (this * Resources.getSystem().displayMetrics.density).toInt() +} diff --git a/app/src/main/java/app/olauncher/helper/Utils.kt b/app/src/main/java/app/olauncher/helper/Utils.kt index 9ee2acd..d89946a 100644 --- a/app/src/main/java/app/olauncher/helper/Utils.kt +++ b/app/src/main/java/app/olauncher/helper/Utils.kt @@ -5,12 +5,10 @@ import android.app.SearchManager import android.app.WallpaperManager import android.content.ClipData import android.content.ClipboardManager -import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.LauncherApps -import android.content.pm.PackageManager import android.content.res.Configuration import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.graphics.Bitmap @@ -65,7 +63,12 @@ fun Context.showToast(stringResource: Int, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(this, getString(stringResource), duration).show() } -suspend fun getAppsList(context: Context, prefs: Prefs, includeHiddenApps: Boolean = false): MutableList<AppModel> { +suspend fun getAppsList( + context: Context, + prefs: Prefs, + includeRegularApps: Boolean = true, + includeHiddenApps: Boolean = false, +): MutableList<AppModel> { return withContext(Dispatchers.IO) { val appList: MutableList<AppModel> = mutableListOf() @@ -81,29 +84,29 @@ suspend fun getAppsList(context: Context, prefs: Prefs, includeHiddenApps: Boole for (app in launcherApps.getActivityList(null, profile)) { val appLabelShown = prefs.getAppRenameLabel(app.applicationInfo.packageName).ifBlank { app.label.toString() } - - if (includeHiddenApps && app.applicationInfo.packageName != BuildConfig.APPLICATION_ID) - appList.add( - AppModel( - appLabelShown, - collator.getCollationKey(app.label.toString()), - app.applicationInfo.packageName, - app.componentName.className, - profile - ) - ) - else if (!hiddenApps.contains(app.applicationInfo.packageName + "|" + profile.toString()) - && app.applicationInfo.packageName != BuildConfig.APPLICATION_ID + val appModel = AppModel( + appLabelShown, + collator.getCollationKey(app.label.toString()), + app.applicationInfo.packageName, + app.componentName.className, + (System.currentTimeMillis() - app.firstInstallTime) < Constants.ONE_HOUR_IN_MILLIS, + profile ) - appList.add( - AppModel( - appLabelShown, - collator.getCollationKey(app.label.toString()), - app.applicationInfo.packageName, - app.componentName.className, - profile - ) - ) + + // if the current app is not OLauncher + if (app.applicationInfo.packageName != BuildConfig.APPLICATION_ID) { + // is this a hidden app? + if (hiddenApps.contains(app.applicationInfo.packageName + "|" + profile.toString())) { + if (includeHiddenApps) { + appList.add(appModel) + } + } else { + // this is a regular app + if (includeRegularApps) { + appList.add(appModel) + } + } + } } } appList.sortBy { it.appLabel.lowercase() } @@ -115,39 +118,6 @@ suspend fun getAppsList(context: Context, prefs: Prefs, includeHiddenApps: Boole } } -suspend fun getHiddenAppsList(context: Context, prefs: Prefs): MutableList<AppModel> { - return withContext(Dispatchers.IO) { - val pm = context.packageManager - if (!prefs.hiddenAppsUpdated) upgradeHiddenApps(prefs) - - val hiddenAppsSet = prefs.hiddenApps - val appList: MutableList<AppModel> = mutableListOf() - if (hiddenAppsSet.isEmpty()) return@withContext appList - - val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager - val collator = Collator.getInstance() - for (hiddenPackage in hiddenAppsSet) { - try { - val appPackage = hiddenPackage.split("|")[0] - val userString = hiddenPackage.split("|")[1] - var userHandle = android.os.Process.myUserHandle() - for (user in userManager.userProfiles) { - if (user.toString() == userString) userHandle = user - } - - val appInfo = pm.getApplicationInfo(appPackage, 0) - val appLabelShown = prefs.getAppRenameLabel(appPackage).ifBlank { pm.getApplicationLabel(appInfo).toString() } - val appKey = collator.getCollationKey(appLabelShown) - appList.add(AppModel(appLabelShown, appKey, appPackage, null, userHandle)) - } catch (e: Exception) { - e.printStackTrace() - } - } - appList.sortBy { it.appLabel.lowercase() } - appList - } -} - // This is to ensure backward compatibility with older app versions // which did not support multiple user profiles private fun upgradeHiddenApps(prefs: Prefs) { @@ -294,17 +264,16 @@ suspend fun getWallpaperBitmap(originalImage: Bitmap, width: Int, height: Int): suspend fun setWallpaper(appContext: Context, url: String): Boolean { return withContext(Dispatchers.IO) { val originalImageBitmap = getBitmapFromURL(url) ?: return@withContext false - val wallpaperManager = WallpaperManager.getInstance(appContext) + if (appContext.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && isTablet(appContext).not()) + return@withContext false + val wallpaperManager = WallpaperManager.getInstance(appContext) val (width, height) = getScreenDimensions(appContext) val scaledBitmap = getWallpaperBitmap(originalImageBitmap, width, height) try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - wallpaperManager.setBitmap(scaledBitmap, null, false, WallpaperManager.FLAG_SYSTEM) - wallpaperManager.setBitmap(scaledBitmap, null, false, WallpaperManager.FLAG_LOCK) - } else - wallpaperManager.setBitmap(scaledBitmap) + wallpaperManager.setBitmap(scaledBitmap, null, false, WallpaperManager.FLAG_SYSTEM) + wallpaperManager.setBitmap(scaledBitmap, null, false, WallpaperManager.FLAG_LOCK) } catch (e: Exception) { return@withContext false } @@ -326,13 +295,17 @@ fun getScreenDimensions(context: Context): Pair<Int, Int> { return Pair(point.x, point.y) } -suspend fun getTodaysWallpaper(wallType: String): String { +suspend fun getTodaysWallpaper(wallType: String, firstOpenTime: Long): String { return withContext(Dispatchers.IO) { var wallpaperUrl: String try { - val month = SimpleDateFormat("M", Locale.ENGLISH).format(Date()) ?: "" - val day = SimpleDateFormat("d", Locale.ENGLISH).format(Date()) ?: "" - val key = String.format("%s_%s", month, day) + val key = if (firstOpenTime.isDaySince() < 10) + String.format("0_%s", firstOpenTime.isDaySince().toString()) + else { + val month = SimpleDateFormat("M", Locale.ENGLISH).format(Date()) ?: "0" + val day = SimpleDateFormat("d", Locale.ENGLISH).format(Date()) ?: "0" + String.format("%s_%s", month, day) + } val url = URL(Constants.URL_WALLPAPERS) val connection: HttpURLConnection = url.openConnection() as HttpURLConnection diff --git a/app/src/main/java/app/olauncher/helper/WallpaperWorker.kt b/app/src/main/java/app/olauncher/helper/WallpaperWorker.kt index 7b944c5..5282dab 100644 --- a/app/src/main/java/app/olauncher/helper/WallpaperWorker.kt +++ b/app/src/main/java/app/olauncher/helper/WallpaperWorker.kt @@ -18,7 +18,7 @@ class WallpaperWorker(appContext: Context, workerParams: WorkerParameters) : Cor true else if (prefs.dailyWallpaper) { val wallType = checkWallpaperType() - val wallpaperUrl = getTodaysWallpaper(wallType) + val wallpaperUrl = getTodaysWallpaper(wallType, prefs.firstOpenTime) if (prefs.dailyWallpaperUrl == wallpaperUrl) true else { diff --git a/app/src/main/java/app/olauncher/helper/usageStats/ComponentForegroundStat.kt b/app/src/main/java/app/olauncher/helper/usageStats/ComponentForegroundStat.kt new file mode 100644 index 0000000..ca7d033 --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/usageStats/ComponentForegroundStat.kt @@ -0,0 +1,28 @@ +package app.olauncher.helper.usageStats + +import java.util.Date + +/** + * Object representing a timespan that an application was in the foreground. + * + * @property beginTime The start of the timespan, in milliseconds since the epoch. + * @property endTime The end of the timespan, in milliseconds since the epoch. + * @property packageName The package name of the application. + */ +data class ComponentForegroundStat( + val beginTime: Long, + val endTime: Long, + val packageName: String +) { + /** + * Overriding toString for a more readable log output, similar to the original Java class. + * The default data class toString() would also work, but this one is more explicit + * about formatting the timestamps as Instants. + */ + override fun toString(): String { + return "ComponentForegroundStat(" + + "beginTime=${Date(beginTime)}, " + + "endTime=${Date(endTime)}, " + + "packageName='$packageName')" + } +} diff --git a/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt b/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt new file mode 100644 index 0000000..18be5bf --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt @@ -0,0 +1,359 @@ +package app.olauncher.helper.usageStats + +import android.app.ActivityManager +import android.app.usage.UsageEvents +import android.app.usage.UsageStatsManager +import android.content.Context +import android.icu.util.Calendar +import android.util.Log +import java.util.concurrent.TimeUnit +import java.util.function.BiConsumer +import kotlin.math.max +import kotlin.math.min + +class EventLogWrapper(private val context: Context) { + private val usageStatsManager by lazy { context.getSystemService("usagestats") as UsageStatsManager } + private val guardian = UnmatchedCloseEventGuardian(usageStatsManager) + + + /** + * Collects event information from system to calculate and aggregate precise + * foreground time statistics for the specified period. + * + * Comments refer to the cases from + * [the documentation.](https://codeberg.org/fynngodau/usageDirect/wiki/Event-log-wrapper-scenarios) + * + * @param start First point in time to include in results + * @param end Last point in time to include in results + * @return A list of foreground stats for the specified period + */ + fun getForegroundStatsByTimestamps(start: Long, end: Long): List<ComponentForegroundStat> { + var queryStart = start // Can be mutated by DEVICE_STARTUP event + + /* + * Because sometimes, open events do not have close events when they should, as a hack / workaround, + * we query the apps currently in the foreground and match them against the apps that are currently + * in the foreground if the query start date is very recent or in the future. Thus, we are using this + * to tell apart True from Faulty unmatched open events. + * + * We query processes in the beginning of this method call in case querying the event log takes a + * little longer. + */ + val foregroundProcesses = mutableListOf<String>() + if (end >= System.currentTimeMillis() - 1500) { + val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager + activityManager?.runningAppProcesses?.forEach { appProcess -> + if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND || + appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE + ) { + if (context.packageName != appProcess.processName) { + foregroundProcesses.add(appProcess.processName) + } + } + } + } + + // Assumption: events are ordered chronologically + val events = usageStatsManager.queryEvents(queryStart, end) + + /* …except that sometimes, the events that are close to each other are swapped in a way that + * breaks the assumption that all end times which do not have a matching start time have + * started before start. We handle those as Duplicate close event and Duplicate open event. + * Therefore, we keep null entries in our moveToForegroundMap instead of removing the entries + * to prevent apps that had been opened previously in a period from being counted as "opened + * before start" (as they are not a True unmatched close event). + */ + // Map components to the last moveToForeground event. Null value means it was closed. + val moveToForegroundMap = mutableMapOf<AppClass, Long?>() + val componentForegroundStats = mutableListOf<ComponentForegroundStat>() + + // Iterate over events + val event = UsageEvents.Event() + + while (events.hasNextEvent()) { + events.getNextEvent(event) + if (context.packageName == event.packageName) continue + + val appClass = AppClass(event.packageName, event.className) + + when (event.eventType) { + /* + * "An event type denoting that an android.app.Activity moved to the foreground." + * (old definition: "An event type denoting that a component moved to the foreground.") + */ + UsageEvents.Event.ACTIVITY_RESUMED, + /* + * public static final int android.app.usage.UsageEvents.Event.CONTINUE_PREVIOUS_DAY = 4; + * (annotated as @hide) + * "An event type denoting that a component was in the foreground the previous day. + * This is effectively treated as a MOVE_TO_FOREGROUND." + */ + 4 -> { + // Store open timestamp in map, overwriting earlier timestamps in case of Duplicate open event + moveToForegroundMap[appClass] = event.timeStamp + } + + /* + * "An event type denoting that an android.app.Activity moved to the background." + * (old definition: "An event type denoting that a component moved to the background.") + */ + UsageEvents.Event.ACTIVITY_PAUSED, + /* + * "An activity becomes invisible on the UI, corresponding to Activity.onStop() + * of the activity's lifecycle." + */ + UsageEvents.Event.ACTIVITY_STOPPED, + /* + * public static final int android.app.usage.UsageEvents.Event.END_OF_DAY = 3; + * (annotated as @hide) + * "An event type denoting that a component was in the foreground when the stats + * rolled-over. This is effectively treated as a {@link #MOVE_TO_BACKGROUND}." + */ + 3 -> { + val eventBeginTime: Long? = moveToForegroundMap[appClass]?.also { + // Open and close events in order. Mark as closed. + moveToForegroundMap[appClass] = null + } ?: if ( + // App has not been in this query yet (test for Duplicate close event) + moveToForegroundMap.keys.none { it.packageName == event.packageName } && + // Test if this unmatched close event is True by asking the Guardian to scan for it + guardian.test(event, queryStart) + ) { + // Identified as True unmatched close event. Take start as a starting timestamp. + queryStart + } else { + null // Ignore Faulty unmatched close event + } + + if (eventBeginTime != null) { + // Check if another of the app's components have moved to the foreground in the meantime + val endTime = moveToForegroundMap.entries + .filter { (key, value) -> key.packageName == event.packageName && value != null } + .mapNotNull { it.value } + .minOrNull() ?: event.timeStamp + + componentForegroundStats.add( + ComponentForegroundStat(eventBeginTime, endTime, event.packageName) + ) + } + } + + /* + * "An event type denoting that the Android runtime underwent a shutdown process..." + */ + UsageEvents.Event.DEVICE_SHUTDOWN -> { + // Per docs: iterate over remaining start events and treat them as closed + moveToForegroundMap.forEach { (key, value) -> + if (value != null) { // If it's a remaining start event + componentForegroundStats.add( + ComponentForegroundStat(value, event.timeStamp, key.packageName) + ) + // Set entire app to closed + moveToForegroundMap.keys + .filter { it.packageName == key.packageName } + .forEach { samePackageKey -> moveToForegroundMap[samePackageKey] = null } + } + } + } + + /* + * "An event type denoting that the Android runtime started up..." + */ + UsageEvents.Event.DEVICE_STARTUP -> { + // Per docs: remove pending open events + moveToForegroundMap.clear() + + /* No package could be open longer than a reboot. Thus, we set the `start` + * timestamp to the boot event's timestamp in case we later assume that a + * package has been open "since the start of the period". It is not logical + * that this would happen but we can never know with this API. + */ + queryStart = event.timeStamp + } + } + } + + // Iterate over remaining start events + moveToForegroundMap.forEach { (key, value) -> + if (value != null) { // If it's a remaining start event + // Test if it's a foreground app (True unmatched open event) + if (foregroundProcesses.any { it.contains(key.packageName) }) { + componentForegroundStats.add( + ComponentForegroundStat( + value, + min(System.currentTimeMillis(), end), + key.packageName + ) + ) + } + // If app is not in foreground, drop event (Assume Faulty unmatched open event) + } + } + + /* If nothing happened during the timespan but there is an app in the foreground, + * then this app was used the whole period time and there was No event for it. + * Because the foreground applications API call is documented as not to be used + * for purposes like this, we first query whether the process name is a valid + * package name and if not, we drop it. + */ + if (moveToForegroundMap.isEmpty()) { + val packageManager = context.packageManager + foregroundProcesses.forEach { foregroundProcess -> + if (packageManager.getLaunchIntentForPackage(foregroundProcess) != null) { + componentForegroundStats.add( + ComponentForegroundStat( + queryStart, + min(System.currentTimeMillis(), end), + foregroundProcess + ) + ) + Log.d("EventLogWrapper", "Assuming that application $foregroundProcess has been used the whole query time") + } + } + } + + return componentForegroundStats + } + + /** + * Collects event information from system to calculate and aggregate precise + * foreground time statistics for the specified relative day. + * + * @param offset Day to query back in time relative to today + */ + fun getForegroundStatsByRelativeDay(offset: Int): List<ComponentForegroundStat> { + val cal = Calendar.getInstance() + cal.add(Calendar.DAY_OF_YEAR, -offset) + // Set to start of the day + cal.set(Calendar.HOUR_OF_DAY, 0) + cal.set(Calendar.MINUTE, 0) + cal.set(Calendar.SECOND, 0) + cal.set(Calendar.MILLISECOND, 0) + val beginTime = cal.timeInMillis + + // Set to start of the next day + cal.add(Calendar.DAY_OF_YEAR, 1) + val endTime = cal.timeInMillis + + return getForegroundStatsByTimestamps(beginTime, endTime) + } + + /** + * Collects event information from system to calculate and aggregate precise + * foreground time statistics starting at `start` and ending at + * the end of the day that contains `start`. + * + * @param start Starting time of query and point in time in day to query + */ + fun getForegroundStatsByPartialDay(start: Long): List<ComponentForegroundStat> { + val cal = Calendar.getInstance() + cal.timeInMillis = start + // Set to start of the next day + cal.add(Calendar.DAY_OF_YEAR, 1) + cal.set(Calendar.HOUR_OF_DAY, 0) + cal.set(Calendar.MINUTE, 0) + cal.set(Calendar.SECOND, 0) + cal.set(Calendar.MILLISECOND, 0) + val endTime = cal.timeInMillis + return getForegroundStatsByTimestamps(start, endTime) + } + + /** + * Takes a list of foreground stats and aggregates them to usage stats. + * Assumes all provided usage stats to be on the same day. + * + * @param endConsumer Consumer that accepts ending times of component + * foreground stats with their package name + */ + @JvmOverloads + fun aggregateForegroundStats( + foregroundStats: List<ComponentForegroundStat>, + endConsumer: BiConsumer<String, Long>? = null + ): List<SimpleUsageStat> { + if (foregroundStats.isEmpty()) return emptyList() + + // Group by package name and sum the duration for each + val applicationTotalTime = foregroundStats + .groupBy { it.packageName } + .mapValues { (_, stats) -> stats.sumOf { it.endTime - it.beginTime } } + + val firstBeginTime = foregroundStats.first().beginTime + val timeZoneOffset = Calendar.getInstance().timeZone.getOffset(firstBeginTime) + val day = TimeUnit.MILLISECONDS.toDays(firstBeginTime + timeZoneOffset) + + // Optionally consume end times + endConsumer?.let { consumer -> + foregroundStats.forEach { consumer.accept(it.packageName, it.endTime) } + } + + // Map the aggregated times to SimpleUsageStat objects + return applicationTotalTime.map { (packageName, totalTime) -> + SimpleUsageStat(day, totalTime, packageName) + } + } + + /** + * Collects <b>all</b> event information from system to calculate and aggregate precise + * foreground time statistics for the provided day and presents this information as + * [SimpleUsageStat]s. + * + * @param day Day since epoch + */ + private fun getForegroundStatsByDay(day: Long): List<ComponentForegroundStat> { + val cal = Calendar.getInstance() + val timeZoneOffset = cal.timeZone.getOffset(System.currentTimeMillis()) + + // To convert epoch day to milliseconds, we first get the UTC millis and then adjust for timezone + val start = TimeUnit.DAYS.toMillis(day) - timeZoneOffset + val end = TimeUnit.DAYS.toMillis(day + 1) - timeZoneOffset + return getForegroundStatsByTimestamps(start, end) + } + + /** + * Collects <b>all</b> event information from system to calculate and aggregate precise + * foreground time statistics and presents this information as [SimpleUsageStat]s. + * **This method call causes lag** if called with a low since value. + * + * @param daySince Return data from this day on + * @param endConsumer Consumer that accepts ending times of component + * foreground stats with their package name + */ + fun getAllSimpleUsageStats(daySince: Long, endConsumer: BiConsumer<String, Long>): List<SimpleUsageStat> { + val usageStats = mutableListOf<SimpleUsageStat>() + var currentDay = daySince + + val timeZoneOffset = Calendar.getInstance().timeZone.getOffset(System.currentTimeMillis()) + val today = TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() + timeZoneOffset) + + // Maximum event log size + currentDay = max(today - 10, currentDay) + + while (currentDay <= today) { + val foregroundStats = getForegroundStatsByDay(currentDay) + usageStats.addAll(aggregateForegroundStats(foregroundStats, endConsumer)) + currentDay++ + } + + return usageStats + } + + /** + * Returns only usage statistics that have not been counted yet for + * only the day that contains `timestamp` + * + * @param endConsumer Consumer that accepts ending times of component + * foreground stats with their package name + */ + fun getIncrementalSimpleUsageStats(timestamp: Long, endConsumer: BiConsumer<String, Long>): List<SimpleUsageStat> { + val foregroundStats = getForegroundStatsByPartialDay(timestamp) + return aggregateForegroundStats(foregroundStats, endConsumer) + } + + fun aggregateSimpleUsageStats(usageStats: List<SimpleUsageStat>): Long { + return usageStats.sumOf { it.timeUsed } + } + /** + * Stores a class name and its corresponding package. + */ + private data class AppClass(val packageName: String, val className: String?) +}
\ No newline at end of file diff --git a/app/src/main/java/app/olauncher/helper/usageStats/SimpleUsageStat.kt b/app/src/main/java/app/olauncher/helper/usageStats/SimpleUsageStat.kt new file mode 100644 index 0000000..93bac4f --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/usageStats/SimpleUsageStat.kt @@ -0,0 +1,48 @@ +package app.olauncher.helper.usageStats + +import android.app.usage.UsageStats +import android.icu.util.Calendar +import java.util.concurrent.TimeUnit + +/** + * A data class to hold simplified usage statistics. + * + * @property day The day since epoch that this object concerns. + * @property timeUsed The time that the application has been in the foreground in milliseconds on this day. + * @property applicationId The package name of the application that this object concerns. + */ +data class SimpleUsageStat( + val day: Long, + val timeUsed: Long, + val applicationId: String +) { + /** + * Secondary constructor to create a SimpleUsageStat from the system's [UsageStats]. + */ + constructor(systemUsageStat: UsageStats) : this( + day = getEpochDay(systemUsageStat.lastTimeUsed), + timeUsed = systemUsageStat.totalTimeInForeground, + applicationId = systemUsageStat.packageName + ) + + companion object { + /** + * Converts a list of system [UsageStats] to a list of [SimpleUsageStat]. + * This function is kept for direct compatibility with the original Java static method. + */ + @JvmStatic + fun asSimpleStats(usageStats: List<UsageStats>): List<SimpleUsageStat> { + return usageStats.map { SimpleUsageStat(it) } + } + + /** + * Calculates the epoch day from a timestamp in milliseconds, compatible with API 24+. + * It manually calculates the day by using integer division on the milliseconds. + */ + private fun getEpochDay(lastTimeUsed: Long): Long { + val timeZoneOffset = Calendar.getInstance().timeZone.getOffset(lastTimeUsed) + return TimeUnit.MILLISECONDS.toDays(lastTimeUsed + timeZoneOffset) + } + } +} + diff --git a/app/src/main/java/app/olauncher/helper/usageStats/UnmatchedCloseEventGuardian.kt b/app/src/main/java/app/olauncher/helper/usageStats/UnmatchedCloseEventGuardian.kt new file mode 100644 index 0000000..9d550e2 --- /dev/null +++ b/app/src/main/java/app/olauncher/helper/usageStats/UnmatchedCloseEventGuardian.kt @@ -0,0 +1,65 @@ +package app.olauncher.helper.usageStats + +import android.app.usage.UsageEvents +import android.app.usage.UsageStatsManager +import android.util.Log + +/** + * “…a diminutive Guardian who traveled backward through time…” + * + * Guards [EventLogWrapper] against Faulty unmatched close events (per + * [the documentation](https://codeberg.org/fynngodau/usageDirect/wiki/Event-log-wrapper-scenarios)) + * by seeking backwards through time and scanning for the open event. + */ +class UnmatchedCloseEventGuardian(private val usageStatsManager: UsageStatsManager) { + + companion object { + private const val SCAN_INTERVAL = 1000L * 60 * 60 * 24 // 24 hours + } + + /** + * @param event Event to validate + * @param queryStart Timestamp at which original query o + * @return True if the event is valid, false otherwise + */ + fun test(event: UsageEvents.Event, queryStart: Long): Boolean { + val events = usageStatsManager.queryEvents(queryStart - SCAN_INTERVAL, queryStart) + + // Reusable event object for iteration + val e = UsageEvents.Event() + + // Track whether the package is currently in foreground or background + var open = false // Not open until opened + + while (events.hasNextEvent()) { + events.getNextEvent(e) + + if (e.eventType == UsageEvents.Event.DEVICE_STARTUP) { + // Consider all apps closed after startup according to docs + open = false + } + + // Only consider events concerning our package otherwise + if (event.packageName == e.packageName) { + when (e.eventType) { + // see EventLogWrapper + UsageEvents.Event.ACTIVITY_RESUMED, 4 -> { + open = true + } + UsageEvents.Event.ACTIVITY_PAUSED, 3 -> { + if (e.timeStamp != event.timeStamp) { + // Don't flip to 'false' if we're looking at the original event itself + open = false + } + } + } + } + } + + val result = if (open) "True" else "Faulty" + Log.d("Guardian", "Scanned for package ${event.packageName} and determined event to be $result") + + // Event is valid if it was previously opened (within SCAN_INTERVAL) + return open + } +} diff --git a/app/src/main/java/app/olauncher/listener/OnSwipeTouchListener.kt b/app/src/main/java/app/olauncher/listener/OnSwipeTouchListener.kt index 3bb0689..3197b3c 100644 --- a/app/src/main/java/app/olauncher/listener/OnSwipeTouchListener.kt +++ b/app/src/main/java/app/olauncher/listener/OnSwipeTouchListener.kt @@ -45,6 +45,7 @@ internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { // doubleTapOn = false // onTripleClick() // } + onClick() return super.onSingleTapUp(e) } @@ -73,14 +74,14 @@ internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { } override fun onFling( - event1: MotionEvent, + event1: MotionEvent?, event2: MotionEvent, velocityX: Float, velocityY: Float, ): Boolean { try { - val diffY = event2.y - event1.y - val diffX = event2.x - event1.x + val diffY = event2.y - (event1?.y ?: 0F) + val diffX = event2.x - (event1?.x ?: 0F) if (abs(diffX) > abs(diffY)) { if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (diffX > 0) onSwipeRight() else onSwipeLeft() @@ -104,7 +105,7 @@ internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { open fun onLongClick() {} open fun onDoubleClick() {} open fun onTripleClick() {} - private fun onClick() {} + open fun onClick() {} init { gestureDetector = GestureDetector(c, GestureListener()) diff --git a/app/src/main/java/app/olauncher/listener/ViewSwipeTouchListener.kt b/app/src/main/java/app/olauncher/listener/ViewSwipeTouchListener.kt index 8810824..9d7009e 100644 --- a/app/src/main/java/app/olauncher/listener/ViewSwipeTouchListener.kt +++ b/app/src/main/java/app/olauncher/listener/ViewSwipeTouchListener.kt @@ -58,14 +58,14 @@ internal open class ViewSwipeTouchListener(c: Context?, v: View) : OnTouchListen } override fun onFling( - event1: MotionEvent, + event1: MotionEvent?, event2: MotionEvent, velocityX: Float, velocityY: Float, ): Boolean { try { - val diffY = event2.y - event1.y - val diffX = event2.x - event1.x + val diffY = event2.y - (event1?.y ?: 0F) + val diffX = event2.x - (event1?.x ?: 0F) if (abs(diffX) > abs(diffY)) { if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (diffX > 0) onSwipeRight() else onSwipeLeft() diff --git a/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt b/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt index 46e236a..cc9dd2c 100644 --- a/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt +++ b/app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt @@ -1,6 +1,9 @@ package app.olauncher.ui +import android.content.Context import android.os.UserHandle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -80,7 +83,11 @@ class AppDrawerAdapter( autoLaunch = charSearch?.startsWith(" ")?.not() ?: true val appFilteredList = (if (charSearch.isNullOrBlank()) appsList - else appsList.filter { app -> appLabelMatches(app.appLabel, charSearch) } as MutableList<AppModel>) + else appsList.filter { app -> + appLabelMatches(app.appLabel, charSearch) +// }.sortedByDescending { +// charSearch.contentEquals(it.appLabel, true) + } as MutableList<AppModel>) val filterResults = FilterResults() filterResults.values = appFilteredList @@ -90,7 +97,8 @@ class AppDrawerAdapter( @Suppress("UNCHECKED_CAST") override fun publishResults(constraint: CharSequence?, results: FilterResults?) { results?.values?.let { - appFilteredList = it as MutableList<AppModel> + val items = it as MutableList<AppModel> + appFilteredList = items submitList(appFilteredList) { autoLaunch() } @@ -122,7 +130,7 @@ class AppDrawerAdapter( fun setAppList(appsList: MutableList<AppModel>) { // Add empty app for bottom padding in recyclerview - appsList.add(AppModel("", null, "", "", android.os.Process.myUserHandle())) + appsList.add(AppModel("", null, "", "", false, android.os.Process.myUserHandle())) this.appsList = appsList this.appFilteredList = appsList submitList(appsList) @@ -149,7 +157,8 @@ class AppDrawerAdapter( with(binding) { appHideLayout.visibility = View.GONE renameLayout.visibility = View.GONE - appTitle.text = appModel.appLabel + appTitle.visibility = View.VISIBLE + appTitle.text = appModel.appLabel + if (appModel.isNew == true) " ✦" else "" appTitle.gravity = appLabelGravity otherProfileIndicator.isVisible = appModel.user != myUserHandle @@ -161,6 +170,7 @@ class AppDrawerAdapter( root.context.getString(R.string.adapter_show) else root.context.getString(R.string.adapter_hide) + appTitle.visibility = View.INVISIBLE appHideLayout.visibility = View.VISIBLE appRename.isVisible = flag != Constants.FLAG_HIDDEN_APPS } @@ -168,15 +178,45 @@ class AppDrawerAdapter( } appRename.setOnClickListener { if (appModel.appPackage.isNotEmpty()) { - etAppRename.hint = appModel.appLabel + etAppRename.hint = getAppName(etAppRename.context, appModel.appPackage) + etAppRename.setText(appModel.appLabel) + etAppRename.setSelectAllOnFocus(true) renameLayout.visibility = View.VISIBLE appHideLayout.visibility = View.GONE etAppRename.showKeyboard() etAppRename.imeOptions = EditorInfo.IME_ACTION_DONE; } } + etAppRename.onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus -> + if (hasFocus) + appTitle.visibility = View.INVISIBLE + else + appTitle.visibility = View.VISIBLE + } + etAppRename.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + etAppRename.hint = getAppName(etAppRename.context, appModel.appPackage) + } + + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int, + ) { + } + + override fun onTextChanged( + s: CharSequence?, + start: Int, + before: Int, + count: Int, + ) { + etAppRename.hint = "" + } + }) etAppRename.setOnEditorActionListener { _, actionCode, _ -> - if(actionCode == EditorInfo.IME_ACTION_DONE) { + if (actionCode == EditorInfo.IME_ACTION_DONE) { val renameLabel = etAppRename.text.toString().trim() if (renameLabel.isNotBlank() && appModel.appPackage.isNotBlank()) { appRenameListener(appModel, renameLabel) @@ -192,12 +232,35 @@ class AppDrawerAdapter( if (renameLabel.isNotBlank() && appModel.appPackage.isNotBlank()) { appRenameListener(appModel, renameLabel) renameLayout.visibility = View.GONE + } else { + val packageManager = etAppRename.context.packageManager + appRenameListener( + appModel, + packageManager.getApplicationLabel( + packageManager.getApplicationInfo(appModel.appPackage, 0) + ).toString() + ) + renameLayout.visibility = View.GONE } } appInfo.setOnClickListener { appInfoListener(appModel) } appDelete.setOnClickListener { appDeleteListener(appModel) } - appHideLayout.setOnClickListener { appHideLayout.visibility = View.GONE } + appMenuClose.setOnClickListener { + appHideLayout.visibility = View.GONE + appTitle.visibility = View.VISIBLE + } + appRenameClose.setOnClickListener { + renameLayout.visibility = View.GONE + appTitle.visibility = View.VISIBLE + } appHide.setOnClickListener { appHideListener(appModel, bindingAdapterPosition) } } + + private fun getAppName(context: Context, appPackage: String): String { + val packageManager = context.packageManager + return packageManager.getApplicationLabel( + packageManager.getApplicationInfo(appPackage, 0) + ).toString() + } } } diff --git a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt index dd7aeea..1986300 100644 --- a/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt +++ b/app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt @@ -10,7 +10,9 @@ import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Recycler import app.olauncher.MainViewModel import app.olauncher.R import app.olauncher.data.Constants @@ -26,10 +28,12 @@ import app.olauncher.helper.showKeyboard import app.olauncher.helper.showToast import app.olauncher.helper.uninstall + class AppDrawerFragment : Fragment() { private lateinit var prefs: Prefs private lateinit var adapter: AppDrawerAdapter + private lateinit var linearLayoutManager: LinearLayoutManager private var flag = Constants.FLAG_LAUNCH_APP private var canRename = false @@ -38,7 +42,11 @@ class AppDrawerFragment : Fragment() { private var _binding: FragmentAppDrawerBinding? = null private val binding get() = _binding!! - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { _binding = FragmentAppDrawerBinding.inflate(inflater, container, false) return binding.root } @@ -75,7 +83,7 @@ class AppDrawerFragment : Fragment() { override fun onQueryTextSubmit(query: String?): Boolean { if (query?.startsWith("!") == true) requireContext().openUrl(Constants.URL_DUCK_SEARCH + query.replace(" ", "%20")) - else if (adapter.itemCount == 0) + else if (adapter.itemCount == 0) // && requireContext().searchOnPlayStore(query?.trim()).not()) requireContext().openSearch(query?.trim()) else adapter.launchFirstInList() @@ -147,12 +155,30 @@ class AppDrawerFragment : Fragment() { viewModel.showDialog.postValue(Constants.Dialog.HIDDEN) findNavController().navigate(R.id.action_appListFragment_to_settingsFragment2) } + viewModel.getAppList() + viewModel.getHiddenApps() }, appRenameListener = { appModel, renameLabel -> prefs.setAppRenameLabel(appModel.appPackage, renameLabel) viewModel.getAppList() } ) + + linearLayoutManager = object : LinearLayoutManager(requireContext()) { + override fun scrollVerticallyBy( + dx: Int, + recycler: Recycler, + state: RecyclerView.State, + ): Int { + val scrollRange = super.scrollVerticallyBy(dx, recycler, state) + val overScroll = dx - scrollRange + if (overScroll < -10 && binding.recyclerView.scrollState == RecyclerView.SCROLL_STATE_DRAGGING) + checkMessageAndExit() + return scrollRange + } + } + + binding.recyclerView.layoutManager = linearLayoutManager binding.recyclerView.adapter = adapter binding.recyclerView.addOnScrollListener(getRecyclerViewOnScrollListener()) binding.recyclerView.itemAnimator = null @@ -168,14 +194,20 @@ class AppDrawerFragment : Fragment() { binding.appDrawerTip.isSelected = true } } - if (flag == Constants.FLAG_HIDDEN_APPS) + if (flag == Constants.FLAG_HIDDEN_APPS) { viewModel.hiddenApps.observe(viewLifecycleOwner) { - it?.let { adapter.setAppList(it.toMutableList()) } + it?.let { + adapter.setAppList(it.toMutableList()) + } } - else + } else { viewModel.appList.observe(viewLifecycleOwner) { - it?.let { adapter.setAppList(it.toMutableList()) } + it?.let { appModels -> + adapter.setAppList(appModels.toMutableList()) + adapter.filter.filter(binding.search.query) + } } + } } private fun initClickListeners() { @@ -216,24 +248,28 @@ class AppDrawerFragment : Fragment() { RecyclerView.SCROLL_STATE_DRAGGING -> { onTop = !recyclerView.canScrollVertically(-1) - if (onTop) binding.search.hideKeyboard() - if (onTop && !recyclerView.canScrollVertically(1)) - findNavController().popBackStack() + if (onTop) + binding.search.hideKeyboard() } RecyclerView.SCROLL_STATE_IDLE -> { - if (!recyclerView.canScrollVertically(1)) { + if (!recyclerView.canScrollVertically(1)) binding.search.hideKeyboard() - } else if (!recyclerView.canScrollVertically(-1)) { - if (onTop) findNavController().popBackStack() - else binding.search.showKeyboard(prefs.autoShowKeyboard) - } + else if (!recyclerView.canScrollVertically(-1)) + if (!onTop && isRemoving.not()) + binding.search.showKeyboard(prefs.autoShowKeyboard) } } } } } + private fun checkMessageAndExit() { + findNavController().popBackStack() + if (flag == Constants.FLAG_LAUNCH_APP) + viewModel.checkForMessages.call() + } + override fun onStart() { super.onStart() binding.search.showKeyboard(prefs.autoShowKeyboard) diff --git a/app/src/main/java/app/olauncher/ui/HomeFragment.kt b/app/src/main/java/app/olauncher/ui/HomeFragment.kt index 29cad55..c2406db 100644 --- a/app/src/main/java/app/olauncher/ui/HomeFragment.kt +++ b/app/src/main/java/app/olauncher/ui/HomeFragment.kt @@ -2,15 +2,23 @@ package app.olauncher.ui import android.app.admin.DevicePolicyManager import android.content.Context +import android.content.Intent +import android.content.res.Configuration import android.os.BatteryManager import android.os.Build import android.os.Bundle -import android.os.Vibrator -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowInsets +import android.widget.FrameLayout import android.widget.TextView import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.core.os.bundleOf import androidx.core.view.isVisible +import androidx.core.view.setPadding import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -21,18 +29,30 @@ import app.olauncher.data.AppModel import app.olauncher.data.Constants import app.olauncher.data.Prefs import app.olauncher.databinding.FragmentHomeBinding -import app.olauncher.helper.* +import app.olauncher.helper.appUsagePermissionGranted +import app.olauncher.helper.dpToPx +import app.olauncher.helper.expandNotificationDrawer +import app.olauncher.helper.getChangedAppTheme +import app.olauncher.helper.getUserHandleFromString +import app.olauncher.helper.isPackageInstalled +import app.olauncher.helper.openAlarmApp +import app.olauncher.helper.openCalendar +import app.olauncher.helper.openCameraApp +import app.olauncher.helper.openDialerApp +import app.olauncher.helper.openSearch +import app.olauncher.helper.setPlainWallpaperByTheme +import app.olauncher.helper.showToast import app.olauncher.listener.OnSwipeTouchListener import app.olauncher.listener.ViewSwipeTouchListener import java.text.SimpleDateFormat -import java.util.* +import java.util.Date +import java.util.Locale class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener { private lateinit var prefs: Prefs private lateinit var viewModel: MainViewModel private lateinit var deviceManager: DevicePolicyManager - private lateinit var vibrator: Vibrator private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! @@ -50,7 +70,6 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener } ?: throw Exception("Invalid Activity") deviceManager = context?.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager - vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator initObservers() setHomeAlignment(prefs.homeAlignment) @@ -72,6 +91,8 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener R.id.clock -> openClockApp() R.id.date -> openCalendarApp() R.id.setDefaultLauncher -> viewModel.resetLauncherLiveData.call() + R.id.tvScreenTime -> openScreenTimeDigitalWellbeing() + else -> { try { // Launch app val appLocation = view.tag.toString().toInt() @@ -130,6 +151,15 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener prefs.calendarAppClassName = "" prefs.calendarAppUser = "" } + + R.id.setDefaultLauncher -> { + prefs.hideSetDefaultLauncher = true + binding.setDefaultLauncher.visibility = View.GONE + if (viewModel.isOlauncherDefault.value != true) { + requireContext().showToast(R.string.set_as_default_launcher) + findNavController().navigate(R.id.action_mainFragment_to_settingsFragment) + } + } } return true } @@ -153,8 +183,9 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener setHomeAlignment() } if (binding.firstRunTips.visibility == View.VISIBLE) return@Observer - if (it) binding.setDefaultLauncher.visibility = View.GONE - else binding.setDefaultLauncher.visibility = View.VISIBLE + binding.setDefaultLauncher.isVisible = it.not() && prefs.hideSetDefaultLauncher.not() +// if (it) binding.setDefaultLauncher.visibility = View.GONE +// else binding.setDefaultLauncher.visibility = View.VISIBLE }) viewModel.homeAppAlignment.observe(viewLifecycleOwner) { setHomeAlignment(it) @@ -162,6 +193,9 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener viewModel.toggleDateTime.observe(viewLifecycleOwner) { populateDateTime() } + viewModel.screenTimeValue.observe(viewLifecycleOwner) { + it?.let { binding.tvScreenTime.text = it } + } } private fun initSwipeTouchListener() { @@ -184,6 +218,8 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener binding.clock.setOnLongClickListener(this) binding.date.setOnLongClickListener(this) binding.setDefaultLauncher.setOnClickListener(this) + binding.setDefaultLauncher.setOnLongClickListener(this) + binding.tvScreenTime.setOnClickListener(this) } private fun setHomeAlignment(horizontalGravity: Int = prefs.homeAlignment) { @@ -218,10 +254,40 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener binding.date.text = dateText.replace(".,", ",") } + @RequiresApi(Build.VERSION_CODES.Q) + private fun populateScreenTime() { + if (requireContext().appUsagePermissionGranted().not()) return + + viewModel.getTodaysScreenTime() + binding.tvScreenTime.visibility = View.VISIBLE + + val isLandscape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + val horizontalMargin = if (isLandscape) 64.dpToPx() else 10.dpToPx() + val marginTop = if (isLandscape) { + if (prefs.dateTimeVisibility == Constants.DateTime.DATE_ONLY) 36.dpToPx() else 56.dpToPx() + } else { + if (prefs.dateTimeVisibility == Constants.DateTime.DATE_ONLY) 45.dpToPx() else 72.dpToPx() + } + val params = FrameLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ).apply { + topMargin = marginTop + marginStart = horizontalMargin + marginEnd = horizontalMargin + gravity = if (prefs.homeAlignment == Gravity.END) Gravity.START else Gravity.END + } + binding.tvScreenTime.layoutParams = params + binding.tvScreenTime.setPadding(10.dpToPx()) + } + private fun populateHomeScreen(appCountUpdated: Boolean) { if (appCountUpdated) hideHomeApps() populateDateTime() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + populateScreenTime() + val homeAppsNum = prefs.homeAppsNum if (homeAppsNum == 0) return @@ -318,6 +384,7 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener null, packageName, activityClassName, + false, getUserHandleFromString(requireContext(), userString) ), Constants.FLAG_LAUNCH_APP @@ -423,6 +490,28 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener requireActivity().recreate() } + private fun openScreenTimeDigitalWellbeing() { + val intent = Intent() + try { + intent.setClassName( + Constants.DIGITAL_WELLBEING_PACKAGE_NAME, + Constants.DIGITAL_WELLBEING_ACTIVITY + ) + startActivity(intent) + } catch (e: Exception) { + e.printStackTrace() + try { + intent.setClassName( + Constants.DIGITAL_WELLBEING_SAMSUNG_PACKAGE_NAME, + Constants.DIGITAL_WELLBEING_SAMSUNG_ACTIVITY + ) + startActivity(intent) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + private fun showLongPressToast() = requireContext().showToast(getString(R.string.long_press_to_select_app)) private fun textOnClick(view: View) = onClick(view) @@ -454,17 +543,9 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener override fun onLongClick() { super.onLongClick() try { - if (prefs.toShowHintCounter == Constants.HINT_RATE_US && prefs.rateClicked.not()) { - viewModel.showDialog.postValue(Constants.Dialog.RATE) - prefs.toShowHintCounter = prefs.toShowHintCounter + 1 - } else if (prefs.toShowHintCounter % Constants.HINT_SHARE == 0) { - viewModel.showDialog.postValue(Constants.Dialog.SHARE) - prefs.toShowHintCounter = prefs.toShowHintCounter + 1 - } else { - findNavController().navigate(R.id.action_mainFragment_to_settingsFragment) - viewModel.firstOpen(false) - } - } catch (e: java.lang.Exception) { + findNavController().navigate(R.id.action_mainFragment_to_settingsFragment) + viewModel.firstOpen(false) + } catch (e: Exception) { e.printStackTrace() } } @@ -476,6 +557,11 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener else if (prefs.lockModeOn) lockPhone() } + + override fun onClick() { + super.onClick() + viewModel.checkForMessages.call() + } } } diff --git a/app/src/main/java/app/olauncher/ui/SettingsFragment.kt b/app/src/main/java/app/olauncher/ui/SettingsFragment.kt index a5c5dd6..b64a7ca 100644 --- a/app/src/main/java/app/olauncher/ui/SettingsFragment.kt +++ b/app/src/main/java/app/olauncher/ui/SettingsFragment.kt @@ -6,8 +6,13 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle +import android.os.Process import android.provider.Settings -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowInsets import android.widget.Toast import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.bundleOf @@ -21,7 +26,18 @@ import app.olauncher.R import app.olauncher.data.Constants import app.olauncher.data.Prefs import app.olauncher.databinding.FragmentSettingsBinding -import app.olauncher.helper.* +import app.olauncher.helper.animateAlpha +import app.olauncher.helper.appUsagePermissionGranted +import app.olauncher.helper.getColorFromAttr +import app.olauncher.helper.isAccessServiceEnabled +import app.olauncher.helper.isDarkThemeOn +import app.olauncher.helper.isOlauncherDefault +import app.olauncher.helper.openAppInfo +import app.olauncher.helper.openUrl +import app.olauncher.helper.rateApp +import app.olauncher.helper.setPlainWallpaper +import app.olauncher.helper.shareApp +import app.olauncher.helper.showToast import app.olauncher.listener.DeviceAdmin class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListener { @@ -47,12 +63,14 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe } ?: throw Exception("Invalid Activity") viewModel.isOlauncherDefault() - deviceManager = context?.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager + deviceManager = requireContext().getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager componentName = ComponentName(requireContext(), DeviceAdmin::class.java) checkAdminPermission() binding.homeAppsNum.text = prefs.homeAppsNum.toString() + populateProMessage() populateKeyboardText() + populateScreenTimeOnOff() populateLockSettings() populateWallpaperText() populateAppThemeText() @@ -78,7 +96,9 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe when (view.id) { R.id.olauncherHiddenApps -> showHiddenApps() - R.id.appInfo -> openAppInfo(requireContext(), android.os.Process.myUserHandle(), BuildConfig.APPLICATION_ID) + R.id.olauncherPro -> requireContext().openUrl(Constants.URL_OLAUNCHER_PRO) + R.id.screenTimeOnOff -> viewModel.showDialog.postValue(Constants.Dialog.DIGITAL_WELLBEING) + R.id.appInfo -> openAppInfo(requireContext(), Process.myUserHandle(), BuildConfig.APPLICATION_ID) R.id.setLauncher -> viewModel.resetLauncherLiveData.call() R.id.toggleLock -> toggleLockMode() R.id.autoShowKeyboard -> toggleKeyboardText() @@ -153,6 +173,7 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe R.id.alignment -> { prefs.appLabelAlignment = prefs.homeAlignment findNavController().navigate(R.id.action_settingsFragment_to_appListFragment) + requireContext().showToast(getString(R.string.alignment_changed)) } R.id.dailyWallpaper -> removeWallpaper() @@ -174,9 +195,11 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe binding.appInfo.setOnClickListener(this) binding.setLauncher.setOnClickListener(this) binding.aboutOlauncher.setOnClickListener(this) + binding.olauncherPro.setOnClickListener(this) binding.autoShowKeyboard.setOnClickListener(this) binding.toggleLock.setOnClickListener(this) binding.homeAppsNum.setOnClickListener(this) + binding.screenTimeOnOff.setOnClickListener(this) binding.dailyWallpaperUrl.setOnClickListener(this) binding.dailyWallpaper.setOnClickListener(this) binding.alignment.setOnClickListener(this) @@ -238,12 +261,13 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe private fun initObservers() { if (prefs.firstSettingsOpen) { + viewModel.showDialog.postValue(Constants.Dialog.ABOUT) prefs.firstSettingsOpen = false } viewModel.isOlauncherDefault.observe(viewLifecycleOwner) { if (it) { binding.setLauncher.text = getString(R.string.change_default_launcher) - prefs.toShowHintCounter = prefs.toShowHintCounter + 1 + prefs.toShowHintCounter += 1 } } viewModel.homeAppAlignment.observe(viewLifecycleOwner) { @@ -497,6 +521,13 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe }.toString() } + private fun populateScreenTimeOnOff() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + if (requireContext().appUsagePermissionGranted()) binding.screenTimeOnOff.text = getString(R.string.on) + else binding.screenTimeOnOff.text = getString(R.string.off) + } else binding.screenTimeLayout.visibility = View.GONE + } + private fun populateKeyboardText() { if (prefs.autoShowKeyboard) binding.autoShowKeyboard.text = getString(R.string.on) else binding.autoShowKeyboard.text = getString(R.string.off) @@ -564,6 +595,12 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe binding.swipeRightApp.setTextColor(requireContext().getColorFromAttr(R.attr.primaryColorTrans50)) } +// private fun populateDigitalWellbeing() { +// binding.digitalWellbeing.isVisible = requireContext().isPackageInstalled(Constants.DIGITAL_WELLBEING_PACKAGE_NAME).not() +// && requireContext().isPackageInstalled(Constants.DIGITAL_WELLBEING_SAMSUNG_PACKAGE_NAME).not() +// && prefs.hideDigitalWellbeing.not() +// } + private fun showAppListIfEnabled(flag: Int) { if ((flag == Constants.FLAG_SET_SWIPE_LEFT_APP) and !prefs.swipeLeftEnabled) { requireContext().showToast(getString(R.string.long_press_to_enable)) @@ -581,13 +618,27 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe } private fun populateActionHints() { + if (prefs.aboutClicked.not()) + binding.aboutOlauncher.setCompoundDrawablesWithIntrinsicBounds(0, 0, android.R.drawable.stat_notify_more, 0) if (viewModel.isOlauncherDefault.value != true) return - if (prefs.rateClicked.not() && prefs.toShowHintCounter > Constants.HINT_RATE_US && prefs.toShowHintCounter < Constants.HINT_RATE_US + 10) + if (prefs.rateClicked.not() && prefs.toShowHintCounter > Constants.HINT_RATE_US && prefs.toShowHintCounter < Constants.HINT_RATE_US + 100) binding.rate.setCompoundDrawablesWithIntrinsicBounds(0, android.R.drawable.arrow_down_float, 0, 0) } + private fun populateProMessage() { + if (prefs.proMessageShown.not() && prefs.userState == Constants.UserState.SHARE) { + prefs.proMessageShown = true + viewModel.showDialog.postValue(Constants.Dialog.PRO_MESSAGE) + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null } + + override fun onDestroy() { + viewModel.checkForMessages.call() + super.onDestroy() + } }
\ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_top.xml b/app/src/main/res/anim/slide_in_top.xml index 14073f7..17f00fa 100644 --- a/app/src/main/res/anim/slide_in_top.xml +++ b/app/src/main/res/anim/slide_in_top.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate - android:duration="@android:integer/config_shortAnimTime" + android:duration="1000" android:fromYDelta="-1%" android:toYDelta="0%" /> <alpha - android:duration="@android:integer/config_shortAnimTime" + android:duration="1000" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
\ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_top.xml b/app/src/main/res/anim/slide_out_top.xml index 3189d42..47973db 100644 --- a/app/src/main/res/anim/slide_out_top.xml +++ b/app/src/main/res/anim/slide_out_top.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate - android:duration="@android:integer/config_shortAnimTime" + android:duration="1000" android:fromYDelta="0%" android:toYDelta="-1%" /> <alpha - android:duration="150" + android:duration="1000" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set> diff --git a/app/src/main/res/drawable/bg_shade_circular.xml b/app/src/main/res/drawable/bg_shade_circular.xml new file mode 100644 index 0000000..f0b1242 --- /dev/null +++ b/app/src/main/res/drawable/bg_shade_circular.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <solid android:color="?attr/primaryShadeDarkColor" /> +</shape> diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000..53bb39e --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,11 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="22dp" + android:height="22dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + <path + android:fillColor="?attr/primaryColor" + android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> + +</vector> diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml index e5c82dd..022cd02 100644 --- a/app/src/main/res/drawable/ic_close.xml +++ b/app/src/main/res/drawable/ic_close.xml @@ -1,6 +1,6 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="20dp" - android:height="20dp" + android:width="22dp" + android:height="22dp" android:viewportWidth="24" android:viewportHeight="24"> <path diff --git a/app/src/main/res/drawable/ic_rename.xml b/app/src/main/res/drawable/ic_rename.xml index b07e067..f599032 100644 --- a/app/src/main/res/drawable/ic_rename.xml +++ b/app/src/main/res/drawable/ic_rename.xml @@ -1,6 +1,6 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" + android:width="22dp" + android:height="22dp" android:viewportWidth="24" android:viewportHeight="24"> <path diff --git a/app/src/main/res/drawable/rounded_rect_shade_color.xml b/app/src/main/res/drawable/rounded_rect_shade_color.xml index bb87ed4..eda3ce1 100644 --- a/app/src/main/res/drawable/rounded_rect_shade_color.xml +++ b/app/src/main/res/drawable/rounded_rect_shade_color.xml @@ -2,8 +2,8 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="?attr/primaryShadeColor" /> - <corners android:radius="16dp" /> + <corners android:radius="20dp" /> <stroke - android:width="0.5dp" + android:width="0.8dp" android:color="?attr/primaryColorTrans50" /> </shape> diff --git a/app/src/main/res/drawable/rounded_rectangle_dark.xml b/app/src/main/res/drawable/rounded_rectangle_dark.xml index 9138e96..4c0758a 100644 --- a/app/src/main/res/drawable/rounded_rectangle_dark.xml +++ b/app/src/main/res/drawable/rounded_rectangle_dark.xml @@ -4,6 +4,6 @@ <solid android:color="?attr/primaryColorInverseTrans90" /> <corners android:radius="24dp" /> <stroke - android:width="0.5dp" + android:width="0.8dp" android:color="?attr/primaryColorTrans50" /> </shape> diff --git a/app/src/main/res/layout-land/fragment_app_drawer.xml b/app/src/main/res/layout-land/fragment_app_drawer.xml index 4749e24..c15bbb1 100644 --- a/app/src/main/res/layout-land/fragment_app_drawer.xml +++ b/app/src/main/res/layout-land/fragment_app_drawer.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml index 0165e15..0c08f2c 100644 --- a/app/src/main/res/layout-land/fragment_home.xml +++ b/app/src/main/res/layout-land/fragment_home.xml @@ -49,6 +49,22 @@ tools:text="Thu, 30 Dec" /> </LinearLayout> + <!-- Screen time--> + <androidx.appcompat.widget.AppCompatTextView + android:id="@+id/tvScreenTime" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginHorizontal="10dp" + android:layout_marginTop="72dp" + android:gravity="center" + android:padding="10dp" + android:textSize="@dimen/date_size" + android:visibility="gone" + tools:text="2h 11m" + tools:visibility="visible" /> + <!-- Home apps--> <LinearLayout android:id="@+id/homeAppsLayout" @@ -172,6 +188,6 @@ android:layout_marginBottom="56dp" android:ellipsize="end" android:maxLines="1" - android:text="@string/set_as_default_launcher" + android:text="@string/set_as_default_launcher_u" android:visibility="gone" /> </FrameLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_settings.xml b/app/src/main/res/layout-land/fragment_settings.xml index 49e697d..eeebae4 100644 --- a/app/src/main/res/layout-land/fragment_settings.xml +++ b/app/src/main/res/layout-land/fragment_settings.xml @@ -4,14 +4,14 @@ android:id="@+id/mainActivityLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:animateLayoutChanges="true"> + android:animateLayoutChanges="true" + android:background="?attr/primaryShadeDarkColor"> <ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" - android:background="?attr/primaryShadeDarkColor" android:clipChildren="false" android:clipToPadding="false" android:fadingEdgeLength="24dp" @@ -77,8 +77,20 @@ android:layout_marginStart="8dp" android:layout_marginTop="12dp" android:layout_marginBottom="8dp" + android:drawablePadding="8dp" + android:gravity="center" android:text="@string/about_olauncher" /> + <TextView + android:id="@+id/olauncherPro" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="12dp" + android:layout_marginBottom="8dp" + android:text="@string/olauncher_pro" /> + </LinearLayout> <LinearLayout @@ -97,7 +109,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginBottom="8dp" - android:text="@string/appearance" + android:text="@string/home_screen" android:textColor="?attr/primaryColor" /> <FrameLayout @@ -246,84 +258,6 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:paddingVertical="8dp" - android:text="@string/auto_show_keyboard" - android:textColor="?attr/primaryColor" /> - - <TextView - android:id="@+id/autoShowKeyboard" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/on" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - android:id="@+id/dailyWallpaperUrl" - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" - android:text="@string/daily_wallpaper_update" /> - - <TextView - android:id="@+id/dailyWallpaper" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/off" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" - android:text="@string/status_bar" - android:textColor="?attr/primaryColor" /> - - <TextView - android:id="@+id/statusBar" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/off" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" android:text="@string/show_date_time" android:textColor="?attr/primaryColor" /> @@ -491,6 +425,135 @@ </FrameLayout> <FrameLayout + android:id="@+id/screenTimeLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true" + android:clipChildren="false" + android:clipToPadding="false"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/screen_time" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/screenTimeOnOff" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/left" /> + + </FrameLayout> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="12dp" + android:background="@drawable/rounded_rect_shade_color" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="vertical" + android:padding="12dp"> + + <TextView + style="@style/TextLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginBottom="8dp" + android:text="@string/appearance" + android:textColor="?attr/primaryColor" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/auto_show_keyboard" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/autoShowKeyboard" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/on" /> + </FrameLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + android:id="@+id/dailyWallpaperUrl" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/daily_wallpaper_update" /> + + <TextView + android:id="@+id/dailyWallpaper" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/off" /> + </FrameLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/status_bar" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/statusBar" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/off" /> + </FrameLayout> + + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" @@ -921,15 +984,14 @@ <TextView android:id="@+id/footer" - style="@style/TextSmall" + style="@style/TextSmallBold" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:letterSpacing="0.03" android:padding="12dp" - android:text="@string/olauncher_pro" - android:textSize="18sp" /> + android:text="@string/olauncher_pro" /> </LinearLayout> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index de1dc4c..12a0fb2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -53,6 +53,7 @@ android:layout_gravity="end|center_vertical" android:alpha="0.5" android:background="?attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/close" android:padding="6dp" android:src="@drawable/ic_close" /> diff --git a/app/src/main/res/layout/adapter_app_drawer.xml b/app/src/main/res/layout/adapter_app_drawer.xml index 9fe1175..92cf344 100644 --- a/app/src/main/res/layout/adapter_app_drawer.xml +++ b/app/src/main/res/layout/adapter_app_drawer.xml @@ -31,8 +31,9 @@ android:id="@+id/appHideLayout" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_marginVertical="1dp" android:animateLayoutChanges="true" - android:background="?attr/primaryColorInverseTrans80" + android:background="?attr/primaryShadeDarkColor" android:clickable="true" android:focusable="true" android:gravity="end|center_vertical" @@ -99,6 +100,21 @@ android:textSize="12sp" app:drawableTopCompat="@drawable/ic_info" /> + <TextView + android:id="@+id/appMenuClose" + style="@style/TextSmall" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:drawablePadding="2dp" + android:ellipsize="end" + android:gravity="center" + android:maxLines="1" + android:paddingHorizontal="8dp" + android:text="@string/close" + android:textSize="12sp" + app:drawableTopCompat="@drawable/ic_close" /> + </LinearLayout> <LinearLayout @@ -106,7 +122,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" - android:background="?attr/primaryColorInverseTrans80" android:clickable="true" android:focusable="true" android:gravity="end|center_vertical" @@ -114,12 +129,13 @@ android:visibility="gone" tools:visibility="gone"> - <EditText + <androidx.appcompat.widget.AppCompatEditText android:id="@+id/etAppRename" style="@style/TextLarge" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" + android:layout_marginEnd="8dp" android:layout_weight="1" android:background="@null" android:gravity="center_vertical" @@ -131,14 +147,32 @@ <TextView android:id="@+id/tvSaveRename" - style="@style/TextSmallBold" + style="@style/TextSmall" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:drawablePadding="2dp" + android:ellipsize="end" android:gravity="center" - android:paddingHorizontal="20dp" + android:maxLines="1" + android:paddingHorizontal="8dp" android:text="@string/rename" - android:textAllCaps="true" /> + android:textSize="12sp" + app:drawableTopCompat="@drawable/ic_check" /> + <TextView + android:id="@+id/appRenameClose" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:drawablePadding="2dp" + android:ellipsize="end" + android:gravity="center" + android:maxLines="1" + android:paddingHorizontal="8dp" + android:text="@string/close" + android:textSize="12sp" + app:drawableTopCompat="@drawable/ic_close" /> </LinearLayout> </FrameLayout> diff --git a/app/src/main/res/layout/fragment_app_drawer.xml b/app/src/main/res/layout/fragment_app_drawer.xml index a73ddd1..91d0484 100644 --- a/app/src/main/res/layout/fragment_app_drawer.xml +++ b/app/src/main/res/layout/fragment_app_drawer.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" @@ -17,6 +18,7 @@ android:id="@+id/search" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginEnd="32dp" android:layout_weight="1" android:gravity="end" android:imeOptions="actionSearch" @@ -70,7 +72,6 @@ android:clipChildren="false" android:clipToPadding="false" android:fadingEdgeLength="24dp" - android:requiresFadingEdge="vertical" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:requiresFadingEdge="vertical" /> </FrameLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 3cbd920..4626a5b 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -48,6 +48,22 @@ tools:text="Thu, 30 Dec" /> </LinearLayout> + <!-- Screen time--> + <androidx.appcompat.widget.AppCompatTextView + android:id="@+id/tvScreenTime" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginHorizontal="10dp" + android:layout_marginTop="72dp" + android:gravity="center" + android:padding="10dp" + android:textSize="@dimen/date_size" + android:visibility="gone" + tools:text="2h 11m" + tools:visibility="visible" /> + <!-- Home apps--> <LinearLayout android:id="@+id/homeAppsLayout" @@ -173,6 +189,6 @@ android:layout_marginBottom="56dp" android:ellipsize="end" android:maxLines="1" - android:text="@string/set_as_default_launcher" + android:text="@string/set_as_default_launcher_u" android:visibility="gone" /> </FrameLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index ac8af8b..514f385 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainActivityLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" - android:background="?attr/primaryColorInverseTrans50"> + android:background="?attr/primaryShadeDarkColor"> <ScrollView android:id="@+id/scrollView" @@ -78,14 +79,27 @@ android:layout_marginStart="8dp" android:layout_marginTop="12dp" android:layout_marginBottom="8dp" + android:drawablePadding="8dp" + android:gravity="center" android:text="@string/about_olauncher" /> + <TextView + android:id="@+id/olauncherPro" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="12dp" + android:layout_marginBottom="8dp" + android:text="@string/olauncher_pro" /> + </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="12dp" + android:layout_marginHorizontal="12dp" + android:layout_marginTop="12dp" android:background="@drawable/rounded_rect_shade_color" android:clipChildren="false" android:clipToPadding="false" @@ -99,7 +113,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="12dp" - android:text="@string/appearance" + android:text="@string/home_screen" android:textColor="?attr/primaryColor" /> <FrameLayout @@ -251,84 +265,6 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:paddingVertical="8dp" - android:text="@string/auto_show_keyboard" - android:textColor="?attr/primaryColor" /> - - <TextView - android:id="@+id/autoShowKeyboard" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/on" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - android:id="@+id/dailyWallpaperUrl" - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" - android:text="@string/daily_wallpaper_update" /> - - <TextView - android:id="@+id/dailyWallpaper" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/off" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" - android:text="@string/status_bar" - android:textColor="?attr/primaryColor" /> - - <TextView - android:id="@+id/statusBar" - style="@style/TextSmallBold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginEnd="4dp" - android:padding="8dp" - android:text="@string/off" /> - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:animateLayoutChanges="true"> - - <TextView - style="@style/TextSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:paddingVertical="8dp" android:text="@string/show_date_time" android:textColor="?attr/primaryColor" /> @@ -504,6 +440,138 @@ </FrameLayout> <FrameLayout + android:id="@+id/screenTimeLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:layout_marginBottom="4dp" + android:animateLayoutChanges="true" + android:clipChildren="false" + android:clipToPadding="false"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/screen_time" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/screenTimeOnOff" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/off" /> + + </FrameLayout> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="12dp" + android:layout_marginTop="12dp" + android:background="@drawable/rounded_rect_shade_color" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="vertical" + android:padding="12dp" + tools:visibility="visible"> + + <TextView + style="@style/TextLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="12dp" + android:text="@string/appearance" + android:textColor="?attr/primaryColor" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/auto_show_keyboard" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/autoShowKeyboard" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/on" /> + </FrameLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + android:id="@+id/dailyWallpaperUrl" + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/daily_wallpaper_update" /> + + <TextView + android:id="@+id/dailyWallpaper" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/off" /> + </FrameLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:animateLayoutChanges="true"> + + <TextView + style="@style/TextSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:paddingVertical="8dp" + android:text="@string/status_bar" + android:textColor="?attr/primaryColor" /> + + <TextView + android:id="@+id/statusBar" + style="@style/TextSmallBold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_marginEnd="4dp" + android:padding="8dp" + android:text="@string/off" /> + </FrameLayout> + + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" @@ -707,8 +775,8 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="12dp" - android:layout_marginEnd="12dp" + android:layout_marginHorizontal="12dp" + android:layout_marginTop="12dp" android:animateLayoutChanges="true" android:background="@drawable/rounded_rect_shade_color" android:orientation="vertical" @@ -949,8 +1017,7 @@ android:gravity="center" android:letterSpacing="0.03" android:padding="12dp" - android:text="@string/olauncher_pro" - android:textSize="18sp" /> + android:text="@string/digital_minimalism" /> </LinearLayout> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differdeleted file mode 100644 index 893250c..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..43ad1d0 --- /dev/null +++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png Binary files differdeleted file mode 100644 index 2ce7fcd..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +++ /dev/null diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..43d4002 --- /dev/null +++ b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png Binary files differdeleted file mode 100644 index b67c213..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..9697b0f --- /dev/null +++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differdeleted file mode 100644 index a776960..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..dda0a4b --- /dev/null +++ b/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png Binary files differdeleted file mode 100644 index 7f8b7fd..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +++ /dev/null diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..27ed372 --- /dev/null +++ b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png Binary files differdeleted file mode 100644 index 8ee1a22..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..aa005c9 --- /dev/null +++ b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differdeleted file mode 100644 index 379dab5..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..d5f37d4 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png Binary files differdeleted file mode 100644 index 4247ba6..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..f75feb2 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png Binary files differdeleted file mode 100644 index 9ae2db2..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..ac0764e --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differdeleted file mode 100644 index b2b07cd..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..8404384 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png Binary files differdeleted file mode 100644 index a7d4d15..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..7e3c456 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png Binary files differdeleted file mode 100644 index 1946471..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..716d025 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Binary files differdeleted file mode 100644 index 810aeb7..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..71f6a80 --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png Binary files differdeleted file mode 100644 index 7d1764d..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..759afcc --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png Binary files differdeleted file mode 100644 index 04dd8ce..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +++ /dev/null diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..ece9e96 --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index f24adf7..912d591 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="app">App</string> + <string name="app">تطبيق</string> <string name="set_as_default_launcher">تعيين كمشغل افتراضي</string> + <string name="set_as_default_launcher_u"><u>تعيين كمشغل افتراضي</u></string> <string name="set_as_default_launcher_first">تعيين كمشغل افتراضي</string> <string name="_0">صفر</string> <string name="_1">واحد</string> @@ -13,84 +14,92 @@ <string name="_7">سبعة</string> <string name="_8">ثمانية</string> <string name="app_drawer_tips">نصيحة: ابدأ في كتابة اسم التطبيق لتشغيله تلقائيًا</string> - <string name="okay">تمام</string> + <string name="okay">حسنًا</string> <string name="cool">رائع!</string> - <string name="tip_start_typing_for_rename">نصيحة: ابدأ الكتابة لخيار التطبيق RENAME</string> - <string name="your_wallpaper_will_update_shortly">سيتم تحديث ورق الحائط الخاص بك قريبًا</string> + <string name="tip_start_typing_for_rename">نصيحة: ابدأ الكتابة بتغيير اسم التطبيق</string> + <string name="your_wallpaper_will_update_shortly">سيتم تحديث الخلفية الخاصة بك قريبًا</string> <string name="olauncher_is_not_default_launcher">Olauncher ليس المشغل الافتراضي. قد يفشل التحديث اليومي للخلفية.</string> - <string name="long_press_to_enable">اضغط لفترة طويلة للتمكين</string> + <string name="long_press_to_enable">اضغط مطولًا للتمكين</string> <string name="no_hidden_apps">لا توجد تطبيقات مخفية</string> <string name="hidden_apps">تطبيقات مخفية</string> - <string name="swipe_left_app_disabled">انتقاد اليسار تعطيل التطبيق</string> - <string name="swipe_right_app_disabled">انتقاد الحق التطبيق تعطيل</string> - <string name="hidden_apps_message">ملاحظة: اضغط على \"Olauncher\" أعلى صفحة الإعدادات هذه للعثور على تطبيقاتك المخفية. المزيد من التفاصيل متوفرة في صفحة \"حول\" أدناه.</string> + <string name="swipe_left_app_disabled">التمرير لليسار معطّل</string> + <string name="swipe_right_app_disabled">التمرير لليمين معطّل</string> + <string name="hidden_apps_message">ملاحظة: اضغط على \"Olauncher\" أعلى الصفحة للعثور على تطبيقاتك المخفية. المزيد من التفاصيل متوفرة في صفحة \"حول\" أدناه.</string> <string name="swipe_down_for">اسحب لأسفل من أجل</string> <string name="search">يبحث</string> <string name="notifications">إشعارات</string> <string name="accessibility_disclosure">يرجى تشغيل أو إيقاف تشغيل خدمة الوصول في Olauncher في إعدادات جهازك لتمكين هذه الميزة أو تعطيلها. يرجى ملاحظة أن هذه الخدمة تُستخدم فقط للسماح لك بإيقاف تشغيل شاشة جهازك باستخدام إيماءة النقر المزدوج. خدمة الوصول لدينا لا تجمع أو تشارك أي بيانات.</string> <string name="accept">يقبل</string> <string name="permission">إذن</string> - <string name="double_tap_lock">انقر نقرًا مزدوجًا للقفل</string> - <string name="enable">يُمكَِن</string> - <string name="disable">إبطال</string> + <string name="double_tap_lock">النقر المزدوج للقفل</string> + <string name="enable">تشغيل</string> + <string name="disable">إيقاف</string> <string name="not_working">لا يعمل؟</string> <string name="info">معلومات</string> <string name="delete">يمسح</string> <string name="text_size">حجم الخط</string> - <string name="enabled">ممكن</string> - <string name="disabled">عاجز</string> - <string name="please_turn_on_double_tap_to_unlock">يرجى تشغيل النقر المزدوج للقفل</string> + <string name="enabled">ممكّن</string> + <string name="disabled">مُطفأ</string> + <string name="please_turn_on_double_tap_to_unlock">يرجى تشغيل النقر المزدوج لفتح القفل</string> <string name="launcher_failed_to_lock_device">فشل Olauncher في قفل الجهاز. يرجى التحقق من إعدادات التطبيق الخاص بك.</string> - <string name="long_press_to_select_app">اضغط لفترة طويلة لتحديد التطبيق</string> - <string name="unable_to_open_app">تعذر فتح معلومات التطبيق</string> - <string name="copied">نسخ</string> - <string name="system_app_cannot_delete">تطبيق النظام ، لا يمكن الحذف</string> - <string name="type_a_new_app_name_first">اكتب اسم تطبيق جديد أولاً</string> + <string name="long_press_to_select_app">اضغط مطوّلًا لاختيار التطبيق</string> + <string name="unable_to_open_app">تعذر فتح التطبيق</string> + <string name="copied">نُسخ</string> + <string name="system_app_cannot_delete">ﻻ يمكن حذف تطبيقات النظام</string> + <string name="type_a_new_app_name_first">اكتب اسمًا جديدًا للتطبيق أولاً</string> <string name="adapter_show">يعرض</string> <string name="adapter_hide">يخفي</string> <string name="app_text_color">لون الخط</string> - <string name="double_tap_to_lock_screen">انقر نقرًا مزدوجًا للقفل</string> + <string name="double_tap_to_lock_screen">انقر مرتين لقفل الشاشة</string> <string name="admin_permission_message">يعد Olauncher باستخدام إذن قفل الشاشة بشكل مسؤول. لا يقوم Olauncher بجمع أو مشاركة أي بيانات.</string> - <string name="about">عن</string> - <string name="off">عن</string> - <string name="on">على</string> + <string name="about">حول</string> + <string name="off">ﻻ</string> + <string name="on">نعم</string> <string name="black">أسود</string> <string name="white">أبيض</string> <string name="change_default_launcher">تغيير المشغل الافتراضي</string> <string name="privacy">خصوصية</string> - <string name="share">يشارك</string> - <string name="share_now">يشارك</string> - <string name="rate">معدل</string> - <string name="rate_now">معدل</string> - <string name="follow">يتبع</string> - <string name="email">بريد إلكتروني</string> - <string name="donate">يتبرع</string> - <string name="swipe_up_for_apps">1. مرر لأعلى لجميع التطبيقات\n2. اضغط لفترة طويلة في أي مكان للإعدادات</string> - <string name="apps_on_home_screen">تطبيقات على الشاشة الرئيسية</string> - <string name="daily_wallpaper_update">تطبيقات على الشاشة الرئيسية</string> - <string name="left">غادر</string> + <string name="share">شارك</string> + <string name="share_now">يشارك اﻵن</string> + <string name="rate">قيّم</string> + <string name="rate_now">قيّم اﻵن</string> + <string name="follow">تابع</string> + <string name="email">بريد</string> + <string name="donate">تبرّع</string> + <string name="swipe_up_for_apps">1. مرر لأعلى لجميع التطبيقات\n2. اضغط مطوّلًا في أي مكان للإعدادات</string> + <string name="apps_on_home_screen">التطبيقات على الشاشة الرئيسية</string> + <string name="daily_wallpaper_update">تحديث الخلفية يوميّا</string> + <string name="left">يسار</string> <string name="right">يمين</string> <string name="center">مركز</string> <string name="home_layout_alignment">محاذاة التطبيق</string> - <string name="swipe_left_app">انتقاد اليسار التطبيق</string> - <string name="swipe_right_app">انتقد التطبيق الصحيح</string> - <string name="auto_show_keyboard">لوحة مفاتيح العرض التلقائي</string> + <string name="swipe_left_app">افتح عند التمرير لليسار</string> + <string name="swipe_right_app">افتح عند التمرير لليمين</string> + <string name="auto_show_keyboard">العرض التلقائي للوحة المفاتيح</string> <string name="hide">يخفي</string> <string name="status_bar">أظهر شريط الحالة</string> <string name="rename">إعادة تسمية</string> <string name="show_date_time">إظهار التاريخ والوقت</string> - <string name="appearance">مظهر</string> + <string name="appearance">المظهر</string> <string name="gestures">إيماءات</string> - <string name="theme_mode">وضع الموضوع</string> + <string name="theme_mode">النمط</string> <string name="system_default">نظام</string> <string name="dark">مظلم</string> - <string name="light">ضوء</string> - <string name="welcome_to_olauncher_settings">تحتوي صفحة \"حول\" في الأسفل على إجابات لجميع أسئلتك. لا تنسى. شكرًا لك.</string> + <string name="light">مضيء</string> + <string name="welcome_to_olauncher_settings">مرحبًا بك في الإعدادات!\n\nتذكر، إذا كان لديك أي سؤال، فإن صفحة "حول" لدينا تحتوي على الإجابة.</string> <string name="rate_us_message">مرحبًا ، لن ترى هذه الرسالة مرة أخرى. \n\nإذا كنت تحب Olauncher ، فهل يمكنك أن تعطينا تصنيف 5 نجوم؟ يساعدنا ذلك على تحسين تصنيفنا ويجعلنا سعداء. شكرًا لك!</string> - <string name="share_message">مرحبا ، لدينا طلب كبير! نريد الوصول إلى مليون عملية تنزيل قبل نهاية عام 2023 ، ونحتاج إلى مساعدتك. - \n\nهل يمكنك مشاركة Olauncher مع أصدقائك ، من فضلك؟ ذلك سيكون عونا حقا. شكرًا لك!</string> + <string name="share_message">مرحبا، نحن بحاجة لمساعدتكم! في العام الماضي تجاوزنا مليون عملية تنزيل. نريد هذا العام أن نصل إلى مليون آخرين ولكن لا يمكننا القيام بذلك بمفردنا. + \n\nهل تتفضل بمشاركة Olauncher مع أصدقائك، من فضلك؟ شكرا لك، ويوم رائع!</string> <string name="keyboard_message">مرحبًا ، لوحة المفاتيح هي أسرع طريقة للعثور على التطبيقات وتشغيلها في Olauncher. هل يمكننا أن نطلب منك الاحتفاظ بهذا الأمر لبضعة أيام أخرى ثم اتخاذ القرار؟ الاختيار دائما لك.</string> + <string name="digital_wellbeing_message">إذا كنت تريد تعيين حدود زمنية لتطبيقات معينة، فيمكن أن تساعدك ميزة الرفاهية الرقمية في Android على القيام بذلك. + \n\nيرجى البحث عن الرفاهية الرقمية في إعدادات هاتفك وتمكينها.</string> + <string name="app_usage_message">لعرض/إخفاء وقت استخدام الشاشة على الشاشة الرئيسية، يرجى السماح أو منع إذن استخدام التطبيق. + \n\nملاحظة: لا يتم جمع أي بيانات حول استخدام التطبيقات. يتم معالجة كل شيء على جهازك.</string> + <string name="pro_message">يحتوي Olauncher أيضًا على إصدار احترافي يسمى Pro Launcher. يحتوي على ميزات إضافية مثل الطقس، والأدوات، والخطوط، والمجلدات، وخلفيات AMOLED، وما إلى ذلك. + \n\nإنه أيضًا أفضل طريقة لدعم مطوري Olauncher. تحقق من ذلك!</string> + <string name="wallpaper_message">يقدم Olauncher خلفيات جميلة جديدة يوميًا. امنح شاشتك الرئيسية مظهرًا جديدًا كل يوم، مجانًا! + \n\nهل ترغب في تجربته؟</string> <string name="accessibility_service_description">إذن الوصول مطلوب لتمكين النقر المزدوج للقفل. أي بيانات حصل عليها Olauncher عبر هذه الخدمة لن تترك جهازك.</string> <string name="support_olauncher_for_free">ادعم Olauncher مجانًا باستخدام رابط الشراكة التابع لشركة Amazon.</string> <string name="support_olauncher_message">في كل مرة تشتري شيئًا باستخدام الرابط الخاص بنا ، نحصل على عمولة صغيرة. يرجى حفظ الرابط واستخدامه في أي وقت تتسوق فيه عبر الإنترنت. شكرًا لك!</string> @@ -104,15 +113,24 @@ <string name="roadmap">خريطة الطريق</string> <string name="date">تاريخ</string> <string name="date_only">التاريخ فقط</string> - <string name="bottom_on">القاع: تشغيل</string> - <string name="bottom_off">القاع: إيقاف</string> + <string name="bottom_on">المحاذاة ﻷسفل</string> + <string name="bottom_off">المحاذاة ﻷعلى</string> <string name="please_set_olauncher_as_default_first">يرجى تعيين Olauncher كمشغل افتراضي أولاً</string> <string name="affiliate">شركة تابعة</string> <string name="app_not_found">التطبيق غير موجود</string> <string name="unable_to_launch_app">تعذر تشغيل التطبيق</string> <string name="search_for_Launcher_or_home_app">ابحث عن Launcher أو Home app</string> - <string name="swipe_left_app_enabled">انتقاد اليسار التطبيق تمكين</string> - <string name="swipe_right_app_enabled">انتقاد الحق التطبيق تمكين</string> + <string name="swipe_left_app_enabled">التمرير لليسار مفعّل</string> + <string name="swipe_right_app_enabled">التمرير لليمين مفعّل</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">هل تستخدم هاتفك أم أن هاتفك يستخدمك؟</string> <string name="about_olauncher">عن Olauncher</string> -</resources>
\ No newline at end of file + <string name="learn_more">تعلم أكثر</string> + <string name="did_you_know">هل كنت تعلم؟</string> + <string name="leave_a_review">أخبرنا رأيك</string> + <string name="review_message">Olauncher هو وسيظل دائمًا مجانيًا تمامًا. ليس لديها إعلانات. لا يجمع أي بيانات. والأهم من ذلك أنه يساعدك على تقليل وقت الشاشة والعيش حياة رقمية أكثر صحة. + \n\nنحن نعتقد أن التحول إلى الحد الأدنى من المشغل هو قرار ممتاز. على الرغم من أننا متحيزون بشكل واضح، إلا أننا نأمل أن تستمتع بالتجربة. لا تتردد في مشاركة أفكارك معنا!</string> + <string name="screen_time">وقت الشاشة</string> + <string name="alignment_changed">تم تغيير المحاذاة ✅</string> + <string name="home_screen">الشاشة الرئيسية</string> + <string name="hey">مرحبا</string> <!-- Arabic --> +</resources> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d6b4991..95489af 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">App</string> <string name="set_as_default_launcher">Als Standard-Launcher festlegen</string> + <string name="set_as_default_launcher_u"><u>Als Standard-Launcher festlegen</u></string> <string name="set_as_default_launcher_first">Als Standard-Launcher festlegen</string> <string name="_0">0</string> <string name="_1">1</string> @@ -86,13 +87,22 @@ <string name="system_default">System</string> <string name="dark">Dunkel</string> <string name="light">Hell</string> - <string name="welcome_to_olauncher_settings">Auf unserer About-Seite unten finden Sie Antworten auf alle Ihre Fragen. Vergiss es nicht. :)\n\nDankeschön.</string> + <string name="welcome_to_olauncher_settings">Willkommen in den Einstellungen! + \n\nDenken Sie daran, wenn Sie Fragen haben, unsere Seite „Über“ hat die Antwort.</string> <string name="rate_us_message">Hallo, diese Nachricht wird Ihnen nicht mehr angezeigt. \n\nWenn Ihnen Olauncher gefällt, können Sie uns bitte eine 5-Sterne-Bewertung geben? Es hilft uns, unser Ranking zu verbessern und macht uns glücklich. Dankeschön!</string> - <string name="share_message">Hallo, wir haben eine große Bitte! Wir wollen bis zum Ende des Jahres 2023 eine Million Downloads erreichen und brauchen dazu Ihre Hilfe. - \n\nKönnten Sie Olauncher bitte mit Ihren Freunden teilen? Das wäre wirklich hilfreich. Dankeschön!</string> + <string name="share_message">Hallo, wir brauchen deine Hilfe! Letztes Jahr haben wir die Marke von einer Million Downloads überschritten. Dieses Jahr wollen wir eine Million mehr erreichen, aber alleine schaffen wir das nicht. + \n\nWären Sie bitte so freundlich, Olauncher mit Ihren Freunden zu teilen? Vielen Dank und einen wunderschönen Tag!</string> <string name="keyboard_message">Hallo, die Tastatur ist der schnellste Weg, Apps in Olauncher zu finden und zu starten. Können wir Sie bitten, die Funktion noch ein paar Tage eingeschaltet zu lassen und dann zu entscheiden? \n\nDie Wahl liegt immer bei Ihnen.</string> + <string name="digital_wellbeing_message">Wenn Sie Zeitlimits für bestimmte Apps festlegen möchten, kann Ihnen die Digital Wellbeing-Funktion von Android dabei helfen. + \n\nBitte suchen Sie in Ihren Telefoneinstellungen nach Digital Wellbeing und aktivieren Sie es.</string> + <string name="app_usage_message">Um die Bildschirmzeit auf dem Startbildschirm anzuzeigen oder zu verbergen, erteilen Sie bitte die Erlaubnis für die App-Nutzung oder verweigern Sie sie. + \n\nHinweis: Es werden keine Daten zur App-Nutzung gesammelt. Alles wird auf Ihrem Gerät verarbeitet.</string> + <string name="pro_message">Olauncher hat auch eine Pro-Version namens Pro Launcher. Sie bietet zusätzliche Funktionen wie Wetter, Widgets, Schriftarten, Ordner, AMOLED-Hintergründe usw. + \n\nEs ist auch der beste Weg, die Entwickler von Olauncher zu unterstützen. Schau es dir an!</string> + <string name="wallpaper_message">Olauncher bietet täglich wunderschöne neue Wallpapers. Verleihe deinem Homescreen jeden Tag ein frisches Aussehen – kostenlos! + \n\nMöchtest du es ausprobieren?</string> <string name="accessibility_service_description">Die Zugriffsberechtigung ist erforderlich, um das Sperren durch Doppeltippen zu ermöglichen. Die von Olauncher über diesen Dienst erfassten Daten verlassen Ihr Gerät nicht.</string> <string name="support_olauncher_for_free">Unterstützen Sie Olauncher kostenlos, indem Sie unseren Amazon-Partnerlink verwenden.</string> <string name="support_olauncher_message">Jedes Mal, wenn Sie über unseren Link etwas kaufen, erhalten wir eine kleine Provision. Bitte speichern Sie den Link und verwenden Sie ihn bei jedem Online-Einkauf. Dankeschön!</string> @@ -118,5 +128,14 @@ <string name="swipe_left_app_disabled">App nach links wischen deaktiviert</string> <string name="swipe_right_app_disabled">App nach rechts wischen deaktiviert</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Benutzen Sie Ihr Telefon, oder nutzt Ihr Telefon Sie?</string> + <string name="screen_time">Bildschirmzeit</string> <string name="about_olauncher">Über Olauncher</string> + <string name="learn_more">Erfahren Sie mehr</string> + <string name="did_you_know">Wussten Sie?</string> + <string name="leave_a_review">Rezension</string> + <string name="review_message">Olauncher ist und bleibt völlig kostenlos. Es gibt keine Werbung. Es werden keine Daten erfasst. Am wichtigsten ist, dass es Ihnen dabei hilft, Ihre Bildschirmzeit zu verkürzen und ein gesünderes digitales Leben zu führen. + \n\nWir glauben, dass der Wechsel zu einem Minimal Launcher eine ausgezeichnete Entscheidung ist. Obwohl wir offensichtlich voreingenommen sind, hoffen wir, dass Ihnen die Erfahrung gefällt. Teilen Sie uns gerne Ihre Gedanken mit!</string> + <string name="alignment_changed">Ausrichtung geändert ✅</string> + <string name="home_screen">Startbildschirm</string> + <string name="hey">Hey</string> <!-- German --> </resources> diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 71d385a..69bf586 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app">App</string> - <string name="set_as_default_launcher">Establecer como iniciador predeterminado</string> - <string name="set_as_default_launcher_first">Establecer como iniciador predeterminado</string> + <string name="set_as_default_launcher">Establecer como lanzador principal</string> + <string name="set_as_default_launcher_u"><u>Establecer como lanzador principal</u></string> + <string name="set_as_default_launcher_first">Establecer como lanzador principal</string> <string name="app_text_color">Color del texto</string> <string name="double_tap_to_lock_screen">Tocar dos veces para bloquear</string> <string name="admin_permission_message">Olauncher promete usar el permiso de la pantalla de bloqueo de manera responsable. Olauncher no recopila ni comparte ningún dato.</string> @@ -11,25 +12,25 @@ <string name="on">Sí</string> <string name="black">Negro</string> <string name="white">Blanco</string> - <string name="change_default_launcher">Cambiar iniciador predeterminado</string> + <string name="change_default_launcher">Cambiar lanzador principal</string> <string name="privacy">Privacidad</string> <string name="share">Compartir</string> <string name="share_now">Compartir</string> - <string name="rate">Valorar</string> - <string name="rate_now">Valorar</string> + <string name="rate">Calificar</string> + <string name="rate_now">Calificar</string> <string name="follow">Seguir</string> <string name="email">Correo electrónico</string> <string name="donate">Donar</string> - <string name="swipe_up_for_apps">1. Deslice hacia arriba para ver todas las aplicaciones\n2. Mantenga pulsado en cualquier lugar para abrir la configuración</string> + <string name="swipe_up_for_apps">1. Desliza hacia arriba para ver todas las aplicaciones\n2. Mantén pulsado en cualquier lugar para abrir la configuración</string> <string name="apps_on_home_screen">Aplicaciones en la pantalla de inicio</string> <string name="daily_wallpaper_update">Nuevo fondo de pantalla diario</string> <string name="left">Izquierda</string> <string name="right">Derecha</string> <string name="center">Centrado</string> <string name="home_layout_alignment">Posición de aplicaciones</string> - <string name="swipe_left_app">Deslizar hacia la izquierda para abrir</string> - <string name="swipe_right_app">Deslizar hacia la derecha para abrir</string> + <string name="swipe_left_app">Deslizar a la izquierda para abrir</string> + <string name="swipe_right_app">Deslizar a la derecha para abrir</string> <string name="_0">0</string> <string name="_1">1</string> <string name="_2">2</string> @@ -39,7 +40,7 @@ <string name="_6">6</string> <string name="_7">7</string> <string name="_8">8</string> - <string name="app_drawer_tips">Sugerencia: comience a escribir el nombre de una aplicación para iniciarla automáticamente</string> + <string name="app_drawer_tips">Sugerencia: Comienza a escribir el nombre de una aplicación para iniciarla automáticamente</string> <string name="okay">De acuerdo</string> <string name="cool">¡Guay!</string> <string name="auto_show_keyboard">Mostrar teclado automáticamente</string> @@ -53,15 +54,24 @@ <string name="system_default">Sistema</string> <string name="dark">Oscuro</string> <string name="light">Claro</string> - <string name="welcome_to_olauncher_settings">Nuestra página \'Acerca de\' en la parte inferior tiene respuestas a todas sus preguntas. no lo olvides :)\n\nGracias.</string> + <string name="welcome_to_olauncher_settings">¡Bienvenido a la configuración! + \n\nRecuerda, si tienes alguna pregunta, nuestra página Acerca de tiene la respuesta.</string> <string name="rate_us_message">Hola, no volverás a ver este mensaje. \n\nSi te gusta Olauncher, ¿puedes darnos una calificación de 5 estrellas? Nos ayuda a mejorar nuestra clasificación y nos hace felices. ¡Gracias!</string> - <string name="share_message">Hola, tenemos una gran solicitud! Queremos alcanzar el millón de descargas antes de que finalice 2023 y necesitamos tu ayuda. - \n\n¿Podrías compartir Olauncher con tus amigos, por favor? Eso sería realmente útil. ¡Gracias!</string> - <string name="keyboard_message">Hola, el teclado es la forma más rápida de encontrar y ejecutar aplicaciones en Olauncher. ¿Podemos pedirle que mantenga esto activado durante unos días más y luego decidir? - \n\nLa decisión siempre es suya.</string> + <string name="share_message">Hola, necesitamos tu ayuda! El año pasado superamos el millón de descargas. Este año queremos llegar a un millón más, pero no podemos hacerlo solos. + \n\n¿Serías tan amable de compartir Olauncher con tus amigos, por favor? ¡Gracias y tenga un maravilloso día!</string> + <string name="keyboard_message">Hola, el teclado es la forma más rápida de encontrar y ejecutar aplicaciones en Olauncher. ¿Podemos pedirte que mantenga esto activado durante unos días más y luego decidir? + \n\nLa decisión siempre es vuestra.</string> + <string name="digital_wellbeing_message">Si deseas establecer límites de tiempo para determinadas aplicaciones, la función Bienestar digital de Android puede ayudarte a hacerlo. + \n\nBusca Bienestar digital en la configuración de su teléfono y habilítelo.</string> + <string name="app_usage_message">Para mostrar/ocultar el tiempo de pantalla en la pantalla de inicio, permita o deniegue el permiso de uso de la aplicación. + \n\nNota: No se recopilan datos de uso de la aplicación. Todo se procesa en su dispositivo.</string> + <string name="pro_message">Olauncher también tiene una versión pro llamada Pro Launcher. Tiene funciones adicionales como clima, widgets, fuentes, carpetas, fondos AMOLED, etc. + \n\nTambién es la mejor manera de apoyar a los desarrolladores de Olauncher. ¡Échale un vistazo!</string> + <string name="wallpaper_message">Olauncher ofrece hermosos fondos de pantalla nuevos a diario. ¡Dale un nuevo look a tu pantalla de inicio cada día, gratis! + \n\n¿Quieres probarlo?</string> <string name="accessibility_service_description">"Se requiere el permiso de accesibilidad para habilitar el doble toque para bloquear. Cualquier dato adquirido por Olauncher a través de este servicio no saldrá de su dispositivo."</string> - <string name="support_olauncher_for_free">Apoye a Olauncher de forma gratuita utilizando nuestro enlace de afiliado de Amazon.</string> + <string name="support_olauncher_for_free">Apoya a Olauncher de forma gratuita utilizando nuestro enlace de afiliado de Amazon.</string> <string name="support_olauncher_message">Cada vez que compre algo usando nuestro enlace, obtendremos una pequeña comisión. Guarde el enlace y utilícelo cada vez que compre en línea.\n¡Gracias!</string> <string name="open">Abrir enlace</string> <string name="copy">Copiar</string> @@ -77,14 +87,14 @@ <string name="bottom_off">Abajo: No</string> <string name="please_set_olauncher_as_default_first">Primero seleccione Olauncher como su iniciador predeterminado</string> <string name="affiliate">Afiliado</string> - <string name="tip_start_typing_for_rename">Sugerencia: Comience a escribir para RENOMBRAR la aplicación</string> - <string name="hidden_apps_message">Nota: pulse \'Olauncher\' en la parte superior de esta página de Configuración para encontrar sus aplicaciones ocultas. + <string name="tip_start_typing_for_rename">Sugerencia: Comienza a escribir para RENOMBRAR la aplicación</string> + <string name="hidden_apps_message">Nota: pulsa \'Olauncher\' en la parte superior de esta página de Configuración para encontrar las aplicaciones ocultas. \n\nMás detalles disponibles en nuestra página \'Acerca de\' más abajo.</string> <string name="swipe_down_for">Deslizar hacia abajo para</string> <string name="search">Búsqueda</string> <string name="notifications">Notificaciones</string> - <string name="accessibility_disclosure">Active o desactive el servicio de accesibilidad de Olauncher en la configuración de su dispositivo para activar o desactivar esta función. - \n\nTenga en cuenta que este servicio solo se utiliza para permitirle apagar la pantalla de su dispositivo con el gesto de doble toque. Nuestro servicio de accesibilidad no recopila ni comparte ningún dato.</string> + <string name="accessibility_disclosure">Activa o desactiva el servicio de accesibilidad de Olauncher en la configuración de su dispositivo para activar o desactivar esta función. + \n\nTen en cuenta que este servicio solo se utiliza para permitir apagar la pantalla de tu dispositivo con el gesto de doble toque. Nuestro servicio de accesibilidad no recopila ni comparte ningún dato.</string> <string name="accept">Aceptar</string> <string name="permission">Permiso</string> <string name="double_tap_lock">Tocar dos veces para bloquear</string> @@ -102,16 +112,16 @@ <string name="unable_to_open_app">No se ha podido abrir la información de la aplicación</string> <string name="copied">Copiado</string> <string name="system_app_cannot_delete">Aplicación del sistema, no se puede eliminar</string> - <string name="type_a_new_app_name_first">Primero escriba un nuevo nombre para la aplicación</string> + <string name="type_a_new_app_name_first">Primero escribe un nuevo nombre para la aplicación</string> <string name="app_not_found">Aplicación no encontrada</string> <string name="unable_to_launch_app">No se ha podido iniciar la aplicación</string> - <string name="search_for_Launcher_or_home_app">Busque la aplicación Lanzador, Iniciador o Inicio</string> + <string name="search_for_Launcher_or_home_app">Busca la aplicación Lanzador, Iniciador o Inicio</string> <string name="swipe_left_app_enabled">Deslizar hacia la izquierda para abrir aplicación: activado</string> <string name="swipe_right_app_enabled">Deslizar hacia la derecha para abrir aplicación: activado</string> <string name="swipe_left_app_disabled">Deslizar hacia la izquierda para abrir aplicación: desactivado</string> <string name="swipe_right_app_disabled">Deslizar hacia la derecha para abrir aplicación: desactivado</string> - <string name="your_wallpaper_will_update_shortly">Su fondo de pantalla se actualizará en breve</string> - <string name="olauncher_is_not_default_launcher">Olauncher no es su lanzador predeterminado.\nLa actualización diaria del fondo de pantalla puede fallar.</string> + <string name="your_wallpaper_will_update_shortly">Tu fondo de pantalla se actualizará en breve</string> + <string name="olauncher_is_not_default_launcher">Olauncher no es tu lanzador predeterminado.\nLa actualización diaria del fondo de pantalla puede fallar.</string> <string name="long_press_to_enable">Mantenga presionado para habilitar</string> <string name="no_hidden_apps">Sin aplicaciones ocultas</string> <string name="hidden_apps">Aplicaciones ocultas</string> @@ -119,4 +129,13 @@ <string name="adapter_hide">Ocultar</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">¿Estás usando tu teléfono, o tu teléfono te está usando a ti?</string> <string name="about_olauncher">Acerca de Olauncher</string> + <string name="learn_more">Aprende más</string> + <string name="did_you_know">¿Sabías?</string> + <string name="screen_time">Tiempo de pantalla</string> + <string name="leave_a_review">Dejar un comentario</string> + <string name="review_message">Olauncher es y será siempre completamente gratuito. No tiene anuncios. No recopila datos. Lo más importante es que te ayuda a reducir el tiempo que pasa frente a la pantalla y a vivir una vida digital más saludable. + \n\nCreemos que cambiar a un lanzador mínimo es una excelente decisión. Aunque obviamente somos parciales, esperamos que disfrutes la experiencia. ¡No dudes en compartir tus pensamientos con nosotros!</string> + <string name="alignment_changed">Alineación cambiada ✅</string> + <string name="home_screen">Pantalla de inicio</string> + <string name="hey">Hola</string> <!-- Spanish --> </resources> diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index 62177b7..0bba712 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -1,35 +1,36 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app">App</string> - <string name="set_as_default_launcher">Establecer como iniciador predeterminado</string> - <string name="set_as_default_launcher_first">Establecer como iniciador predeterminado</string> - <string name="app_text_color">Color de texto</string> - <string name="double_tap_to_lock_screen">Toca dos veces para bloquear</string> + <string name="set_as_default_launcher">Establecer como lanzador principal</string> + <string name="set_as_default_launcher_u"><u>Establecer como lanzador principal</u></string> + <string name="set_as_default_launcher_first">Primero pongalo como lanzador principal</string> + <string name="app_text_color">Color del texto</string> + <string name="double_tap_to_lock_screen">Tocar dos veces para bloquear</string> <string name="admin_permission_message">Olauncher promete usar el permiso de la pantalla de bloqueo de manera responsable. Olauncher no recopila ni comparte ningún dato.</string> <string name="about">Acerca de</string> - <string name="off">De</string> - <string name="on">En</string> - <string name="black">Black</string> + <string name="off">No</string> + <string name="on">Sí</string> + <string name="black">Negro</string> <string name="white">Blanco</string> - <string name="change_default_launcher">Cambiar lanzador predeterminado</string> + <string name="change_default_launcher">Cambiar lanzador principal</string> <string name="privacy">Privacidad</string> <string name="share">Compartir</string> - <string name="share_now">Compartir</string> - <string name="rate">Tasa</string> - <string name="rate_now">Tasa</string> + <string name="share_now">Compartir ya</string> + <string name="rate">Calificar</string> + <string name="rate_now">Calificar ya</string> <string name="follow">Seguir</string> <string name="email">Correo electrónico</string> <string name="donate">Donar</string> - <string name="swipe_up_for_apps">1. Desliza hacia arriba para todas las aplicaciones\n2. Mantenga pulsado en cualquier lugar para la configuración</string> + <string name="swipe_up_for_apps">1. Deslize hacia arriba para todas las aplicaciones\n2. Mantenga pulsado en cualquier lugar para la configuración</string> <string name="apps_on_home_screen">Aplicaciones en la pantalla de inicio</string> - <string name="daily_wallpaper_update">Nuevo fondo de pantalla diario</string> + <string name="daily_wallpaper_update">Fondo nuevo de pantalla diario </string> <string name="left">Izquierda</string> - <string name="right">Bien</string> + <string name="right">Derecha</string> <string name="center">Centro</string> <string name="home_layout_alignment">Alineación de aplicaciones</string> - <string name="swipe_left_app">Deslizar la aplicación hacia la izquierda</string> - <string name="swipe_right_app">Deslizar la aplicación hacia la derecha</string> + <string name="swipe_left_app">Deslizar a la izquierda para abrir</string> + <string name="swipe_right_app">Deslizar a la derecha para abrir</string> <string name="_0">0</string> <string name="_1">1</string> <string name="_2">2</string> @@ -39,81 +40,99 @@ <string name="_6">6</string> <string name="_7">7</string> <string name="_8">8</string> - <string name="app_drawer_tips">Sugerencia: comience a escribir el nombre de una aplicación para iniciarla automáticamente</string> + <string name="app_drawer_tips">Sugerencia: Comienze a escribir el nombre de una aplicación para abrirla automáticamente</string> <string name="okay">Bueno</string> <string name="cool">¡Fresco!</string> - <string name="auto_show_keyboard">Teclado de exhibición automática</string> - <string name="hide">Esconder</string> + <string name="auto_show_keyboard">Mostrar teclado automáticamente</string> + <string name="hide">Ocultar</string> <string name="status_bar">Mostrar barra de estado</string> - <string name="rename">Rebautizar</string> + <string name="rename">Renombrar</string> <string name="show_date_time">Mostrar fecha y hora</string> - <string name="appearance">Apariencia</string> - <string name="gestures">Gestualidad</string> - <string name="theme_mode">Modo de tema</string> + <string name="appearance">Estilo</string> + <string name="gestures">Gestos</string> + <string name="theme_mode">Tema</string> <string name="system_default">Sistema</string> <string name="dark">Oscuro</string> - <string name="light">Ligero</string> - <string name="welcome_to_olauncher_settings">Nuestra página Acerca de en la parte inferior tiene respuestas a todas sus preguntas. No lo olvides. :)</string> - <string name="rate_us_message">Hola, no volverás a ver este mensaje. - \n\nSi te gusta Olauncher, ¿puedes darnos una calificación de 5 estrellas? Nos ayuda a mejorar nuestra clasificación y nos hace felices. ¡Gracias!</string> - <string name="share_message">Hola, tenemos una gran solicitud! Queremos alcanzar el millón de descargas antes de que finalice 2023 y necesitamos tu ayuda. - \n\n¿Podrías compartir Olauncher con tus amigos, por favor? Eso sería realmente útil. ¡Gracias!</string> - <string name="keyboard_message">Hola, el teclado es la forma más rápida de encontrar y lanzar aplicaciones en Olauncher. ¿Podemos pedirle que mantenga esto encendido por unos días más y luego decidir? La elección es siempre tuya.</string> - <string name="accessibility_service_description">The accessibility permission is required to enable double tap to lock. Any data acquired by Olauncher via this service will not leave your device.</string> + <string name="light">Claro</string> + <string name="welcome_to_olauncher_settings">¡Bienvenido a la configuración! + \n\nRecuerda, si tienes alguna pregunta, nuestra página Acerca de tiene la respuesta.</string> + <string name="rate_us_message">Hola, no volverá a ver este mensaje. + \n\nSi le gusta Olauncher, ¿puede darnos una calificación de 5 estrellas? Nos ayuda a mejorar nuestra clasificación y nos hace felices. ¡Gracias!</string> + <string name="share_message">Hola, necesitamos su ayuda! El año pasado superamos el millón de descargas. Este año queremos llegar a un millón más pero no podemos hacerlo solos. + \n\n¿Sería tan amable de compartir Olauncher con sus amigos, por favor? ¡Gracias, y tenga un maravilloso día!</string> + <string name="keyboard_message">Hola, el teclado es la forma más rápida de encontrar y abrir aplicaciones en Olauncher. ¿Podemos pedirle que mantenga esto activado por unos días más y luego decidir? La decisión siempre es suya.</string> + <string name="digital_wellbeing_message">Si desea establecer límites de tiempo para determinadas aplicaciones, la función Bienestar Digital de Android puede ayudarle a hacerlo. + \n\nBusque Bienestar Digital en la configuración de su teléfono y habilítelo.</string> + <string name="app_usage_message">Para mostrar/ocultar el tiempo de pantalla en la pantalla de inicio, permita o deniegue el permiso de uso de la aplicación. + \n\nNota: No se recopilan datos de uso de la aplicación. Todo se procesa en su dispositivo.</string> + <string name="pro_message">Olauncher también tiene una versión pro llamada Pro Launcher. Tiene funciones adicionales como clima, widgets, fuentes, carpetas, fondos AMOLED, etc. + \n\nTambién es la mejor manera de apoyar a los desarrolladores de Olauncher. ¡Échale un vistazo!</string> + <string name="wallpaper_message">Olauncher ofrece hermosos fondos de pantalla nuevos a diario. ¡Dale un nuevo look a tu pantalla de inicio cada día, gratis! + \n\n¿Quieres probarlo?</string> + <string name="accessibility_service_description">Se necesita el permiso de Accesibilidad para activar el bloqueo con doble toque. Cualquier dato recolectado por Olauncher no saldrá de su dispositivo.</string> <string name="support_olauncher_for_free">Apoye Olauncher de forma gratuita utilizando nuestro enlace de afiliado de Amazon.</string> - <string name="support_olauncher_message">Cada vez que compras algo usando nuestro enlace, obtenemos una pequeña comisión. Por favor, guarde el enlace y úselo cada vez que compre en línea. ¡Gracias!</string> + <string name="support_olauncher_message">Cada vez que compre algo usando nuestro enlace, obtenemos una pequeña comisión. Por favor, guarde el enlace y úselo cada vez que compre en línea. ¡Gracias!</string> <string name="open">Abrir enlace</string> <string name="copy">Copiar</string> <string name="close">Cerrar</string> <string name="not_now">Ahora no</string> - <string name="public_roadmap">Hoja de ruta pública de Olauncher</string> + <string name="public_roadmap">Objetivos de Olauncher</string> <string name="instagram">Instagram</string> <string name="twitter">Twitter</string> - <string name="roadmap">Hoja de ruta</string> + <string name="roadmap">Objetivos</string> <string name="date">Fecha</string> <string name="date_only">Sólo fecha</string> - <string name="bottom_on">Abajo: Activado</string> - <string name="bottom_off">Abajo: Desactivado</string> - <string name="please_set_olauncher_as_default_first">Configura Olauncher como tu lanzador predeterminado primero</string> + <string name="bottom_on">Abajo: Sí</string> + <string name="bottom_off">Abajo: No</string> + <string name="please_set_olauncher_as_default_first">Por favor, primero configure Olauncher como su lanzador principal</string> <string name="affiliate">Afiliar</string> - <string name="tip_start_typing_for_rename">Consejo: Comience a escribir para la opción RENAME de la aplicación</string> + <string name="tip_start_typing_for_rename">Consejo: Comience a escribir para poder RENOMBRAR la aplicación</string> <string name="hidden_apps_message">Nota: Toque \'Olauncher\' en la parte superior de esta página de Configuración para encontrar sus aplicaciones ocultas. Más detalles disponibles en nuestra página Acerca de abajo.</string> - <string name="swipe_down_for">Desliza el dedo hacia abajo para</string> + <string name="swipe_down_for">Deslize el dedo hacia abajo para</string> <string name="search">Buscar</string> <string name="notifications">Notificaciones</string> <string name="accessibility_disclosure">Active o desactive el servicio de accesibilidad de Olauncher en la configuración de su dispositivo para habilitar o deshabilitar esta función. Tenga en cuenta que este servicio solo se utiliza para permitirle apagar el dispositivo</string> <string name="accept">Aceptar</string> <string name="permission">Permiso</string> - <string name="double_tap_lock">Toca dos veces para bloquear</string> + <string name="double_tap_lock">Tocar dos veces para bloquear</string> <string name="enable">Habilitar</string> <string name="disable">Inutilizar</string> <string name="not_working"><u>¿No funciona?</u></string> <string name="info">Información</string> <string name="delete">Borrar</string> <string name="text_size">Tamaño del texto</string> - <string name="enabled">Habilitado</string> - <string name="disabled">Deshabilitado</string> - <string name="please_turn_on_double_tap_to_unlock">Activa el doble toque para bloquear</string> + <string name="enabled">Activado</string> + <string name="disabled">Desactivado</string> + <string name="please_turn_on_double_tap_to_unlock">Active el doble toque para bloquear</string> <string name="launcher_failed_to_lock_device">Olauncher no pudo bloquear el dispositivo. Comprueba la configuración de la aplicación.</string> <string name="long_press_to_select_app">Mantenga presionado para seleccionar la aplicación</string> <string name="unable_to_open_app">No se puede abrir la información de la aplicación</string> <string name="copied">Copiado</string> <string name="system_app_cannot_delete">Aplicación del sistema, no se puede eliminar</string> - <string name="type_a_new_app_name_first">Escriba primero un nuevo nombre de aplicación</string> + <string name="type_a_new_app_name_first">Escriba un nombre nuevo para la aplicación</string> <string name="app_not_found">Aplicación no encontrada</string> <string name="unable_to_launch_app">No se puede iniciar la aplicación</string> - <string name="search_for_Launcher_or_home_app">Buscar la aplicación Launcher o Home</string> - <string name="swipe_left_app_enabled">Aplicación de deslizar hacia la izquierda habilitada</string> - <string name="swipe_right_app_enabled">Aplicación de deslizamiento hacia la derecha habilitada</string> - <string name="swipe_left_app_disabled">Aplicación desactivada para deslizar hacia la izquierda</string> - <string name="swipe_right_app_disabled">Aplicación desactivada para deslizar hacia la derecha</string> - <string name="your_wallpaper_will_update_shortly">Tu fondo de pantalla se actualizará en breve</string> - <string name="olauncher_is_not_default_launcher">Olauncher no es el lanzador predeterminado. La actualización diaria del fondo de pantalla puede fallar.</string> + <string name="search_for_Launcher_or_home_app">Busca la aplicación Launcher o Home</string> + <string name="swipe_left_app_enabled">Deslizar a la izquierda - Activado</string> + <string name="swipe_right_app_enabled">Deslizar a la derecha - Activado</string> + <string name="swipe_left_app_disabled">Deslizar a la izquierda - Desactivado</string> + <string name="swipe_right_app_disabled">Deslizar a la derecha - Desactivado</string> + <string name="your_wallpaper_will_update_shortly">El fondo de pantalla se actualizará en breve</string> + <string name="olauncher_is_not_default_launcher">Olauncher no es el lanzador principal. La actualización diaria del fondo de pantalla puede fallar.</string> <string name="long_press_to_enable">Mantenga presionado para habilitar</string> <string name="no_hidden_apps">Sin aplicaciones ocultas</string> <string name="hidden_apps">Aplicaciones ocultas</string> <string name="adapter_show">demostrar</string> <string name="adapter_hide">esconder</string> - <string name="are_you_using_your_phone_or_is_your_phone_using_you">¿Estás usando tu teléfono, o tu teléfono te está usando a ti?</string> + <string name="are_you_using_your_phone_or_is_your_phone_using_you">¿Está usando su teléfono, o el teléfono lo usa a usted?</string> <string name="about_olauncher">Acerca de Olauncher</string> + <string name="learn_more">Aprenda más</string> + <string name="screen_time">Tiempo de pantalla</string> + <string name="did_you_know">¿Sabía qué?</string> + <string name="leave_a_review">Dejar un comentario</string> + <string name="review_message">Olauncher es y será siempre completamente gratuito. No tiene anuncios. No recopila datos. Lo más importante es que le ayuda a reducir el tiempo que pasa frente a la pantalla y a vivir una vida digital más saludable. + \n\nCreemos que cambiar a un lanzador mínimo es una excelente decisión. Aunque obviamente somos parciales, esperamos que disfrutes la experiencia. ¡No dude en compartir sus pensamientos con nosotros!</string> + <string name="alignment_changed">Alineación cambiada ✅</string> + <string name="home_screen">Pantalla de inicio</string> + <string name="hey">Hola</string> <!-- Spanish --> </resources> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cdff990..da25890 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">App</string> <string name="set_as_default_launcher">Définir comme lanceur par défaut</string> + <string name="set_as_default_launcher_u"><u>Définir comme lanceur par défaut</u></string> <string name="set_as_default_launcher_first">Définir comme lanceur par défaut</string> <string name="app_text_color">Couleur du texte</string> <string name="double_tap_to_lock_screen">Double appui pour verrouiller</string> @@ -53,12 +54,21 @@ <string name="system_default">Système</string> <string name="dark">Sombre</string> <string name="light">Clair</string> - <string name="welcome_to_olauncher_settings">Notre page \"À propos\" en bas a des réponses à toutes vos questions. :)\n\nMerci!</string> + <string name="welcome_to_olauncher_settings">Bienvenue dans les paramètres ! + \n\nN\'oubliez pas, si vous avez des questions, notre page À propos a la réponse.</string> <string name="rate_us_message">Hé, trouvez-vous Olauncher utile? Si oui, une note de 5 étoiles est le meilleur moyen de nous soutenir. \n\nMerci, vous ne verrez plus ce message.</string> - <string name="share_message">Bonjour, pensez-vous que vos amis aimeraient Olauncher autant que vous? - \n\nSoutenez-nous en partageant l\'appli. Merci !</string> + <string name="share_message">Bonjour, nous avons besoin de votre aide ! L\'année dernière, nous avons franchi le million de téléchargements. Cette année, nous voulons atteindre un million de plus, mais nous ne pouvons pas le faire seuls. + \n\nAuriez-vous la gentillesse de partager Olauncher avec vos amis, s\'il vous plaît ? Merci et passez une merveilleuse journée!</string> <string name="keyboard_message">Bonjour, le clavier est le moyen le plus rapide de trouver et de lancer des applications dans Olauncher. Pouvons-nous vous demander de garder cela activé pendant quelques jours de plus, puis de décider? Le choix vous appartient toujours.</string> + <string name="digital_wellbeing_message">Si vous souhaitez définir des limites de temps pour certaines applications, la fonctionnalité Digital Wellbeing d\'Android peut vous aider à le faire. + \n\nVeuillez rechercher Digital Wellbeing dans les paramètres de votre téléphone et l\'activer.</string> + <string name="app_usage_message">Pour afficher/masquer le temps d\'écran sur l\'écran d\'accueil, autorisez ou refusez l\'autorisation d\'utilisation de l\'application. + \n\nRemarque : Aucune donnée d\'utilisation de l\'application n\'est collectée. Tout est traité sur votre appareil.</string> + <string name="pro_message">Olauncher a également une version pro appelée Pro Launcher. Elle dispose de fonctionnalités supplémentaires telles que la météo, les widgets, les polices, les dossiers, les fonds d\'écran AMOLED, etc. + \n\nC\'est aussi le meilleur moyen de soutenir les développeurs d\'Olauncher. Jetez-y un œil !</string> + <string name="wallpaper_message">Olauncher propose de superbes fonds d\'écran nouveaux chaque jour. Donne un nouveau look à ton écran d\'accueil chaque jour, gratuitement! + \n\nTu veux essayer?</string> <string name="accessibility_service_description">L\'autorisation d\'accessibilité est requise pour activer le double appui pour verrouiller. Toutes les données acquises par Olauncher via ce service ne quitteront pas votre appareil.</string> <string name="support_olauncher_for_free">Soutenez Olauncher gratuitement en utilisant notre lien d\'affiliation Amazon.</string> <string name="support_olauncher_message">Chaque fois que vous achetez quelque chose en utilisant notre lien, nous recevons une petite commission. Enregistrez le lien et utilisez le chaque fois que vous commandez en ligne. Merci!</string> @@ -121,4 +131,13 @@ <string name="adapter_hide">Masquer</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Utilisez-vous votre téléphone, ou votre téléphone vous utilise-t-il?</string> <string name="about_olauncher">À propos Olauncher</string> + <string name="learn_more">Apprendre encore plus</string> + <string name="screen_time">Temps d\'écran</string> + <string name="did_you_know">Saviez-vous?</string> + <string name="leave_a_review">Laisser un commentaire</string> + <string name="review_message">Olauncher est et sera toujours entièrement gratuit. Il n\'y a pas de publicité. Il ne collecte aucune donnée. Plus important encore, cela vous aide à réduire votre temps d’écran et à vivre une vie numérique plus saine. + \n\nNous pensons que passer à un lanceur minimal est une excellente décision. Même si nous sommes évidemment partiaux, nous espérons que vous appréciez l\'expérience. N\'hésitez pas à partager vos idées avec nous!</string> + <string name="alignment_changed">Alignement changé ✅</string> + <string name="home_screen">Écran d\'accueil</string> + <string name="hey">Salut</string> <!-- French --> </resources> diff --git a/app/src/main/res/values-hdpi/dimens.xml b/app/src/main/res/values-hdpi/dimens.xml index 6d9fc80..96a1925 100644 --- a/app/src/main/res/values-hdpi/dimens.xml +++ b/app/src/main/res/values-hdpi/dimens.xml @@ -1,11 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">22sp</dimen> + <dimen name="text_large">26sp</dimen> <dimen name="text_small">14sp</dimen> <dimen name="app_padding_vertical">10dp</dimen> <dimen name="home_app_padding_vertical">8dp</dimen> - <dimen name="time_size">45sp</dimen> + <dimen name="time_size">50sp</dimen> <dimen name="date_size">14sp</dimen> - </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index f8b49a3..3f2c850 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -2,6 +2,8 @@ <string name="app_name">Olauncher</string> <string name="app">Aplikacija</string> <string name="set_as_default_launcher">Postavi kao zadani pokretač</string> + <string name="set_as_default_launcher_u"><u>Postavi kao zadani pokretač</u></string> + <string name="set_as_default_launcher_first">Postavi kao zadani pokretač</string> <string name="app_text_color">Boja teksta</string> <string name="double_tap_to_lock_screen">Dvostruki dodir za zaključavanje</string> <string name="admin_permission_message">Olauncher obećava da će odgovorno koristiti dozvolu za zaključavanje zaslona.</string> @@ -13,7 +15,9 @@ <string name="change_default_launcher">Promijeni zadani pokretač</string> <string name="privacy">Privatnost</string> <string name="share">Podijeli</string> + <string name="share_now">Podijeli</string> <string name="rate">Ocijeni</string> + <string name="rate_now">Ocijeni</string> <string name="follow">Prati</string> <string name="email">E-pošta</string> <string name="github">Github</string> @@ -38,6 +42,7 @@ <string name="_8">8</string> <string name="app_drawer_tips">Savjet: Povuci prema dolje za zatvaranje. Pomakni zaslon za zatvaranje tipkovnice.</string> <string name="okay">U redu</string> + <string name="cool">Cool!</string> <string name="auto_show_keyboard">Automatski prikaži tipkovnicu</string> <string name="hide">Sakrij</string> <string name="status_bar">Prikaži statusnu traku</string> @@ -49,12 +54,22 @@ <string name="system_default">Sustav</string> <string name="dark">Tamna</string> <string name="light">Svijetla</string> - <string name="welcome_to_olauncher_settings">Naša stranica s informacijama na dnu zaslona ima odgovore na sva tvoja pitanja. Nemoj zaboraviti to. :) - \n\nHvala ti.</string> + <string name="welcome_to_olauncher_settings">Dobrodošli u postavke! + \n\nZapamtite, ako imate bilo kakvih pitanja, naša stranica O nama ima odgovor.</string> <string name="rate_us_message">Ovu poruku više nećeš vidjeti. \n\nBok, ako uživaš u korištenju Olaunchera, možeš li nam dati recenziju s 5 zvijezdica? To nam donosi više korisnika i usrećuje nas.\nHvala ti i sretan ostatak dana!</string> - <string name="share_message">Bok, misliš li da bi i tvoji prijatelji voljeli Olauncher? - \n\nPodijeli aplikaciju i širi riječ o nama. Hvala ti!</string> + <string name="share_message">Bok, trebamo tvoju pomoć! Prošle godine prešli smo milijun preuzimanja. Ove godine želimo doseći milijun više, ali ne možemo sami. + \n\nHoćete li, molim vas, biti ljubazni podijeliti Olauncher sa svojim prijateljima? Hvala i ugodan dan!</string> + <string name="keyboard_message">Bok, tipkovnica je najbrži način za pronalaženje i pokretanje aplikacija u Olauncheru. Možemo li vas zamoliti da to zadržite uključeno još nekoliko dana, a zatim odlučite? + \n\nIzbor je uvijek vaš.</string> + <string name="digital_wellbeing_message">Ako želite postaviti vremenska ograničenja za određene aplikacije, značajka Digital Wellbeing na Androidu može vam pomoći u tome. + \n\nPotražite Digital Wellbeing u postavkama telefona i omogućite ga.</string> + <string name="app_usage_message">Da biste prikazali/sakrili vrijeme korištenja ekrana na početnom zaslonu, molimo dozvolite ili onemogućite dopuštenje korištenja aplikacije. + \n\nNapomena: Ne prikupljaju se podaci o korištenju aplikacije. Sve se obrađuje na vašem uređaju.</string> + <string name="pro_message">Olauncher također ima pro verziju pod nazivom Pro Launcher. Ima dodatne značajke poput vremena, widgeta, fontova, mapa, AMOLED pozadina itd. + \n\nTo je također najbolji način da podržite programere Olauncher-a. Pogledajte!</string> + <string name="wallpaper_message">Olauncher nudi predivne nove pozadine svaki dan. Daj svom početnom ekranu svjež izgled svaki dan, besplatno! + \n\nŽeliš li isprobati?</string> <string name="accessibility_service_description">Dozvola za pristupačnost potrebna je za omogućavanje zaključavanja dvostrukim dodirom. Bilo koji podatci prikupljeni ovim servisom neće napustiti tvoj uređaj.</string> <string name="lock_layout_description">lock layout description to be used a unique id to lock screen</string> <string name="support_olauncher_for_free">Besplatno podrži Olauncher korištenjem naše sponzorske poveznice za Amazon.</string> @@ -62,6 +77,7 @@ <string name="open">Otvori poveznicu</string> <string name="copy">Kopiraj</string> <string name="close">Zatvori</string> + <string name="not_now">Ne sad</string> <string name="public_roadmap">Javni plan razvoja Olaunchera</string> <string name="instagram">Instagram</string> <string name="twitter">Twitter</string> @@ -77,4 +93,49 @@ <string name="swipe_down_for">Povuci prema dolje za</string> <string name="search">Pretraživanje</string> <string name="notifications">Obavijesti</string> + <string name="learn_more">Saznajte više</string> + <string name="did_you_know">Dali si znao?</string> + <string name="screen_time">Vrijeme na ekranu</string> + <string name="leave_a_review">Ostavite recenziju</string> + <string name="review_message">Olauncher jest i uvijek će biti potpuno besplatan. Nema reklama. Ne prikuplja podatke. Što je najvažnije, pomaže vam u smanjenju vremena koje provodite pred ekranom i živite zdravijim digitalnim životom. + \n\nVjerujemo da je prelazak na minimalni launcher izvrsna odluka. Iako smo očito pristrani, nadamo se da uživate u iskustvu. Slobodno podijelite svoje misli s nama!</string> + + <string name="accessibility_disclosure">Molimo vas da uključite ili isključite Olauncherovu uslugu pristupa u postavkama vašeg uređaja kako biste omogućili ili onemogućili ovu funkciju.\n\nImajte na umu da se ova usluga koristi samo za isključivanje ekrana vašeg uređaja pomoću geste dvostrukog dodira. Naša usluga pristupa ne prikuplja niti dijeli bilo kakve podatke.</string> + <string name="accept">Prihvati</string> + <string name="permission">Dozvola</string> + <string name="double_tap_lock">Dvostruki dodir za zaključavanje</string> + <string name="enable">Omogući</string> + <string name="disable">Onemogući</string> + <string name="not_working"><u>Ne radi?</u></string> + <string name="info">Informacije</string> + <string name="delete">Izbriši</string> + <string name="text_size">Veličina teksta</string> + <string name="enabled">Omogućeno</string> + <string name="disabled">Onemogućeno</string> + <string name="please_turn_on_double_tap_to_unlock">Molimo vas da uključite dvostruki dodir za otključavanje</string> + <string name="launcher_failed_to_lock_device">Olauncher nije uspio zaključati uređaj.\nMolimo provjerite postavke aplikacije.</string> + <string name="long_press_to_select_app">Dugo pritisnite za odabir aplikacije</string> + <string name="unable_to_open_app">Nije moguće otvoriti informacije o aplikaciji</string> + <string name="copied">Kopirano</string> + <string name="system_app_cannot_delete">Sistemska aplikacija, ne može se izbrisati</string> + <string name="type_a_new_app_name_first">Prvo upišite novo ime aplikacije</string> + <string name="app_not_found">Aplikacija nije pronađena</string> + <string name="unable_to_launch_app">Nije moguće pokrenuti aplikaciju</string> + <string name="search_for_Launcher_or_home_app">Pretraži Launcher ili Home aplikaciju</string> + <string name="swipe_left_app_enabled">Povucite lijevo, aplikacija omogućena</string> + <string name="swipe_right_app_enabled">Povucite desno, aplikacija omogućena</string> + <string name="swipe_left_app_disabled">Povucite lijevo, aplikacija onemogućena</string> + <string name="swipe_right_app_disabled">Povucite desno, aplikacija onemogućena</string> + <string name="your_wallpaper_will_update_shortly">Vaša pozadina će se uskoro ažurirati</string> + <string name="olauncher_is_not_default_launcher">Olauncher nije zadani. Ažuriranje pozadine će ne uspjeti.</string> + <string name="long_press_to_enable">Dugo pritisnite za omogućavanje</string> + <string name="no_hidden_apps">Nema skrivenih aplikacija</string> + <string name="hidden_apps">Skrivene aplikacije</string> + <string name="adapter_show">Prikaži</string> + <string name="adapter_hide">Sakrij</string> + <string name="are_you_using_your_phone_or_is_your_phone_using_you">Koristite li svoj telefon ili vaš telefon koristi vas?</string> + <string name="about_olauncher">O Olauncher-u i ČPP</string> + <string name="alignment_changed">Poravnanje promijenjeno ✅</string> + <string name="home_screen">Početni ekran</string> + <string name="hey">Bok</string> <!-- Croatian --> </resources> diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ab21a54..4d24762 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,21 +1,7 @@ <resources> - <string name="app_name" translatable="false">Olauncher</string> - <string name="github" translatable="false">Github</string> - <string name="lock_layout_description" translatable="false">lock layout description to be used a unique id to lock screen</string> - <string name="olauncher_pro" translatable="false"><u>Olauncher Pro</u></string> - <string name="day_battery" formatted="false" translatable="false">%s, %d%%</string> - <string name="tag_0" translatable="false">0</string> - <string name="tag_1" translatable="false">1</string> - <string name="tag_2" translatable="false">2</string> - <string name="tag_3" translatable="false">3</string> - <string name="tag_4" translatable="false">4</string> - <string name="tag_5" translatable="false">5</string> - <string name="tag_6" translatable="false">6</string> - <string name="tag_7" translatable="false">7</string> - <string name="tag_8" translatable="false">8</string> - <string name="app">Alkalmazás</string> - <string name="set_as_default_launcher">Beállítás alapértelmezett indítóként</string> + <string name="set_as_default_launcher">Beállítás alapért. indítóként</string> + <string name="set_as_default_launcher_u"><u>Beállítás alapért. indítóként</u></string> <string name="set_as_default_launcher_first">Beállítás alapértelmezett indítóként</string> <string name="app_text_color">Szövegszín</string> <string name="double_tap_to_lock_screen">Dupla koppintás a képernyő lezárásához</string> @@ -52,10 +38,10 @@ <string name="_6">6</string> <string name="_7">7</string> <string name="_8">8</string> - <string name="app_drawer_tips">Tipp: Kezdje el begépelni egy alkalmazás nevét az automatikus indításához</string> + <string name="app_drawer_tips">Tipp: Kezdje el begépelni egy alkalmazás nevét annak automatikus indításához</string> <string name="okay">Rendben</string> <string name="cool">Szuper!</string> - <string name="auto_show_keyboard">Billentyűzet automatikus megjelenítlse</string> + <string name="auto_show_keyboard">Billentyűzet auto. megjelenítése</string> <string name="hide">Elrejtés</string> <string name="status_bar">Állapotsor megjelenítése fent</string> <string name="rename">Átnevezés</string> @@ -66,18 +52,28 @@ <string name="system_default">Rendszer</string> <string name="dark">Sötét</string> <string name="light">Világos</string> - <string name="welcome_to_olauncher_settings">A Névjegy oldalunk alján megtalálja a válaszokat minden kérdésére. Ne feledje el. :) - \n\nKöszönjük!</string> + <string name="welcome_to_olauncher_settings">Üdvözöljük a beállításokban! + \n\nNe feledje, ha bármilyen kérdése van, az „Rólunk” oldalunk tartalmazza a választ.</string> <string name="rate_us_message">Üdv, ezt az üzenetet nem fogja újra látni. - \n\nHa tetszik az Olauncher, kérjük, adjon nekünk 5 csillagos értékelést! Ez segít javítani a helyezésünket, és nagyon boldoggá tesz minket. Köszönjük!</string> - <string name="share_message">Az embereknek nem kell ragaszkodniuk figyelemelterelő indítóikhoz. Segítsen elterjeszteni, hogy egy jobb opció is létezik. - \n\nOssza meg az Olauncher-t az Önnek fontos emberekkel.</string> - <string name="keyboard_message">Üdv, a billentyűzet a leggyorsabb módja a alkalmazások megtalálásához és elindításához az Olauncherben. Kérhetjük, hogy hagyja bekapcsolva még néhány napig, és utána döntsön. - \n\nA választás mindig az Öné.</string> - <string name="accessibility_service_description">A dupla koppintás zárolásához szükséges a hozzáférhetőségi engedély. Az Olauncher által ezen a szolgáltatáson keresztül megszerzett adatok nem hagyják el a készüléket.</string> + \n\nHa tetszik az Olauncher, kérjük, adjon nekünk 5 csillagos értékelést! Ez segít javítani a helyezésünket, és nagyon boldoggá tesz minket. Köszönjük!</string> + <string name="share_message">A segítségére van szükségünk! Tavaly átléptük az egymillió letöltést. Idén egy millióval többet szeretnénk elérni, de egyedül nem tudjuk megtenni. + \n\nAz Olauncher-nek emberekre van szüksége, az embereknek pedig az Olauncher-re. Köszönettel vennénk, ha megosztaná másokkal is az Olaunchert!</string> + <!-- <string name="share_message">Az Ön havi emlékeztetője - használja Ön a telefonját, és ne a telefonja Önt! Csak így tovább! Nagyszerűen csinálja!--> + <!-- \n\nHa van egy kis ideje, kérjük, ossza meg másokkal is az Olauncher-t. Az Olauncher-nek szüksége van emberekre. De ami még fontosabb, az embereknek szüksége van az Olauncher-re..</string>--> + <string name="keyboard_message">Üdvözöljük! A billentyűzet a leggyorsabb módja az alkalmazások megtalálásához és elindításához az Olauncherben. Megkérhetjük, hogy hagyja bekapcsolva még néhány napig, és utána döntsön? + \n\nA választás mindig az Öné.</string> + <string name="digital_wellbeing_message">Ha időkorlátokat szeretne beállítani bizonyos alkalmazásokhoz, az Android Digital Wellbeing funkciója segíthet ebben. + \n\nKeresse meg a Digitális jólét elemet a telefon beállításai között, és engedélyezze.</string> + <string name="app_usage_message">A képernyőidő megjelenítéséhez/elrejtéséhez a kezdőképernyőn engedélyezze vagy tagadja meg az alkalmazás használati engedélyét. + \n\nMegjegyzés: Nem gyűjtünk alkalmazás-használati adatokat. Minden az Ön eszközén kerül feldolgozásra.</string> + <string name="pro_message">Az Olauncher-nek van egy pro verziója is, amely Pro Launcher néven ismert. További funkciókat kínál, mint például időjárás, widgetek, betűtípusok, mappák, AMOLED háttérképek stb. + \n\nEz a legjobb módja annak, hogy támogassa az Olauncher fejlesztőit. Tekintse meg őket!</string> + <string name="wallpaper_message">Az Olauncher minden nap gyönyörű, új háttérképeket kínál, amelyekkel frissen tarthatja kezdőképernyőjét, ingyen! + \n\nSzeretné kipróbálni?</string> + <string name="accessibility_service_description">A hozzáférhetőségi engedély szükséges a dupla koppintás általi zároláshoz. Az Olauncher által ezen a szolgáltatáson keresztül megszerzett adatok nem hagyják el a készüléket.</string> <string name="support_olauncher_for_free">Támogasson minket ingyenesen az Amazon affiliate linkünk használatával.</string> <string name="support_olauncher_message">Minden alkalommal, amikor vásárol valamit a linkünket használva, egy kis jutalékot kapunk. Kérjük, mentse el a linket, és használja fel, amikor csak online vásárol. - \n\nKöszönjük!</string> + \n\nKöszönjük!</string> <string name="open">Link megnyitása</string> <string name="copy">Másolás</string> <string name="close">Bezárás</string> @@ -90,7 +86,7 @@ <string name="date_only">Csak dátum</string> <string name="bottom_on">Alsó: Be</string> <string name="bottom_off">Alsó: Ki</string> - <string name="please_set_olauncher_as_default_first">Kérjük állítsa be az Olauncher alkalmazást alapértelmezett indítóként</string> + <string name="please_set_olauncher_as_default_first">Kérjük, állítsa be az Olauncher-t alapértelmezett indítóként</string> <string name="affiliate">Affiliate</string> <string name="tip_start_typing_for_rename">Tipp: Kezdjen el gépelni az alkalmazás ÁTNEVEZÉSE opcióhoz</string> <string name="hidden_apps_message">Megjegyzés: A rejtett alkalmazások megtalálásához érintse meg az "Olauncher" elemet ennek a beállítás oldalnak a tetején. @@ -132,6 +128,15 @@ <string name="hidden_apps">Rejtett alkalmazások</string> <string name="adapter_show">Mutasd!</string> <string name="adapter_hide">Rejtsd el!</string> - <string name="are_you_using_your_phone_or_is_your_phone_using_you">Ön használja a telefonját, vagy a telefona használja Önt?</string> + <string name="are_you_using_your_phone_or_is_your_phone_using_you">Ön használja a telefonját, vagy a telefonja használja Önt?</string> <string name="about_olauncher">Az Olauncher-ről</string> + <string name="screen_time">Képernyőidő</string> + <string name="learn_more">Tudjon meg többet</string> + <string name="did_you_know">Tudta?</string> + <string name="leave_a_review">Hagyjon véleményt</string> + <string name="review_message">Az Olauncher teljesen ingyenes és mindig is az lesz. Nincsenek hirdetései, nem gyűjt adatokat, és segít csökkenteni a képernyő előtt töltött időt egy egészségesebb digitális élet végett. + \n\nÚgy gondoljuk, hogy egy minimális indítóra váltás kiváló döntés, és reméljük, hogy élvezni fogja. Ossza meg másokkal is tapasztalatait!</string> + <string name="alignment_changed">Az igazítás megváltozott ✅</string> + <string name="home_screen">Kezdőképernyő</string> + <string name="hey">Üdvözöljük!</string> <!-- Hungarian --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 12bb882..be78aeb 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -2,25 +2,26 @@ <resources> <string name="app">Aplikasi</string> <string name="set_as_default_launcher">Tetapkan sebagai peluncur default</string> + <string name="set_as_default_launcher_u"><u>Tetapkan sebagai peluncur default</u></string> <string name="set_as_default_launcher_first">Tetapkan sebagai peluncur default</string> <string name="app_text_color">Warna teks</string> <string name="double_tap_to_lock_screen">Ketuk dua kali untuk mengunci</string> <string name="admin_permission_message">Olauncher berjanji untuk menggunakan izin layar kunci secara bertanggung jawab. Olauncher tidak mengumpulkan atau membagikan data apa pun.</string> <string name="about">Tentang</string> <string name="off">Mati</string> - <string name="on">Pada</string> + <string name="on">Nyala</string> <string name="black">Hitam</string> <string name="white">Putih</string> <string name="change_default_launcher">Ubah peluncur default</string> - <string name="privacy">Pribadi</string> - <string name="share">Membagikan</string> - <string name="share_now">Membagikan</string> - <string name="rate">Kecepatan</string> - <string name="rate_now">Kecepatan</string> - <string name="follow">Mengikuti</string> + <string name="privacy">Privasi</string> + <string name="share">Bagikan</string> + <string name="share_now">Bagikan sekarang</string> + <string name="rate">Peringkat</string> + <string name="rate_now">Berikan peringkat sekarang</string> + <string name="follow">Ikuti</string> <string name="email">Surel</string> - <string name="donate">Menyumbangkan</string> + <string name="donate">Donasi</string> <string name="swipe_up_for_apps">1. Geser ke atas untuk semua aplikasi\n2. Tekan lama di mana saja untuk pengaturan</string> <string name="apps_on_home_screen">Aplikasi di layar awal</string> <string name="daily_wallpaper_update">Wallpaper baru setiap hari</string> @@ -41,30 +42,39 @@ <string name="_8">8</string> <string name="app_drawer_tips">Kiat: Mulai ketikkan nama aplikasi untuk meluncurkannya secara otomatis</string> <string name="okay">Oke</string> - <string name="cool">Dingin!</string> + <string name="cool">Keren!</string> <string name="auto_show_keyboard">Tampilkan keyboard secara otomatis</string> - <string name="hide">Bersembunyi</string> + <string name="hide">Sembunyikan</string> <string name="status_bar">Tampilkan bilah status</string> <string name="rename">Ganti nama</string> - <string name="show_date_time">Tunjukkan waktu tanggal</string> + <string name="show_date_time">Tampilkan waktu tanggal</string> <string name="appearance">Penampilan</string> <string name="gestures">Gerakan</string> - <string name="theme_mode">Modus tema</string> + <string name="theme_mode">Mode tema</string> <string name="system_default">Sistem</string> <string name="dark">Gelap</string> - <string name="light">Lampu</string> - <string name="welcome_to_olauncher_settings">Halaman Tentang kami di bagian bawah memiliki jawaban atas semua pertanyaan Anda. Jangan lupa. :)</string> + <string name="light">Terang</string> + <string name="welcome_to_olauncher_settings">Selamat datang di pengaturan! + \n\nIngat, jika Anda memiliki pertanyaan, halaman Tentang kami memiliki jawabannya.</string> <string name="rate_us_message">Hai, Anda tidak akan melihat pesan ini lagi. \n\nJika Anda menyukai Olauncher, bisakah Anda memberi kami peringkat bintang 5? Ini membantu kami meningkatkan peringkat kami dan membuat kami bahagia. Terima kasih!</string> - <string name="share_message">Hai, kami punya permintaan besar! Kami ingin mencapai satu juta unduhan sebelum tahun 2023 berakhir, dan kami membutuhkan bantuan Anda. - \n\nBisakah Anda berbagi Olauncher dengan teman-teman Anda? Itu akan sangat membantu. Terima kasih!</string> + <string name="share_message">Hai, kami membutuhkan bantuan Anda! Tahun lalu kami melampaui satu juta unduhan. Tahun ini kami ingin menjangkau satu juta orang lagi tetapi kami tidak dapat melakukannya sendiri. + \n\nMaukah Anda berbaik hati membagikan Olauncher kepada teman-teman Anda? Terima kasih dan semoga harimu menyenangkan!</string> <string name="keyboard_message">Hai, keyboard adalah cara tercepat untuk menemukan dan meluncurkan aplikasi di Olauncher. Bisakah kami meminta Anda untuk mengaktifkannya selama beberapa hari lagi dan kemudian memutuskan? Pilihan selalu menjadi milik Anda.</string> + <string name="digital_wellbeing_message">Jika Anda ingin menetapkan batas waktu untuk aplikasi tertentu, fitur Digital Wellbeing Android dapat membantu Anda melakukannya. + \n\nSilakan cari Digital Wellbeing di pengaturan ponsel Anda dan aktifkan.</string> + <string name="app_usage_message">Untuk menampilkan/menyembunyikan waktu layar di layar utama, izinkan atau tolak izin penggunaan aplikasi. + \n\nCatatan: Tidak ada data penggunaan aplikasi yang dikumpulkan. Semua diproses di perangkat Anda.</string> + <string name="pro_message">Olauncher juga memiliki versi pro yang disebut Pro Launcher. Ini memiliki fitur tambahan seperti cuaca, widget, font, folder, wallpaper AMOLED, dan banyak lagi. + \n\nIni juga merupakan cara terbaik untuk mendukung pengembang Olauncher. Cek it out!</string> + <string name="wallpaper_message">Olauncher menawarkan wallpaper baru yang indah setiap hari. Berikan tampilan baru pada layar utama Anda setiap hari, secara gratis! + \n\nIngin mencobanya?</string> <string name="accessibility_service_description">Izin aksesibilitas diperlukan untuk mengaktifkan ketuk dua kali untuk mengunci. Data apa pun yang diperoleh Olauncher melalui layanan ini tidak akan meninggalkan perangkat Anda.</string> <string name="support_olauncher_for_free">Dukung Olauncher secara gratis dengan menggunakan tautan afiliasi Amazon kami.</string> <string name="support_olauncher_message">Setiap kali Anda membeli sesuatu menggunakan tautan kami, kami mendapat komisi kecil. Harap simpan tautan dan gunakan setiap kali Anda berbelanja online.\nTerima kasih!</string> <string name="open">Buka tautan</string> - <string name="copy">Menyalin</string> - <string name="close">Menutup</string> + <string name="copy">Salin</string> + <string name="close">Tutup</string> <string name="not_now">Tidak sekarang</string> <string name="public_roadmap">Peta jalan publik Olauncher</string> <string name="instagram">Instagram</string> @@ -72,27 +82,27 @@ <string name="roadmap">Peta jalan</string> <string name="date">Tanggal</string> <string name="date_only">Tanggal saja</string> - <string name="bottom_on">Bawah: Aktif</string> + <string name="bottom_on">Bawah: Nyala</string> <string name="bottom_off">Bawah: Mati</string> <string name="please_set_olauncher_as_default_first">Silakan atur Olauncher sebagai peluncur default Anda terlebih dahulu</string> <string name="affiliate">Afiliasi</string> <string name="tip_start_typing_for_rename">Tip: Mulailah mengetik untuk opsi RENAME aplikasi</string> <string name="hidden_apps_message">Catatan: Ketuk \'Olauncher\' di bagian atas halaman Pengaturan ini untuk menemukan aplikasi tersembunyi Anda.\n\nRincian lebih lanjut tersedia di halaman Tentang kami di bawah ini.</string> <string name="swipe_down_for">Geser ke bawah untuk</string> - <string name="search">Mencari</string> + <string name="search">Cari</string> <string name="notifications">Notifikasi</string> <string name="accessibility_disclosure">Harap aktifkan atau nonaktifkan layanan aksesibilitas Olauncher di pengaturan perangkat Anda untuk mengaktifkan atau menonaktifkan fitur ini.\n\nHarap perhatikan bahwa layanan ini hanya digunakan untuk memungkinkan Anda mematikan layar perangkat menggunakan gerakan ketuk dua kali. Layanan aksesibilitas kami tidak mengumpulkan atau membagikan data apa pun.</string> - <string name="accept">Menerima</string> + <string name="accept">Terima</string> <string name="permission">Izin</string> <string name="double_tap_lock">Ketuk dua kali untuk mengunci</string> - <string name="enable">Memungkinkan</string> - <string name="disable">Cacat</string> + <string name="enable">Aktifkan</string> + <string name="disable">Nonaktifkan</string> <string name="not_working"><u>Tidak bekerja?</u></string> <string name="info">Info</string> - <string name="delete">Menghapus</string> + <string name="delete">Hapus</string> <string name="text_size">Ukuran teks</string> <string name="enabled">Diaktifkan</string> - <string name="disabled">Dengan disabilitas</string> + <string name="disabled">Dinonaktifkan</string> <string name="please_turn_on_double_tap_to_unlock">Harap aktifkan ketuk dua kali untuk mengunci</string> <string name="launcher_failed_to_lock_device">Olauncher gagal mengunci perangkat.\nSilakan periksa pengaturan aplikasi Anda.</string> <string name="long_press_to_select_app">Tekan lama untuk memilih aplikasi</string> @@ -110,10 +120,19 @@ <string name="your_wallpaper_will_update_shortly">Wallpaper Anda akan segera diperbarui</string> <string name="olauncher_is_not_default_launcher">Olauncher bukan peluncur default.\nPembaruan wallpaper harian mungkin gagal.</string> <string name="long_press_to_enable">Tekan lama untuk mengaktifkan</string> - <string name="no_hidden_apps">Tiada apl tersembunyi</string> + <string name="no_hidden_apps">Aplikasi tersembunyi tidak ada</string> <string name="hidden_apps">Aplikasi tersembunyi</string> - <string name="adapter_show">memperlihatkan</string> - <string name="adapter_hide">bersembunyi</string> + <string name="adapter_show">perlihatkan</string> + <string name="adapter_hide">sembunyikan</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Apakah Anda menggunakan ponsel Anda, atau ponsel Anda menggunakan Anda?</string> <string name="about_olauncher">Tentang Olauncher</string> + <string name="learn_more">Pelajari lebih lanjut</string> + <string name="screen_time">Waktu layar</string> + <string name="did_you_know">Tahukah kamu?</string> + <string name="leave_a_review">Tinggalkan ulasan</string> + <string name="review_message">Olauncher sepenuhnya gratis dan akan selalu gratis. Tidak ada iklan. Tidak mengumpulkan data pribadi. Yang terpenting, ini membantu Anda mengurangi waktu pemakaian perangkat dan menjalani kehidupan digital yang lebih sehat. + \n\nKami percaya bahwa beralih ke peluncur minimal adalah keputusan yang sangat baik. Meskipun kami jelas-jelas bias, kami harap Anda menikmati pengalaman ini. Jangan ragu untuk berbagi pemikiran Anda dengan kami!</string> + <string name="alignment_changed">Penyelarasan diubah ✅</string> + <string name="home_screen">Layar beranda</string> + <string name="hey">Hai</string> <!-- Indonesian --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index adaf596..cec987a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,6 +1,7 @@ <resources> <string name="app">App</string> <string name="set_as_default_launcher">Imposta come launcher predefinito</string> + <string name="set_as_default_launcher_u"><u>Imposta come launcher predefinito</u></string> <string name="set_as_default_launcher_first">Imposta come launcher predefinito</string> <string name="app_text_color"> Colore del testo</string> <string name="double_tap_to_lock_screen">Tocca due volte per bloccare</string> @@ -52,14 +53,22 @@ <string name="system_default">di sistema</string> <string name="dark">Scuro</string> <string name="light">Chiaro</string> - <string name="welcome_to_olauncher_settings">La nostra pagina Informazioni in basso ha le risposto a tutte le tue domande. Non dimenticare. :) - \n\nGrazie.</string> + <string name="welcome_to_olauncher_settings">Benvenuto nelle impostazioni! + \n\nRicorda, se hai domande, la nostra pagina Informazioni ha la risposta.</string> <string name="rate_us_message">Ehi, trovi utile Olauncher? Se sì, una valutazione a 5 stelle è il modo migliore per sostenerci. \n\nGrazie e non lo vedrai più.</string> - <string name="share_message">Ciao, pensi che ai tuoi amici potrebbe piacere Olauncher tanto quanto piace a te? - \n\nCondividi l\'app e aiutaci a spargere la voce. Grazie!</string> + <string name="share_message">Ciao, abbiamo bisogno del tuo aiuto! L\'anno scorso abbiamo superato il milione di download. Quest’anno vogliamo raggiungere un milione in più ma non possiamo farcela da soli. + \n\nSaresti così gentile da condividere Olauncher con i tuoi amici, per favore? Grazie e buona giornata!</string> <string name="keyboard_message">Ciao, la tastiera è il modo più veloce per trovare e avviare le app in Olauncher. Possiamo chiederti di metterlo alla prova ancora per qualche giorno e poi decidere? \n\nSei sempre tu a scegliere.</string> + <string name="digital_wellbeing_message">Se desideri impostare limiti di tempo per determinate app, la funzionalità Benessere digitale di Android può aiutarti a farlo. + \n\nCerca Benessere digitale nelle impostazioni del telefono e attivalo.</string> + <string name="app_usage_message">Per visualizzare/nascondere il tempo di utilizzo dello schermo sulla schermata iniziale, conceda o neghi il permesso di utilizzo dell\'app. + \n\nNota: Non vengono raccolti dati sull\'utilizzo dell\'app. Tutto viene elaborato sul tuo dispositivo.</string> + <string name="pro_message">Olauncher ha anche una versione pro chiamata Pro Launcher. Ha funzionalità extra come meteo, widget, font, cartelle, sfondi AMOLED, e così via. + \n\nÈ anche il modo migliore per supportare gli sviluppatori di Olauncher. Dai un\'occhiata!</string> + <string name="wallpaper_message">Olauncher offre bellissimi sfondi nuovi ogni giorno. Dai un aspetto fresco alla tua schermata principale ogni giorno, gratuitamente! + \n\nVuoi provarlo?</string> <string name="accessibility_service_description">L\'autorizzazione di accessibilità è necessaria per abilitare il doppio tocco per il blocco schermo. Qualsiasi dato acquisito da Olauncher tramite questo servizio rimarrà all’interno del telefono</string> <string name="support_olauncher_for_free">Supporta Olauncher gratuitamente utilizzando il nostro link di affiliazione su Amazon.</string> <string name="support_olauncher_message">Ogni volta che acquisti qualcosa utilizzando il nostro link, riceviamo una piccola commissione. Salva il link e usalo ogni volta che fai acquisti online.\n Grazie!</string> @@ -119,4 +128,13 @@ <string name="adapter_hide">nascondi</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Stai usando il tuo telefono, o è il tuo telefono che sta usando te?</string> <string name="about_olauncher">Info Olauncher</string> + <string name="learn_more">Saperne di più</string> + <string name="screen_time">Tempo di schermo</string> + <string name="did_you_know">Lo sapevate?</string> + <string name="leave_a_review">Lascia una recensione</string> + <string name="review_message">Olauncher è e sarà sempre completamente gratuito. Non ha pubblicità. Non raccoglie dati. Ancora più importante, ti aiuta a ridurre il tempo trascorso davanti allo schermo e a vivere una vita digitale più sana. + \n\nCrediamo che passare a un launcher minimale sia un\'ottima decisione. Anche se siamo ovviamente di parte, ci auguriamo che l\'esperienza ti piaccia. Sentitevi liberi di condividere i tuoi pensieri con noi!</string> + <string name="alignment_changed">Allineamento cambiato ✅</string> + <string name="home_screen">Schermata principale</string> + <string name="hey">Ciao</string> <!-- Italian --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 10b55ee..66bc893 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">アプリ</string> <string name="set_as_default_launcher">デフォルトのランチャーとして設定</string> + <string name="set_as_default_launcher_u"><u>デフォルトのランチャーとして設定</u></string> <string name="set_as_default_launcher_first">デフォルトのランチャーとして設定</string> <string name="_0">〇</string> <string name="_1">一</string> @@ -87,10 +88,20 @@ <string name="system_default">システム</string> <string name="dark">ダーク</string> <string name="light">ライト</string> - <string name="welcome_to_olauncher_settings">下部にある当社の概要ページには、すべての質問への回答が記載されています。忘れないで。 :)\n\nありがとう。</string> + <string name="welcome_to_olauncher_settings">設定へようこそ! + \n\n質問がある場合は、私たちの「About」ページに答えがありますので、覚えておいてください。</string> <string name="rate_us_message">ねえ、Olauncher は役に立つと思いますか? 「はい」の場合、5 つ星の評価が私たちをサポートする最善の方法です。\n\nありがとう、もうこれを見ることはないだろう。</string> - <string name="share_message">こんにちは、あなたの友達もあなたと同じくらいオランチャーを好きだと思いますか?\n\nアプリを共有して、情報を広めてください。ありがとう!</string> + <string name="share_message">こんにちは、あなたの助けが必要です!昨年、ダウンロード数が 100 万件を突破しました。今年はさらに 100 万人を達成したいと考えていますが、私たちだけでは達成できません。 + \n\nOlauncher をお友達と共有していただけますか?ありがとう、そして素晴らしい一日をお過ごしください!</string> <string name="keyboard_message">こんにちは、キーボードは Olauncher でアプリを見つけて起動する最も速い方法です。もう数日間これをオンにしてから判断していただくようお願いできますか?選択は常にあなた次第です。</string> + <string name="digital_wellbeing_message">特定のアプリに時間制限を設定したい場合は、Android の Digital Wellbeing 機能を使用すると便利です。 + \n\n携帯電話の設定で Digital Wellbeing を検索し、有効にしてください。</string> + <string name="app_usage_message">ホーム画面で画面時間を表示/非表示するには、アプリの使用権限を許可または拒否してください。 + \n\n注意: アプリの使用データは収集されません。すべての処理はあなたのデバイスで行われます。</string> + <string name="pro_message">OlauncherにはPro Launcherというプロ版もあります。天気、ウィジェット、フォント、フォルダー、AMOLED壁紙などの追加機能があります。 + \n\nOlauncherの開発者をサポートするための最良の方法でもあります。チェックしてみてください!</string> + <string name="wallpaper_message">Olauncherは毎日美しい新しい壁紙を提供します。毎日ホーム画面に新しい外観を無料で提供! + \n\n試してみますか?</string> <string name="accessibility_service_description">ダブルタップしてロックを有効にするには、アクセシビリティ許可が必要です。このサービスを通じて Olauncher が取得したデータは、デバイスから流出することはありません。</string> <string name="support_olauncher_for_free">Amazon アフィリエイト リンクを使用して、Olauncher を無料でサポートしてください。</string> <string name="support_olauncher_message">あなたが私たちのリンクを使用して何かを購入するたびに、私たちは少額の手数料を受け取ります。リンクを保存し、オンライン ショッピングの際には必ずご利用ください。 ありがとう!</string> @@ -114,7 +125,16 @@ <string name="swipe_left_app_enabled">アプリを左にスワイプ有効化</string> <string name="swipe_right_app_enabled">アプリを右にスワイプ有効</string> <string name="swipe_left_app_disabled">左にスワイプするとアプリが無効になります</string> + <string name="screen_time">スクリーンタイム</string> <string name="swipe_right_app_disabled">アプリを右にスワイプすると無効になります</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">あなたは電話を使っていますか、それともあなたの電話があなたを使っていますか?</string> <string name="about_olauncher">アバウト Olauncher</string> + <string name="learn_more">もっと詳しく知る</string> + <string name="did_you_know">知っていましたか?</string> + <string name="leave_a_review">レビューを残す</string> + <string name="review_message">Olauncher は現在も、今後も完全に無料です。広告はありません。データは収集されません。最も重要なことは、スクリーンタイムを短縮し、より健康的なデジタル ライフを送るのに役立つことです。 + \n\n私たちは、最小限のランチャーに切り替えるのは素晴らしい決断だと信じています。明らかに偏見がありますが、楽しんでいただければ幸いです。ぜひご意見をお聞かせください。</string> + <string name="alignment_changed">アライメントが変更されました ✅</string> + <string name="home_screen">ホーム画面</string> + <string name="hey">やあ</string> <!-- Japanese --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-ldpi/dimens.xml b/app/src/main/res/values-ldpi/dimens.xml index 882f3ab..7bad3df 100644 --- a/app/src/main/res/values-ldpi/dimens.xml +++ b/app/src/main/res/values-ldpi/dimens.xml @@ -1,12 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">22sp</dimen> + <dimen name="text_large">26sp</dimen> <dimen name="text_small">14sp</dimen> <dimen name="app_padding_vertical">8dp</dimen> <dimen name="home_app_padding_vertical">6dp</dimen> - <dimen name="time_size">45sp</dimen> + <dimen name="time_size">50sp</dimen> <dimen name="date_size">14sp</dimen> - <dimen name="alphabet_recycler_margin_top">180dp</dimen> - </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-mdpi/dimens.xml b/app/src/main/res/values-mdpi/dimens.xml index 54a5b07..7bad3df 100644 --- a/app/src/main/res/values-mdpi/dimens.xml +++ b/app/src/main/res/values-mdpi/dimens.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">22sp</dimen> + <dimen name="text_large">26sp</dimen> <dimen name="text_small">14sp</dimen> <dimen name="app_padding_vertical">8dp</dimen> <dimen name="home_app_padding_vertical">6dp</dimen> - <dimen name="time_size">45sp</dimen> + <dimen name="time_size">50sp</dimen> <dimen name="date_size">14sp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 2085d29..250a22a 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -51,7 +51,7 @@ </style> <style name="AppSearchText" parent="Widget.AppCompat.SearchView"> - <item name="android:maxLength">50</item> + <item name="android:maxLength">200</item> <item name="android:textSize">@dimen/text_large</item> <item name="android:textColor">?attr/primaryColor</item> <item name="android:editTextColor">?attr/primaryColor</item> @@ -65,9 +65,9 @@ <item name="android:textColor">@drawable/text_colors_default</item> <item name="android:textColorHint">?attr/primaryColorTrans80</item> <item name="android:shadowColor">?attr/primaryTextShadowColor</item> - <item name="android:shadowDx">1</item> - <item name="android:shadowDy">1</item> - <item name="android:shadowRadius">2</item> + <item name="android:shadowDx">0</item> + <item name="android:shadowDy">2</item> + <item name="android:shadowRadius">4</item> </style> <style name="TextLarge" parent="TextDefault"> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 99bf6c5..7ed26a5 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">Aplikacja</string> <string name="set_as_default_launcher">Ustaw jako domyślny program uruchamiający</string> + <string name="set_as_default_launcher_u"><u>Ustaw jako domyślny program uruchamiający</u></string> <string name="set_as_default_launcher_first">Ustaw jako domyślny program uruchamiający</string> <string name="_0">0</string> <string name="_1">1</string> @@ -86,10 +87,20 @@ <string name="system_default">System</string> <string name="dark">Ciemny</string> <string name="light">Jasny</string> - <string name="welcome_to_olauncher_settings">Nasza strona Informacje na dole zawiera odpowiedzi na wszystkie Twoje pytania. Nie zapomnij. :)\n\nDziękuję.</string> + <string name="welcome_to_olauncher_settings">Witamy w ustawieniach! + \n\nPamiętaj, jeśli masz jakiekolwiek pytania, nasza strona „O nas” ma odpowiedź.</string> <string name="rate_us_message">Hej, czy uważasz, że Olauncher jest przydatny? Jeśli tak, ocena 5 gwiazdek to najlepszy sposób, aby nas wesprzeć.\n\nDziękuję i więcej tego nie zobaczysz.</string> - <string name="share_message">Cześć, myślisz, że Twoi znajomi pokochaliby Olaunchera tak samo jak Ty?\n\nUdostępnij aplikację i pomóż nam rozpowszechniać informacje. Dziękuję!</string> + <string name="share_message">Cześć, potrzebujemy Twojej pomocy! W zeszłym roku przekroczyliśmy milion pobrań. W tym roku chcemy dotrzeć do kolejnego miliona, ale sami nie możemy tego zrobić. + \n\nCzy byłbyś tak miły i udostępnił Olauncher swoim znajomym? Dziękuję i życzę cudownego dnia!</string> <string name="keyboard_message">Cześć, klawiatura to najszybszy sposób znajdowania i uruchamiania aplikacji w Olauncher. Czy możemy poprosić o pozostawienie tego włączonego jeszcze przez kilka dni, a następnie podjęcie decyzji?\n\nWybór zawsze należy do Ciebie.</string> + <string name="digital_wellbeing_message">Jeśli chcesz ustawić limity czasowe dla niektórych aplikacji, funkcja Cyfrowa równowaga w systemie Android może Ci w tym pomóc. + \n\nWyszukaj opcję Cyfrowa równowaga w ustawieniach telefonu i włącz ją.</string> + <string name="app_usage_message">Aby wyświetlić/ukryć czas ekranu na ekranie głównym, pozwól lub zabroń aplikacji na dostęp do danych o użyciu. + \n\nUwaga: Nie są gromadzone żadne dane o użyciu aplikacji. Wszystko jest przetwarzane na Twoim urządzeniu.</string> + <string name="pro_message">Olauncher ma również wersję pro o nazwie Pro Launcher. Posiada dodatkowe funkcje, takie jak pogoda, widgety, czcionki, foldery, tapety AMOLED itp. + \n\nTo także najlepszy sposób na wsparcie deweloperów Olauncher. Sprawdź to!</string> + <string name="wallpaper_message">Olauncher oferuje piękne nowe tapety codziennie. Nadaj swojemu ekranowi głównemu świeży wygląd każdego dnia, za darmo! + \n\nChcesz spróbować?</string> <string name="accessibility_service_description">Uprawnienia dostępu są wymagane, aby włączyć podwójne dotknięcie, aby zablokować. Wszelkie dane pozyskane przez Olauncher za pośrednictwem tej usługi nie opuszczą Twojego urządzenia.</string> <string name="support_olauncher_for_free">Wesprzyj Olauncher za darmo, korzystając z naszego linku afiliacyjnego Amazon.</string> <string name="support_olauncher_message">Za każdym razem, gdy kupujesz coś za pomocą naszego linku, otrzymujemy niewielką prowizję. Zapisz link i używaj go podczas zakupów online. Dziękuję!</string> @@ -116,4 +127,13 @@ <string name="swipe_right_app_disabled">Gest Przesuń w prawo jest wyłączony</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Czy używasz telefonu, czy telefon używa ciebie?</string> <string name="about_olauncher">O Olauncher</string> + <string name="screen_time">Czas ekranowy</string> + <string name="learn_more">Ucz się więcej</string> + <string name="did_you_know">Czy wiedziałeś?</string> + <string name="leave_a_review">Ucz się więcej</string> + <string name="review_message">Olauncher jest i zawsze będzie całkowicie darmowy. Nie zawiera reklam. Nie zbiera żadnych danych. Co najważniejsze, pomaga skrócić czas spędzany przed ekranem i prowadzić zdrowsze cyfrowe życie. + \n\nWierzymy, że przejście na minimalny program uruchamiający to doskonała decyzja. Chociaż jesteśmy oczywiście stronniczy, mamy nadzieję, że spodoba ci się to doświadczenie. Podziel się z nami swoimi przemyśleniami!</string> + <string name="alignment_changed">Wyrównanie zmienione ✅</string> + <string name="home_screen">Ekran główny</string> + <string name="hey">Hej</string> <!-- Polish --> </resources> diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 72f7273..d9d5954 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">Aplicativo</string> <string name="set_as_default_launcher">Definir como launcher padrão</string> + <string name="set_as_default_launcher_u"><u>Definir como launcher padrão</u></string> <string name="set_as_default_launcher_first">Definir como launcher padrão</string> <string name="app_text_color">Cor do texto</string> <string name="double_tap_to_lock_screen">Toque duplo para bloquear</string> @@ -53,12 +54,21 @@ <string name="system_default">Sistema</string> <string name="dark">Escuro</string> <string name="light">Claro</string> - <string name="welcome_to_olauncher_settings">Nossa página Sobre, na parte inferior, tem respostas para todas as suas perguntas. Não se esqueça. :)</string> + <string name="welcome_to_olauncher_settings">Bem-vindo às configurações! + \n\nLembre-se, se você tiver alguma dúvida, nossa página Sobre tem a resposta.</string> <string name="rate_us_message">Ei, você acha Olauncher útil? Se sim, uma classificação de 5 estrelas é a melhor maneira de nos apoiar. Obrigado.</string> - <string name="share_message">Olá, você acha que seus amigos amariam o Olauncher tanto quanto você? - \n\nCompartilhe o aplicativo e ajude-nos a divulgar. Obrigado!</string> + <string name="share_message">Olá, precisamos da sua ajuda! No ano passado ultrapassamos um milhão de downloads. Este ano queremos chegar a mais um milhão, mas não podemos fazê-lo sozinhos. + \n\nVocê poderia fazer a gentileza de compartilhar o Olauncher com seus amigos, por favor? Obrigado e tenha um dia maravilhoso!</string> <string name="keyboard_message">Olá, o teclado é a maneira mais rápida de encontrar e iniciar aplicativos no Olauncher. Podemos pedir-lhe que mantenha isto ligado por mais alguns dias para depois decidir? \n\nA escolha é sempre sua!</string> + <string name="digital_wellbeing_message">Se você deseja definir limites de tempo para determinados aplicativos, o recurso Bem-estar digital do Android pode ajudá-lo a fazer isso. + \n\nProcure Bem-estar Digital nas configurações do seu telefone e ative-o.</string> + <string name="app_usage_message">Para exibir/ocultar o tempo de tela na tela inicial, permita ou negue a permissão de uso do aplicativo. + \n\nNota: Não são coletados dados de uso do aplicativo. Tudo é processado no seu dispositivo.</string> + <string name="pro_message">Olauncher também tem uma versão pro chamada Pro Launcher. Tem recursos extras como clima, widgets, fontes, pastas, papéis de parede AMOLED, e assim por diante. + \n\nÉ também a melhor maneira de apoiar os desenvolvedores do Olauncher. Confira!</string> + <string name="wallpaper_message">Olauncher oferece lindos papéis de parede novos todos os dias. Dê uma nova aparência à sua tela inicial todos os dias, gratuitamente! + \n\nQuer tentar?</string> <string name="accessibility_service_description">A permissão de acessibilidade é necessária para ativar o toque duplo para bloquear. Quaisquer dados adquiridos pelo Olauncher através deste serviço não sairão do seu dispositivo.</string> <string name="support_olauncher_for_free">Apoie o Olauncher gratuitamente usando nosso link de afiliado da Amazon.</string> <string name="support_olauncher_message">Sempre que você comprar algo usando nosso link, receberemos uma pequena comissão. Salve o link e use-o sempre que fizer compras online. Obrigado!</string> @@ -119,4 +129,13 @@ <string name="adapter_hide">Esconder</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Você está usando seu telefone, ou seu telefone está usando você?</string> <string name="about_olauncher">Sobre Olauncher</string> + <string name="learn_more">Saber mais</string> + <string name="screen_time">Tempo de tela</string> + <string name="did_you_know">Você sabia?</string> + <string name="leave_a_review">Deixe um comentário</string> + <string name="review_message">Olauncher é e sempre será totalmente gratuito. Não tem anúncios. Não coleta dados. Mais importante ainda, ajuda você a reduzir o tempo de tela e a ter uma vida digital mais saudável. + \n\nAcreditamos que mudar para um launcher mínimo é uma excelente decisão. Embora sejamos obviamente tendenciosos, esperamos que você esteja gostando da experiência. Sinta-se à vontade para compartilhar suas idéias conosco!</string> + <string name="alignment_changed">Alinhamento alterado ✅</string> + <string name="home_screen">Tela inicial</string> + <string name="hey">Oi</string> <!-- Portuguese --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 7da9c7e..11ab215 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">Приложение</string> <string name="set_as_default_launcher">Сделать лаунчером по умолчанию</string> + <string name="set_as_default_launcher_u"><u>Сделать лаунчером по умолчанию</u></string> <string name="set_as_default_launcher_first">Сделать лаунчером по умолчанию</string> <string name="app_text_color">Цвет текста</string> <string name="double_tap_to_lock_screen">Блокировка двойным тапом</string> @@ -26,10 +27,10 @@ <string name="daily_wallpaper_update">Ежедневно новые обои</string> <string name="left">Слева</string> <string name="right">Справа</string> - <string name="center">По центру</string> - <string name="home_layout_alignment">Выравнивание приложений</string> - <string name="swipe_left_app">Проведите влево для</string> - <string name="swipe_right_app">Проведите вправо для</string> + <string name="center">Центр</string> + <string name="home_layout_alignment">Расположение приложений</string> + <string name="swipe_left_app">Свайп влево</string> + <string name="swipe_right_app">Свайп вправо</string> <string name="_0">0</string> <string name="_1">1</string> <string name="_2">2</string> @@ -39,7 +40,7 @@ <string name="_6">6</string> <string name="_7">7</string> <string name="_8">8</string> - <string name="app_drawer_tips">Совет. Начните вводить название приложения, чтобы оно запустилось автоматически.</string> + <string name="app_drawer_tips">Совет: начните вводить название приложения, чтобы запустить его автоматически.</string> <string name="okay">Хорошо</string> <string name="cool">Круто!</string> <string name="auto_show_keyboard">Автопоказ клавиатуры</string> @@ -47,19 +48,28 @@ <string name="status_bar">Показывать строку состояния</string> <string name="rename">Переименовать</string> <string name="show_date_time">Показывать дату и время</string> - <string name="appearance">Появление</string> + <string name="appearance">Оформление</string> <string name="gestures">Жесты</string> <string name="theme_mode">Тема</string> <string name="system_default">Системная</string> <string name="dark">Темная</string> <string name="light">Светлая</string> - <string name="welcome_to_olauncher_settings">На странице «О нас» внизу есть ответы на все ваши вопросы. Не забывайте. :)</string> + <string name="welcome_to_olauncher_settings">Добро пожаловать в настройки! + \n\nПомните, если у вас есть вопросы, на нашей странице «О нас» есть ответ.</string> <string name="rate_us_message">Здравствуйте, вы больше не увидите это сообщение. - \n\nЕсли вам нравится Olauncher, не могли бы вы дать нам 5-звездочный рейтинг? Это помогает нам улучшить наш рейтинг и делает нас счастливыми. Спасибо!</string> - <string name="share_message">Привет, у нас большая просьба! Мы хотим достичь миллиона загрузок до конца 2023 года, и нам нужна ваша помощь. - \n\nНе могли бы вы поделиться Olauncher со своими друзьями, пожалуйста? Это было бы очень полезно. Спасибо!</string> - <string name="keyboard_message">Привет, клавиатура — это самый быстрый способ найти и запустить приложения в Olauncher. Можем ли мы попросить вас оставить это включенным еще на несколько дней, а затем принять решение? + \n\nЕсли вам нравится Olauncher, не могли бы вы поставить нам 5 звезд? Это поможет улучшить наш рейтинг и сделает нас счастливыми. Спасибо!</string> + <string name="share_message">Привет, нам нужна ваша помощь! В прошлом году мы преодолели миллион загрузок. В этом году мы хотим достичь еще миллиона, но мы не можем сделать это в одиночку. + \n\nНе могли бы вы поделиться Olauncher со своими друзьями, пожалуйста? Спасибо, хорошего дня!</string> + <string name="keyboard_message">Привет, клавиатура — это самый быстрый способ найти и запустить приложения в Olauncher. Могли бы вы продолжить использовать Автопоказ клавиатуры еще несколько дней, прежде чем принять окончательное решение? \n\nВыбор всегда за вами.</string> + <string name="digital_wellbeing_message">Если вы хотите установить ограничения по времени для определенных приложений, функция «Цифровое благополучие» Android может помочь вам в этом. + \n\nНайдите параметр «Цифровое благополучие» в настройках телефона и включите его.</string> + <string name="app_usage_message">Чтобы показать/скрыть время экрана на домашнем экране, разрешите или запретите разрешение на использование приложения. + \n\nПримечание: Не собираются данные об использовании приложения. Все обрабатывается на вашем устройстве.</string> + <string name="pro_message">У Olauncher также есть профессиональная версия под названием Pro Launcher. Она имеет дополнительные функции, такие как погода, виджеты, шрифты, папки, обои AMOLED и так далее. + \n\nЭто также лучший способ поддержать разработчиков Olauncher. Ознакомьтесь!</string> + <string name="wallpaper_message">Olauncher предлагает красивые новые обои каждый день. Обновите свой главный экран каждый день, бесплатно! + \n\nХотите попробовать?</string> <string name="accessibility_service_description">" Разрешение на доступ требуется, чтобы включить двойное касание для блокировки. Любые данные, полученные Olauncher через этот сервис, не покинут ваше устройство."</string> <string name="support_olauncher_for_free">Поддержите Olauncher бесплатно, используя нашу партнерскую ссылку Amazon.</string> <string name="support_olauncher_message">Каждый раз, когда вы покупаете что-то по нашей ссылке, мы получаем небольшую комиссию. Пожалуйста, сохраните ссылку и используйте ее при совершении покупок в Интернете.\nСпасибо!</string> @@ -78,7 +88,7 @@ <string name="please_set_olauncher_as_default_first">Сначала установите Olauncher в качестве лаунчера по умолчанию.</string> <string name="affiliate">Партнер</string> <string name="tip_start_typing_for_rename">Совет: начните вводить текст чтобы ПЕРЕИМЕНОВАТЬ приложение.</string> - <string name="hidden_apps_message">Примечание. Нажмите «Olauncher» в верхней части страницы настроек, чтобы найти скрытые приложения. + <string name="hidden_apps_message">Примечание: для доступа к скрытым приложениям, нажмите «Olauncher» в верхней части страницы настроек. \n\nБолее подробная информация доступна на нашей странице «О нас» ниже.</string> <string name="swipe_down_for">Проведите вниз для</string> <string name="search">Поиск</string> @@ -101,7 +111,7 @@ <string name="long_press_to_select_app">Длительное нажатие для выбора приложения</string> <string name="unable_to_open_app">Не удалось открыть информацию о приложении</string> <string name="copied">Скопировано</string> - <string name="system_app_cannot_delete">Не могу удалить системное приложение</string> + <string name="system_app_cannot_delete">Невозможно удалить системное приложение</string> <string name="type_a_new_app_name_first">Сначала введите новое имя приложения</string> <string name="app_not_found">Приложение не найдено</string> <string name="unable_to_launch_app">Не удается запустить приложение</string> @@ -114,9 +124,18 @@ <string name="olauncher_is_not_default_launcher">Olauncher не является лаунчером по умолчанию.\nЕжедневное обновление обоев может завершиться ошибкой.</string> <string name="long_press_to_enable">Нажмите и удерживайте, чтобы включить</string> <string name="no_hidden_apps">Нет скрытых приложений</string> - <string name="hidden_apps">Скрытых приложений</string> + <string name="hidden_apps">Скрытые приложения</string> <string name="adapter_show">Показать</string> <string name="adapter_hide">Скрыть</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Вы используете свой телефон, или ваш телефон использует вас?</string> <string name="about_olauncher">О нас Olauncher</string> + <string name="screen_time">Время на экране</string> + <string name="learn_more">Узнать больше</string> + <string name="did_you_know">Вы знали?</string> + <string name="leave_a_review">Оставить отзыв</string> + <string name="review_message">Olauncher есть и всегда будет полностью бесплатным. В нем нет рекламы. Он не собирает никаких данных. Самое главное, это помогает вам сократить время, проводимое перед экраном, и вести более здоровую цифровую жизнь. + \n\nМы считаем, что переход на минимальный лаунчер — отличное решение. Хотя мы явно предвзяты, мы надеемся, что вам понравится этот опыт. Не стесняйтесь поделиться с нами своим мнением!</string> + <string name="alignment_changed">Выравнивание изменено ✅</string> + <string name="home_screen">Главный экран</string> + <string name="hey">Привет</string> <!-- Russian --> </resources> diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 196e5e7..92a8a61 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,21 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> <resources> - <string name="app_name" translatable="false">Olauncher</string> - <string name="github" translatable="false">Github</string> - <string name="lock_layout_description" translatable="false">lock layout description to be used a unique id to lock screen</string> - <string name="day_battery" formatted="false" translatable="false">%s, %d%%</string> - <string name="tag_0" translatable="false">0</string> - <string name="tag_1" translatable="false">1</string> - <string name="tag_2" translatable="false">2</string> - <string name="tag_3" translatable="false">3</string> - <string name="tag_4" translatable="false">4</string> - <string name="tag_5" translatable="false">5</string> - <string name="tag_6" translatable="false">6</string> - <string name="tag_7" translatable="false">7</string> - <string name="tag_8" translatable="false">8</string> - <string name="app">App</string> <string name="set_as_default_launcher">Ange som förvald startskärmsapp</string> - <string name="set_as_default_launcher_first">Ange som förvald startskärmsapp</string> + <string name="set_as_default_launcher_u"><u>Ange som förvald startskärmsapp</u></string> + <string name="set_as_default_launcher_first">Ange Olauncher som förvald först</string> <string name="app_text_color">Textfärg</string> <string name="double_tap_to_lock_screen">Dubbeltryck för att låsa</string> <string name="admin_permission_message">Olauncher lovar att använda skärmlåsningsbehörigheten ansvarsfullt. Olauncher varken samlar in eller delar några data.</string> @@ -27,9 +15,9 @@ <string name="change_default_launcher">Ändra förvald startskärmsapp</string> <string name="privacy">Integritet</string> <string name="share">Dela</string> - <string name="share_now">Dela</string> + <string name="share_now">Dela nu</string> <string name="rate">Betygsätt</string> - <string name="rate_now">Betygsätt</string> + <string name="rate_now">Betygsätt nu</string> <string name="follow">Följ</string> <string name="email">E-post</string> <string name="donate">Donera</string> @@ -56,7 +44,7 @@ <string name="cool">Coolt!</string> <string name="auto_show_keyboard">Visa tangentbord automatiskt</string> <string name="hide">Dölj</string> - <string name="status_bar">Visa statusfält</string> + <string name="status_bar">Statusfält överst</string> <string name="rename">Byt namn</string> <string name="show_date_time">Visa datum och tid</string> <string name="appearance">Utseende</string> @@ -65,14 +53,22 @@ <string name="system_default">System</string> <string name="dark">Mörkt</string> <string name="light">Ljust</string> - <string name="welcome_to_olauncher_settings">Vår Om-sida längst ner har svar på alla dina frågor. Glöm inte det. :) - \n\nTack.</string> + <string name="welcome_to_olauncher_settings">Välkommen till inställningarna! + \n\nKom ihåg, om du har några frågor har vår sida Om oss svaret.</string> <string name="rate_us_message">Hejsan, du kommer inte att se detta meddelande igen. - \n\nOm du gillar Olauncher, kan du vänligen ge oss ett 5-stjärnigt betyg? Det hjälper oss att förbättra vår rankning och gör oss glada. Tack!</string> - <string name="share_message">Hej, vi har en stor förfrågan! Vi vill nå en miljon nedladdningar innan 2023 tar slut, och vi behöver din hjälp. - \n\nKan du dela Olauncher med dina vänner, snälla du? Det skulle verkligen vara till hjälp. Tack!</string> + \n\nOm du tycker att Olauncher är användbar, skulle du vänligen kunna lämna en 5-stjärnig recension? Det skulle göra oss väldigt glada. Tack!</string> + <string name="share_message">Vi behöver din hjälp! Förra året passerade vi en miljon nedladdningar. I år vill vi nå en miljon till, men vi kan inte göra det på egen hand. + \n\nKan du dela Olauncher med dina vänner? Olauncher behöver människor, och människor behöver Olauncher.</string> <string name="keyboard_message">Hejsan, tangentbordet är det snabbaste sättet att hitta och starta appar i Olauncher. Får vi be dig att behålla denna På i några dagar till innan du bestämmer dig? \n\nValet är alltid ditt.</string> + <string name="digital_wellbeing_message">Om du vill ställa in tidsgränser för vissa appar, kan Digitalt välmående-funktionen i Android hjälpa dig att göra det. + \n\nVänligen sök efter Digitalt välmående i dina telefoninställningar och aktivera den.</string> + <string name="app_usage_message">För att visa/dölja din skärmtid på startsidan, vänligen tillåt eller neka appanvändningsbehörigheten. + \n\nObs: Inga data om appanvändning samlas in. Allt bearbetas på din enhet.</string> + <string name="pro_message">Olauncher har också en pro-version som kallas Pro Launcher. Den har extra funktioner som väder, widgets, typsnitt, mappar, AMOLED-bakgrunder och så vidare. + \n\nDet är också det bästa sättet att stödja utvecklarna av Olauncher. Kolla in det!</string> + <string name="wallpaper_message">Olauncher erbjuder vackra nya bakgrundsbilder varje dag. Ge din hemskärm ett fräscht utseende varje dag, gratis! + \n\nVill du prova?</string> <string name="accessibility_service_description">Tillgänglighetsbehörigheten krävs för att aktivera dubbeltryck för att låsa. Eventuella data förvärvade av Olauncher genom denna tjänst kommer inte att lämna din enhet.</string> <string name="support_olauncher_for_free">Stöd Olauncher utan kostnad genom att använda vår Amazon-affiliatelänk.</string> <string name="support_olauncher_message">Varje gång du köper något via vår länk får vi en liten provision. Vänligen spara länken och använd den när du handlar på nätet.\nTack!</string> @@ -82,13 +78,13 @@ <string name="not_now">Inte nu</string> <string name="public_roadmap">Olaunchers offentliga färdplan</string> <string name="instagram">Instagram</string> - <string name="twitter">Twitter</string> + <string name="twitter">Utvecklare</string> <string name="roadmap">Färdplan</string> <string name="date">Datum</string> <string name="date_only">Endast datum</string> <string name="bottom_on">Botten: På</string> <string name="bottom_off">Botten: Av</string> - <string name="please_set_olauncher_as_default_first">Vänligen ange Olauncher som din förvalda startskärmsapp först</string> + <string name="please_set_olauncher_as_default_first">Vänligen ange Olauncher som förvald först</string> <string name="affiliate">Affiliate</string> <string name="tip_start_typing_for_rename">Tips: Börja skriv för BYT NAMN-alternativ för appen</string> <string name="hidden_apps_message">Observera: Tryck på \'Olauncher\' högst upp på denna Inställningar-sida för att hitta dina dolda appar.\n\nMer information finns på vår Om-sida nedan.</string> @@ -96,7 +92,7 @@ <string name="search">Sök</string> <string name="notifications">Aviseringar</string> <string name="accessibility_disclosure">Vänligen sätt på eller stäng av Olaunchers tillgänglighetstjänst i din enhets inställningar för att aktivera eller inaktivera denna funktion. - \n\nVänligen observera att denna tjänst endast används för att låta dig stänga av skärmen på din enhet genom dubbeltrycksgesten. Vår tillgänglighetstjänst varken samlar in eller delar några data.</string> + \n\nVänligen observera att denna tjänst endast används för att låta dig stänga av skärmen på din enhet genom dubbeltrycksgesten. Vår tillgänglighetstjänst varken samlar in eller delar några data.</string> <string name="accept">Godkänn</string> <string name="permission">Behörighet</string> <string name="double_tap_lock">Dubbeltryck för att låsa</string> @@ -123,7 +119,7 @@ <string name="swipe_left_app_disabled">Vänstersvepsapp inaktiverad</string> <string name="swipe_right_app_disabled">Högersvepsapp inaktiverad</string> <string name="your_wallpaper_will_update_shortly">Din bakgrundsbild kommer att uppdateras inom kort</string> - <string name="olauncher_is_not_default_launcher">Olauncher är inte förvald.\nUppdatering av daglig bakgrundsbild kanske misslyckas.</string> + <string name="olauncher_is_not_default_launcher">Olauncher är inte förvald. Uppdatering av bakgrundsbild kommer att misslyckas.</string> <string name="long_press_to_enable">Långtryck för att aktivera</string> <string name="no_hidden_apps">Inga dolda appar</string> <string name="hidden_apps">Dolda appar</string> @@ -131,4 +127,13 @@ <string name="adapter_hide">Dölj</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Använder du din telefon, eller använder din telefon dig?</string> <string name="about_olauncher">Om Olauncher</string> + <string name="screen_time">Skärmtid</string> + <string name="learn_more">Läs mer</string> + <string name="did_you_know">Visste du?</string> + <string name="leave_a_review">Lämna en recension</string> + <string name="review_message">Olauncher är gratis och kommer alltid att vara det. Den har inga annonser. Den samlar inte in någon data. Viktigast av allt, det hjälper dig att minska din skärmtid och leva ett hälsosammare digitalt liv. + \n\nVi tycker att det är ett utmärkt beslut att byta till en minimalistisk startskärmsapp. Även om vi uppenbarligen är partiska, hoppas vi att du gillar upplevelsen. Vi vill gärna höra dina tankar!</string> + <string name="alignment_changed">Justering ändrad ✅</string> + <string name="home_screen">Startskärm</string> + <string name="hey">Hej</string> <!-- Swedish --> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index ca2656e..28d02c5 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">Uygulama</string> <string name="set_as_default_launcher">Varsayılan başlatıcı olarak ayarla</string> + <string name="set_as_default_launcher_u"><u>Varsayılan başlatıcı olarak ayarla</u></string> <string name="set_as_default_launcher_first">Varsayılan başlatıcı olarak ayarla</string> <string name="_0">0</string> <string name="_1">1</string> @@ -12,111 +13,129 @@ <string name="_6">6</string> <string name="_7">7</string> <string name="_8">8</string> - <string name="app_drawer_tips">İpucu: Otomatik olarak başlatmak için bir uygulama adı yazmaya başlayın</string> + <string name="app_drawer_tips">İpucu: Otomatik başlatmak için bir uygulama adı yazın</string> <string name="okay">Tamam</string> - <string name="cool">Serin!</string> - <string name="tip_start_typing_for_rename">İpucu: Uygulama RENAME seçeneği için yazmaya başlayın</string> - <string name="your_wallpaper_will_update_shortly">Duvar kağıdınız kısa süre içinde güncellenecek</string> - <string name="olauncher_is_not_default_launcher">Olauncher, varsayılan başlatıcı değildir. Günlük duvar kağıdı güncellemesi başarısız olabilir.</string> + <string name="cool">Harika!</string> + <string name="tip_start_typing_for_rename">İpucu: Uygulama ismi değiştirmek için yazmaya başlayın</string> + <string name="your_wallpaper_will_update_shortly">Duvar kağıdınız birazdan güncellenecek</string> + <string name="olauncher_is_not_default_launcher">Olauncher varsayılan başlatıcınız değil. Günlük duvar kağıtları hatalı çalışabilir.</string> <string name="long_press_to_enable">Etkinleştirmek için uzun basın</string> <string name="no_hidden_apps">Gizli uygulama yok</string> <string name="hidden_apps">Gizli uygulamalar</string> - <string name="hidden_apps_message">Not: Gizli uygulamalarınızı bulmak için bu ayarlar sayfasının üst kısmındaki \"Olauncher\" seçeneğine dokunun. - \n\nDaha fazla ayrıntı aşağıdaki Hakkında sayfasında mevcuttur.</string> - <string name="swipe_down_for">için aşağı kaydırın</string> - <string name="search">Aramak</string> + <string name="hidden_apps_message">Not: Gizli uygulamalarınızı bulmak için bu ayarlar sayfasının üst kısmındaki \"Olauncher\" yazısına dokunun. + \n\nDaha fazla ayrıntı "Hakkında" sayfasında mevcuttur.</string> + <string name="swipe_down_for">Aşağı kaydır:</string> + <string name="search">Ara</string> <string name="notifications">Bildirimler</string> <string name="accessibility_disclosure">Bu özelliği etkinleştirmek veya devre dışı bırakmak için lütfen cihazınızın ayarlarında Olauncher\'ın erişilebilirlik hizmetini açın veya kapatın. - \n\nLütfen bu hizmetin yalnızca cihazınızın ekranını çift dokunma hareketini kullanarak kapatmanıza izin vermek için kullanıldığını unutmayın. Erişilebilirlik hizmetimiz herhangi bir veri toplamaz veya paylaşmaz.</string> - <string name="accept">Kabul etmek</string> + \n\nLütfen bu hizmetin yalnızca ekranı çift dokunma hareketini kullanarak kapatmanıza izin vermek için kullanıldığını unutmayın. Erişilebilirlik hizmetimiz herhangi bir veri toplamaz veya paylaşmaz.</string> + <string name="accept">Kabul et</string> <string name="permission">İzin</string> <string name="double_tap_lock">Kilitlemek için iki kez dokunun</string> - <string name="enable">Olanak vermek</string> - <string name="disable">Devre dışı bırakmak</string> - <string name="not_working"><u>Çalışmıyor musunuz?</u></string> + <string name="enable">Etkinleştir</string> + <string name="disable">Devre dışı bırak</string> + <string name="not_working"><u>Çalışmıyor mu?</u></string> <string name="info">Bilgi</string> - <string name="delete">Silmek</string> + <string name="delete">Sil</string> <string name="text_size">Yazı Boyutu</string> - <string name="enabled">Etkinleştirilmiş</string> - <string name="disabled">Engelli</string> + <string name="enabled">Etkin</string> + <string name="disabled">Devre Dışı</string> <string name="please_turn_on_double_tap_to_unlock">Lütfen kilitlemek için çift dokunmayı açın</string> <string name="launcher_failed_to_lock_device">Olauncher cihazı kilitleyemedi. Lütfen uygulama ayarlarınızı kontrol edin.</string> <string name="long_press_to_select_app">Uygulamayı seçmek için uzun basın</string> <string name="unable_to_open_app">Uygulama bilgisi açılamıyor</string> - <string name="copied">kopyalandı</string> + <string name="copied">Kopyalandı</string> <string name="system_app_cannot_delete">Sistem uygulaması, silinemez</string> <string name="type_a_new_app_name_first">Önce yeni bir uygulama adı yazın</string> - <string name="adapter_show">Göstermek</string> - <string name="adapter_hide">Saklamak</string> - <string name="app_text_color">metin rengi</string> - <string name="double_tap_to_lock_screen">Kilitlemek için iki kez dokunun</string> - <string name="admin_permission_message">Olauncher, kilit ekranı iznini sorumlu bir şekilde kullanmayı vaat ediyor. Olauncher herhangi bir veri toplamaz veya paylaşmaz.</string> + <string name="adapter_show">Göster</string> + <string name="adapter_hide">Gizle</string> + <string name="app_text_color">Metin rengi</string> + <string name="double_tap_to_lock_screen">Kilitlemek için çift dokunun</string> + <string name="admin_permission_message">Olauncher, kilit ekranı iznini sorumlu bir şekilde kullanacaktır. Olauncher herhangi bir veri toplamaz veya paylaşmaz.</string> <string name="about">Hakkında</string> <string name="off">Kapalı</string> <string name="on">Açık</string> <string name="black">Siyah</string> <string name="white">Beyaz</string> <string name="change_default_launcher">Varsayılan başlatıcıyı değiştir</string> - <string name="privacy">Mahremiyet</string> - <string name="share">Paylaşmak</string> - <string name="share_now">Paylaşmak</string> - <string name="rate">Oran</string> - <string name="rate_now">Oran</string> - <string name="follow">Takip etmek</string> + <string name="privacy">Gizlilik</string> + <string name="share">Paylaş</string> + <string name="share_now">Şimdi paylaş</string> + <string name="rate">Değerlendir</string> + <string name="rate_now">Şimdi değerlendir</string> + <string name="follow">Takip et</string> <string name="email">E-posta</string> - <string name="donate">Bağış yapmak</string> + <string name="donate">Bağış yap</string> <string name="swipe_up_for_apps">1. Tüm uygulamalar için yukarı kaydırın\n2. Ayarlar için herhangi bir yere uzun basın</string> - <string name="apps_on_home_screen">Ana ekrandaki uygulamalar</string> - <string name="daily_wallpaper_update">Günlük yeni duvar kağıdı</string> + <string name="apps_on_home_screen">Ana ekran uygulamaları</string> + <string name="daily_wallpaper_update">Günlük duvar kağıtları</string> <string name="left">Sol</string> <string name="right">Sağ</string> - <string name="center">merkez</string> + <string name="center">Merkez</string> <string name="home_layout_alignment">Uygulama hizalaması</string> - <string name="swipe_left_app">Uygulamayı sola kaydırın</string> - <string name="swipe_right_app">Uygulamayı sağa kaydırın</string> + <string name="swipe_left_app">Sola kaydırma uygulaması</string> + <string name="swipe_right_app">Sağa kaydırma uygulaması</string> <string name="auto_show_keyboard">Klavyeyi otomatik göster</string> - <string name="hide">Saklamak</string> + <string name="hide">Sakla</string> <string name="status_bar">Durum çubuğunu göster</string> - <string name="rename">Yeniden isimlendirmek</string> - <string name="show_date_time">Tarih saatini göster</string> - <string name="appearance">Dış görünüş</string> - <string name="gestures">Mimik</string> + <string name="rename">Yeniden isimlendir</string> + <string name="show_date_time">Tarih ve saati göster</string> + <string name="appearance">Görünüm</string> + <string name="gestures">Hareket</string> <string name="theme_mode">Tema modu</string> - <string name="system_default">sistem</string> - <string name="dark">Karanlık</string> - <string name="light">Işık</string> - <string name="welcome_to_olauncher_settings">Alt kısımdaki Hakkında sayfamızda tüm sorularınızın yanıtları bulunmaktadır. unutma :)\n\nTeşekkür ederim.</string> + <string name="system_default">Sistem</string> + <string name="dark">Koyu</string> + <string name="light">Açık</string> + <string name="welcome_to_olauncher_settings">Ayarlar sayfasına hoş geldiniz! + \n\nUnutmayın, herhangi bir sorunuz olursa "Hakkında" sayfamıza danışabilirsiniz.</string> <string name="rate_us_message">Merhaba, bu mesajı bir daha görmeyeceksiniz. - \n\nOlauncher\'ı beğendiyseniz, lütfen bize 5 yıldız verebilir misiniz? Sıralamamızı yükseltmemize yardımcı oluyor ve bizi mutlu ediyor. Teşekkür ederim!</string> - <string name="share_message">Merhaba, büyük bir isteğimiz var! 2023 bitmeden bir milyon indirmeye ulaşmak istiyoruz ve yardımınıza ihtiyacımız var. - \n\nOlauncher\'ı arkadaşlarınızla paylaşır mısınız lütfen? Bu gerçekten yardımcı olacaktır. Teşekkür ederim!</string> - <string name="keyboard_message">Merhaba, klavye, Olauncher\'da uygulamaları bulmanın ve başlatmanın en hızlı yoludur. Bunu birkaç gün daha Açık tutmanızı ve sonra karar vermenizi rica edebilir miyiz? - \n\nSeçim her zaman senindir.</string> + \n\nOlauncher\'ı beğendiyseniz bize tam puan verir misiniz? Sıralamamızı yükseltmemize yardımcı oluyor ve bizi neşelendiriyor. Teşekkür ederiz!</string> + <string name="share_message">Merhaba, yardımınıza ihtiyacımız var! Geçen yıl bir milyon indirmeyi geçtik. Bu yıl bir milyona daha ulaşmak istiyoruz ama bunu tek başımıza yapamayız. + \n\nOlauncher\'ı arkadaşlarınızla paylaşma nezaketini gösterir misiniz lütfen? Teşekkür eder, harika bir gün geçirmenizi dileriz!</string> + <string name="keyboard_message">Merhaba, klavye, Olauncher\'da uygulamaları bulmanın ve başlatmanın en hızlı yoludur. Birkaç gün daha kullanıp karar vermenizi rica ederiz. + \n\nSeçim her zaman sizindir.</string> + <string name="digital_wellbeing_message">Belirli uygulamalar için zaman sınırları belirlemek istiyorsanız Android\'in Dijital Denge özelliği bunu yapmanıza yardımcı olacaktır. + \n\nLütfen telefon ayarlarınızda Dijital Denge\'yi arayın ve etkinleştirin.</string> + <string name="app_usage_message">Ana ekranınızda ekran sürenizi göstermek/gizlemek için lütfen uygulama kullanım iznini onaylayın veya reddedin. + \n\nNot: Uygulama kullanım verileri toplanmaz. Her şey cihazınızda işlenir.</string> + <string name="pro_message">Olauncher\'ın Pro Launcher adında bir pro versiyonu da var. Hava durumu, widget\'lar, yazı tipleri, klasörler, AMOLED duvar kağıtları gibi ekstra özelliklere sahip. + \n\nAyrıca Olauncher geliştiricilerini desteklemenin en iyi yoludur. Mutlaka inceleyin!</string> + <string name="wallpaper_message">Olauncher, ana ekranınıza taze bir görünüm kazandırmak için her gün yeni duvar kağıtları sunuyor. Hem de ücretsiz! + \n\nDenemek ister misiniz?</string> <string name="accessibility_service_description">Kilitlemek için çift dokunmayı etkinleştirmek için erişilebilirlik izni gereklidir. Olauncher tarafından bu hizmet aracılığıyla elde edilen hiçbir veri cihazınızdan ayrılmayacaktır.</string> <string name="support_olauncher_for_free">Amazon ortaklık bağlantımızı kullanarak Olauncher\'ı ücretsiz olarak destekleyin.</string> - <string name="support_olauncher_message">Bağlantımızı kullanarak her bir şey satın aldığınızda, küçük bir komisyon alırız. Lütfen bağlantıyı kaydedin ve çevrimiçi alışveriş yaptığınızda kullanın. Teşekkür ederim!</string> + <string name="support_olauncher_message">Bağlantımızı kullanarak her bir şey satın aldığınızda, küçük bir komisyon alırız. Lütfen bağlantıyı kaydedin ve çevrimiçi alışveriş yaptığınızda kullanın. Teşekkür ederiz!</string> <string name="open">Linki aç</string> - <string name="copy">kopyala</string> - <string name="close">Kapalı</string> + <string name="copy">Kopyala</string> + <string name="close">Kapat</string> <string name="not_now">Şimdi değil</string> - <string name="public_roadmap">Olauncher genel yol haritası</string> + <string name="public_roadmap">Olauncher Yol Çizelgesi</string> <string name="instagram">Instagram</string> <string name="twitter">Twitter</string> - <string name="roadmap">yol haritası</string> + <string name="roadmap">Yol Çizelgesi</string> <string name="date">Tarih</string> - <string name="date_only">Yalnızca tarih</string> + <string name="date_only">Sadece tarih</string> <string name="bottom_on">Alt: Açık</string> <string name="bottom_off">Alt: Kapalı</string> <string name="please_set_olauncher_as_default_first">Lütfen önce Olauncher\'ı varsayılan başlatıcınız olarak ayarlayın</string> - <string name="affiliate">ortak</string> + <string name="affiliate">Ortak</string> <string name="app_not_found">Uygulama bulunamadı</string> - <string name="unable_to_launch_app">Uygulama başlatılamıyor</string> - <string name="search_for_Launcher_or_home_app">Başlatıcı veya Ev uygulamasını arayın</string> - <string name="swipe_left_app_enabled">Sola kaydır uygulaması etkin</string> + <string name="unable_to_launch_app">Uygulama başlatılamadı</string> + <string name="search_for_Launcher_or_home_app">Başlatıcı veya Ana Menü uygulamasını arayın</string> + <string name="swipe_left_app_enabled">Sola kaydırma uygulaması etkin</string> <string name="swipe_right_app_enabled">Sağa kaydırma uygulaması etkin</string> - <string name="swipe_left_app_disabled">Sola kaydırma uygulaması devre dışı bırakıldı</string> - <string name="swipe_right_app_disabled">Sağa kaydırma uygulaması devre dışı bırakıldı</string> + <string name="swipe_left_app_disabled">Sola kaydırma uygulaması devre dışı</string> + <string name="swipe_right_app_disabled">Sağa kaydırma uygulaması devre dışı</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Sen mi telefonunu, kullanıyorsun yoksa telefon mu seni kullanıyor?</string> - <string name="about_olauncher">Hakkında Olauncher</string> -</resources>
\ No newline at end of file + <string name="about_olauncher">Olauncher Hakkında</string> + <string name="learn_more">Daha fazla bilgi</string> + <string name="screen_time">Ekran süresi</string> + <string name="did_you_know">Biliyor muydunuz?</string> + <string name="leave_a_review">Değerlendirme bırakın</string> + <string name="review_message">Olauncher tamamen ücretsizdir ve her zaman ücretsiz olacaktır. Reklam yok, veri toplamaz ve en önemlisi ekran sürenizi azaltmanıza ve daha sağlıklı bir dijital yaşam sürmenize yardımcı olur. + \n\nUmarım hoşunuza gider. Düşüncelerinizi mutlaka bizimle paylaşın!</string> + <string name="alignment_changed">Hizalama değiştirildi ✅</string> + <string name="home_screen">Ana ekran</string> + <string name="hey">Merhaba</string> <!-- Turkish --> +</resources> diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4a58bcd..be05fb1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">Додаток</string> <string name="set_as_default_launcher">Зробити лаунчером за замовчування</string> + <string name="set_as_default_launcher_u"><u>Зробити лаунчером за замовчування</u></string> <string name="set_as_default_launcher_first">Зробити лаунчером за замовчування</string> <string name="app_text_color">Кольор тексту</string> <string name="double_tap_to_lock_screen">Блокування подвійним тапом</string> @@ -53,13 +54,22 @@ <string name="system_default">Системна</string> <string name="dark">Темна</string> <string name="light">Світла</string> - <string name="welcome_to_olauncher_settings">На сторінці «Про нас» є відповіді на всі ваші запитання. Не забувайте. :)</string> + <string name="welcome_to_olauncher_settings">Ласкаво просимо до налаштувань! + \n\nПам\'ятайте, якщо у вас є питання, на нашій сторінці «Про нас» є відповідь.</string> <string name="rate_us_message">Привіт, ти більше не побачиш це повідомлення. \n\nЯкщо вам подобається Olauncher, чи можете ви поставити нам 5 зірок? Це допомагає нам покращити наш рейтинг і робить нас щасливими. Дякую тобі!</string> - <string name="share_message">Привіт, у нас велике прохання! Ми хочемо досягти мільйона завантажень до кінця 2023 року, і нам потрібна ваша допомога. - \n\nНе могли б ви поділитися Olauncher зі своїми друзями? Це було б справді корисно. Дякую тобі!</string> + <string name="share_message">Привіт, нам потрібна ваша допомога! Минулого року ми перевищили мільйон завантажень. Цього року ми хочемо досягти мільйона більше, але ми не можемо зробити це поодинці. + \n\nБудь ласка, не могли б ви поділитися Olauncher зі своїми друзями? Дякую і гарного дня!</string> <string name="keyboard_message">Привіт, клавіатура - це найшвидший спосіб знайти та запустити програми в Olauncher. Чи можемо ми попросити вас залишити це увімкненим ще на кілька днів, а потім прийняти рішення? \n\nВибір завжди за вами.</string> + <string name="digital_wellbeing_message">Якщо ви хочете встановити часові обмеження для певних програм, функція цифрового добробуту Android може допомогти вам це зробити. + \n\nЗнайдіть Digital Wellbeing у налаштуваннях телефону та ввімкніть його.</string> + <string name="app_usage_message">Щоб показати/ховати час роботи з екраном на головному екрані, будь ласка, дозвольте або забороніть дозвіл на використання програми. + \n\nПримітка: Не збираються дані про використання програми. Все обробляється на вашому пристрої.</string> + <string name="pro_message">Olauncher також має професійну версію під назвою Pro Launcher. Вона має додаткові функції, такі як погода, віджети, шрифти, папки, фони AMOLED тощо. + \n\nЦе також найкращий спосіб підтримати розробників Olauncher. Ознайомтеся!</string> + <string name="wallpaper_message">Olauncher пропонує красиві нові шпалери щодня. Дайте вашому головному екрану новий вигляд кожного дня, безкоштовно! + \n\nХочете спробувати?</string> <string name="accessibility_service_description">" Дозвіл на доступ потрібний, щоб увімкнути подвійне торкання для блокування. Будь-які дані, отримані Olauncher через цей сервіс, не залишать ваш пристрій."</string> <string name="support_olauncher_for_free">Підтримайте Olauncher безкоштовно, використовуючи наше партнерське посилання Amazon.</string> <string name="support_olauncher_message">Щоразу, коли ви купуєте щось за нашим посиланням, ми отримуємо невелику комісію. Будь ласка, збережіть посилання та використовуйте його для здійснення покупок в Інтернеті.\nСпасибі!</string> @@ -119,4 +129,13 @@ <string name="adapter_hide">Приховати</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Ви користуєтеся своїм телефоном, чи ваш телефон використовує вас?</string> <string name="about_olauncher">Про нас Olauncher</string> + <string name="learn_more">Вивчайте більше</string> + <string name="screen_time">Час екрану</string> + <string name="did_you_know">Ти знав?</string> + <string name="leave_a_review">Залиште відгук</string> + <string name="review_message">Olauncher є і завжди буде абсолютно безкоштовним. У ньому немає реклами. Він не збирає дані. Найважливіше те, що це допомагає вам скоротити час використання екрана та жити здоровішим цифровим життям. + \n\nМи вважаємо, що перехід на мінімальний лаунчер є відмінним рішенням. Хоча ми явно упереджені, ми сподіваємося, що вам сподобається. Не соромтеся поділитися з нами своїми думками!</string> + <string name="alignment_changed">Вирівнювання змінено ✅</string> + <string name="home_screen">Головний екран</string> + <string name="hey">Привіт</string> <!-- Ukrainian --> </resources> diff --git a/app/src/main/res/values-xhdpi/dimens.xml b/app/src/main/res/values-xhdpi/dimens.xml index 23c4667..1745fdd 100644 --- a/app/src/main/res/values-xhdpi/dimens.xml +++ b/app/src/main/res/values-xhdpi/dimens.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">24sp</dimen> + <dimen name="text_large">28sp</dimen> <dimen name="text_small">16sp</dimen> <dimen name="app_padding_vertical">12dp</dimen> <dimen name="home_app_padding_vertical">10dp</dimen> - <dimen name="time_size">50sp</dimen> + <dimen name="time_size">60sp</dimen> <dimen name="date_size">16sp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-xxhdpi/dimens.xml b/app/src/main/res/values-xxhdpi/dimens.xml index ed3904f..7599018 100644 --- a/app/src/main/res/values-xxhdpi/dimens.xml +++ b/app/src/main/res/values-xxhdpi/dimens.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">26sp</dimen> - <dimen name="text_small">16sp</dimen> + <dimen name="text_large">30sp</dimen> + <dimen name="text_small">18sp</dimen> <dimen name="app_padding_vertical">12dp</dimen> <dimen name="home_app_padding_vertical">10dp</dimen> - <dimen name="time_size">60sp</dimen> + <dimen name="time_size">66sp</dimen> <dimen name="date_size">18sp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-xxxhdpi/dimens.xml b/app/src/main/res/values-xxxhdpi/dimens.xml index c48f5a5..d731dc2 100644 --- a/app/src/main/res/values-xxxhdpi/dimens.xml +++ b/app/src/main/res/values-xxxhdpi/dimens.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <dimen name="text_large">28sp</dimen> - <dimen name="text_small">16sp</dimen> + <dimen name="text_large">32sp</dimen> + <dimen name="text_small">18sp</dimen> <dimen name="app_padding_vertical">16dp</dimen> <dimen name="home_app_padding_vertical">14dp</dimen> - <dimen name="time_size">64sp</dimen> + <dimen name="time_size">66sp</dimen> <dimen name="date_size">18sp</dimen> </resources> diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 821409c..b1daf05 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app">应用程序</string> <string name="set_as_default_launcher">设置为默认启动器</string> + <string name="set_as_default_launcher_u"><u>设置为默认启动器</u></string> <string name="set_as_default_launcher_first">设置为默认启动器</string> <string name="app_drawer_tips">提示:输入应用程序名称以查找并启动它</string> <string name="okay">好的</string> @@ -86,14 +87,23 @@ <string name="system_default">系统</string> <string name="dark">黑暗</string> <string name="light">光</string> - <string name="welcome_to_olauncher_settings">我们底部的“关于”页面可以解答您的所有问题。别忘了。 :)\n\n谢谢。</string> + <string name="welcome_to_olauncher_settings">欢迎来到设置! + \n\n请记住,如果您有任何问题,我们的“关于”页面有答案。</string> <string name="rate_us_message">您好,您不会再看到此消息。 \n\n如果您喜欢 Olauncher,能给我们一个 5 星评价吗? 它帮助我们提高排名并使我们高兴。 谢谢你!</string> - <string name="share_message">你好,我们有一个很大的要求! 我们希望在 2023 年底之前达到 100 万下载量,我们需要您的帮助。 - \n\n您能与您的朋友分享 Olauncher 吗? 这真的很有帮助。 谢谢你!</string> + <string name="share_message">你好,我们需要你的帮助!去年我们的下载量突破了一百万次。今年我们希望再增加一百万,但我们无法单独做到这一点。 + \n\n您能与您的朋友分享 Olauncher 吗?谢谢您,祝您有美好的一天!</string> <string name="keyboard_message">您好,键盘是在 Olauncher 中查找和启动应用程序的最快方式。我们可以要求您再保留几天? \n\n然后再决定吗?选择权永远在你手中。</string> - <string name="accessibility_service_description">需要辅助功能权限才能启用双击锁定。 Olauncher 通过此服务获取的任何数据都不会离开您的设备。</string> + <string name="digital_wellbeing_message">如果您想为某些应用程序设置时间限制,Android 的数字健康功能可以帮助您做到这一点。 + \n\n请在手机设置中搜索数字健康并启用它。</string> + <string name="app_usage_message">要在主屏幕上显示/隐藏您的屏幕时间,请允许或拒绝应用程序使用权限。 + \n\n注意:不收集应用程序使用数据。所有数据都在您的设备上处理。</string> + <string name="pro_message">Olauncher 还有一个名为 Pro Launcher 的专业版。它具有额外的功能,如天气、部件、字体、文件夹、AMOLED 壁纸等。 + \n\n这也是支持 Olauncher 开发者的最佳方式。快来看看吧!</string> + <string name="wallpaper_message">Olauncher每天提供美丽的新壁纸。让你的主屏幕每天焕然一新,免费! + \n\n想试试吗?</string> + <string name="accessibility_service_description">请在手机设置中搜索数字健康并启用它。</string> <string name="support_olauncher_for_free">使用我们的亚马逊附属链接免费支持 Olauncher。</string> <string name="support_olauncher_message">每次您使用我们的链接购买商品时,我们都会获得少量佣金。请保存链接并在网上购物时使用它。 谢谢!</string> <string name="open">打开链接</string> @@ -119,4 +129,13 @@ <string name="swipe_right_app_disabled">向右滑动应用程序已禁用</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">是你在用手机,还是手机在用你?</string> <string name="about_olauncher">关于 Olauncher</string> + <string name="learn_more">了解更多</string> + <string name="screen_time">屏幕时间</string> + <string name="did_you_know">你可知道?</string> + <string name="leave_a_review">发表评论</string> + <string name="review_message">Olauncher 现在并且永远是完全免费的。它没有广告。它不收集任何数据。最重要的是,它可以帮助您减少屏幕时间并过上更健康的数字生活。 + \n\n我们相信切换到最小启动器是一个很好的决定。虽然我们显然有偏见,但我们希望您喜欢这次体验。请随时与我们分享您的想法!</string> + <string name="alignment_changed">对齐已更改 ✅</string> + <string name="home_screen">主屏幕</string> + <string name="hey">嘿</string> <!-- Chinese --> </resources> diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index c5d5899..210ab8a 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="ic_launcher_background">#FFFFFF</color> + <color name="ic_launcher_background">#1A1E1D</color> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d85c4b..876d807 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,8 @@ <string name="app_name" translatable="false">Olauncher</string> <string name="github" translatable="false">Github</string> <string name="lock_layout_description" translatable="false">lock layout description to be used a unique id to lock screen</string> - <string name="olauncher_pro" translatable="false"><u>Olauncher Pro</u></string> + <string name="olauncher_pro" translatable="false">Olauncher Pro</string> + <string name="digital_minimalism" translatable="false"><u>Digital Minimalism</u></string> <string name="day_battery" formatted="false" translatable="false">%s, %d%%</string> <string name="tag_0" translatable="false">0</string> <string name="tag_1" translatable="false">1</string> @@ -13,9 +14,12 @@ <string name="tag_6" translatable="false">6</string> <string name="tag_7" translatable="false">7</string> <string name="tag_8" translatable="false">8</string> + <string name="time_spent_min" translatable="false"><b>%1$sm</b></string> + <string name="time_spent_hour" translatable="false">%1$sh %2$sm</string> <string name="app">App</string> <string name="set_as_default_launcher">Set as default launcher</string> + <string name="set_as_default_launcher_u"><u>Set as default launcher</u></string> <string name="set_as_default_launcher_first">Set Olauncher default first</string> <string name="app_text_color">Text color</string> <string name="double_tap_to_lock_screen">Double tap to lock</string> @@ -66,14 +70,24 @@ <string name="system_default">System</string> <string name="dark">Dark</string> <string name="light">Light</string> - <string name="welcome_to_olauncher_settings">Tip: Our About page has answers to all your questions. Don\'t forget. :) - \n\nThank you.</string> + <string name="welcome_to_olauncher_settings">Welcome to the settings! + \n\nRemember, if you have any questions, our About page has the answer.</string> <string name="rate_us_message">Hi, you won\'t see this message again. - \n\nIf you like Olauncher, could you please give us a 5-star rating? It helps us improve our ranking and makes us very happy. Thank you!</string> - <string name="share_message">Hi, we need your help! We want to hit a million downloads before 2023 ends but we can\'t do it alone. - \n\nWould you be kind enough to share Olauncher with your friends, please? Thank you and have a wonderful day!</string> + \n\nIf you\'re finding Olauncher useful, could you please leave a 5-star review? It\'ll mean the world to us. Thank you!</string> + <string name="share_message">We need your help! We want to tell every Android user about the benefits of Olauncher but we can\'t do it alone. + \n\nCould you please share Olauncher with your friends, family and followers? That\'d be very helpful. Thanks!</string> + <!-- <string name="share_message">Your monthly reminder - you should use your phone, not the other way round. Stay strong. You\'re doing great!--> + <!-- \n\nIf you have a moment to spare, could you please share Olauncher with others? Olauncher needs people. More importantly, people need Olauncher.</string>--> <string name="keyboard_message">Hi, keyboard is the fastest way to find and launch apps in Olauncher. Can we request you to keep this On for a few more days and then decide? \n\nThe choice is always yours.</string> + <string name="digital_wellbeing_message">If you want to set time limits for certain apps, Digital Wellbeing feature of Android can help you do it. + \n\nPlease search for Digital Wellbeing in your phone settings and enable it.</string> + <string name="app_usage_message">To show/hide your screen time on the home screen, please allow or disallow the app usage permission. + \n\nNote: No app usage data is collected. Everything is processed on your device.</string> + <string name="pro_message">Olauncher also has a pro version called Pro Launcher. It has extra features like weather, widgets, fonts, folders, AMOLED wallpapers, and so on. + \n\nIt\'s also the best way to support the developers of Olauncher. Check it out!</string> + <string name="wallpaper_message">Olauncher offers beautiful new wallpapers daily. Give your homescreen a fresh new look every day, for free! + \n\nWant to try it?</string> <string name="accessibility_service_description">The accessibility permission is required to enable double tap to lock. Any data acquired by Olauncher via this service will not leave your device.</string> <string name="support_olauncher_for_free">Support Olauncher for free by using our Amazon affiliate link.</string> <string name="support_olauncher_message">Every time you buy something using our link, we get a small commission. Please save the link and use it whenever you shop online.\nThank you!</string> @@ -92,7 +106,7 @@ <string name="please_set_olauncher_as_default_first">Please set Olauncher as default first</string> <string name="affiliate">Affiliate</string> <string name="tip_start_typing_for_rename">Tip: Start typing for app RENAME option</string> - <string name="hidden_apps_message">Note: Tap on \'Olauncher\' at the top of this Settings page to find your hidden apps.\n\nMore details available in our About page below.</string> + <string name="hidden_apps_message">Note: Tap on \'Olauncher\' at the top of this Settings page to find your hidden apps.\n\nMore details available in our About page.</string> <string name="swipe_down_for">Swipe down for</string> <string name="search">Search</string> <string name="notifications">Notifications</string> @@ -131,5 +145,14 @@ <string name="adapter_show">Show</string> <string name="adapter_hide">Hide</string> <string name="are_you_using_your_phone_or_is_your_phone_using_you">Are you using your phone, or is your phone using you?</string> - <string name="about_olauncher">About Olauncher</string> + <string name="about_olauncher">About and FAQs</string> + <string name="screen_time">Screen time</string> + <string name="learn_more">Learn more</string> + <string name="did_you_know">Did you know?</string> + <string name="leave_a_review">Leave a review</string> + <string name="review_message">Olauncher is free and always will be. It has no ads, collects no data, and reduces your screen time, resulting in a healthier life. + \n\nWe hope you enjoy it. Tell us what you think.</string> + <string name="alignment_changed">Alignment changed ✅</string> + <string name="home_screen">Home screen</string> + <string name="hey">Hey</string> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4393381..a9ca7b0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -51,7 +51,7 @@ </style> <style name="AppSearchText" parent="Widget.AppCompat.SearchView"> - <item name="android:maxLength">50</item> + <item name="android:maxLength">200</item> <item name="android:textSize">@dimen/text_large</item> <item name="android:textColor">?attr/primaryColor</item> <item name="android:editTextColor">?attr/primaryColor</item> @@ -65,9 +65,9 @@ <item name="android:textColor">@drawable/text_colors_default</item> <item name="android:textColorHint">?attr/primaryColorTrans80</item> <item name="android:shadowColor">?attr/primaryTextShadowColor</item> - <item name="android:shadowDx">1</item> - <item name="android:shadowDy">1</item> - <item name="android:shadowRadius">2</item> + <item name="android:shadowDx">0</item> + <item name="android:shadowDy">2</item> + <item name="android:shadowRadius">4</item> </style> <style name="TextLarge" parent="TextDefault"> |
