├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── drawable │ │ │ ├── logo.webp │ │ │ ├── ic_rounded.webp │ │ │ ├── bg_shade_circular.xml │ │ │ ├── ic_check.xml │ │ │ ├── rounded_rect_shade_color.xml │ │ │ ├── rounded_rectangle_dark.xml │ │ │ ├── ic_close.xml │ │ │ ├── ic_delete.xml │ │ │ ├── text_colors_light.xml │ │ │ ├── text_colors_default.xml │ │ │ ├── ic_info.xml │ │ │ ├── rounded_primary_gradient.xml │ │ │ ├── ic_rename.xml │ │ │ └── ic_hide.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── dimens.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── xml │ │ │ ├── policies.xml │ │ │ ├── locales_config.xml │ │ │ ├── backup_rules.xml │ │ │ ├── accessibility_service_config.xml │ │ │ └── data_extraction_rules.xml │ │ ├── anim │ │ │ ├── layout_anim_from_bottom.xml │ │ │ ├── fade_exit.xml │ │ │ ├── fade_enter.xml │ │ │ ├── slide_out_top.xml │ │ │ ├── slide_in_top.xml │ │ │ └── item_anim_from_bottom.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── layout │ │ │ ├── activity_fake_home.xml │ │ │ ├── fragment_app_drawer.xml │ │ │ ├── activity_main.xml │ │ │ ├── adapter_app_drawer.xml │ │ │ └── fragment_home.xml │ │ ├── values-hdpi │ │ │ └── dimens.xml │ │ ├── values-ldpi │ │ │ └── dimens.xml │ │ ├── values-mdpi │ │ │ └── dimens.xml │ │ ├── values-xhdpi │ │ │ └── dimens.xml │ │ ├── values-xxhdpi │ │ │ └── dimens.xml │ │ ├── values-xxxhdpi │ │ │ └── dimens.xml │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ ├── layout-land │ │ │ ├── fragment_app_drawer.xml │ │ │ └── fragment_home.xml │ │ ├── values-night │ │ │ └── styles.xml │ │ ├── values-zh │ │ │ └── strings.xml │ │ ├── values-ja │ │ │ └── strings.xml │ │ ├── values-he │ │ │ └── strings.xml │ │ ├── values-ar │ │ │ └── strings.xml │ │ ├── values-sv │ │ │ └── strings.xml │ │ ├── values-hr │ │ │ └── strings.xml │ │ ├── values-tr │ │ │ └── strings.xml │ │ ├── values-pl │ │ │ └── strings.xml │ │ └── values-uk │ │ │ └── strings.xml │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ └── app │ │ │ └── olauncher │ │ │ ├── data │ │ │ ├── DrawerCharacterModel.kt │ │ │ ├── AppModel.kt │ │ │ └── Constants.kt │ │ │ ├── helper │ │ │ ├── AppFilterHelper.kt │ │ │ ├── FakeHomeActivity.kt │ │ │ ├── AppUsageStats.kt │ │ │ ├── SingleLiveEvent.kt │ │ │ ├── usageStats │ │ │ │ ├── ComponentForegroundStat.kt │ │ │ │ ├── SimpleUsageStat.kt │ │ │ │ └── UnmatchedCloseEventGuardian.kt │ │ │ ├── MyAccessibilityService.kt │ │ │ ├── WallpaperWorker.kt │ │ │ └── Extensions.kt │ │ │ └── listener │ │ │ ├── DeviceAdmin.kt │ │ │ ├── ViewSwipeTouchListener.kt │ │ │ └── OnSwipeTouchListener.kt │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── fastlane └── metadata │ └── android │ ├── de │ └── short_description.txt │ └── en-US │ ├── short_description.txt │ ├── images │ ├── icon.png │ ├── featureGraphic.jpg │ └── phoneScreenshots │ │ ├── 01.jpg │ │ ├── 02.jpg │ │ ├── 03.jpg │ │ ├── 04.jpg │ │ ├── 05.jpg │ │ ├── 06.jpg │ │ └── 07.jpg │ └── full_description.txt ├── .github └── funding.yml ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── libs.versions.toml ├── .gitignore ├── gradle.properties ├── README.md ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "Olauncher" -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Minimalistischer Launcher zur Reduzierung Ihrer Bildschirmzeit -------------------------------------------------------------------------------- /.github/funding.yml: -------------------------------------------------------------------------------- 1 | github: tanujnotes 2 | buy_me_a_coffee: tanujnotes 3 | custom: ["https://www.paypal.me/tanujnotes"] 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/drawable/logo.webp -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Minimalist launcher to reduce your screen time. Daily wallpapers. Zero ads. -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rounded.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/drawable/ic_rounded.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.jpg -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #1A1E1D 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/01.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/02.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/03.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/04.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/05.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/06.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanujnotes/Olauncher/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/07.jpg -------------------------------------------------------------------------------- /app/src/main/res/xml/policies.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/data/DrawerCharacterModel.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.data 2 | 3 | data class DrawerCharacterModel( 4 | val character: String = "", 5 | val inRange: Boolean = false 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/AppFilterHelper.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import app.olauncher.data.AppModel 4 | 5 | interface AppFilterHelper { 6 | fun onAppFiltered(items:List) 7 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shade_circular.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/layout_anim_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jan 04 18:41:02 IST 2023 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 10dp 5 | 320dp 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.jks 3 | .gradle 4 | /local.properties 5 | /.idea/* 6 | /.idea/caches 7 | /.idea/libraries 8 | /.idea/modules.xml 9 | /.idea/workspace.xml 10 | /.idea/navEditor.xml 11 | /.idea/assetWizardSettings.xml 12 | .DS_Store 13 | /build 14 | /captures 15 | /app/release 16 | .externalNativeBuild 17 | .cxx 18 | google-services.json 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fake_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-hdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26sp 4 | 14sp 5 | 10dp 6 | 8dp 7 | 8 | 50sp 9 | 14sp 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-ldpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26sp 4 | 14sp 5 | 8dp 6 | 6dp 7 | 8 | 50sp 9 | 14sp 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-mdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26sp 4 | 14sp 5 | 8dp 6 | 6dp 7 | 8 | 50sp 9 | 14sp 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values-xhdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28sp 4 | 16sp 5 | 12dp 6 | 10dp 7 | 8 | 60sp 9 | 16sp 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-xxhdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 30sp 4 | 18sp 5 | 12dp 6 | 10dp 7 | 8 | 66sp 9 | 18sp 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rect_shade_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-xxxhdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 32sp 4 | 18sp 5 | 16dp 6 | 14dp 7 | 8 | 66sp 9 | 18sp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rectangle_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/FakeHomeActivity.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import app.olauncher.R 6 | 7 | class FakeHomeActivity : AppCompatActivity() { 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | setContentView(R.layout.activity_fake_home) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_colors_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_colors_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/xml/locales_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_primary_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rename.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/data/AppModel.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.data 2 | 3 | import android.os.UserHandle 4 | import java.text.CollationKey 5 | 6 | data class AppModel( 7 | val appLabel: String, 8 | val key: CollationKey?, 9 | val appPackage: String, 10 | val activityClassName: String?, 11 | val isNew: Boolean? = false, 12 | val user: UserHandle, 13 | ) : Comparable { 14 | override fun compareTo(other: AppModel): Int = when { 15 | key != null && other.key != null -> key.compareTo(other.key) 16 | else -> appLabel.compareTo(other.appLabel, true) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/accessibility_service_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/AppUsageStats.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | class AppUsageStats( 7 | val lastTimeUsedMillis: Long, 8 | val totalTimeInForegroundMillis: Long, 9 | @get:RequiresApi(Build.VERSION_CODES.Q) val lastTimeForegroundServiceUsedMillis: Long, 10 | @get:RequiresApi(Build.VERSION_CODES.Q) val totalTimeForegroundServiceUsedMillis: Long, 11 | ) 12 | 13 | class AppUsageStatsBucket { 14 | var startMillis: Long = 0L 15 | var endMillis: Long = 0L 16 | var totalTime: Long = 0L 17 | 18 | fun addTotalTime() { 19 | this.totalTime += endMillis - startMillis 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/listener/DeviceAdmin.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.listener 2 | 3 | import android.app.admin.DeviceAdminReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.widget.Toast 7 | import app.olauncher.R 8 | 9 | class DeviceAdmin : DeviceAdminReceiver() { 10 | fun onEnabled(intent: Intent?, context: Context) { 11 | super.onEnabled(context, intent!!) 12 | Toast.makeText(context, context.getString(R.string.enabled), Toast.LENGTH_SHORT).show() 13 | } 14 | 15 | fun onDisabled(intent: Intent?, context: Context) { 16 | super.onDisabled(context, intent!!) 17 | Toast.makeText(context, context.getString(R.string.enabled), Toast.LENGTH_SHORT).show() 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/anim/item_anim_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/SingleLiveEvent.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.util.Log 4 | import androidx.annotation.MainThread 5 | import androidx.lifecycle.LifecycleOwner 6 | import androidx.lifecycle.MutableLiveData 7 | import androidx.lifecycle.Observer 8 | import java.util.concurrent.atomic.AtomicBoolean 9 | 10 | class SingleLiveEvent : MutableLiveData() { 11 | private val pending = AtomicBoolean(false) 12 | 13 | @MainThread 14 | override fun observe(owner: LifecycleOwner, observer: Observer) { 15 | if (hasActiveObservers()) { 16 | Log.d("SingleLiveEvent", "Only one observer will be notified of the changes") 17 | } 18 | 19 | super.observe(owner) { t -> 20 | if (pending.compareAndSet(true, false)) { 21 | observer.onChanged(t) 22 | } 23 | } 24 | } 25 | 26 | @MainThread 27 | override fun setValue(t: T?) { 28 | pending.set(true) 29 | super.setValue(t) 30 | } 31 | 32 | @MainThread 33 | fun call() { 34 | value = null 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hide.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/usageStats/ComponentForegroundStat.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper.usageStats 2 | 3 | import java.util.Date 4 | 5 | /** 6 | * Object representing a timespan that an application was in the foreground. 7 | * 8 | * @property beginTime The start of the timespan, in milliseconds since the epoch. 9 | * @property endTime The end of the timespan, in milliseconds since the epoch. 10 | * @property packageName The package name of the application. 11 | */ 12 | data class ComponentForegroundStat( 13 | val beginTime: Long, 14 | val endTime: Long, 15 | val packageName: String 16 | ) { 17 | /** 18 | * Overriding toString for a more readable log output, similar to the original Java class. 19 | * The default data class toString() would also work, but this one is more explicit 20 | * about formatting the timestamps as Instants. 21 | */ 22 | override fun toString(): String { 23 | return "ComponentForegroundStat(" + 24 | "beginTime=${Date(beginTime)}, " + 25 | "endTime=${Date(endTime)}, " + 26 | "packageName='$packageName')" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/MyAccessibilityService.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.accessibilityservice.AccessibilityService 4 | import android.content.Intent 5 | import android.os.Build 6 | import android.view.accessibility.AccessibilityEvent 7 | import android.view.accessibility.AccessibilityNodeInfo 8 | import androidx.annotation.RequiresApi 9 | import app.olauncher.R 10 | import app.olauncher.data.Prefs 11 | 12 | class MyAccessibilityService : AccessibilityService() { 13 | 14 | override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 15 | return START_STICKY 16 | } 17 | 18 | override fun onServiceConnected() { 19 | Prefs(applicationContext).lockModeOn = true 20 | super.onServiceConnected() 21 | } 22 | 23 | @RequiresApi(Build.VERSION_CODES.P) 24 | override fun onAccessibilityEvent(event: AccessibilityEvent) { 25 | try { 26 | val source: AccessibilityNodeInfo = event.source ?: return 27 | if ((source.className == "android.widget.FrameLayout") and 28 | (source.contentDescription == getString(R.string.lock_layout_description)) 29 | ) 30 | performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN) 31 | } catch (e: Exception) { 32 | return 33 | } 34 | } 35 | 36 | override fun onInterrupt() { 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx4608m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | android.suppressUnsupportedCompileSdk=34 23 | android.defaults.buildfeatures.buildconfig=true 24 | android.nonTransitiveRClass=false 25 | android.nonFinalResIds=false -------------------------------------------------------------------------------- /gradle/libs.versions.toml: -------------------------------------------------------------------------------- 1 | [versions] 2 | appcompat = "1.7.0" 3 | coreKtx = "1.16.0" 4 | gradle = "8.9.1" 5 | kotlinStdlib = "2.1.20" 6 | lifecycleExtensions = "2.2.0" 7 | lifecycleViewmodelKtx = "2.9.0" 8 | material = "1.12.0" 9 | navigationFragmentKtx = "2.9.0" 10 | recyclerview = "1.4.0" 11 | workRuntimeKtx = "2.10.1" 12 | [libraries] 13 | appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } 14 | core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" } 15 | gradle = { module = "com.android.tools.build:gradle", version.ref = "gradle" } 16 | kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinStdlib" } 17 | kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlinStdlib" } 18 | lifecycle-extensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "lifecycleExtensions" } 19 | lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } 20 | material = { module = "com.google.android.material:material", version.ref = "material" } 21 | navigation-fragment-ktx = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } 22 | recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } 23 | work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workRuntimeKtx" } -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @android:color/white 4 | @android:color/darker_gray 5 | #FFEB3B 6 | 7 | 8 | #FFFFFF 9 | #E6FFFFFF 10 | #CCFFFFFF 11 | #80FFFFFF 12 | #000000 13 | #1A000000 14 | #40000000 15 | #80000000 16 | #CC000000 17 | #E6000000 18 | 19 | 20 | #000000 21 | #E6000000 22 | #CC000000 23 | #80000000 24 | #FFFFFF 25 | #1AFFFFFF 26 | #40FFFFFF 27 | #80FFFFFF 28 | #CCFFFFFF 29 | #E6FFFFFF 30 | 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Olauncher](https://repository-images.githubusercontent.com/278638069/db0acb80-661b-11eb-803e-926cae5dccb4) 2 | 3 | 4 | # Olauncher | Minimal AF Launcher 5 | AF stands for Ad-Free :D 6 | 7 | 8 | ## Install 9 | 10 | #### Install from [F-Droid](https://f-droid.org/packages/app.olauncher) or [Play Store](https://play.google.com/store/apps/details?id=app.olauncher) or download the APK from the [latest release](https://github.com/tanujnotes/Olauncher/releases/). 11 | 12 | [Get it on F-Droid](https://f-droid.org/packages/app.olauncher) 15 | [Get it on Play Store](https://play.google.com/store/apps/details?id=app.olauncher) 18 | 19 | To maintain the simplicity of the launcher, a few niche features are available but hidden. 20 | 21 | Please check out the [About](https://tanujnotes.substack.com/p/olauncher-minimal-af-launcher?utm_source=github) page in the Olauncher settings for a complete list of features and FAQs. 22 | 23 | ## 24 | 25 | License: [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html) 26 | 27 | @tanujnotes | [X/Twitter](https://twitter.com/tanujnotes) | [Bluesky](https://bsky.app/profile/tanujnotes.bsky.social) 28 | 29 | **[See my other apps](https://play.google.com/store/apps/dev?id=7198807840081074933)** 30 | 31 | ## 32 | 33 | *New: We're working on an open source notes app called Note Safe (previously Note to Self). What's cool about it - it has a chat like interface and end-to-end encryption. [Take a look!](https://github.com/jeerovan/ntsapp)* 34 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/WallpaperWorker.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.content.Context 4 | import androidx.appcompat.app.AppCompatDelegate 5 | import androidx.work.CoroutineWorker 6 | import androidx.work.WorkerParameters 7 | import app.olauncher.data.Constants 8 | import app.olauncher.data.Prefs 9 | import kotlinx.coroutines.coroutineScope 10 | 11 | class WallpaperWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) { 12 | 13 | private val prefs = Prefs(applicationContext) 14 | 15 | override suspend fun doWork(): Result = coroutineScope { 16 | val success = 17 | if (isOlauncherDefault(applicationContext).not()) 18 | true 19 | else if (prefs.dailyWallpaper) { 20 | val wallType = checkWallpaperType() 21 | val wallpaperUrl = getTodaysWallpaper(wallType, prefs.firstOpenTime) 22 | if (prefs.dailyWallpaperUrl == wallpaperUrl) 23 | true 24 | else { 25 | prefs.dailyWallpaperUrl = wallpaperUrl 26 | setWallpaper(applicationContext, wallpaperUrl) 27 | } 28 | } else 29 | true 30 | 31 | if (success) 32 | Result.success() 33 | else 34 | Result.retry() 35 | } 36 | 37 | private fun checkWallpaperType(): String { 38 | return when (prefs.appTheme) { 39 | AppCompatDelegate.MODE_NIGHT_YES -> Constants.WALL_TYPE_DARK 40 | AppCompatDelegate.MODE_NIGHT_NO -> Constants.WALL_TYPE_LIGHT 41 | else -> if (applicationContext.isDarkThemeOn()) 42 | Constants.WALL_TYPE_DARK 43 | else 44 | Constants.WALL_TYPE_LIGHT 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/usageStats/SimpleUsageStat.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper.usageStats 2 | 3 | import android.app.usage.UsageStats 4 | import android.icu.util.Calendar 5 | import java.util.concurrent.TimeUnit 6 | 7 | /** 8 | * A data class to hold simplified usage statistics. 9 | * 10 | * @property day The day since epoch that this object concerns. 11 | * @property timeUsed The time that the application has been in the foreground in milliseconds on this day. 12 | * @property applicationId The package name of the application that this object concerns. 13 | */ 14 | data class SimpleUsageStat( 15 | val day: Long, 16 | val timeUsed: Long, 17 | val applicationId: String 18 | ) { 19 | /** 20 | * Secondary constructor to create a SimpleUsageStat from the system's [UsageStats]. 21 | */ 22 | constructor(systemUsageStat: UsageStats) : this( 23 | day = getEpochDay(systemUsageStat.lastTimeUsed), 24 | timeUsed = systemUsageStat.totalTimeInForeground, 25 | applicationId = systemUsageStat.packageName 26 | ) 27 | 28 | companion object { 29 | /** 30 | * Converts a list of system [UsageStats] to a list of [SimpleUsageStat]. 31 | * This function is kept for direct compatibility with the original Java static method. 32 | */ 33 | @JvmStatic 34 | fun asSimpleStats(usageStats: List): List { 35 | return usageStats.map { SimpleUsageStat(it) } 36 | } 37 | 38 | /** 39 | * Calculates the epoch day from a timestamp in milliseconds, compatible with API 24+. 40 | * It manually calculates the day by using integer division on the milliseconds. 41 | */ 42 | private fun getEpochDay(lastTimeUsed: Long): Long { 43 | val timeZoneOffset = Calendar.getInstance().timeZone.getOffset(lastTimeUsed) 44 | return TimeUnit.MILLISECONDS.toDays(lastTimeUsed + timeZoneOffset) 45 | } 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdk 35 6 | 7 | compileOptions { 8 | sourceCompatibility JavaVersion.VERSION_17 9 | targetCompatibility JavaVersion.VERSION_17 10 | } 11 | 12 | kotlinOptions { 13 | jvmTarget = JavaVersion.VERSION_17.toString() 14 | } 15 | 16 | defaultConfig { 17 | applicationId "app.olauncher" 18 | minSdkVersion 24 19 | targetSdkVersion 35 20 | versionCode 95 21 | versionName "v5.3.4" 22 | 23 | resourceConfigurations += ["en", "ar", "de", "es-rES", "es-rUS", "fr", "he", "hr", "hu", "in", "it", "ja", "pl", "pt-rBR", "ru-rRU", "sv", "tr", "uk", "zh"] 24 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 25 | } 26 | 27 | buildTypes { 28 | release { 29 | debuggable false 30 | minifyEnabled true 31 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 32 | } 33 | debug { 34 | debuggable true 35 | minifyEnabled false 36 | applicationIdSuffix ".debug" 37 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 38 | } 39 | } 40 | buildFeatures { 41 | viewBinding = true 42 | buildConfig = true 43 | } 44 | namespace 'app.olauncher' 45 | } 46 | 47 | dependencies { 48 | implementation fileTree(dir: "libs", include: ["*.jar"]) 49 | implementation libs.kotlin.stdlib 50 | implementation libs.core.ktx 51 | implementation libs.appcompat 52 | implementation libs.recyclerview 53 | 54 | // Android lifecycle 55 | implementation libs.lifecycle.extensions 56 | implementation libs.lifecycle.viewmodel.ktx 57 | 58 | // Navigation 59 | implementation libs.navigation.fragment.ktx 60 | 61 | // Work Manager 62 | implementation libs.work.runtime.ktx 63 | 64 | //Material dependency 65 | implementation libs.material 66 | 67 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 |

Are you using your phone, or is your phone using you?

Olauncher is a minimal AF Android launcher with just enough features. By the way, AF stands for AdFree. :D


FEATURES YOU MIGHT LIKE:

  • Minimalist homescreen: A clean homescreen experience with no icons, ads or any distraction. It helps you reduce your screen time and increase productivity.
  • Customizations: Resize text, rename apps, hide unused apps, show or hide the status bar, app text alignments, etc.
  • Gestures: Double tap to lock screen. Swipe left or right to open apps. Swipe down for notifications.
  • Wallpaper: A beautiful new wallpaper, daily. No one said that a minimalist launcher has to be boring. :)
  • Privacy: No data collection. FOSS Android launcher. Open source under GPLv3 license.
  • Launcher features: Dark & light themes, dual apps support, work profile support, auto app launch.

To maintain the simplicity of such a minimalist launcher, a few niche features are available but hidden. Please visit the About page in settings for the complete list.

FAQs:

  • 1. Hidden apps - Long press anywhere on the home screen to open settings. Tap ’Olauncher’ on the top to see your hidden apps.
  • 2. Navigation gestures - Some devices do not support gestures with a downloaded Android launchers. This can only be fixed by your device manufacturer via an update.
  • 3. Wallpapers - This Android launcher provides a new wallpaper daily. You can also set any wallpaper you want from your phone settings or Gallery/Photos app.

Our About page in settings has rest of the FAQs and several other tips to help you make the best usage of Olauncher. Please check it out.

Accessibility Service: Our Accessibility Service is used exclusively to let you turn off your phone’s screen with a double-tap gesture. It is optional, disabled by default and doesn’t collect or share any data.

P.S. Thank you for checking out the description till the end. Only a few very special people do that. Take care! ❤️

-------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 20 | 27 | 28 | 29 | 34 | 43 | 44 | 49 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/usageStats/UnmatchedCloseEventGuardian.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper.usageStats 2 | 3 | import android.app.usage.UsageEvents 4 | import android.app.usage.UsageStatsManager 5 | import android.util.Log 6 | 7 | /** 8 | * “…a diminutive Guardian who traveled backward through time…” 9 | * 10 | * Guards [EventLogWrapper] against Faulty unmatched close events (per 11 | * [the documentation](https://codeberg.org/fynngodau/usageDirect/wiki/Event-log-wrapper-scenarios)) 12 | * by seeking backwards through time and scanning for the open event. 13 | */ 14 | class UnmatchedCloseEventGuardian(private val usageStatsManager: UsageStatsManager) { 15 | 16 | companion object { 17 | private const val SCAN_INTERVAL = 1000L * 60 * 60 * 24 // 24 hours 18 | } 19 | 20 | /** 21 | * @param event Event to validate 22 | * @param queryStart Timestamp at which original query o 23 | * @return True if the event is valid, false otherwise 24 | */ 25 | fun test(event: UsageEvents.Event, queryStart: Long): Boolean { 26 | val events = usageStatsManager.queryEvents(queryStart - SCAN_INTERVAL, queryStart) 27 | 28 | // Reusable event object for iteration 29 | val e = UsageEvents.Event() 30 | 31 | // Track whether the package is currently in foreground or background 32 | var open = false // Not open until opened 33 | 34 | while (events.hasNextEvent()) { 35 | events.getNextEvent(e) 36 | 37 | if (e.eventType == UsageEvents.Event.DEVICE_STARTUP) { 38 | // Consider all apps closed after startup according to docs 39 | open = false 40 | } 41 | 42 | // Only consider events concerning our package otherwise 43 | if (event.packageName == e.packageName) { 44 | when (e.eventType) { 45 | // see EventLogWrapper 46 | UsageEvents.Event.ACTIVITY_RESUMED, 4 -> { 47 | open = true 48 | } 49 | UsageEvents.Event.ACTIVITY_PAUSED, 3 -> { 50 | if (e.timeStamp != event.timeStamp) { 51 | // Don't flip to 'false' if we're looking at the original event itself 52 | open = false 53 | } 54 | } 55 | } 56 | } 57 | } 58 | 59 | val result = if (open) "True" else "Faulty" 60 | Log.d("Guardian", "Scanned for package ${event.packageName} and determined event to be $result") 61 | 62 | // Event is valid if it was previously opened (within SCAN_INTERVAL) 63 | return open 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_app_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 34 | 35 | 46 | 47 | 48 | 49 | 65 | 66 | 76 | 77 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/fragment_app_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 34 | 35 | 46 | 47 | 48 | 49 | 65 | 66 | 77 | 78 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/listener/ViewSwipeTouchListener.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.listener 2 | 3 | import android.content.Context 4 | import android.view.GestureDetector 5 | import android.view.GestureDetector.SimpleOnGestureListener 6 | import android.view.MotionEvent 7 | import android.view.View 8 | import android.view.View.OnTouchListener 9 | import app.olauncher.data.Constants 10 | import kotlinx.coroutines.Dispatchers 11 | import kotlinx.coroutines.GlobalScope 12 | import kotlinx.coroutines.delay 13 | import kotlinx.coroutines.isActive 14 | import kotlinx.coroutines.launch 15 | import kotlinx.coroutines.withContext 16 | import kotlin.math.abs 17 | 18 | internal open class ViewSwipeTouchListener(c: Context?, v: View) : OnTouchListener { 19 | private var longPressOn = false 20 | private val gestureDetector: GestureDetector 21 | 22 | override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { 23 | when (motionEvent.action) { 24 | MotionEvent.ACTION_DOWN -> view.isPressed = true 25 | MotionEvent.ACTION_UP -> view.isPressed = false 26 | } 27 | return gestureDetector.onTouchEvent(motionEvent) 28 | } 29 | 30 | private inner class GestureListener(private val view: View) : SimpleOnGestureListener() { 31 | private val SWIPE_THRESHOLD: Int = 100 32 | private val SWIPE_VELOCITY_THRESHOLD: Int = 100 33 | 34 | override fun onDown(e: MotionEvent): Boolean { 35 | return true 36 | } 37 | 38 | override fun onSingleTapUp(e: MotionEvent): Boolean { 39 | onClick(view) 40 | return super.onSingleTapUp(e) 41 | } 42 | 43 | override fun onDoubleTap(e: MotionEvent): Boolean { 44 | onDoubleClick() 45 | return super.onDoubleTap(e) 46 | } 47 | 48 | override fun onLongPress(e: MotionEvent) { 49 | longPressOn = true 50 | GlobalScope.launch { 51 | delay(Constants.LONG_PRESS_DELAY_MS) 52 | withContext(Dispatchers.Main) { 53 | if (isActive && longPressOn) 54 | onLongClick(view) 55 | } 56 | } 57 | super.onLongPress(e) 58 | } 59 | 60 | override fun onFling( 61 | event1: MotionEvent?, 62 | event2: MotionEvent, 63 | velocityX: Float, 64 | velocityY: Float, 65 | ): Boolean { 66 | try { 67 | val diffY = event2.y - (event1?.y ?: 0F) 68 | val diffX = event2.x - (event1?.x ?: 0F) 69 | if (abs(diffX) > abs(diffY)) { 70 | if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 71 | if (diffX > 0) onSwipeRight() else onSwipeLeft() 72 | } 73 | } else { 74 | if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 75 | if (diffY < 0) onSwipeUp() else onSwipeDown() 76 | } 77 | } 78 | } catch (exception: Exception) { 79 | exception.printStackTrace() 80 | } 81 | return false 82 | } 83 | } 84 | 85 | open fun onSwipeRight() {} 86 | open fun onSwipeLeft() {} 87 | open fun onSwipeUp() {} 88 | open fun onSwipeDown() {} 89 | open fun onLongClick(view: View) {} 90 | private fun onDoubleClick() {} 91 | open fun onClick(view: View) {} 92 | 93 | init { 94 | gestureDetector = GestureDetector(c, GestureListener(v)) 95 | } 96 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 30 | 31 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 67 | 70 | 71 | 72 | 73 | 74 | 75 | 81 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/listener/OnSwipeTouchListener.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.listener 2 | 3 | import android.content.Context 4 | import android.view.GestureDetector 5 | import android.view.GestureDetector.SimpleOnGestureListener 6 | import android.view.MotionEvent 7 | import android.view.View 8 | import android.view.View.OnTouchListener 9 | import app.olauncher.data.Constants 10 | import kotlinx.coroutines.Dispatchers 11 | import kotlinx.coroutines.GlobalScope 12 | import kotlinx.coroutines.delay 13 | import kotlinx.coroutines.isActive 14 | import kotlinx.coroutines.launch 15 | import kotlinx.coroutines.withContext 16 | import kotlin.math.abs 17 | 18 | /* 19 | Swipe, double tap and long press touch listener for a view 20 | Source: https://www.tutorialspoint.com/how-to-handle-swipe-gestures-in-kotlin 21 | */ 22 | 23 | internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { 24 | private var longPressOn = false 25 | 26 | // private var doubleTapOn = false 27 | private val gestureDetector: GestureDetector 28 | 29 | override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { 30 | if (motionEvent.action == MotionEvent.ACTION_UP) 31 | longPressOn = false 32 | return gestureDetector.onTouchEvent(motionEvent) 33 | } 34 | 35 | private inner class GestureListener : SimpleOnGestureListener() { 36 | private val SWIPE_THRESHOLD: Int = 100 37 | private val SWIPE_VELOCITY_THRESHOLD: Int = 100 38 | 39 | override fun onDown(e: MotionEvent): Boolean { 40 | return true 41 | } 42 | 43 | override fun onSingleTapUp(e: MotionEvent): Boolean { 44 | // if (doubleTapOn) { 45 | // doubleTapOn = false 46 | // onTripleClick() 47 | // } 48 | onClick() 49 | return super.onSingleTapUp(e) 50 | } 51 | 52 | override fun onDoubleTap(e: MotionEvent): Boolean { 53 | // doubleTapOn = true 54 | // Timer().schedule(Constants.TRIPLE_TAP_DELAY_MS) { 55 | // if (doubleTapOn) { 56 | // doubleTapOn = false 57 | // onDoubleClick() 58 | // } 59 | // } 60 | onDoubleClick() 61 | return super.onDoubleTap(e) 62 | } 63 | 64 | override fun onLongPress(e: MotionEvent) { 65 | longPressOn = true 66 | GlobalScope.launch { 67 | delay(Constants.LONG_PRESS_DELAY_MS) 68 | withContext(Dispatchers.Main) { 69 | if (isActive && longPressOn) 70 | onLongClick() 71 | } 72 | } 73 | super.onLongPress(e) 74 | } 75 | 76 | override fun onFling( 77 | event1: MotionEvent?, 78 | event2: MotionEvent, 79 | velocityX: Float, 80 | velocityY: Float, 81 | ): Boolean { 82 | try { 83 | val diffY = event2.y - (event1?.y ?: 0F) 84 | val diffX = event2.x - (event1?.x ?: 0F) 85 | if (abs(diffX) > abs(diffY)) { 86 | if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 87 | if (diffX > 0) onSwipeRight() else onSwipeLeft() 88 | } 89 | } else { 90 | if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 91 | if (diffY < 0) onSwipeUp() else onSwipeDown() 92 | } 93 | } 94 | } catch (exception: Exception) { 95 | exception.printStackTrace() 96 | } 97 | return false 98 | } 99 | } 100 | 101 | open fun onSwipeRight() {} 102 | open fun onSwipeLeft() {} 103 | open fun onSwipeUp() {} 104 | open fun onSwipeDown() {} 105 | open fun onLongClick() {} 106 | open fun onDoubleClick() {} 107 | open fun onTripleClick() {} 108 | open fun onClick() {} 109 | 110 | init { 111 | gestureDetector = GestureDetector(c, GestureListener()) 112 | } 113 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 30 | 31 | 44 | 45 | 48 | 49 | 59 | 60 | 71 | 72 | 73 | 82 | 83 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 47 | 48 | 52 | 53 | 63 | 64 | 72 | 73 | 77 | 78 | 81 | 82 | 85 | 86 | 89 | 90 | 93 | 94 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 47 | 48 | 52 | 53 | 63 | 64 | 72 | 73 | 77 | 78 | 81 | 82 | 85 | 86 | 89 | 90 | 93 | 94 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/data/Constants.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.data 2 | 3 | object Constants { 4 | 5 | object Key { 6 | const val FLAG = "flag" 7 | const val RENAME = "rename" 8 | } 9 | 10 | object Dialog { 11 | const val ABOUT = "ABOUT" 12 | const val WALLPAPER = "WALLPAPER" 13 | const val REVIEW = "REVIEW" 14 | const val RATE = "RATE" 15 | const val SHARE = "SHARE" 16 | const val HIDDEN = "HIDDEN" 17 | const val KEYBOARD = "KEYBOARD" 18 | const val DIGITAL_WELLBEING = "DIGITAL_WELLBEING" 19 | const val PRO_MESSAGE = "PRO_MESSAGE" 20 | } 21 | 22 | object UserState { 23 | const val START = "START" 24 | const val WALLPAPER = "WALLPAPER" 25 | const val REVIEW = "REVIEW" 26 | const val RATE = "RATE" 27 | const val SHARE = "SHARE" 28 | } 29 | 30 | object DateTime { 31 | const val OFF = 0 32 | const val ON = 1 33 | const val DATE_ONLY = 2 34 | 35 | fun isTimeVisible(dateTimeVisibility: Int): Boolean { 36 | return dateTimeVisibility == ON 37 | } 38 | 39 | fun isDateVisible(dateTimeVisibility: Int): Boolean { 40 | return dateTimeVisibility == ON || dateTimeVisibility == DATE_ONLY 41 | } 42 | } 43 | 44 | object SwipeDownAction { 45 | const val SEARCH = 1 46 | const val NOTIFICATIONS = 2 47 | } 48 | 49 | object TextSize { 50 | const val ONE = 0.6f 51 | const val TWO = 0.75f 52 | const val THREE = 0.9f 53 | const val FOUR = 1f 54 | const val FIVE = 1.1f 55 | const val SIX = 1.2f 56 | const val SEVEN = 1.3f 57 | } 58 | 59 | object CharacterIndicator { 60 | const val SHOW = 102 61 | const val HIDE = 101 62 | } 63 | 64 | val CLOCK_APP_PACKAGES = arrayOf( 65 | "com.google.android.deskclock", //Google Clock 66 | "com.sec.android.app.clockpackage", //Samsung Clock 67 | "com.oneplus.deskclock", //OnePlus Clock 68 | "com.miui.clock", //Xiaomi Clock 69 | ) 70 | 71 | const val WALL_TYPE_LIGHT = "light" 72 | const val WALL_TYPE_DARK = "dark" 73 | 74 | // const val THEME_MODE_DARK = 0 75 | // const val THEME_MODE_LIGHT = 1 76 | // const val THEME_MODE_SYSTEM = 2 77 | 78 | const val FLAG_LAUNCH_APP = 100 79 | const val FLAG_HIDDEN_APPS = 101 80 | 81 | const val FLAG_SET_HOME_APP_1 = 1 82 | const val FLAG_SET_HOME_APP_2 = 2 83 | const val FLAG_SET_HOME_APP_3 = 3 84 | const val FLAG_SET_HOME_APP_4 = 4 85 | const val FLAG_SET_HOME_APP_5 = 5 86 | const val FLAG_SET_HOME_APP_6 = 6 87 | const val FLAG_SET_HOME_APP_7 = 7 88 | const val FLAG_SET_HOME_APP_8 = 8 89 | 90 | const val FLAG_SET_SWIPE_LEFT_APP = 11 91 | const val FLAG_SET_SWIPE_RIGHT_APP = 12 92 | const val FLAG_SET_CLOCK_APP = 13 93 | const val FLAG_SET_CALENDAR_APP = 14 94 | 95 | const val REQUEST_CODE_ENABLE_ADMIN = 666 96 | const val REQUEST_CODE_LAUNCHER_SELECTOR = 678 97 | 98 | const val HINT_RATE_US = 15 99 | 100 | const val LONG_PRESS_DELAY_MS = 500L 101 | const val ONE_DAY_IN_MILLIS = 86400000L 102 | const val ONE_HOUR_IN_MILLIS = 3600000L 103 | const val ONE_MINUTE_IN_MILLIS = 60000L 104 | 105 | const val MIN_ANIM_REFRESH_RATE = 10f 106 | 107 | const val URL_ABOUT_OLAUNCHER = "https://tanujnotes.substack.com/p/olauncher-minimal-af-launcher?utm_source=olauncher" 108 | const val URL_OLAUNCHER_PRIVACY = "https://tanujnotes.notion.site/Olauncher-Privacy-Policy-dd6ac5101ddd4b3da9d27057889d44ab" 109 | const val URL_DOUBLE_TAP = "https://tanujnotes.notion.site/Double-tap-to-lock-Olauncher-0f7fb103ec1f47d7a90cdfdcd7fb86ef" 110 | const val URL_OLAUNCHER_GITHUB = "https://www.github.com/tanujnotes/Olauncher" 111 | const val URL_OLAUNCHER_PLAY_STORE = "https://play.google.com/store/apps/details?id=app.olauncher" 112 | const val URL_OLAUNCHER_PRO = "https://play.google.com/store/apps/details?id=app.prolauncher" 113 | const val URL_PLAY_STORE_DEV = "https://play.google.com/store/apps/dev?id=7198807840081074933" 114 | const val URL_TWITTER_TANUJ = "https://x.com/tanujnotes" 115 | const val URL_WALLPAPERS = "https://gist.githubusercontent.com/tanujnotes/85e2d0343ace71e76615ac346fbff82b/raw" 116 | const val URL_NTS = "https://play.google.com/store/apps/details?id=com.makenotetoself" 117 | const val URL_DEFAULT_DARK_WALLPAPER = "https://images.unsplash.com/photo-1512551980832-13df02babc9e" 118 | const val URL_DEFAULT_LIGHT_WALLPAPER = "https://images.unsplash.com/photo-1515549832467-8783363e19b6" 119 | const val URL_DUCK_SEARCH = "https://duck.co/?q=" 120 | const val URL_DIGITAL_WELLBEING_LEARN_MORE = "https://tanujnotes.substack.com/p/digital-wellbeing-app-on-android?utm_source=olauncher" 121 | 122 | const val DIGITAL_WELLBEING_PACKAGE_NAME = "com.google.android.apps.wellbeing" 123 | const val DIGITAL_WELLBEING_ACTIVITY = "com.google.android.apps.wellbeing.settings.TopLevelSettingsActivity" 124 | const val DIGITAL_WELLBEING_SAMSUNG_PACKAGE_NAME = "com.samsung.android.forest" 125 | const val DIGITAL_WELLBEING_SAMSUNG_ACTIVITY = "com.samsung.android.forest.launcher.LauncherActivity" 126 | const val WALLPAPER_WORKER_NAME = "WALLPAPER_WORKER_NAME" 127 | } -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /app/src/main/java/app/olauncher/helper/Extensions.kt: -------------------------------------------------------------------------------- 1 | package app.olauncher.helper 2 | 3 | import android.app.Activity 4 | import android.app.AppOpsManager 5 | import android.app.SearchManager 6 | import android.app.role.RoleManager 7 | import android.content.ComponentName 8 | import android.content.Context 9 | import android.content.Intent 10 | import android.content.pm.LauncherApps 11 | import android.content.pm.PackageManager 12 | import android.content.res.Resources 13 | import android.net.Uri 14 | import android.os.Build 15 | import android.os.UserHandle 16 | import android.provider.Settings 17 | import android.view.View 18 | import android.view.WindowManager 19 | import android.view.inputmethod.InputMethodManager 20 | import androidx.annotation.RequiresApi 21 | import app.olauncher.BuildConfig 22 | import app.olauncher.R 23 | import app.olauncher.data.Constants 24 | import java.util.Calendar 25 | 26 | fun View.hideKeyboard() { 27 | this.clearFocus() 28 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 29 | imm.hideSoftInputFromWindow(windowToken, 0) 30 | } 31 | 32 | fun View.showKeyboard(show: Boolean = true) { 33 | if (show.not()) return 34 | if (this.requestFocus()) 35 | postDelayed({ 36 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 37 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) 38 | }, 100) 39 | } 40 | 41 | 42 | @RequiresApi(Build.VERSION_CODES.Q) 43 | fun Activity.showLauncherSelector(requestCode: Int) { 44 | val roleManager = getSystemService(Context.ROLE_SERVICE) as RoleManager 45 | if (roleManager.isRoleAvailable(RoleManager.ROLE_HOME)) { 46 | val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME) 47 | startActivityForResult(intent, requestCode) 48 | } else 49 | resetDefaultLauncher() 50 | } 51 | 52 | fun Context.resetDefaultLauncher() { 53 | try { 54 | val componentName = ComponentName(this, FakeHomeActivity::class.java) 55 | packageManager.setComponentEnabledSetting( 56 | componentName, 57 | PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 58 | PackageManager.DONT_KILL_APP 59 | ) 60 | val selector = Intent(Intent.ACTION_MAIN) 61 | selector.addCategory(Intent.CATEGORY_HOME) 62 | startActivity(selector) 63 | packageManager.setComponentEnabledSetting( 64 | componentName, 65 | PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 66 | PackageManager.DONT_KILL_APP 67 | ) 68 | } catch (e: Exception) { 69 | e.printStackTrace() 70 | } 71 | } 72 | 73 | fun Context.isDefaultLauncher(): Boolean { 74 | val launcherPackageName = getDefaultLauncherPackage(this) 75 | return BuildConfig.APPLICATION_ID == launcherPackageName 76 | } 77 | 78 | fun Context.resetLauncherViaFakeActivity() { 79 | resetDefaultLauncher() 80 | if (getDefaultLauncherPackage(this).contains(".")) 81 | startActivity(Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS)) 82 | } 83 | 84 | fun Context.openSearch(query: String? = null) { 85 | val intent = Intent(Intent.ACTION_WEB_SEARCH) 86 | intent.putExtra(SearchManager.QUERY, query ?: "") 87 | startActivity(intent) 88 | } 89 | 90 | fun Context.isEinkDisplay(): Boolean { 91 | return try { 92 | val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager 93 | windowManager.defaultDisplay.refreshRate <= Constants.MIN_ANIM_REFRESH_RATE 94 | } catch (e: Exception) { 95 | e.printStackTrace() 96 | false 97 | } 98 | } 99 | 100 | fun Context.searchOnPlayStore(query: String? = null): Boolean { 101 | return try { 102 | startActivity( 103 | Intent( 104 | Intent.ACTION_VIEW, 105 | Uri.parse("https://play.google.com/store/search?q=$query&c=apps") 106 | ).addFlags( 107 | Intent.FLAG_ACTIVITY_NO_HISTORY or 108 | Intent.FLAG_ACTIVITY_NEW_DOCUMENT or 109 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK 110 | ) 111 | ) 112 | true 113 | } catch (e: Exception) { 114 | e.printStackTrace() 115 | false 116 | } 117 | } 118 | 119 | fun Context.isPackageInstalled(packageName: String, userHandle: UserHandle = android.os.Process.myUserHandle()): Boolean { 120 | val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps 121 | val activityInfo = launcher.getActivityList(packageName, userHandle) 122 | return activityInfo.isNotEmpty() 123 | } 124 | 125 | @RequiresApi(Build.VERSION_CODES.Q) 126 | fun Context.appUsagePermissionGranted(): Boolean { 127 | val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager 128 | return appOpsManager.unsafeCheckOpNoThrow( 129 | "android:get_usage_stats", 130 | android.os.Process.myUid(), 131 | packageName 132 | ) == AppOpsManager.MODE_ALLOWED 133 | } 134 | 135 | fun Context.formattedTimeSpent(timeSpent: Long): String { 136 | val seconds = timeSpent / 1000 137 | val minutes = seconds / 60 138 | val hours = minutes / 60 139 | val remainingMinutes = minutes % 60 140 | return when { 141 | timeSpent == 0L -> "0m" 142 | 143 | hours > 0 -> getString( 144 | R.string.time_spent_hour, 145 | hours.toString(), 146 | remainingMinutes.toString() 147 | ) 148 | 149 | minutes > 0 -> { 150 | getString(R.string.time_spent_min, minutes.toString()) 151 | } 152 | 153 | else -> "<1m" 154 | } 155 | } 156 | 157 | fun Long.convertEpochToMidnight(): Long { 158 | val calendar = Calendar.getInstance() 159 | calendar.timeInMillis = this 160 | calendar.set(Calendar.HOUR_OF_DAY, 0) 161 | calendar.set(Calendar.MINUTE, 0) 162 | calendar.set(Calendar.SECOND, 0) 163 | calendar.set(Calendar.MILLISECOND, 0) 164 | return calendar.timeInMillis 165 | } 166 | 167 | fun Long.isDaySince(): Int = ((System.currentTimeMillis().convertEpochToMidnight() - this.convertEpochToMidnight()) 168 | / Constants.ONE_DAY_IN_MILLIS).toInt() 169 | 170 | fun Long.hasBeenDays(days: Int): Boolean = 171 | ((System.currentTimeMillis() - this) / Constants.ONE_DAY_IN_MILLIS) >= days 172 | 173 | fun Long.hasBeenHours(hours: Int): Boolean = 174 | ((System.currentTimeMillis() - this) / Constants.ONE_HOUR_IN_MILLIS) >= hours 175 | 176 | fun Long.hasBeenMinutes(minutes: Int): Boolean = 177 | ((System.currentTimeMillis() - this) / Constants.ONE_MINUTE_IN_MILLIS) >= minutes 178 | 179 | fun Int.dpToPx(): Int { 180 | return (this * Resources.getSystem().displayMetrics.density).toInt() 181 | } 182 | -------------------------------------------------------------------------------- /app/src/main/res/layout/adapter_app_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 29 | 30 | 42 | 43 | 57 | 58 | 72 | 73 | 87 | 88 | 102 | 103 | 117 | 118 | 119 | 120 | 131 | 132 | 147 | 148 | 162 | 163 | 176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 17 | 18 | 19 | 28 | 29 | 38 | 39 | 49 | 50 | 51 | 52 | 66 | 67 | 68 | 77 | 78 | 88 | 89 | 99 | 100 | 110 | 111 | 121 | 122 | 132 | 133 | 143 | 144 | 154 | 155 | 165 | 166 | 167 | 168 | 180 | 181 | 182 | 194 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 17 | 18 | 19 | 29 | 30 | 39 | 40 | 50 | 51 | 52 | 53 | 67 | 68 | 69 | 77 | 78 | 88 | 89 | 99 | 100 | 110 | 111 | 121 | 122 | 132 | 133 | 143 | 144 | 154 | 155 | 165 | 166 | 167 | 168 | 178 | 179 | 180 | 193 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 应用程序 4 | 设置为默认启动器 5 | 设置为默认启动器 6 | 设置为默认启动器 7 | 提示:输入应用程序名称以查找并启动它 8 | 好的 9 | 非常棒! 10 | 提示:开始输入应用程序重命名选项 11 | 您的壁纸即将更新 12 | Olauncher 不是默认启动器。 每日壁纸更新可能会失败。 13 | 长按即可启用 14 | 没有隐藏的应用程序 15 | 隐藏的应用程序 16 | 注意:点击此设置页面顶部的“Olauncher”即可找到隐藏的应用程序。 17 | \n\n更多详细信息请参阅下面的“关于”页面。 18 | 向下滑动查看 19 | 搜索 20 | 通知 21 | 请在您设备的设置中打开或关闭 Olauncher 的辅助服务以启用或禁用此功能。 22 | \n\n请注意,此服务仅用于让您使用双击手势关闭设备的屏幕。 我们的无障碍服务不收集或共享任何数据。 23 | 接受 24 | 允许 25 | 双击即可锁定 26 | 启用 27 | 禁用 28 | 不工作? 29 | 信息 30 | 删除 31 | 字体大小 32 | 启用 33 | 禁用 34 | 请打开双击以锁定 35 | Olauncher 无法锁定设备。 请检查您的应用程序设置。 36 | 长按选择应用程序 37 | 无法打开应用程序信息 38 | 已复制 39 | 系统应用,无法删除 40 | 首先输入新的应用程序名称 41 | 显示 42 | 隐藏 43 | 文字颜色 44 | 双击即可锁定 45 | Olauncher 承诺负责任地使用锁屏权限。 Olauncher 不收集或共享任何数据。 46 | 关于 47 | 48 | 49 | 黑色 50 | 白色 51 | 更改默认启动器 52 | 隐私 53 | 分享 54 | 分享 55 | 评分 56 | 评分 57 | 关注 58 | 电子邮件 59 | 60 | 捐赠 61 | 1. 向上滑动查看所有应用\n2.长按任意位置进行设置 62 | 主屏幕上的应用程序 63 | 每日新壁纸 64 | 左对齐 65 | 右对齐 66 | 居中 67 | 应用对齐方式 68 | 向左滑动应用程序 69 | 向右滑动应用程序 70 | 0 71 | 1 72 | 2 73 | 3 74 | 4 75 | 5 76 | 6 77 | 7 78 | 8 79 | 自动显示键盘 80 | 隐藏 81 | 显示状态栏 82 | 改名 83 | 显示日期时间 84 | 外观 85 | 手势 86 | 主题模式 87 | 系统 88 | 黑暗 89 | 90 | 欢迎来到设置! 91 | \n\n请记住,如果您有任何问题,我们的“关于”页面有答案。 92 | 您好,您不会再看到此消息。 93 | \n\n如果您喜欢 Olauncher,能给我们一个 5 星评价吗? 它帮助我们提高排名并使我们高兴。 谢谢你! 94 | 你好,我们需要你的帮助!去年我们的下载量突破了一百万次。今年我们希望再增加一百万,但我们无法单独做到这一点。 95 | \n\n您能与您的朋友分享 Olauncher 吗?谢谢您,祝您有美好的一天! 96 | 您好,键盘是在 Olauncher 中查找和启动应用程序的最快方式。我们可以要求您再保留几天? 97 | \n\n然后再决定吗?选择权永远在你手中。 98 | 如果您想为某些应用程序设置时间限制,Android 的数字健康功能可以帮助您做到这一点。 99 | \n\n请在手机设置中搜索数字健康并启用它。 100 | 要在主屏幕上显示/隐藏您的屏幕时间,请允许或拒绝应用程序使用权限。 101 | \n\n注意:不收集应用程序使用数据。所有数据都在您的设备上处理。 102 | Olauncher 还有一个名为 Pro Launcher 的专业版。它具有额外的功能,如天气、部件、字体、文件夹、AMOLED 壁纸等。 103 | \n\n这也是支持 Olauncher 开发者的最佳方式。快来看看吧! 104 | Olauncher每天提供美丽的新壁纸。让你的主屏幕每天焕然一新,免费! 105 | \n\n想试试吗? 106 | 请在手机设置中搜索数字健康并启用它。 107 | 使用我们的亚马逊附属链接免费支持 Olauncher。 108 | 每次您使用我们的链接购买商品时,我们都会获得少量佣金。请保存链接并在网上购物时使用它。 谢谢! 109 | 打开链接 110 | 复制 111 | 关闭 112 | 暂时不要 113 | Olauncher 公共路线图 114 | Instagram 115 | 推特 116 | 路线图 117 | 日期 118 | 仅限日期 119 | 底部:打开 120 | 底部:关闭 121 | 请先将 Olauncher 设置为默认启动器 122 | 联盟 123 | 找不到应用程序 124 | 无法启动应用程序 125 | 搜索启动器或家庭应用程序 126 | 向左滑动应用程序启用 127 | 向右滑动应用程序启用 128 | 向左滑动应用程序已禁用 129 | 向右滑动应用程序已禁用 130 | 是你在用手机,还是手机在用你? 131 | 关于 Olauncher 132 | 了解更多 133 | 屏幕时间 134 | 你可知道? 135 | 发表评论 136 | Olauncher 现在并且永远是完全免费的。它没有广告。它不收集任何数据。最重要的是,它可以帮助您减少屏幕时间并过上更健康的数字生活。 137 | \n\n我们相信切换到最小启动器是一个很好的决定。虽然我们显然有偏见,但我们希望您喜欢这次体验。请随时与我们分享您的想法! 138 | 对齐已更改 ✅ 139 | 主屏幕 140 | 141 | 更多功能… 142 | 愿新的一年胜过以往所有。新年快乐! 143 | 月过得如何并不重要。你还有一年的时间做到比以往任何时候都更好。 144 | 干杯! 145 | 通知栏 146 | 147 | -------------------------------------------------------------------------------- /app/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | アプリ 4 | デフォルトのランチャーとして設定 5 | デフォルトのランチャーとして設定 6 | デフォルトのランチャーとして設定 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ヒント: アプリ名の入力を開始すると、アプリが自動的に起動します 17 | わかった 18 | いいね! 19 | 20 | ヒント: アプリの RENAME オプションの入力を開始します 21 | 壁紙は間もなく更新されます 22 | Olauncher はデフォルトのランチャーではありません。 毎日の壁紙の更新に失敗する場合があります。 23 | 長押しして有効にします 24 | 隠れたアプリはありません 25 | 隠しアプリ 26 | 注: この設定ページの上部にある「Olauncher」をタップして、隠れたアプリを見つけます。 27 | \n\n詳細については、以下の About ページをご覧ください。 28 | 下にスワイプして 29 | 検索 30 | 通知 31 | この機能を有効または無効にするには、デバイスの設定で Olauncher のアクセシビリティ サービスをオンまたはオフにしてください。 32 | \n\nこのサービスは、ダブルタップ ジェスチャを使用してデバイスの画面をオフにするためにのみ使用されることに注意してください。 当社のアクセシビリティ サービスは、いかなるデータも収集または共有しません。 33 | 受け入れる 34 | 許可 35 | ダブルタップしてロックします 36 | 有効 37 | 無効にする 38 | 機能しない場合 39 | 情報 40 | 消去 41 | 文字サイズ 42 | 有効 43 | 無効 44 | ダブルタップしてロックをオンにしてください 45 | Olauncher がデバイスをロックできませんでした。 アプリの設定を確認してください。 46 | 長押ししてアプリを選択します 47 | アプリ情報を開けません 48 | コピーされました 49 | システムアプリ、削除できません 50 | 最初に新しいアプリ名を入力します 51 | 見せる 52 | 隠れる 53 | テキストの色 54 | ダブルタップしてロックします 55 | Olauncher は、ロック画面のアクセス許可を責任を持って使用することを約束します。 Olauncher はデータを収集または共有しません。 56 | アバウト 57 | オフ 58 | オン 59 | 60 | 61 | デフォルトのランチャーを変更する 62 | プライバシー 63 | 共有 64 | 共有 65 | レート 66 | レート 67 | 従う 68 | Eメール 69 | 70 | 寄付 71 | 1. 上にスワイプしてすべてのアプリを表示します\n2. 設定を行うには任意の場所を長押しします 72 | ホーム画面のアプリ 73 | 毎日新しい壁紙 74 | 75 | 76 | 中心 77 | アプリの調整 78 | アプリを左にスワイプ 79 | アプリを右にスワイプ 80 | キーボードの自動表示 81 | 隠れる 82 | ステータスバーを表示する 83 | 名前の変更 84 | 日付時刻を表示する 85 | 外観 86 | ジェスチャー 87 | テーマモード 88 | システム 89 | ダーク 90 | ライト 91 | 設定へようこそ! 92 | \n\n質問がある場合は、私たちの「About」ページに答えがありますので、覚えておいてください。 93 | ねえ、Olauncher は役に立つと思いますか? 「はい」の場合、5 つ星の評価が私たちをサポートする最善の方法です。\n\nありがとう、もうこれを見ることはないだろう。 94 | こんにちは、あなたの助けが必要です!昨年、ダウンロード数が 100 万件を突破しました。今年はさらに 100 万人を達成したいと考えていますが、私たちだけでは達成できません。 95 | \n\nOlauncher をお友達と共有していただけますか?ありがとう、そして素晴らしい一日をお過ごしください! 96 | こんにちは、キーボードは Olauncher でアプリを見つけて起動する最も速い方法です。もう数日間これをオンにしてから判断していただくようお願いできますか?選択は常にあなた次第です。 97 | 特定のアプリに時間制限を設定したい場合は、Android の Digital Wellbeing 機能を使用すると便利です。 98 | \n\n携帯電話の設定で Digital Wellbeing を検索し、有効にしてください。 99 | ホーム画面で画面時間を表示/非表示するには、アプリの使用権限を許可または拒否してください。 100 | \n\n注意: アプリの使用データは収集されません。すべての処理はあなたのデバイスで行われます。 101 | OlauncherにはPro Launcherというプロ版もあります。天気、ウィジェット、フォント、フォルダー、AMOLED壁紙などの追加機能があります。 102 | \n\nOlauncherの開発者をサポートするための最良の方法でもあります。チェックしてみてください! 103 | Olauncherは毎日美しい新しい壁紙を提供します。毎日ホーム画面に新しい外観を無料で提供! 104 | \n\n試してみますか? 105 | ダブルタップしてロックを有効にするには、アクセシビリティ許可が必要です。このサービスを通じて Olauncher が取得したデータは、デバイスから流出することはありません。 106 | Amazon アフィリエイト リンクを使用して、Olauncher を無料でサポートしてください。 107 | あなたが私たちのリンクを使用して何かを購入するたびに、私たちは少額の手数料を受け取ります。リンクを保存し、オンライン ショッピングの際には必ずご利用ください。 ありがとう! 108 | リンクを開く 109 | コピー 110 | 閉じる 111 | 今はやめろ 112 | Olauncher の公開ロードマップ 113 | インスタグラム 114 | ツイッター 115 | ロードマップ 116 | 日にち 117 | 日付のみ 118 | 下: オン 119 | 下:オフ 120 | まず Olauncher をデフォルトのランチャーとして設定してください 121 | アフィリエイト 122 | アプリが見つかりません 123 | アプリを起動できません 124 | ランチャーまたはホームアプリを検索する 125 | アプリを左にスワイプ有効化 126 | アプリを右にスワイプ有効 127 | 左にスワイプするとアプリが無効になります 128 | スクリーンタイム 129 | アプリを右にスワイプすると無効になります 130 | あなたは電話を使っていますか、それともあなたの電話があなたを使っていますか? 131 | アバウト Olauncher 132 | もっと詳しく知る 133 | 知っていましたか? 134 | レビューを残す 135 | Olauncher は現在も、今後も完全に無料です。広告はありません。データは収集されません。最も重要なことは、スクリーンタイムを短縮し、より健康的なデジタル ライフを送るのに役立つことです。 136 | \n\n私たちは、最小限のランチャーに切り替えるのは素晴らしい決断だと信じています。明らかに偏見がありますが、楽しんでいただければ幸いです。ぜひご意見をお聞かせください。 137 | アライメントが変更されました ✅ 138 | ホーム画面 139 | やあ 140 | その他の機能… 141 | これまでのどの年よりも良い一年になりますように。明けましておめでとうございます! 142 | 1月がどうだったかは関係ありません。これまで以上に良い結果を出すために、まだ今年の残りの期間があります。 143 | 乾杯! 144 | 通知バー 145 | -------------------------------------------------------------------------------- /app/src/main/res/values-he/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | יישום 3 | הגדרה בתור משגר ברירת המחדל 4 | הגדר תחילה את Olauncher כברירת מחדל 5 | הגדר תחילה את Olauncher כברירת מחדל 6 | צבע הטקסט 7 | נעילת המסך בהקשה כפולה 8 | יישום Olauncher ישתמש בהרשאה של נעילת המסך באופן מתון. יישום Olauncher אינו אוסף או משתף נתונים כלל. 9 | מידע כללי 10 | כבוי 11 | מופעל 12 | שחור 13 | לבן 14 | שינוי משגר ברירת המחדל 15 | פרטיות 16 | שיתוף 17 | שתף עכשיו 18 | דירוג 19 | דרג עכשיו 20 | עקבו אחריי 21 | דואר אלקטרוני 22 | תרומה 23 | 1. החלקה כלפי מעלה תפתח את הרשימה של כל היישומים\n2. לפתיחת הגדרות מסך הבית יש ללחוץ לחיצה ארוכה מכל מקום על גבי המסך. 24 | יישומים במסך הבית 25 | רקע חדש בכל יום 26 | ימין 27 | שמאל 28 | מרכז 29 | יישור היישומים 30 | יישום לפתיחה בהחלקה שמאלה 31 | יישום לפתיחה בהחלקה ימינה 32 | 0 33 | 1 34 | 2 35 | 3 36 | 4 37 | 5 38 | 6 39 | 7 40 | 8 41 | עצה: אפשר להתחיל להקליד שם של יישום מסוים ואז הוא ייפתח אוטומטית 42 | אישור 43 | מגניב! 44 | הצגת המקלדת באופן אוטומטי 45 | הסתרה 46 | הצגת שורת המצב 47 | שינוי שם 48 | Show date time 49 | מראה 50 | מחוות 51 | ערכת נושא 52 | מערכת 53 | כהה 54 | בהירה 55 | למטה מופיע קישור לעמוד "מידע כללי", ובו אפשר למצוא תשובות לכל השאלות. לא לשכוח :) 56 | \n\nThank you. 57 | היי, לא נציג לך הודעה זו בשנית. 58 | \n\nאם כיף לך להשתמש ב־Olauncher, האם נוכל בבקשה לקבל ממך דירוג של 5 כוכבים? זה יעזור לנו להתקדם בדירוג ויעשה לנו טוב על הלב. תודה מראש! 59 | שלום, יש לנו משימה ענקית! אנחנו רוצים להגיע למיליון הורדות לפני סוף שנת 2023, ואנו זקוקים לעזרתך. 60 | \n\nהיית רוצה אולי לספר לחברים שלך על Olauncher? זה יכול לסייע לנו מאוד. תודה רבה! 61 | היי, יותר מהיר למצוא ולפתוח יישומים ב־Olauncher בעזרת ההקלדה. אולי בכל זאת היית רוצה להשאיר את ההגדרה הזאת ולתת לה עוד הזדמנות? 62 | \n\nThe choice is always yours. 63 | Olauncher מציע טפטים חדשים ויפים מדי יום. תנו למסך הבית שלכם מראה חדש ורענן בכל יום, בחינם! רוצים לנסות? 64 | הרשאת הנגישות נחוצה להפעלת הנעילה בהקשה כפולה. כל הנתונים שייאספו על ידי Olauncher דרך השירות הזה לא יועברו הלאה ממכשירך. 65 | אפשר לתמוך ב־Olauncher מבלי לשלם שקל, בעזרת שימוש בקישור ה־Amazon affiliate שלנו. 66 | על כל רכישה שתבוצע דרך הקישור שלנו אנחנו נקבל עמלה קטנה. נשמח אם תשמרו את הקישור ותשתמשו בו בקניות מהאינטרנט.\nתודה רבה! 67 | פתיחת קישור 68 | העתקה 69 | סגירה 70 | לא כעת 71 | Olauncher public roadmap 72 | אינסטגרם 73 | המפתח 74 | Roadmap 75 | תאריך 76 | תאריך בלבד 77 | הצגה למטה: מופעל 78 | הצגה למטה: כבוי 79 | ראשית, נא להגדיר את Olauncher בתור ברירת המחדל למסך בית. 80 | Affiliate 81 | עצה: אפשר להתחיל להקליד בשביל להגיע לאפשרות לשינוי שם של יישומים 82 | הערה: בשביל להגיע ליישומים המוסתרים, יש ללחוץ על הכיתוב \'Olauncher\' שנמצא בראש עמוד ההגדרות.\n\nפרטים נוספים אפשר למצוא בעמוד ה"מידע כללי" שלנו למטה. 83 | פעולה בעת החלקה למטה 84 | חיפוש 85 | התראות 86 | נא להפעיל או לכבות את שירות הנגישות של Olauncher בהגדרות המכשיר שלך בשביל להפעיל או לנטרל אפשרות זו. 87 | \n\nלתשומת ליבך, נעשה שימוש בשירות זה אך ורק בשביל לאפשר לך לכבות את המסך בעזרת הקשה לחיצה כפולה. שירות הנגישות שלנו אינו אוסף או משתף נתונים כלל. 88 | הסכמה 89 | הרשאה 90 | לחיצה כפולה לנעילת המסך 91 | הפעלה 92 | השבתהe 93 | לא עובד? 94 | מידע 95 | מחיקה 96 | גודל הטקסט 97 | מופעל 98 | מושבת 99 | נא להפעיל את מחוות ההקשה הכפולה בשביל לצורך הנעילה 100 | ל־Olauncher אין אפשרות לנעול את המסך.\nנא לבדוק את הגדרות היישום. 101 | לבחירת יישום יש ללחוץ לחיצה ארוכה 102 | אין אפשרות לפתוח את המידע על היישום 103 | הועתק ללוח 104 | יישום מערכת, ולכן אי אפשר למחוק אותו 105 | נא לתת שם חדש ליישום תחילה 106 | היישום לא נמצא 107 | אין אפשרות להפעיל את היישום 108 | חיפוש יישום מסך בית או משגר 109 | פתיחת היישום בהחלקה שמאלה מופעלת 110 | פתיחת היישום בהחלקה ימינה מופעלת 111 | פתיחת היישום בהחלקה שמאלה כבויה 112 | פתיחת היישום בהחלקה ימינה כבויה 113 | הרקע שלך תכף יתעדכן 114 | יישום Olauncher לא מוגדר בתור ברירת מחדל.\nייתכן שעדכון הרקע היומי לא יצליח. 115 | לחיצה ארוכה להפעלה 116 | אין יישומים מוסתרים 117 | אפליקציות מוסתרות 118 | הצגה 119 | הסתרה 120 | האם אתם משתמשים בטלפון, או שהוא משתמש בכם? 121 | היי 122 | עוד תכונות… 123 | לעבר שנה טובה יותר מכל מה שקדם. שנה טובה! 124 | לא משנה איך עבר ינואר. עדיין יש לך את שאר השנה להצליח יותר מתמיד 125 | לחיים! 126 | אודות ושאלות נפוצות 127 | זמן מסך 128 | למדו עוד 129 | האם ידעת? 130 | השאירו ביקורת 131 | ‏Olauncher חינמית ותמיד תהיה. אין בה פרסומות, היא אינה אוספת נתונים, והיא מפחיתה את זמן המסך שלכם – מה שמוביל לחיים בריאים יותר. 132 | היישור השתנה ✅ 133 | מסך הבית 134 | אם ברצונך להגדיר מגבלות זמן עבור אפליקציות מסוימות, תכונת Digital Wellbeing של אנדרואיד יכולה לעזור לך לעשות זאת. חפש את Digital Wellbeing בהגדרות הטלפון שלך והפעל אותה. 135 | כדי להציג/להסתיר את זמן המסך שלך במסך הבית, אנא אפשר או בטל את הרשאת השימוש באפליקציה. הערה: לא נאספים נתוני שימוש באפליקציה. הכל מעובד במכשיר שלך. 136 | ל-Olauncher יש גם גרסת Pro בשם Pro Launcher. יש לה תכונות נוספות כמו מזג אוויר, ווידג\'טים, גופנים, תיקיות, טפטים של AMOLED וכן הלאה. זוהי גם הדרך הטובה ביותר לתמוך במפתחי Olauncher. תבדקו! 137 | שורת ההתראות 138 | 139 | -------------------------------------------------------------------------------- /app/src/main/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | تطبيق 4 | تعيين كمشغل افتراضي 5 | تعيين كمشغل افتراضي 6 | تعيين كمشغل افتراضي 7 | صفر 8 | واحد 9 | إثنان 10 | ثلاثة 11 | أربعة 12 | خمسة 13 | ستة 14 | سبعة 15 | ثمانية 16 | نصيحة: ابدأ في كتابة اسم التطبيق لتشغيله تلقائيًا 17 | حسنًا 18 | رائع! 19 | نصيحة: ابدأ الكتابة بتغيير اسم التطبيق 20 | سيتم تحديث الخلفية الخاصة بك قريبًا 21 | Olauncher ليس المشغل الافتراضي. قد يفشل التحديث اليومي للخلفية. 22 | اضغط مطولًا للتمكين 23 | لا توجد تطبيقات مخفية 24 | تطبيقات مخفية 25 | التمرير لليسار معطّل 26 | التمرير لليمين معطّل 27 | ملاحظة: اضغط على \"Olauncher\" أعلى الصفحة للعثور على تطبيقاتك المخفية. المزيد من التفاصيل متوفرة في صفحة \"حول\" أدناه. 28 | اسحب لأسفل من أجل 29 | يبحث 30 | إشعارات 31 | يرجى تشغيل أو إيقاف تشغيل خدمة الوصول في Olauncher في إعدادات جهازك لتمكين هذه الميزة أو تعطيلها. يرجى ملاحظة أن هذه الخدمة تُستخدم فقط للسماح لك بإيقاف تشغيل شاشة جهازك باستخدام إيماءة النقر المزدوج. خدمة الوصول لدينا لا تجمع أو تشارك أي بيانات. 32 | يقبل 33 | إذن 34 | النقر المزدوج للقفل 35 | تشغيل 36 | إيقاف 37 | لا يعمل؟ 38 | معلومات 39 | يمسح 40 | حجم الخط 41 | ممكّن 42 | مُطفأ 43 | يرجى تشغيل النقر المزدوج لفتح القفل 44 | فشل Olauncher في قفل الجهاز. يرجى التحقق من إعدادات التطبيق الخاص بك. 45 | اضغط مطوّلًا لاختيار التطبيق 46 | تعذر فتح التطبيق 47 | نُسخ 48 | ﻻ يمكن حذف تطبيقات النظام 49 | اكتب اسمًا جديدًا للتطبيق أولاً 50 | يعرض 51 | يخفي 52 | لون الخط 53 | انقر مرتين لقفل الشاشة 54 | يعد Olauncher باستخدام إذن قفل الشاشة بشكل مسؤول. لا يقوم Olauncher بجمع أو مشاركة أي بيانات. 55 | حول 56 | 57 | نعم 58 | أسود 59 | أبيض 60 | تغيير المشغل الافتراضي 61 | خصوصية 62 | شارك 63 | يشارك اﻵن 64 | قيّم 65 | قيّم اﻵن 66 | تابع 67 | بريد 68 | تبرّع 69 | 1. مرر لأعلى لجميع التطبيقات\n2. اضغط مطوّلًا في أي مكان للإعدادات 70 | التطبيقات على الشاشة الرئيسية 71 | تحديث الخلفية يوميّا 72 | يسار 73 | يمين 74 | مركز 75 | محاذاة التطبيق 76 | افتح عند التمرير لليسار 77 | افتح عند التمرير لليمين 78 | العرض التلقائي للوحة المفاتيح 79 | يخفي 80 | أظهر شريط الحالة 81 | إعادة تسمية 82 | إظهار التاريخ والوقت 83 | المظهر 84 | إيماءات 85 | النمط 86 | نظام 87 | مظلم 88 | مضيء 89 | مرحبًا بك في الإعدادات!\n\nتذكر، إذا كان لديك أي سؤال، فإن صفحة "حول" لدينا تحتوي على الإجابة. 90 | مرحبًا ، لن ترى هذه الرسالة مرة أخرى. 91 | \n\nإذا كنت تحب Olauncher ، فهل يمكنك أن تعطينا تصنيف 5 نجوم؟ يساعدنا ذلك على تحسين تصنيفنا ويجعلنا سعداء. شكرًا لك! 92 | مرحبا، نحن بحاجة لمساعدتكم! في العام الماضي تجاوزنا مليون عملية تنزيل. نريد هذا العام أن نصل إلى مليون آخرين ولكن لا يمكننا القيام بذلك بمفردنا. 93 | \n\nهل تتفضل بمشاركة Olauncher مع أصدقائك، من فضلك؟ شكرا لك، ويوم رائع! 94 | مرحبًا ، لوحة المفاتيح هي أسرع طريقة للعثور على التطبيقات وتشغيلها في Olauncher. هل يمكننا أن نطلب منك الاحتفاظ بهذا الأمر لبضعة أيام أخرى ثم اتخاذ القرار؟ الاختيار دائما لك. 95 | إذا كنت تريد تعيين حدود زمنية لتطبيقات معينة، فيمكن أن تساعدك ميزة الرفاهية الرقمية في Android على القيام بذلك. 96 | \n\nيرجى البحث عن الرفاهية الرقمية في إعدادات هاتفك وتمكينها. 97 | لعرض/إخفاء وقت استخدام الشاشة على الشاشة الرئيسية، يرجى السماح أو منع إذن استخدام التطبيق. 98 | \n\nملاحظة: لا يتم جمع أي بيانات حول استخدام التطبيقات. يتم معالجة كل شيء على جهازك. 99 | يحتوي Olauncher أيضًا على إصدار احترافي يسمى Pro Launcher. يحتوي على ميزات إضافية مثل الطقس، والأدوات، والخطوط، والمجلدات، وخلفيات AMOLED، وما إلى ذلك. 100 | \n\nإنه أيضًا أفضل طريقة لدعم مطوري Olauncher. تحقق من ذلك! 101 | يقدم Olauncher خلفيات جميلة جديدة يوميًا. امنح شاشتك الرئيسية مظهرًا جديدًا كل يوم، مجانًا! 102 | \n\nهل ترغب في تجربته؟ 103 | إذن الوصول مطلوب لتمكين النقر المزدوج للقفل. أي بيانات حصل عليها Olauncher عبر هذه الخدمة لن تترك جهازك. 104 | ادعم Olauncher مجانًا باستخدام رابط الشراكة التابع لشركة Amazon. 105 | في كل مرة تشتري شيئًا باستخدام الرابط الخاص بنا ، نحصل على عمولة صغيرة. يرجى حفظ الرابط واستخدامه في أي وقت تتسوق فيه عبر الإنترنت. شكرًا لك! 106 | افتح الرابط 107 | ينسخ 108 | يغلق 109 | ليس الآن 110 | خارطة طريق Olauncher العامة 111 | انستغرام 112 | تويتر 113 | خريطة الطريق 114 | تاريخ 115 | التاريخ فقط 116 | المحاذاة ﻷسفل 117 | المحاذاة ﻷعلى 118 | يرجى تعيين Olauncher كمشغل افتراضي أولاً 119 | شركة تابعة 120 | التطبيق غير موجود 121 | تعذر تشغيل التطبيق 122 | ابحث عن Launcher أو Home app 123 | التمرير لليسار مفعّل 124 | التمرير لليمين مفعّل 125 | هل تستخدم هاتفك أم أن هاتفك يستخدمك؟ 126 | عن Olauncher 127 | تعلم أكثر 128 | هل كنت تعلم؟ 129 | أخبرنا رأيك 130 | Olauncher هو وسيظل دائمًا مجانيًا تمامًا. ليس لديها إعلانات. لا يجمع أي بيانات. والأهم من ذلك أنه يساعدك على تقليل وقت الشاشة والعيش حياة رقمية أكثر صحة. 131 | \n\nنحن نعتقد أن التحول إلى الحد الأدنى من المشغل هو قرار ممتاز. على الرغم من أننا متحيزون بشكل واضح، إلا أننا نأمل أن تستمتع بالتجربة. لا تتردد في مشاركة أفكارك معنا! 132 | وقت الشاشة 133 | تم تغيير المحاذاة ✅ 134 | الشاشة الرئيسية 135 | مرحبا 136 | مزايا إضافية… 137 | إليك عامًا أفضل من كل ما سبقه. سنة جديدة سعيدة! 138 | لا يهم كيف مضى شهر يناير. لا يزال لديك بقية العام لتقدم أداءً أفضل من أي وقت مضى. 139 | هتافات! 140 | شريط الإشعارات 141 | 142 | -------------------------------------------------------------------------------- /app/src/main/res/values-sv/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | App 4 | Ange som förvald startskärmsapp 5 | Ange som förvald startskärmsapp 6 | Ange Olauncher som förvald först 7 | Textfärg 8 | Dubbeltryck för att låsa 9 | Olauncher lovar att använda skärmlåsningsbehörigheten ansvarsfullt. Olauncher varken samlar in eller delar några data. 10 | Om 11 | Av 12 | 13 | Svart 14 | Vit 15 | Ändra förvald startskärmsapp 16 | Integritet 17 | Dela 18 | Dela nu 19 | Betygsätt 20 | Betygsätt nu 21 | Följ 22 | E-post 23 | Donera 24 | 1. Svep uppåt för alla appar\n2. Långtryck var som helst för inställningar 25 | Appar på startskärmen 26 | Daglig ny bakgrundsbild 27 | Vänster 28 | Höger 29 | Mitten 30 | App-placering 31 | Vänstersvepsapp 32 | Högersvepsapp 33 | 0 34 | 1 35 | 2 36 | 3 37 | 4 38 | 5 39 | 6 40 | 7 41 | 8 42 | Tips: Börja skriv namnet på en app för att autostarta den 43 | Okej 44 | Coolt! 45 | Visa tangentbord automatiskt 46 | Dölj 47 | Statusfält överst 48 | Byt namn 49 | Visa datum och tid 50 | Utseende 51 | Gester 52 | Tema 53 | System 54 | Mörkt 55 | Ljust 56 | Välkommen till inställningarna! 57 | \n\nKom ihåg, om du har några frågor har vår sida Om oss svaret. 58 | Hejsan, du kommer inte att se detta meddelande igen. 59 | \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! 60 | 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. 61 | \n\nKan du dela Olauncher med dina vänner? Olauncher behöver människor, och människor behöver Olauncher. 62 | 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? 63 | \n\nValet är alltid ditt. 64 | 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. 65 | \n\nVänligen sök efter Digitalt välmående i dina telefoninställningar och aktivera den. 66 | För att visa/dölja din skärmtid på startsidan, vänligen tillåt eller neka appanvändningsbehörigheten. 67 | \n\nObs: Inga data om appanvändning samlas in. Allt bearbetas på din enhet. 68 | 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. 69 | \n\nDet är också det bästa sättet att stödja utvecklarna av Olauncher. Kolla in det! 70 | Olauncher erbjuder vackra nya bakgrundsbilder varje dag. Ge din hemskärm ett fräscht utseende varje dag, gratis! 71 | \n\nVill du prova? 72 | 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. 73 | Stöd Olauncher utan kostnad genom att använda vår Amazon-affiliatelänk. 74 | 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! 75 | Öppna länk 76 | Kopiera 77 | Stäng 78 | Inte nu 79 | Olaunchers offentliga färdplan 80 | Instagram 81 | Utvecklare 82 | Färdplan 83 | Datum 84 | Endast datum 85 | Botten: På 86 | Botten: Av 87 | Vänligen ange Olauncher som förvald först 88 | Affiliate 89 | Tips: Börja skriv för BYT NAMN-alternativ för appen 90 | 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. 91 | Svep nedåt för 92 | Sök 93 | Aviseringar 94 | 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. 95 | \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. 96 | Godkänn 97 | Behörighet 98 | Dubbeltryck för att låsa 99 | Aktivera 100 | Inaktivera 101 | Fungerar inte? 102 | Info 103 | Radera 104 | Textstorlek 105 | Aktiverad 106 | Inaktiverad 107 | Vänligen sätt på dubbeltryck för att låsa 108 | Olauncher lyckades inte låsa enheten.\nVänligen kontrollera dina appinställningar. 109 | Långtryck för att välja app 110 | Kunde inte öppna appinfon 111 | Kopierad 112 | Systemapp, kan inte raderas 113 | Skriv ett nytt appnamn först 114 | Appen hittades inte 115 | Kunde inte starta appen 116 | Sök efter startskärmsapp 117 | Vänstersvepsapp aktiverad 118 | Högersvepsapp aktiverad 119 | Vänstersvepsapp inaktiverad 120 | Högersvepsapp inaktiverad 121 | Din bakgrundsbild kommer att uppdateras inom kort 122 | Olauncher är inte förvald. Uppdatering av bakgrundsbild kommer att misslyckas. 123 | Långtryck för att aktivera 124 | Inga dolda appar 125 | Dolda appar 126 | Visa 127 | Dölj 128 | Använder du din telefon, eller använder din telefon dig? 129 | Om Olauncher 130 | Skärmtid 131 | Läs mer 132 | Visste du? 133 | Lämna en recension 134 | 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. 135 | \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! 136 | Justering ändrad ✅ 137 | Startskärm 138 | Hej 139 | Fler funktioner… 140 | För ett år bättre än alla tidigare. Gott nytt år! 141 | Det spelar ingen roll hur januari gick. Du har fortfarande resten av året på dig att göra bättre ifrån dig än någonsin. 142 | Skål! 143 | Aviseringsfält 144 | -------------------------------------------------------------------------------- /app/src/main/res/values-hr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Aplikacija 4 | Postavi kao zadani pokretač 5 | Postavi kao zadani pokretač 6 | Postavi kao zadani pokretač 7 | Boja teksta 8 | Dvostruki dodir za zaključavanje 9 | Olauncher obećava da će odgovorno koristiti dozvolu za zaključavanje zaslona. 10 | Informacije 11 | Isklj. 12 | Uklj. 13 | Crno 14 | Bijelo 15 | Promijeni zadani pokretač 16 | Privatnost 17 | Podijeli 18 | Podijeli 19 | Ocijeni 20 | Ocijeni 21 | Prati 22 | E-pošta 23 | Doniraj 24 | 1. Povuci prema gore za aplikacije\n2. Dugo pritisnite bilo gdje za postavke 25 | Aplikacije na početnoj stranici 26 | Dnevne pozadine 27 | Lijevo 28 | Desno 29 | Sredina 30 | Poravnanje aplikacija 31 | Aplikacija za lijevi potez 32 | Aplikacija za desni potez 33 | 0 34 | 1 35 | 2 36 | 3 37 | 4 38 | 5 39 | 6 40 | 7 41 | 8 42 | Savjet: Povuci prema dolje za zatvaranje. Pomakni zaslon za zatvaranje tipkovnice. 43 | U redu 44 | Cool! 45 | Automatski prikaži tipkovnicu 46 | Sakrij 47 | Prikaži statusnu traku 48 | Preimenuj 49 | Prikaži datum i vrijeme 50 | Izgled 51 | Geste 52 | Tema 53 | Sustav 54 | Tamna 55 | Svijetla 56 | Dobrodošli u postavke! 57 | \n\nZapamtite, ako imate bilo kakvih pitanja, naša stranica O nama ima odgovor. 58 | Ovu poruku više nećeš vidjeti. 59 | \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! 60 | 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. 61 | \n\nHoćete li, molim vas, biti ljubazni podijeliti Olauncher sa svojim prijateljima? Hvala i ugodan dan! 62 | 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? 63 | \n\nIzbor je uvijek vaš. 64 | Ako želite postaviti vremenska ograničenja za određene aplikacije, značajka Digital Wellbeing na Androidu može vam pomoći u tome. 65 | \n\nPotražite Digital Wellbeing u postavkama telefona i omogućite ga. 66 | Da biste prikazali/sakrili vrijeme korištenja ekrana na početnom zaslonu, molimo dozvolite ili onemogućite dopuštenje korištenja aplikacije. 67 | \n\nNapomena: Ne prikupljaju se podaci o korištenju aplikacije. Sve se obrađuje na vašem uređaju. 68 | Olauncher također ima pro verziju pod nazivom Pro Launcher. Ima dodatne značajke poput vremena, widgeta, fontova, mapa, AMOLED pozadina itd. 69 | \n\nTo je također najbolji način da podržite programere Olauncher-a. Pogledajte! 70 | Olauncher nudi predivne nove pozadine svaki dan. Daj svom početnom ekranu svjež izgled svaki dan, besplatno! 71 | \n\nŽeliš li isprobati? 72 | 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. 73 | Besplatno podrži Olauncher korištenjem naše sponzorske poveznice za Amazon. 74 | Svaki puta kada kupiš nešto pomoću naše poveznice, mi primimo malu naknadu. Molimo spremi poveznicu i koristi ju svaki puta kada kupuješ online.\nHvala ti! 75 | Otvori poveznicu 76 | Kopiraj 77 | Zatvori 78 | Ne sad 79 | Javni plan razvoja Olaunchera 80 | Instagram 81 | Twitter 82 | Plan razvoja 83 | Datum 84 | Samo datum 85 | Dno: uklj. 86 | Dno: isklj. 87 | Prvo postavite Olauncher kao zadani pokretač 88 | Sponzorstvo 89 | Savjet: počni pisati za opciju preimenovanja aplikacija 90 | Pazi: Dodirni \'Olauncher\' na vrhu da pronađeš svoje skrivene aplikacije.\n\nViše detalja dostupno dolje na našoj stranici Informacije. 91 | Povuci prema dolje za 92 | Pretraživanje 93 | Obavijesti 94 | Saznajte više 95 | Dali si znao? 96 | Vrijeme na ekranu 97 | Ostavite recenziju 98 | 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. 99 | \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! 100 | 101 | 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. 102 | Prihvati 103 | Dozvola 104 | Dvostruki dodir za zaključavanje 105 | Omogući 106 | Onemogući 107 | Ne radi? 108 | Informacije 109 | Izbriši 110 | Veličina teksta 111 | Omogućeno 112 | Onemogućeno 113 | Molimo vas da uključite dvostruki dodir za otključavanje 114 | Olauncher nije uspio zaključati uređaj.\nMolimo provjerite postavke aplikacije. 115 | Dugo pritisnite za odabir aplikacije 116 | Nije moguće otvoriti informacije o aplikaciji 117 | Kopirano 118 | Sistemska aplikacija, ne može se izbrisati 119 | Prvo upišite novo ime aplikacije 120 | Aplikacija nije pronađena 121 | Nije moguće pokrenuti aplikaciju 122 | Pretraži Launcher ili Home aplikaciju 123 | Povucite lijevo, aplikacija omogućena 124 | Povucite desno, aplikacija omogućena 125 | Povucite lijevo, aplikacija onemogućena 126 | Povucite desno, aplikacija onemogućena 127 | Vaša pozadina će se uskoro ažurirati 128 | Olauncher nije zadani. Ažuriranje pozadine će ne uspjeti. 129 | Dugo pritisnite za omogućavanje 130 | Nema skrivenih aplikacija 131 | Skrivene aplikacije 132 | Prikaži 133 | Sakrij 134 | Koristite li svoj telefon ili vaš telefon koristi vas? 135 | O Olauncher-u i ČPP 136 | Poravnanje promijenjeno ✅ 137 | Početni ekran 138 | Bok 139 | Više značajki… 140 | Neka je ova godina bolja od svih prije. Sretna nova godina! 141 | Nije važno kako je prošao siječanj. Još uvijek imate ostatak godine da budete bolji nego ikad. 142 | Živjeli! 143 | Traka obavijesti 144 | 145 | -------------------------------------------------------------------------------- /app/src/main/res/values-tr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Uygulama 4 | Varsayılan başlatıcı olarak ayarla 5 | Varsayılan başlatıcı olarak ayarla 6 | Varsayılan başlatıcı olarak ayarla 7 | 0 8 | 1 9 | 2 10 | 3 11 | 4 12 | 5 13 | 6 14 | 7 15 | 8 16 | İpucu: Otomatik başlatmak için bir uygulama adı yazın 17 | Tamam 18 | Harika! 19 | İpucu: Uygulama ismi değiştirmek için yazmaya başlayın 20 | Duvar kağıdınız birazdan güncellenecek 21 | Olauncher varsayılan başlatıcınız değil. Günlük duvar kağıtları hatalı çalışabilir. 22 | Etkinleştirmek için uzun basın 23 | Gizli uygulama yok 24 | Gizli uygulamalar 25 | Not: Gizli uygulamalarınızı bulmak için bu ayarlar sayfasının üst kısmındaki \"Olauncher\" yazısına dokunun. 26 | \n\nDaha fazla ayrıntı "Hakkında" sayfasında mevcuttur. 27 | Aşağı kaydır: 28 | Ara 29 | Bildirimler 30 | 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. 31 | \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. 32 | Kabul et 33 | İzin 34 | Kilitlemek için iki kez dokunun 35 | Etkinleştir 36 | Devre dışı bırak 37 | Çalışmıyor mu? 38 | Bilgi 39 | Sil 40 | Yazı Boyutu 41 | Etkin 42 | Devre Dışı 43 | Lütfen kilitlemek için çift dokunmayı açın 44 | Olauncher cihazı kilitleyemedi. Lütfen uygulama ayarlarınızı kontrol edin. 45 | Uygulamayı seçmek için uzun basın 46 | Uygulama bilgisi açılamıyor 47 | Kopyalandı 48 | Sistem uygulaması, silinemez 49 | Önce yeni bir uygulama adı yazın 50 | Göster 51 | Gizle 52 | Metin rengi 53 | Kilitlemek için çift dokunun 54 | Olauncher, kilit ekranı iznini sorumlu bir şekilde kullanacaktır. Olauncher herhangi bir veri toplamaz veya paylaşmaz. 55 | Hakkında 56 | Kapalı 57 | Açık 58 | Siyah 59 | Beyaz 60 | Varsayılan başlatıcıyı değiştir 61 | Gizlilik 62 | Paylaş 63 | Şimdi paylaş 64 | Değerlendir 65 | Şimdi değerlendir 66 | Takip et 67 | E-posta 68 | 69 | Bağış yap 70 | 1. Tüm uygulamalar için yukarı kaydırın\n2. Ayarlar için herhangi bir yere uzun basın 71 | Ana ekran uygulamaları 72 | Günlük duvar kağıtları 73 | Sol 74 | Sağ 75 | Merkez 76 | Uygulama hizalaması 77 | Sola kaydırma uygulaması 78 | Sağa kaydırma uygulaması 79 | Klavyeyi otomatik göster 80 | Sakla 81 | Durum çubuğunu göster 82 | Yeniden isimlendir 83 | Tarih ve saati göster 84 | Görünüm 85 | Hareket 86 | Tema modu 87 | Sistem 88 | Koyu 89 | Açık 90 | Ayarlar sayfasına hoş geldiniz! 91 | \n\nUnutmayın, herhangi bir sorunuz olursa "Hakkında" sayfamıza danışabilirsiniz. 92 | Merhaba, bu mesajı bir daha görmeyeceksiniz. 93 | \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! 94 | 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. 95 | \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! 96 | 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. 97 | \n\nSeçim her zaman sizindir. 98 | Belirli uygulamalar için zaman sınırları belirlemek istiyorsanız Android\'in Dijital Denge özelliği bunu yapmanıza yardımcı olacaktır. 99 | \n\nLütfen telefon ayarlarınızda Dijital Denge\'yi arayın ve etkinleştirin. 100 | Ana ekranınızda ekran sürenizi göstermek/gizlemek için lütfen uygulama kullanım iznini onaylayın veya reddedin. 101 | \n\nNot: Uygulama kullanım verileri toplanmaz. Her şey cihazınızda işlenir. 102 | 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. 103 | \n\nAyrıca Olauncher geliştiricilerini desteklemenin en iyi yoludur. Mutlaka inceleyin! 104 | 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! 105 | \n\nDenemek ister misiniz? 106 | 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. 107 | Amazon ortaklık bağlantımızı kullanarak Olauncher\'ı ücretsiz olarak destekleyin. 108 | 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! 109 | Linki aç 110 | Kopyala 111 | Kapat 112 | Şimdi değil 113 | Olauncher Yol Çizelgesi 114 | Instagram 115 | Twitter 116 | Yol Çizelgesi 117 | Tarih 118 | Sadece tarih 119 | Alt: Açık 120 | Alt: Kapalı 121 | Lütfen önce Olauncher\'ı varsayılan başlatıcınız olarak ayarlayın 122 | Ortak 123 | Uygulama bulunamadı 124 | Uygulama başlatılamadı 125 | Başlatıcı veya Ana Menü uygulamasını arayın 126 | Sola kaydırma uygulaması etkin 127 | Sağa kaydırma uygulaması etkin 128 | Sola kaydırma uygulaması devre dışı 129 | Sağa kaydırma uygulaması devre dışı 130 | Sen mi telefonunu, kullanıyorsun yoksa telefon mu seni kullanıyor? 131 | Olauncher Hakkında 132 | Daha fazla bilgi 133 | Ekran süresi 134 | Biliyor muydunuz? 135 | Değerlendirme bırakın 136 | 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. 137 | \n\nUmarım hoşunuza gider. Düşüncelerinizi mutlaka bizimle paylaşın! 138 | Hizalama değiştirildi ✅ 139 | Ana ekran 140 | Merhaba 141 | Daha fazla özellik… 142 | Öncekilerin hepsinden daha iyi bir yıl olsun. Mutlu yıllar! 143 | Ocak ayının nasıl geçtiği önemli değil. Her zamankinden daha iyisini yapmak için hala yılın geri kalanı var. 144 | Şerefe! 145 | Bildirim çubuğu 146 | 147 | -------------------------------------------------------------------------------- /app/src/main/res/values-pl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Aplikacja 4 | Ustaw jako domyślny program uruchamiający 5 | Ustaw jako domyślny program uruchamiający 6 | Ustaw jako domyślny program uruchamiający 7 | 0 8 | 1 9 | 2 10 | 3 11 | 4 12 | 5 13 | 6 14 | 7 15 | 8 16 | Wskazówka: zacznij wpisywać nazwę aplikacji, aby uruchomić ją automatycznie 17 | OK 18 | Fajny! 19 | Wskazówka: zacznij pisać by zmienić nazwę aplikacji 20 | Twoja tapeta zostanie wkrótce zaktualizowana 21 | Olauncher nie jest domyślnym programem uruchamiającym. Codzienna aktualizacja tapety może się nie powieść. 22 | Naciśnij długo, aby włączyć 23 | Brak ukrytych aplikacji 24 | Ukrytych aplikacji 25 | Uwaga: Stuknij w „Olauncher” u góry tej strony ustawień, aby znaleźć ukryte aplikacje. 26 | \n\nWięcej informacji znajduje się na stronie Informacje poniżej. 27 | Przesuń w dół, aby 28 | Szukaj 29 | Powiadomienia 30 | Włącz lub wyłącz usługę ułatwień dostępu Olauncher w ustawieniach swojego urządzenia, aby włączyć lub wyłączyć tę funkcję. 31 | \n\nNależy pamiętać, że ta usługa służy wyłącznie do wyłączania ekranu urządzenia za pomocą gestu dwukrotnego dotknięcia. Nasza usługa ułatwień dostępu nie gromadzi ani nie udostępnia żadnych danych. 32 | Akceptuj 33 | Uprawnienie 34 | Kliknij dwukrotnie, aby zablokować 35 | Włącz 36 | Wyłącz 37 | Nie działa? 38 | Informacje 39 | Usuń 40 | Rozmiar czcionki 41 | Włączony 42 | Wyłączony 43 | Włącz podwójne dotknięcie, aby zablokować 44 | Olauncherowi nie udało się zablokować urządzenia. Sprawdź ustawienia aplikacji. 45 | Naciśnij długo, aby wybrać aplikację 46 | Nie można otworzyć informacji o aplikacji 47 | Skopiowane 48 | Aplikacja systemowa, nie można usunąć 49 | Najpierw wpisz nową nazwę aplikacji 50 | Pokaż 51 | Ukryj 52 | Kolor tekstu 53 | Kliknij dwukrotnie, aby zablokować 54 | Olauncher obiecuje odpowiedzialnie korzystać z uprawnień blokady ekranu. Olauncher nie gromadzi ani nie udostępnia żadnych danych. 55 | Informacje 56 | Nie 57 | Tak 58 | Czarny 59 | Biały 60 | Zmień domyślny program uruchamiający 61 | Prywatność 62 | Udostępnij 63 | Udostępnij 64 | Oceń 65 | Oceń 66 | Śledź 67 | E-mail 68 | 69 | Wspomóż 70 | 1. Przesuń palcem w górę, aby wyświetlić wszystkie aplikacje\n2. Naciśnij i przytrzymaj dowolne miejsce, aby przejść do ustawień 71 | Aplikacje na ekranie głównym 72 | Codziennie nowa tapeta 73 | Lewo 74 | Prawo 75 | Środek 76 | Wyrównanie aplikacji 77 | Przesuń w lewo aplikację 78 | Przesuń w prawo aplikację 79 | Automatyczne wyświetlanie klawiatury 80 | Ukryj 81 | Pokaż pasek stanu 82 | Zmień nazwę 83 | Pokaż datę i godzinę 84 | Wygląd 85 | Gesty 86 | Temat 87 | System 88 | Ciemny 89 | Jasny 90 | Witamy w ustawieniach! 91 | \n\nPamiętaj, jeśli masz jakiekolwiek pytania, nasza strona „O nas” ma odpowiedź. 92 | 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. 93 | 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ć. 94 | \n\nCzy byłbyś tak miły i udostępnił Olauncher swoim znajomym? Dziękuję i życzę cudownego dnia! 95 | 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. 96 | Jeśli chcesz ustawić limity czasowe dla niektórych aplikacji, funkcja Cyfrowa równowaga w systemie Android może Ci w tym pomóc. 97 | \n\nWyszukaj opcję Cyfrowa równowaga w ustawieniach telefonu i włącz ją. 98 | Aby wyświetlić/ukryć czas ekranu na ekranie głównym, pozwól lub zabroń aplikacji na dostęp do danych o użyciu. 99 | \n\nUwaga: Nie są gromadzone żadne dane o użyciu aplikacji. Wszystko jest przetwarzane na Twoim urządzeniu. 100 | Olauncher ma również wersję pro o nazwie Pro Launcher. Posiada dodatkowe funkcje, takie jak pogoda, widgety, czcionki, foldery, tapety AMOLED itp. 101 | \n\nTo także najlepszy sposób na wsparcie deweloperów Olauncher. Sprawdź to! 102 | Olauncher oferuje piękne nowe tapety codziennie. Nadaj swojemu ekranowi głównemu świeży wygląd każdego dnia, za darmo! 103 | \n\nChcesz spróbować? 104 | 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. 105 | Wesprzyj Olauncher za darmo, korzystając z naszego linku afiliacyjnego Amazon. 106 | 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ę! 107 | Otwórz łącze 108 | Kopiuj 109 | Zamknij 110 | Nie teraz 111 | Publiczna mapa drogowa Olauncher 112 | Instagram 113 | Twitter 114 | Mapa drogowa 115 | Data 116 | Tylko data 117 | Dół: włączony 118 | Dół: wyłączone 119 | Najpierw ustaw Olauncher jako domyślny program uruchamiający 120 | Przyłącz 121 | Nie znaleziono aplikacji 122 | Nie można uruchomić aplikacji 123 | Wyszukaj program uruchamiający lub aplikację domową 124 | Gest Przesuń w lewo jest włączony 125 | Gest Przesuń w prawo jest włączony 126 | Gest Przesuń w lewo wyłączony 127 | Gest Przesuń w prawo jest wyłączony 128 | Czy używasz telefonu, czy telefon używa ciebie? 129 | O Olauncher 130 | Czas ekranowy 131 | Ucz się więcej 132 | Czy wiedziałeś? 133 | Ucz się więcej 134 | 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. 135 | \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! 136 | Wyrównanie zmienione ✅ 137 | Ekran główny 138 | Hej 139 | Więcej funkcji… 140 | Za rok lepszy niż wszystkie poprzednie. Szczęśliwego nowego roku! 141 | Nie ma znaczenia, jak minął styczeń. Wciąż masz resztę roku, aby poradzić sobie lepiej niż kiedykolwiek. 142 | Na zdrowie! 143 | Pasek powiadomień 144 | 145 | -------------------------------------------------------------------------------- /app/src/main/res/values-uk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Додаток 4 | Зробити лаунчером за замовчування 5 | Зробити лаунчером за замовчування 6 | Зробити лаунчером за замовчування 7 | Кольор тексту 8 | Блокування подвійним тапом 9 | Olauncher обіцяє відповідально використовувати роздільну здатність екрана блокування. Olauncher не збирає і не передає будь-які дані. 10 | Про нас 11 | Викл 12 | Вкл 13 | Чорний 14 | Білий 15 | Змінити лаунчер за замовчуванням 16 | Конфіденційність 17 | Поділитися 18 | Поділитися 19 | Оцінити 20 | Оцінити 21 | Перейти 22 | Электронна пошта 23 | 24 | Пожертвувати 25 | 1. Проведіть вгору, щоб відкрити всі програми.\n2. Тривалим натисканням будь-де відкриваються налаштування 26 | Кількість програм на головному екрані 27 | Щодня нові шпалери 28 | Ліворуч 29 | Праворуч 30 | По центру 31 | Вирівнювання додатків 32 | Проведіть вліво для 33 | Проведіть вправо для 34 | 0 35 | 1 36 | 2 37 | 3 38 | 4 39 | 5 40 | 6 41 | 7 42 | 8 43 | Порада. Почніть вводити назву програми, щоб вона запустилася автоматично. 44 | Добре 45 | Круто! 46 | Автопоказ клавіатури 47 | Приховати 48 | Показувати рядок стану 49 | Перенайменувати 50 | Показувати дату та час 51 | Поява 52 | Жести 53 | Тема 54 | Системна 55 | Темна 56 | Світла 57 | Ласкаво просимо до налаштувань! 58 | \n\nПам\'ятайте, якщо у вас є питання, на нашій сторінці «Про нас» є відповідь. 59 | Привіт, ти більше не побачиш це повідомлення. 60 | \n\nЯкщо вам подобається Olauncher, чи можете ви поставити нам 5 зірок? Це допомагає нам покращити наш рейтинг і робить нас щасливими. Дякую тобі! 61 | Привіт, нам потрібна ваша допомога! Минулого року ми перевищили мільйон завантажень. Цього року ми хочемо досягти мільйона більше, але ми не можемо зробити це поодинці. 62 | \n\nБудь ласка, не могли б ви поділитися Olauncher зі своїми друзями? Дякую і гарного дня! 63 | Привіт, клавіатура - це найшвидший спосіб знайти та запустити програми в Olauncher. Чи можемо ми попросити вас залишити це увімкненим ще на кілька днів, а потім прийняти рішення? 64 | \n\nВибір завжди за вами. 65 | Якщо ви хочете встановити часові обмеження для певних програм, функція цифрового добробуту Android може допомогти вам це зробити. 66 | \n\nЗнайдіть Digital Wellbeing у налаштуваннях телефону та ввімкніть його. 67 | Щоб показати/ховати час роботи з екраном на головному екрані, будь ласка, дозвольте або забороніть дозвіл на використання програми. 68 | \n\nПримітка: Не збираються дані про використання програми. Все обробляється на вашому пристрої. 69 | Olauncher також має професійну версію під назвою Pro Launcher. Вона має додаткові функції, такі як погода, віджети, шрифти, папки, фони AMOLED тощо. 70 | \n\nЦе також найкращий спосіб підтримати розробників Olauncher. Ознайомтеся! 71 | Olauncher пропонує красиві нові шпалери щодня. Дайте вашому головному екрану новий вигляд кожного дня, безкоштовно! 72 | \n\nХочете спробувати? 73 | " Дозвіл на доступ потрібний, щоб увімкнути подвійне торкання для блокування. Будь-які дані, отримані Olauncher через цей сервіс, не залишать ваш пристрій." 74 | Підтримайте Olauncher безкоштовно, використовуючи наше партнерське посилання Amazon. 75 | Щоразу, коли ви купуєте щось за нашим посиланням, ми отримуємо невелику комісію. Будь ласка, збережіть посилання та використовуйте його для здійснення покупок в Інтернеті.\nСпасибі! 76 | Відкрити посилання 77 | Копіювати 78 | Закрити 79 | Не зараз 80 | Публічна дорожня карта Olauncher 81 | Instagram 82 | Twitter 83 | Дорожня карта 84 | Дата 85 | Толільки дата 86 | Внизу: Вкл 87 | Внизу: Викл 88 | Спочатку встановіть Olauncher як стандартний лаунчер. 89 | Партнер 90 | Порада: почніть вводити текст, щоб перейменувати програму. 91 | Примітка. Натисніть «Olauncher» у верхній частині сторінки налаштувань, щоб знайти приховані програми. 92 | \n\nДокладніша інформація доступна на нашій сторінці «Про нас» нижче. 93 | Проведіть вниз для 94 | Пошук 95 | Повідомлення 96 | Щоб увімкнути або вимкнути цю функцію, увімкніть або відключіть службу Olauncher у налаштуваннях Вашого пристрою. 97 | \n\nЗверніть увагу, що ця служба використовується тільки для того, щоб ви могли вимкнути екран вашого пристрою за допомогою подвійного торкання жесту. Наша служба доступності не збирає і не передає жодних даних. 98 | Прийняти 99 | Дозвіл 100 | Блокування подвійним дотиком 101 | Включити 102 | Виключити 103 | Не працює? 104 | Інформація 105 | Видалити 106 | Розмір тексту 107 | Включено 108 | Виключено 109 | Будь ласка, увімкніть подвійний дотик для блокування 110 | Olauncher не вдалося заблокувати пристрій.\nБудь ласка, перевірте налаштування вашої програми. 111 | Тривале натискання для вибору програми 112 | Неможливо відкрити інформацію про програму 113 | Скопійовано 114 | Неможливо видалити системну програму 115 | Спочатку введіть нове ім\'я програми 116 | Додаток не знайдено 117 | Неможливо запустити програму 118 | Знайдіть додаток Launcher або Home 119 | Додаток для лівого свайпа включено 120 | Додаток для правого свайпа включено 121 | Додаток для лівого свайпа вимкнено 122 | Додаток для правого свайпа вимкнено 123 | Ваші шпалери незабаром оновляться 124 | Olauncher не є стандартним лаунчером.\nЩоденне оновлення шпалер може завершитися помилкою. 125 | Натисніть та утримуйте, щоб увімкнути 126 | Немає прихованих додатків 127 | Приховані додатків 128 | Показати 129 | Приховати 130 | Ви користуєтеся своїм телефоном, чи ваш телефон використовує вас? 131 | Про нас Olauncher 132 | Вивчайте більше 133 | Час екрану 134 | Ти знав? 135 | Залиште відгук 136 | Olauncher є і завжди буде абсолютно безкоштовним. У ньому немає реклами. Він не збирає дані. Найважливіше те, що це допомагає вам скоротити час використання екрана та жити здоровішим цифровим життям. 137 | \n\nМи вважаємо, що перехід на мінімальний лаунчер є відмінним рішенням. Хоча ми явно упереджені, ми сподіваємося, що вам сподобається. Не соромтеся поділитися з нами своїми думками! 138 | Вирівнювання змінено ✅ 139 | Головний екран 140 | Привіт 141 | Більше функцій… 142 | За рік, кращий за всі попередні. З новим роком! 143 | " Неважливо, як пройшов січень. У вас ще є решта року, щоб досягти успіху, як ніколи раніше." 144 | будьмо! 145 | Панель сповіщень 146 | 147 | --------------------------------------------------------------------------------