From 3597baee1f7d3c1a07c08db3e8956a051aef6cad Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Fri, 14 Mar 2025 22:33:08 +0100 Subject: [PATCH 01/50] fix problem which switching from grayscale icons back to normal --- .../main/java/de/jrpie/android/launcher/Functions.kt | 2 +- .../main/java/de/jrpie/android/launcher/ui/Helper.kt | 12 ++++++++---- .../launcher/ui/list/apps/AppsRecyclerAdapter.kt | 12 ++++++------ .../actions/SettingsFragmentActionsRecycler.kt | 4 +--- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index 57f13a5..d5e8d13 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -194,7 +194,7 @@ fun getApps( loadList.add(detailedAppInfo) } } - loadList.sortBy { it.getCustomLabel(context).toString() } + loadList.sortBy { it.getCustomLabel(context) } var end = System.currentTimeMillis() Log.i(LOG_TAG, "${loadList.size} apps loaded (${end - start}ms)") diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt b/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt index b8fc82e..1ca4d2b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/Helper.kt @@ -27,10 +27,14 @@ fun View.blink( } // Taken from: https://stackoverflow.com/a/30340794/12787264 -fun ImageView.transformGrayscale() { - this.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply { - setSaturation(0f) - }) +fun ImageView.transformGrayscale(grayscale: Boolean) { + this.colorFilter = if (grayscale) { + ColorMatrixColorFilter(ColorMatrix().apply { + setSaturation(0f) + }) + } else { + null + } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt index 1f275e4..c4428b7 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt @@ -47,6 +47,7 @@ class AppsRecyclerAdapter( private val apps = (activity.applicationContext as Application).apps private val appsListDisplayed: MutableList = mutableListOf() + private val grayscale = LauncherPreferences.theme().monochromeIcons() // temporarily disable auto launch var disableAutoLaunch: Boolean = false @@ -79,20 +80,19 @@ class AppsRecyclerAdapter( override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { var appLabel = appsListDisplayed[i].getCustomLabel(activity) + val appIcon = appsListDisplayed[i].getIcon(activity) + + viewHolder.img.transformGrayscale(grayscale) + viewHolder.img.setImageDrawable(appIcon.constantState?.newDrawable() ?: appIcon) + if (layout.useBadgedText) { appLabel = activity.packageManager.getUserBadgedLabel( appLabel, appsListDisplayed[i].getUser(activity) ).toString() } - - val appIcon = appsListDisplayed[i].getIcon(activity) - viewHolder.textView.text = appLabel - viewHolder.img.setImageDrawable(appIcon) - if (LauncherPreferences.theme().monochromeIcons()) - viewHolder.img.transformGrayscale() // decide when to show the options popup menu about if (intention == ListActivity.ListActivityIntention.VIEW) { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt index 1f91913..630b5b0 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt @@ -143,9 +143,7 @@ class ActionsRecyclerAdapter(val activity: Activity) : val description = gesture.getDescription(activity) viewHolder.descriptionTextView.text = description - - if (LauncherPreferences.theme().monochromeIcons()) - viewHolder.img.transformGrayscale() + viewHolder.img.transformGrayscale(LauncherPreferences.theme().monochromeIcons()) updateViewHolder(gesture, viewHolder) viewHolder.img.setOnClickListener { chooseApp(gesture) } From c1511cd475331381221bdfe4a033f31006fb86b1 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 15 Mar 2025 03:11:08 +0100 Subject: [PATCH 02/50] merge #124 - improve tutorial * Add new "app list" section * Rename fragments * Replace screenshots * Replace ViewPager by ViewPager2 * Add navigation buttons Co-authored-by: Luke Wass --- .../launcher/ui/tutorial/TutorialActivity.kt | 109 ++++++++++++------ ...mentStart.kt => TutorialFragment0Start.kt} | 12 +- ...Concept.kt => TutorialFragment1Concept.kt} | 10 +- ...mentUsage.kt => TutorialFragment2Usage.kt} | 6 +- .../tutorial/tabs/TutorialFragment3AppList.kt | 30 +++++ ...mentSetup.kt => TutorialFragment4Setup.kt} | 6 +- ...ntFinish.kt => TutorialFragment5Finish.kt} | 10 +- .../drawable/baseline_navigate_before_24.xml | 11 ++ .../drawable/baseline_navigate_next_24.xml | 11 ++ .../main/res/drawable/home_round_screen.png | Bin 163224 -> 0 bytes app/src/main/res/drawable/round_outline.xml | 6 + .../main/res/drawable/tutorial_app_list.png | Bin 0 -> 127430 bytes .../res/drawable/tutorial_home_screen.png | Bin 0 -> 23704 bytes app/src/main/res/layout/tutorial.xml | 32 ++++- ...utorial_start.xml => tutorial_0_start.xml} | 14 +-- ...ial_concept.xml => tutorial_1_concept.xml} | 21 +++- ...utorial_usage.xml => tutorial_2_usage.xml} | 6 +- .../main/res/layout/tutorial_3_app_list.xml | 64 ++++++++++ ...utorial_setup.xml => tutorial_4_setup.xml} | 2 +- ...orial_finish.xml => tutorial_5_finish.xml} | 3 +- app/src/main/res/values/donottranslate.xml | 2 +- app/src/main/res/values/strings.xml | 47 ++++---- 22 files changed, 298 insertions(+), 104 deletions(-) rename app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/{TutorialFragmentStart.kt => TutorialFragment0Start.kt} (59%) rename app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/{TutorialFragmentConcept.kt => TutorialFragment1Concept.kt} (68%) rename app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/{TutorialFragmentUsage.kt => TutorialFragment2Usage.kt} (75%) create mode 100644 app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment3AppList.kt rename app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/{TutorialFragmentSetup.kt => TutorialFragment4Setup.kt} (74%) rename app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/{TutorialFragmentFinish.kt => TutorialFragment5Finish.kt} (80%) create mode 100644 app/src/main/res/drawable/baseline_navigate_before_24.xml create mode 100644 app/src/main/res/drawable/baseline_navigate_next_24.xml delete mode 100644 app/src/main/res/drawable/home_round_screen.png create mode 100644 app/src/main/res/drawable/round_outline.xml create mode 100644 app/src/main/res/drawable/tutorial_app_list.png create mode 100644 app/src/main/res/drawable/tutorial_home_screen.png rename app/src/main/res/layout/{tutorial_start.xml => tutorial_0_start.xml} (62%) rename app/src/main/res/layout/{tutorial_concept.xml => tutorial_1_concept.xml} (75%) rename app/src/main/res/layout/{tutorial_usage.xml => tutorial_2_usage.xml} (92%) create mode 100644 app/src/main/res/layout/tutorial_3_app_list.xml rename app/src/main/res/layout/{tutorial_setup.xml => tutorial_4_setup.xml} (95%) rename app/src/main/res/layout/{tutorial_finish.xml => tutorial_5_finish.xml} (92%) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt index fd60d19..12c6c8a 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt @@ -4,23 +4,26 @@ import android.content.Intent import android.content.res.Resources import android.os.Build import android.os.Bundle +import android.view.View import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter -import androidx.viewpager.widget.ViewPager -import com.google.android.material.tabs.TabLayout -import de.jrpie.android.launcher.R +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.tabs.TabLayoutMediator import de.jrpie.android.launcher.REQUEST_CHOOSE_APP +import de.jrpie.android.launcher.databinding.TutorialBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.ui.UIObject -import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentConcept -import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentFinish -import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentSetup -import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentStart -import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentUsage +import de.jrpie.android.launcher.ui.blink +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment0Start +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment1Concept +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment2Usage +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment3AppList +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment4Setup +import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment5Finish /** * The [TutorialActivity] is displayed automatically on new installations. @@ -31,10 +34,16 @@ import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentUsage */ class TutorialActivity : AppCompatActivity(), UIObject { + private lateinit var binding: TutorialBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) super.onCreate() + // Initialise layout + binding = TutorialBinding.inflate(layoutInflater) + setContentView(binding.root) + // Handle back key / gesture on Android 13+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { onBackInvokedDispatcher.registerOnBackInvokedCallback( @@ -48,15 +57,51 @@ class TutorialActivity : AppCompatActivity(), UIObject { } } - // Initialise layout - setContentView(R.layout.tutorial) // set up tabs and swiping in settings - val sectionsPagerAdapter = TutorialSectionsPagerAdapter(supportFragmentManager) - val viewPager: ViewPager = findViewById(R.id.tutorial_viewpager) - viewPager.adapter = sectionsPagerAdapter - val tabs: TabLayout = findViewById(R.id.tutorial_tabs) - tabs.setupWithViewPager(viewPager) + val sectionsPagerAdapter = TutorialSectionsPagerAdapter(this) + binding.tutorialViewpager.apply { + adapter = sectionsPagerAdapter + currentItem = 0 + registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + binding.tutorialButtonNext.apply { + val lastItem = sectionsPagerAdapter.itemCount - 1 + visibility = if (position == lastItem) { + View.INVISIBLE + } else { + View.VISIBLE + } + if (position == 0) { + blink() + } else { + clearAnimation() + } + } + binding.tutorialButtonBack.apply { + visibility = if (position == 0) { + View.INVISIBLE + } else { + View.VISIBLE + } + } + } + }) + } + TabLayoutMediator(binding.tutorialTabs, binding.tutorialViewpager) { _, _ -> }.attach() + binding.tutorialButtonNext.setOnClickListener { + binding.tutorialViewpager.apply { + setCurrentItem( + (currentItem + 1).coerceAtMost(sectionsPagerAdapter.itemCount - 1), + true + ) + } + } + binding.tutorialButtonBack.setOnClickListener { + binding.tutorialViewpager.apply { + setCurrentItem((currentItem - 1).coerceAtLeast(0), true) + } + } } override fun getTheme(): Resources.Theme { @@ -89,26 +134,22 @@ class TutorialActivity : AppCompatActivity(), UIObject { * * Tabs: (Start | Concept | Usage | Setup | Finish) */ -class TutorialSectionsPagerAdapter(fm: FragmentManager) : - FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class TutorialSectionsPagerAdapter(activity: FragmentActivity) : + FragmentStateAdapter(activity) { - override fun getItem(position: Int): Fragment { + override fun getItemCount(): Int { + return 6 + } + + override fun createFragment(position: Int): Fragment { return when (position) { - 0 -> TutorialFragmentStart() - 1 -> TutorialFragmentConcept() - 2 -> TutorialFragmentUsage() - 3 -> TutorialFragmentSetup() - 4 -> TutorialFragmentFinish() + 0 -> TutorialFragment0Start() + 1 -> TutorialFragment1Concept() + 2 -> TutorialFragment2Usage() + 3 -> TutorialFragment3AppList() + 4 -> TutorialFragment4Setup() + 5 -> TutorialFragment5Finish() else -> Fragment() } } - - /* We don't use titles here, as we have the dots */ - override fun getPageTitle(position: Int): CharSequence { - return "" - } - - override fun getCount(): Int { - return 5 - } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentStart.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment0Start.kt similarity index 59% rename from app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentStart.kt rename to app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment0Start.kt index 445ded1..5ce5920 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentStart.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment0Start.kt @@ -5,24 +5,22 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import de.jrpie.android.launcher.databinding.TutorialStartBinding +import de.jrpie.android.launcher.databinding.Tutorial0StartBinding import de.jrpie.android.launcher.ui.UIObject -import de.jrpie.android.launcher.ui.blink /** - * The [TutorialFragmentStart] is a used as a tab in the TutorialActivity. + * The [TutorialFragment0Start] is a used as a tab in the TutorialActivity. * * It displays info about the app and gets the user into the tutorial */ -class TutorialFragmentStart : Fragment(), UIObject { +class TutorialFragment0Start : Fragment(), UIObject { - private lateinit var binding: TutorialStartBinding + private lateinit var binding: Tutorial0StartBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = TutorialStartBinding.inflate(inflater, container, false) - binding.tutorialStartIconRight.blink() + binding = Tutorial0StartBinding.inflate(inflater, container, false) return binding.root } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment1Concept.kt similarity index 68% rename from app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt rename to app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment1Concept.kt index f0fd233..876266e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment1Concept.kt @@ -6,22 +6,22 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import de.jrpie.android.launcher.BuildConfig -import de.jrpie.android.launcher.databinding.TutorialConceptBinding +import de.jrpie.android.launcher.databinding.Tutorial1ConceptBinding import de.jrpie.android.launcher.ui.UIObject /** - * The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity. + * The [TutorialFragment1Concept] is a used as a tab in the TutorialActivity. * * It is used to display info about Launchers concept (open source, efficiency ...) */ -class TutorialFragmentConcept : Fragment(), UIObject { - private lateinit var binding: TutorialConceptBinding +class TutorialFragment1Concept : Fragment(), UIObject { + private lateinit var binding: Tutorial1ConceptBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = TutorialConceptBinding.inflate(inflater, container, false) + binding = Tutorial1ConceptBinding.inflate(inflater, container, false) binding.tutorialConceptBadgeVersion.text = BuildConfig.VERSION_NAME return binding.root } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentUsage.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment2Usage.kt similarity index 75% rename from app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentUsage.kt rename to app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment2Usage.kt index 90db232..4b24dcd 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentUsage.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment2Usage.kt @@ -9,17 +9,17 @@ import de.jrpie.android.launcher.R import de.jrpie.android.launcher.ui.UIObject /** - * The [TutorialFragmentUsage] is a used as a tab in the TutorialActivity. + * The [TutorialFragment2Usage] is a used as a tab in the TutorialActivity. * * Tells the user how his screen will look and how the app can be used */ -class TutorialFragmentUsage : Fragment(), UIObject { +class TutorialFragment2Usage : Fragment(), UIObject { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.tutorial_usage, container, false) + return inflater.inflate(R.layout.tutorial_2_usage, container, false) } override fun onStart() { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment3AppList.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment3AppList.kt new file mode 100644 index 0000000..78698aa --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment3AppList.kt @@ -0,0 +1,30 @@ +package de.jrpie.android.launcher.ui.tutorial.tabs + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.ui.UIObject + +/** + * The [TutorialFragment3AppList] is a used as a tab in the TutorialActivity. + * + * Tells the user how his screen will look and how the app can be used + */ +class TutorialFragment3AppList : Fragment(), UIObject { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.tutorial_3_app_list, container, false) + } + + override fun onStart() { + super.onStart() + super.onStart() + } + +} diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentSetup.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment4Setup.kt similarity index 74% rename from app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentSetup.kt rename to app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment4Setup.kt index 09ef4c9..56eb6ca 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentSetup.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment4Setup.kt @@ -9,17 +9,17 @@ import de.jrpie.android.launcher.R import de.jrpie.android.launcher.ui.UIObject /** - * The [TutorialFragmentSetup] is a used as a tab in the TutorialActivity. + * The [TutorialFragment4Setup] is a used as a tab in the TutorialActivity. * * It is used to display info in the tutorial */ -class TutorialFragmentSetup : Fragment(), UIObject { +class TutorialFragment4Setup : Fragment(), UIObject { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.tutorial_setup, container, false) + return inflater.inflate(R.layout.tutorial_4_setup, container, false) } override fun onStart() { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentFinish.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt similarity index 80% rename from app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentFinish.kt rename to app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt index 2d01d0a..2fd093e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentFinish.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt @@ -6,25 +6,25 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import de.jrpie.android.launcher.BuildConfig.VERSION_CODE -import de.jrpie.android.launcher.databinding.TutorialFinishBinding +import de.jrpie.android.launcher.databinding.Tutorial5FinishBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.setDefaultHomeScreen import de.jrpie.android.launcher.ui.UIObject /** - * The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity. + * The [TutorialFragment5Finish] is a used as a tab in the TutorialActivity. * * It is used to display further resources and let the user start Launcher */ -class TutorialFragmentFinish : Fragment(), UIObject { +class TutorialFragment5Finish : Fragment(), UIObject { - private lateinit var binding: TutorialFinishBinding + private lateinit var binding: Tutorial5FinishBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = TutorialFinishBinding.inflate(inflater, container, false) + binding = Tutorial5FinishBinding.inflate(inflater, container, false) return binding.root } diff --git a/app/src/main/res/drawable/baseline_navigate_before_24.xml b/app/src/main/res/drawable/baseline_navigate_before_24.xml new file mode 100644 index 0000000..4097b26 --- /dev/null +++ b/app/src/main/res/drawable/baseline_navigate_before_24.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_navigate_next_24.xml b/app/src/main/res/drawable/baseline_navigate_next_24.xml new file mode 100644 index 0000000..22cef28 --- /dev/null +++ b/app/src/main/res/drawable/baseline_navigate_next_24.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/home_round_screen.png b/app/src/main/res/drawable/home_round_screen.png deleted file mode 100644 index f0237e8a5e25863a283f5c06d714db6a7fa9d3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163224 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ⅈHbq)y8JA0;Dv*1{~G> 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

XQ}L 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 diff --git a/app/src/main/res/drawable/round_outline.xml b/app/src/main/res/drawable/round_outline.xml new file mode 100644 index 0000000..3650338 --- /dev/null +++ b/app/src/main/res/drawable/round_outline.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tutorial_app_list.png b/app/src/main/res/drawable/tutorial_app_list.png new file mode 100644 index 0000000000000000000000000000000000000000..66ebaaf7db1e6207f91fc549513c0d8947b481c2 GIT binary patch literal 127430 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%0DY7oKfb*{gTc$@&;BQd3iR%%>{Su9 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�G03`|y&LZ2oDb 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 U?n~QjbmE$k`5z@$Zv6GX0F|~}$p8QV literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/tutorial.xml b/app/src/main/res/layout/tutorial.xml index 7f2fd8c..5520aa1 100644 --- a/app/src/main/res/layout/tutorial.xml +++ b/app/src/main/res/layout/tutorial.xml @@ -10,7 +10,7 @@ tools:context=".ui.tutorial.TutorialActivity"> - + + + + + + app:layout_constraintTop_toBottomOf="@+id/tutorial_viewpager" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_start.xml b/app/src/main/res/layout/tutorial_0_start.xml similarity index 62% rename from app/src/main/res/layout/tutorial_start.xml rename to app/src/main/res/layout/tutorial_0_start.xml index f431486..d383f5e 100644 --- a/app/src/main/res/layout/tutorial_start.xml +++ b/app/src/main/res/layout/tutorial_0_start.xml @@ -8,7 +8,7 @@ android:paddingRight="32sp" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.tutorial.tabs.TutorialFragmentStart"> + tools:context=".ui.tutorial.tabs.TutorialFragment0Start"> - - - \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_concept.xml b/app/src/main/res/layout/tutorial_1_concept.xml similarity index 75% rename from app/src/main/res/layout/tutorial_concept.xml rename to app/src/main/res/layout/tutorial_1_concept.xml index 9b8495b..9b85552 100644 --- a/app/src/main/res/layout/tutorial_concept.xml +++ b/app/src/main/res/layout/tutorial_1_concept.xml @@ -8,7 +8,7 @@ android:paddingRight="32sp" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.tutorial.tabs.TutorialFragmentConcept"> + tools:context=".ui.tutorial.tabs.TutorialFragment1Concept"> + app:layout_constraintBottom_toTopOf="@id/tutorial_concept_badge_version_label"/> + + diff --git a/app/src/main/res/layout/tutorial_usage.xml b/app/src/main/res/layout/tutorial_2_usage.xml similarity index 92% rename from app/src/main/res/layout/tutorial_usage.xml rename to app/src/main/res/layout/tutorial_2_usage.xml index 29bc475..d395eee 100644 --- a/app/src/main/res/layout/tutorial_usage.xml +++ b/app/src/main/res/layout/tutorial_2_usage.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:paddingLeft="32sp" android:paddingRight="32sp" - tools:context=".ui.tutorial.tabs.TutorialFragmentUsage"> + tools:context=".ui.tutorial.tabs.TutorialFragment2Usage"> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_setup.xml b/app/src/main/res/layout/tutorial_4_setup.xml similarity index 95% rename from app/src/main/res/layout/tutorial_setup.xml rename to app/src/main/res/layout/tutorial_4_setup.xml index 15990aa..bf62261 100644 --- a/app/src/main/res/layout/tutorial_setup.xml +++ b/app/src/main/res/layout/tutorial_4_setup.xml @@ -8,7 +8,7 @@ android:layout_height="match_parent" android:paddingLeft="32sp" android:paddingRight="32sp" - tools:context=".ui.tutorial.tabs.TutorialFragmentSetup"> + tools:context=".ui.tutorial.tabs.TutorialFragment4Setup"> + tools:context=".ui.tutorial.tabs.TutorialFragment5Finish"> µLauncher +

μLauncher

Modifications to Launcher.

github.com/jrpie/launcher

diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4512b62..b94a92b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -193,7 +193,7 @@ Set μLauncher as home screen App Info - View Launcher Tutorial + View µLauncher Tutorial Reset Settings You are going to discard all your preferences. Continue? @@ -202,14 +202,14 @@ Report a bug Report a bug - Thank you for helping to improve µLauncher!\nPlease consider adding the following information to your bug report: + Thank you for helping to improve μLauncher!\nPlease consider adding the following information to your bug report: Copy to clipboard Please do not report security vulnerabilities publicly on GitHub, but use the following instead: Report a security vulnerability Create report Contact the developer of the fork - Join µLauncher chat + Join μLauncher chat Donate Privacy Policy @@ -246,7 +246,7 @@ Search Search (no auto launch) - µLauncher Settings + μLauncher Settings All Applications Favorite Applications Private Space @@ -274,22 +274,29 @@ - --> Tutorial - Take a few seconds to learn how to use this Launcher! + 👋\n\nTake a few seconds to learn how to use this Launcher! Concept - Launcher is designed to be minimal, efficient and free of distraction. It is free of payments, ads and tracking services. - The app is open-source (MIT license) and available on GitHub! Make sure to check out the repository! + μLauncher is designed to be minimal, efficient and free of distraction. + \n\nIt contains no ads and collects no data. + It is free software (MIT license)!\nMake sure to check out the repository! + Version Usage Your home screen contains the local date and time. No distraction. - You can launch your apps with a single swipe or button press. Choose some in the next slide. + You can launch your most important apps with touch gestures or button presses. + + All Apps + You can quickly search through all apps in the app list.\n\nSwipe up to open it, or bind it to a different gesture. + Once only one app matches, it launches automatically.\nThis can be disabled by prefixing the query with a space. + Setup We chose some default apps for you. You can change them now if you want to: You can also change your selection later. Let\'s go! - You are ready to get started! I hope this is of great value to you! - Finn (who made Launcher) \tand Josia (who made some improvements and maintains the fork μLauncher) + You are ready to get started!\n\nI hope this is of great value to you!\n\n- Finn (who made Launcher) and Josia (who made some improvements and maintains the fork μLauncher) Start @@ -301,7 +308,7 @@ App hidden. You can make it visible again in settings. Undo Quick Settings - µLauncher needs to be a device admin in order to lock the screen. + μLauncher needs to be a device admin in order to lock the screen. This is required for the lock screen action. Enable the lock screen action No camera with torch detected. @@ -311,18 +318,18 @@ Private space locked Private space unlocked Private space is not available - µLauncher needs to be the default home screen to access private space. + μLauncher needs to be the default home screen to access private space. Lock private space Unlock private space Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead. - µLauncher - lock screen + μLauncher - lock screen - Setting µLauncher as an accessibility service allows it to lock the screen. + Setting μLauncher as an accessibility service allows it to lock the screen. Note that excessive permissions are required. You should never grant such permissions lightly to any app. - µLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure. + μLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure. - Note that locking the screen can also be accomplished by granting µLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock. + Note that locking the screen can also be accomplished by granting μLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock. @@ -340,7 +347,7 @@

Accessibility Service

Requires excessive privileges. - µLauncher will use those privileges only for locking the screen. + μLauncher will use those privileges only for locking the screen.
(You really should not trust a random app you just downloaded with such a claim, but you can check the source code.)
@@ -363,11 +370,11 @@ Ok Color Choose color - I am aware that this will grant far-reaching privileges to µLauncher. + I am aware that this will grant far-reaching privileges to μLauncher. I am aware that other options exist (using device administrator privileges or the power button). - I consent to µLauncher using the accessibility service to provide functionality unrelated to accessibility. - I consent to µLauncher not collecting any data. - far-reaching privileges to µLauncher.
µLauncher will use these privileges only to lock the screen. µLauncher will never collect any data. In particular, µLauncher does not use the accessibility service to collect any data.]]>
+ I consent to μLauncher using the accessibility service to provide functionality unrelated to accessibility. + I consent to μLauncher not collecting any data. + far-reaching privileges to μLauncher.
μLauncher will use these privileges only to lock the screen. μLauncher will never collect any data. In particular, μLauncher does not use the accessibility service to collect any data.]]>
Activating the Accessibility Service Activate Accessibility Service Cancel From 75b22400c5eee341938df2bf3aac68e8543f1eb0 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 15 Mar 2025 17:24:19 +0100 Subject: [PATCH 03/50] try to fix #125 --- app/src/main/res/layout/list_apps_row.xml | 7 +++++-- app/src/main/res/layout/list_apps_row_variant_grid.xml | 3 ++- app/src/main/res/layout/list_apps_row_variant_text.xml | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/list_apps_row.xml b/app/src/main/res/layout/list_apps_row.xml index 85ce5e6..0229195 100644 --- a/app/src/main/res/layout/list_apps_row.xml +++ b/app/src/main/res/layout/list_apps_row.xml @@ -15,18 +15,21 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + tools:src="@mipmap/ic_launcher_round" tools:ignore="ContentDescription" /> \ No newline at end of file diff --git a/app/src/main/res/layout/list_apps_row_variant_grid.xml b/app/src/main/res/layout/list_apps_row_variant_grid.xml index 1a9058c..ee57c45 100644 --- a/app/src/main/res/layout/list_apps_row_variant_grid.xml +++ b/app/src/main/res/layout/list_apps_row_variant_grid.xml @@ -15,6 +15,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" + tools:src="@mipmap/ic_launcher_round" tools:ignore="ContentDescription" /> + tools:text="@string/app_name" /> \ No newline at end of file From 72f9c0595f36debc74d713ed7226871d6470b4e3 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 15 Mar 2025 19:23:44 +0100 Subject: [PATCH 04/50] handle MotionEvent.ACTION_CANCEL in TouchGestureDetector (see #126) --- .../launcher/ui/TouchGestureDetector.kt | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt index 1c05d54..74b8351 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt @@ -87,24 +87,40 @@ class TouchGestureDetector( } private var paths = HashMap() - private var gestureIsLongClick = false + + /* Set when + * - the longPressHandler has detected this gesture as a long press + * - the gesture was cancelled by MotionEvent.ACTION_CANCEL + * In any case, the current gesture should be ignored by further detection logic. + */ + private var cancelled = false private var lastTappedTime = 0L private var lastTappedLocation: Vector? = null fun onTouchEvent(event: MotionEvent) { + + if (event.actionMasked == MotionEvent.ACTION_CANCEL) { + synchronized(this@TouchGestureDetector) { + cancelled = true + } + } + val pointerIdToIndex = (0.. Date: Thu, 13 Mar 2025 22:24:37 +0000 Subject: [PATCH 05/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 98.4% (251 of 255 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 61 +++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 793ef9d..72acf81 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -47,7 +47,7 @@ 使用全屏 功能 边缘滑动动作 - 零点击启动唯一搜索结果 + 直接启动匹配搜索内容的应用 搜索时呼出键盘 灵敏度 应用信息 @@ -213,4 +213,63 @@ µLauncher 需要作为默认的主屏幕来访问私人空间。 没有找到处理搜索的应用。 无法打开 URL:找不到浏览器。 + 我已知晓,这将赋予 µLauncher 广泛且重要的权限。 + 在应用程序列表中隐藏私人空间 + 隐藏已被暂停的应用 + 返回按键 / 返回手势 + 先单击然后再下滑 + 在网络上搜索 + (从)右上 (滑向)中左(滑向)右下 + 通过按回车键在应用列表搜索界面激活网络搜索。 + (从)左下 (滑向)中上(滑向)右下 + 选择锁定设备的方式 + 有2种方式可以用来锁定屏幕。 + 遗憾的是,两者都有缺点:

+ +

通过设置“设备管理应用”

+ 无法和指纹解锁和脸部解锁共同使用。 + +
+
+ +

通过“无障碍”功能

+ 需要更多的权限。 + µLauncher 将这些权限仅用于锁定屏幕。 +
+ (对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的源代码.) +
+ 在某些设备上,激活辅助功能服务后,启动PIN码将不再用于加密数据。 + 如果遇到该问题,可以通过该方法重新激活启动PIN码用于数据加密。 + +



+ 你可以在设置中随时更改这个选项。 + ]]>
+ 搜索(不触发自动启动应用程序) + 广泛且重要的权限。
µLauncher 将这些权限仅用于锁定屏幕。µLauncher 绝不会收集任何数据。尤其是,µLauncher 不会使用“无障碍”服务来收集任何数据。]]>
+ (从)左上 (滑向)中右(滑向)左下 + 单击 + 上滑 + 单击 + 下滑 + 单击 + 左滑 + 先单击然后再左滑 + 先单击然后再上滑 + 单击 + 右滑 + 先单击然后再右滑 + (从)左下 (滑向)中右(滑向)左上 + (从)右下 (滑向)中左(滑向)右上 + (从)左上 (滑向)中下(滑向)右上 + (从)右上 (滑向)中下(滑向)左上 + (从)右下 (滑向)中上(滑向)左下 + Λ (反向) + V(反向) + (反向)]]> + + 按空格键临时暂停该功能。 + 应用程序列表样式 + 绑定到手势 + 音乐:播放 / 暂停 + 报告安全漏洞 + 安全漏洞请不要在 Github 上以公开的方式提交,而是使用以下方式进行报告: + 感谢您帮助改进 µLauncher!\n请考虑在您的应用程序错误报告中添加以下信息: + 我已知晓,还有其他替代方法(使用设备管理员权限或电源按键)。 From 59f4a2904484c65397ff19637b865e6a1785ce75 Mon Sep 17 00:00:00 2001 From: anmoti Date: Thu, 13 Mar 2025 22:27:15 +0000 Subject: [PATCH 06/50] Translated using Weblate (Japanese) Currently translated at 17.6% (3 of 17 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/ja/ --- .../android/ja-JP/full_description.txt | 22 +++++++++++++++++++ .../android/ja-JP/short_description.txt | 1 + fastlane/metadata/android/ja-JP/title.txt | 1 + 3 files changed, 24 insertions(+) create mode 100644 fastlane/metadata/android/ja-JP/full_description.txt create mode 100644 fastlane/metadata/android/ja-JP/short_description.txt create mode 100644 fastlane/metadata/android/ja-JP/title.txt diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt new file mode 100644 index 0000000..7d7e6bf --- /dev/null +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -0,0 +1,22 @@ +µLauncherは、スワイプジェスチャとタップだけでアプリを起動できるホーム画面です。 +必要最小限で、効率的で、気が散らない。 + +ホーム画面には日付、時刻、壁紙のみが表示されます。 +戻るを押すか上にスワイプすると(これは設定可能)、 +インストールされているすべてのアプリのリストが開き、効率的に検索できます。 + + +このアプリは、Finn M Glas氏のアプリ Launcher のフォークです。 + +機能: +* 35種のジェスチャーにアクションを設定できます。 +* アクションは以下のいずれかになります: + - アプリを起動 + - アプリを表示 + - お気に入りのアプリを表示 + - ボリュームを上げる/下げる + - 音楽: 次/前の曲 + - 画面をロック + - ライトの切り替え + - 通知 / クイック設定を表示 +* 仕事用プロファイルに対応しているので、Shelterなどのアプリも使えます。 diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt new file mode 100644 index 0000000..58b8c41 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/short_description.txt @@ -0,0 +1 @@ +気が散らない、最小限の Android ホーム画面。 diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt new file mode 100644 index 0000000..4305604 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/title.txt @@ -0,0 +1 @@ +µLauncher From 943867d9385cb875396654d0c128692074309f4b Mon Sep 17 00:00:00 2001 From: anmoti Date: Thu, 13 Mar 2025 22:46:11 +0000 Subject: [PATCH 07/50] Translated using Weblate (Japanese) Currently translated at 78.4% (200 of 255 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ja/ --- app/src/main/res/values-ja/strings.xml | 202 ++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a6b3dae..077bb7e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,2 +1,202 @@ - \ No newline at end of file + + アプリを開けません + 設定を変更しますか? + 設定 + アプリ + ランチャー + その他 + このジェスチャのアクションを選択するには設定を開きます + 上にスワイプ + タップしてから上にスワイプ + Double Up + Tap + Up + Up + Back + 2本指で上にスワイプ + Down + 下にスワイプ + Tap + Down + タップしてから下にスワイプ + Double Down + 2本指で下にスワイプ + Left + 左にスワイプ + Tap + Left + タップしてから左にスワイプ + Double Left + 2本指で左にスワイプ + Right + 右にスワイプ + タップしてから右にスワイプ + Double Right + Right (Top) + 画面の上部で右にスワイプ + Right (Bottom) + 画面の下部で右にスワイプ + Left (Bottom) + 画面の下部で左にスワイプ + Left (Top) + 画面の上部で左にスワイプ + Up (Left Edge) + Up (Right Edge) + 画面の右端で上にスワイプ + Down (Left Edge) + 画面の左端で下にスワイプ + Down (Right Edge) + ]]> + 左上 -> 右中 -> 左下 + (Reverse)]]> + 左下 -> 右中 -> 左上 + + 右上 -> 左中 -> 右下 + + V + 左上 -> 中下 -> 右上 + V (Reverse) + 右上 -> 中下 -> 左上 + Λ + 左下 -> 中上 -> 右下 + Λ (Reverse) + 右下 -> 中上 -> 左下 + Volume Down + 音量ダウンボタンを押す + Double Click + 空白部分をダブルタップ + Long Click + Date + 日付をタップ + Time + 時刻をタップ + アプリを選択 + 外観 + カラーテーマ + デフォルト + ダーク + ダイナミック + 文字の影 + 透明 + ブラー + ソリッド + フォント + システムデフォルト + モノクロのアプリアイコン + + + 時刻を表示 + 日付を表示 + ローカライズされた日付形式を使用する + 秒を表示 + 日付と時刻を反転 + 壁紙を選択 + 壁紙を変更 + 表示 + 画面オンを維持 + フルスクリーンを仕様 + 画面の回転 + 2本指でスワイプ + Edgeスワイプアクション + 画面端でスワイプ + アプリリストで検索中にリターンキーを押すとWeb検索が起動します。 + Webで検索 + 検索時にキーボードを表示 + アプリ + ジェスチャーに設定されたアプリをアプリ一覧に表示しない + 一時停止されたアプリを隠す + アプリ一覧のレイアウト + アプリ一覧を反転 + デフォルト + テキスト + グリッド + ランチャーのチュートリアルを見る + 設定をリセット + すべての設定を破棄します。続行しますか? + ソースコードを見る + バグを報告 + クリップボードにコピー + セキュリティ上の脆弱性をGitHubに公開しないでください。代わりに以下を使用してください。 + セキュリティ上の脆弱性を報告 + レポートを作成 + µLauncherのチャットに入る + プライバシーポリシー + Discordに参加してください! + 非表示のアプリ + プライベートスペース + アプリを選択 + アプリ + その他 + アンインストール + アプリ情報 + お気に入りから削除 + 隠す + 名称を変更 + アプリを削除できませんでした + 検索 + 検索(自動起動なし) + µLauncherの設定 + すべてのアプリ + プライベートスペースのロックを切り替え + 音楽: うるさい + 音楽: ひっそり + 音楽: 次 + 音楽: 前 + 通知パネルを表示 + なにもしねぇ + 画面をロック + ライトを切り替え + ショートカットを追加 + ジェシュチャーに設定 + Ok + アプリ一覧に表示 + チュートリアル + コンセプト + 使い方 + ホーム画面には現地の日付と時刻が表示されます。邪魔されることはありません。 + 1回のスワイプまたはボタンのタップでアプリを起動できます。次のスライドでいくつか選択してください。 + セットアップ + 選択内容は後で変更することもできます。 + さあ行きましょう! + 始める + 設定 + 戻るボタン / 戻るジェスチャ + ライト + Doubleスワイプアクション + 検索結果を起動 + お気に入りのアプリ + 音量アップボタンを押す + 空白部分をロングタップ + 機能性 + µLauncherの改善にご協力いただきありがとうございます。\nバグレポートに次の情報を追加することを検討してください。 + お気に入りに追加 + 画面の左端で上にスワイプ + 画面の右端で下にスワイプ + アプリをインストール + 選択されたアプリを削除しました + 始める準備はできました!これがあなたにとって大きな価値となることを願っています! \t- Finn(Launcherの作成者)とJosia(いくつかの改良を行い、フォーク μLauncher を保守) + Tap + Right + 2本指で右にスワイプ + 非表示のアプリ + μLauncherホーム画面に設定 + フォークの開発者に問い合わせ + オリジナルの開発者に問い合わせる + お気に入りのアプリ + 音楽: 再生 / 一時停止 + 薄暗い + 感度 + アプリ情報 + Volume Up + すべてのアプリ + 表示 + 右下 -> 左中 -> 右上 + 背景(アプリ一覧と設定) + 端の幅 + この機能を一時的に無効にするにはスペースキーを押します。 + プライベートスペース + アプリ一覧からプライベートスペースを隠す + この機能はあなたのデバイスでは動作しません。代わりにアプリケーションの詳細を管理しますか? + バグを報告 + このランチャーの使い方を学ぶのにほんの数秒しかかかりません + Launcherは、最小限かつ効率的で、邪魔にならないように設計されています。支払い、広告、追跡サービスは一切ありません。 + このアプリはオープンソース(MIT ライセンス)であり、GitHub で入手できます!リポジトリを必ずチェックしてください! + デフォルトのアプリをいくつか選択しました。必要に応じて今すぐ変更できます。 + From ff108ee32354877f490e449c81162e62f1f13e3f Mon Sep 17 00:00:00 2001 From: toolatebot Date: Fri, 14 Mar 2025 00:07:18 +0000 Subject: [PATCH 08/50] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ --- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 3 +-- app/src/main/res/values-fr/strings.xml | 3 +-- app/src/main/res/values-it/strings.xml | 3 +-- app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 3 +-- app/src/main/res/values-zh-rCN/strings.xml | 1 - 8 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 349d730..b4bf65f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -97,7 +97,6 @@ Hintergrund ändern Bildschirm Bildschirm nicht ausschalten - Vollbild Bildschirm drehen Funktionalität Doppelte Wischaktionen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f0a80c6..df4a50a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -63,7 +63,6 @@ Cambiar fondo de pantalla Pantalla Mantener encendida - Pantalla completa Funciones Deslizar con dos dedos Auto-lanzar búsquedas @@ -127,4 +126,4 @@ Iniciar Configuración Más opciones - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 388e089..86accb2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -55,7 +55,6 @@ Changer le fond d\'écran Écran Garder l\'écran allumé - Utiliser le plein écran Fonctions Actions de double balayage Lancer apps par recherche @@ -231,4 +230,4 @@ Balayer vers le bas au bord gauche de l\'écran Balayer au bord de l\'écran Couleur - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 320bfc6..fe30410 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -115,7 +115,6 @@ Cambia immagine di sfondo Schermo Mantieni lo schermo acceso - Schermo intero Ruota lo schermo Funzionalità Apri automaticamente la tastiera per cercare @@ -237,4 +236,4 @@ Impossibile aprire l\'URL: nessun browser trovato. Non è stata trovata un\'applicazione per gestire la ricerca. privilegi più ampi a µLauncher.
µLauncher utilizzerà questi privilegi solo per bloccare lo schermo. µLauncher non raccoglierà mai alcun dato. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]>
- \ No newline at end of file + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 077bb7e..6cc844d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -92,7 +92,6 @@ 壁紙を変更 表示 画面オンを維持 - フルスクリーンを仕様 画面の回転 2本指でスワイプ Edgeスワイプアクション diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6a6149c..857e454 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -66,7 +66,6 @@ Alterar papel de parede Exibição Manter a tela ligada - Usar tela cheia Funcionalidades Gestos com 2 dedos Ações de deslize nas bordas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bfd0cfe..0c22e97 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -137,7 +137,6 @@ Duvar kağıdını değiştir Ekran Ekranı açık tut - Tam ekran kullan Ekranı döndür İşlevsellik Ekranın köşesinden kaydırın @@ -209,4 +208,4 @@ OK Renk Renk seçin - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 72acf81..c445a75 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -44,7 +44,6 @@ 选择一个壁纸 换壁纸 保持屏幕常亮 - 使用全屏 功能 边缘滑动动作 直接启动匹配搜索内容的应用 From 232046e9867c824da3be01f3cf520fcd6ab506c9 Mon Sep 17 00:00:00 2001 From: toolatebot Date: Sat, 15 Mar 2025 00:07:18 +0000 Subject: [PATCH 09/50] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ --- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - 8 files changed, 8 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b4bf65f..e9f35b6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -117,7 +117,6 @@ Raster Launcher wählen App Info - Das Gerät unterstützt diese Funktion nicht. Stattdessen die App Details bearbeiten? Zum Tutorial Einstellungen zurücksetzen Alle Einstellungen gehen verloren. Weitermachen? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index df4a50a..742c880 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -75,7 +75,6 @@ --> Seleccionar Launcher Información de la aplicación - Su dispositivo no posee esta caracrerística. Desea cambiar los detalles de la aplicación? Ver tutorial de Launcher Configuración por defecto Todas sus preferencias se eliminarán. Desea continuar? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 86accb2..5bfb096 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -67,7 +67,6 @@ --> Choisir μLauncher comme application d\'écran d\'accueil par défaut Informations sur l\'application - Votre appareil ne prend pas en charge cette fonctionnalité. Souhaitez-vous plutôt accéder aux détails de l\'application ? Regarder le tutoriel Réinitialiser Vous allez réinitialiser tous vos paramètres. Souhaitez-vous poursuivre ? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fe30410..28a7133 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -34,7 +34,6 @@



Puoi cambiare le tue scelte in seguito nelle impostazioni. ]]> - Il tuo dispositivo non supporta questa funzione. Vuoi aprire la pagina di dettaglio dell\'applicazione? Impossibile aprire l\'applicazione Desideri modificare le impostazioni? Apri le impostazioni per abbinare un\'azione a questo gesto diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6cc844d..c453380 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -192,7 +192,6 @@ この機能を一時的に無効にするにはスペースキーを押します。 プライベートスペース アプリ一覧からプライベートスペースを隠す - この機能はあなたのデバイスでは動作しません。代わりにアプリケーションの詳細を管理しますか? バグを報告 このランチャーの使い方を学ぶのにほんの数秒しかかかりません Launcherは、最小限かつ効率的で、邪魔にならないように設計されています。支払い、広告、追跡サービスは一切ありません。 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 857e454..3a0734f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -79,7 +79,6 @@ --> Definir o μLauncher como tela inicial Informações do aplicativo - Seu dispositivo não é compatível com esse recurso. Gerenciar detalhes do app em vez disso? Ver tutorial do launcher Redefinir configuraçãos Você vai descartar todas as suas preferências. Continuar? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0c22e97..a283fa9 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -164,7 +164,6 @@ Metin Izgara Uygulama Detayı - Sizin cihazınız bu özelliği desteklemiyor. Onun yerine uygulama detaylarını düzenleyin? Ayarları Sıfırlayın Tüm tercihlerinizi bir kenara bırakacaksınız. Devam mı? Tek uzay diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c445a75..08bc5b7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -50,7 +50,6 @@ 搜索时呼出键盘 灵敏度 应用信息 - 您的设备不支持此功能。要不打开应用程序详细? 查看启动器教程 重置设置 你将放弃你所有的配置。继续吗? From 47940811b4d8c6aece6ed8073044fd3c85db1db0 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 16 Mar 2025 02:30:49 +0100 Subject: [PATCH 10/50] fix #126 --- .../jrpie/android/launcher/ui/HomeActivity.kt | 13 ++++ .../launcher/ui/TouchGestureDetector.kt | 65 +++++++++++++++---- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 7875473..14e04d5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -69,10 +69,23 @@ class HomeActivity : UIObject, AppCompatActivity() { LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f ) + + // Initialise layout binding = HomeBinding.inflate(layoutInflater) + setContentView(binding.root) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + binding.root.setOnApplyWindowInsetsListener { _, windowInsets -> + val insets = windowInsets.systemGestureInsets + touchGestureDetector.setSystemGestureInsets(insets) + + windowInsets + } + } + + // Handle back key / gesture on Android 13+, cf. onKeyDown() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt index 74b8351..9000fa8 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt @@ -1,10 +1,13 @@ package de.jrpie.android.launcher.ui import android.content.Context +import android.graphics.Insets +import android.os.Build import android.os.Handler import android.os.Looper import android.view.MotionEvent import android.view.ViewConfiguration +import androidx.annotation.RequiresApi import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.preferences.LauncherPreferences import kotlin.math.abs @@ -31,20 +34,29 @@ class TouchGestureDetector( private val longPressHandler = Handler(Looper.getMainLooper()) + private var systemGestureInsetTop = 100 + private var systemGestureInsetBottom = 0 + private var systemGestureInsetLeft = 0 + private var systemGestureInsetRight = 0 + data class Vector(val x: Float, val y: Float) { fun absSquared(): Float { return this.x * this.x + this.y * this.y } + fun plus(vector: Vector): Vector { return Vector(this.x + vector.x, this.y + vector.y) } + fun max(other: Vector): Vector { return Vector(max(this.x, other.x), max(this.y, other.y)) } + fun min(other: Vector): Vector { return Vector(min(this.x, other.x), min(this.y, other.y)) } + operator fun minus(vector: Vector): Vector { return Vector(this.x - vector.x, this.y - vector.y) } @@ -61,16 +73,35 @@ class TouchGestureDetector( fun sizeSquared(): Float { return (max - min).absSquared() } + fun getDirection(): Vector { return last - start } + fun update(vector: Vector) { min = min.min(vector) max = max.max(vector) last = vector } } + + private fun PointerPath.startIntersectsSystemGestureInsets(): Boolean { + // ignore x, since this makes edge swipes very hard to execute + return start.y < systemGestureInsetTop + || start.y > height - systemGestureInsetBottom + } + + private fun PointerPath.intersectsSystemGestureInsets(): Boolean { + return min.x < systemGestureInsetLeft + || min.y < systemGestureInsetTop + || max.x > width - systemGestureInsetRight + || max.y > height - systemGestureInsetBottom + } + private fun PointerPath.isTap(): Boolean { + if (intersectsSystemGestureInsets()) { + return false + } return sizeSquared() < TOUCH_SLOP_SQUARE } @@ -128,8 +159,8 @@ class TouchGestureDetector( } // add new pointers - for(i in 0.. { - if(startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) { + if (startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) { gesture = Gesture.SWIPE_LARGER } else if (startEndMin.x - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.x) { gesture = Gesture.SWIPE_SMALLER } } + Gesture.SWIPE_UP -> { - if(startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) { + if (startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) { gesture = Gesture.SWIPE_LARGER_REVERSE } else if (startEndMin.x - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.x) { gesture = Gesture.SWIPE_SMALLER_REVERSE } } + Gesture.SWIPE_RIGHT -> { - if(startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) { + if (startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) { gesture = Gesture.SWIPE_V } else if (startEndMin.y - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.y) { gesture = Gesture.SWIPE_LAMBDA } } + Gesture.SWIPE_LEFT -> { - if(startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) { + if (startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) { gesture = Gesture.SWIPE_V_REVERSE } else if (startEndMin.y - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.y) { gesture = Gesture.SWIPE_LAMBDA_REVERSE } } - else -> { } + + else -> {} } if (edgeActions) { @@ -283,4 +318,12 @@ class TouchGestureDetector( gesture?.invoke(context) } } + + @RequiresApi(Build.VERSION_CODES.Q) + fun setSystemGestureInsets(insets: Insets) { + systemGestureInsetTop = insets.top + systemGestureInsetBottom = insets.bottom + systemGestureInsetLeft = insets.left + systemGestureInsetRight = insets.right + } } \ No newline at end of file From 90434617e72f50bebee7c912d087a442618a450b Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 16 Mar 2025 04:12:34 +0100 Subject: [PATCH 11/50] replace (ViewPager, FragmentPagerAdapter) by (ViewPager2, FragmentStateAdapter) --- .../android/launcher/ui/list/ListActivity.kt | 29 +++++------ .../launcher/ui/settings/SettingsActivity.kt | 48 +++++++++---------- app/src/main/res/layout/list.xml | 2 +- app/src/main/res/layout/settings.xml | 2 +- 4 files changed, 40 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 64bd850..997d2b0 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -12,10 +12,8 @@ import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter -import androidx.viewpager.widget.ViewPager -import com.google.android.material.tabs.TabLayout +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_UNINSTALL @@ -241,11 +239,14 @@ class ListActivity : AppCompatActivity(), UIObject { updateTitle() - val sectionsPagerAdapter = ListSectionsPagerAdapter(this, supportFragmentManager) - val viewPager: ViewPager = findViewById(R.id.list_viewpager) - viewPager.adapter = sectionsPagerAdapter - val tabs: TabLayout = findViewById(R.id.list_tabs) - tabs.setupWithViewPager(viewPager) + val sectionsPagerAdapter = ListSectionsPagerAdapter(this) + binding.listViewpager.apply { + adapter = sectionsPagerAdapter + currentItem = 0 + } + TabLayoutMediator(binding.listTabs, binding.listViewpager) { tab, position -> + tab.text = sectionsPagerAdapter.getPageTitle(position) + }.attach() } } @@ -258,10 +259,10 @@ private val TAB_TITLES = arrayOf( * The [ListSectionsPagerAdapter] returns the fragment, * which corresponds to the selected tab in [ListActivity]. */ -class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentManager) : - FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class ListSectionsPagerAdapter(private val activity: ListActivity) : + FragmentStateAdapter(activity) { - override fun getItem(position: Int): Fragment { + override fun createFragment(position: Int): Fragment { return when (position) { 0 -> ListFragmentApps() 1 -> ListFragmentOther() @@ -269,11 +270,11 @@ class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentM } } - override fun getPageTitle(position: Int): CharSequence { + fun getPageTitle(position: Int): CharSequence { return activity.resources.getString(TAB_TITLES[position]) } - override fun getCount(): Int { + override fun getItemCount(): Int { return when (activity.intention) { ListActivity.ListActivityIntention.VIEW -> 1 else -> 2 diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt index fde61a7..2b3cdc6 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt @@ -1,6 +1,5 @@ package de.jrpie.android.launcher.ui.settings -import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.content.res.Resources @@ -8,10 +7,9 @@ import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter -import androidx.viewpager.widget.ViewPager -import com.google.android.material.tabs.TabLayout +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.databinding.SettingsBinding @@ -34,6 +32,7 @@ import de.jrpie.android.launcher.ui.settings.meta.SettingsFragmentMeta * Settings are closed automatically if the activity goes `onPause` unexpectedly. */ class SettingsActivity : AppCompatActivity(), UIObject { + private val EXTRA_TAB = "tab" private val solidBackground = LauncherPreferences.theme().background() == Background.SOLID || LauncherPreferences.theme().colorTheme() == ColorTheme.LIGHT @@ -49,15 +48,15 @@ class SettingsActivity : AppCompatActivity(), UIObject { // This ugly workaround causes a jump to the top of the list, but at least // the text stays readable. val i = Intent(this, SettingsActivity::class.java) - .also { it.putExtra("tab", 1) } + .also { it.putExtra(EXTRA_TAB, 1) } finish() startActivity(i) } else - if (prefKey?.startsWith("theme.") == true || - prefKey?.startsWith("display.") == true - ) { - recreate() - } + if (prefKey?.startsWith("theme.") == true || + prefKey?.startsWith("display.") == true + ) { + recreate() + } } private lateinit var binding: SettingsBinding @@ -71,15 +70,14 @@ class SettingsActivity : AppCompatActivity(), UIObject { setContentView(binding.root) // set up tabs and swiping in settings - val sectionsPagerAdapter = SettingsSectionsPagerAdapter(this, supportFragmentManager) - val viewPager: ViewPager = findViewById(R.id.settings_viewpager) - viewPager.adapter = sectionsPagerAdapter - - val tabs: TabLayout = findViewById(R.id.settings_tabs) - tabs.setupWithViewPager(viewPager) - if (intent.hasExtra("tab")) { - tabs.getTabAt(intent.getIntExtra("tab", 0))?.select() + val sectionsPagerAdapter = SettingsSectionsPagerAdapter(this) + binding.settingsViewpager.apply { + adapter = sectionsPagerAdapter + setCurrentItem(intent.getIntExtra(EXTRA_TAB, 0), false) } + TabLayoutMediator(binding.settingsTabs, binding.settingsViewpager) { tab, position -> + tab.text = sectionsPagerAdapter.getPageTitle(position) + }.attach() } override fun onStart() { @@ -122,10 +120,10 @@ private val TAB_TITLES = arrayOf( R.string.settings_tab_meta ) -class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) : - FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class SettingsSectionsPagerAdapter(private val activity: FragmentActivity) : + FragmentStateAdapter(activity) { - override fun getItem(position: Int): Fragment { + override fun createFragment(position: Int): Fragment { return when (position) { 0 -> SettingsFragmentActions() 1 -> SettingsFragmentLauncher() @@ -134,11 +132,11 @@ class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentMan } } - override fun getPageTitle(position: Int): CharSequence { - return context.resources.getString(TAB_TITLES[position]) + fun getPageTitle(position: Int): CharSequence { + return activity.resources.getString(TAB_TITLES[position]) } - override fun getCount(): Int { + override fun getItemCount(): Int { return 3 } } diff --git a/app/src/main/res/layout/list.xml b/app/src/main/res/layout/list.xml index 43c1f4c..45bcb85 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -95,7 +95,7 @@ - - Date: Sun, 16 Mar 2025 16:37:39 +0100 Subject: [PATCH 12/50] refactor: remove unused stuff, fix lint warnings --- app/build.gradle | 2 +- .../de/jrpie/android/launcher/Application.kt | 10 +- .../de/jrpie/android/launcher/Functions.kt | 24 +- .../jrpie/android/launcher/actions/Action.kt | 56 +- .../jrpie/android/launcher/actions/Gesture.kt | 2 +- .../launcher/actions/lock/LockMethod.kt | 1 - .../de/jrpie/android/launcher/apps/AppInfo.kt | 20 +- .../launcher/apps/PinnedShortcutInfo.kt | 23 +- .../android/launcher/apps/PrivateSpace.kt | 1 + .../launcher/preferences/ColorPreference.kt | 9 +- .../launcher/preferences/ListLayout.kt | 7 +- .../launcher/preferences/legacy/Version1.kt | 16 +- .../preferences/legacy/VersionUnknown.kt | 621 +++++++++--------- .../launcher/preferences/theme/ColorTheme.kt | 1 - .../jrpie/android/launcher/ui/HomeActivity.kt | 3 + .../launcher/ui/PinShortcutActivity.kt | 18 +- .../de/jrpie/android/launcher/ui/UIObject.kt | 2 + .../android/launcher/ui/list/ListActivity.kt | 21 +- .../ui/list/apps/AppsRecyclerAdapter.kt | 11 +- .../ui/list/apps/ContextMenuActions.kt | 15 +- .../ui/list/other/OtherRecyclerAdapter.kt | 17 +- .../launcher/ui/settings/SettingsActivity.kt | 10 +- .../SettingsFragmentActionsRecycler.kt | 6 +- .../ui/settings/meta/SettingsFragmentMeta.kt | 2 - .../launcher/ui/tutorial/TutorialActivity.kt | 13 +- .../android/launcher/ui/util/HtmlTextView.kt | 1 + .../tutorial_app_list.png | Bin .../tutorial_home_screen.png | Bin .../res/drawable/baseline_more_horiz_24.xml | 11 - .../res/drawable/ic_launcher_background.xml | 10 - app/src/main/res/drawable/round_outline.xml | 6 - .../main/res/layout/activity_pin_shortcut.xml | 2 +- app/src/main/res/layout/tutorial_4_setup.xml | 2 +- .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 612 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 372 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 880 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 1416 -> 0 bytes .../ic_launcher_foreground.webp | Bin 2046 -> 0 bytes app/src/main/res/values-de/strings.xml | 6 - app/src/main/res/values-es/strings.xml | 6 - app/src/main/res/values-fr/strings.xml | 6 - app/src/main/res/values-it/strings.xml | 6 - app/src/main/res/values-pt-rBR/strings.xml | 6 - app/src/main/res/values-tr/strings.xml | 6 - app/src/main/res/values-w820dp/dimens.xml | 6 - app/src/main/res/values-zh-rCN/strings.xml | 6 - .../res/values/ic_launcher_background.xml | 4 - app/src/main/res/values/strings.xml | 9 - app/src/main/res/values/styles.xml | 11 - docs/launcher.md | 1 + gradle.properties | 4 +- 51 files changed, 415 insertions(+), 605 deletions(-) rename app/src/main/res/{drawable => drawable-mdpi}/tutorial_app_list.png (100%) rename app/src/main/res/{drawable => drawable-mdpi}/tutorial_home_screen.png (100%) delete mode 100644 app/src/main/res/drawable/baseline_more_horiz_24.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/drawable/round_outline.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp delete mode 100644 app/src/main/res/values-w820dp/dimens.xml delete mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/build.gradle b/app/build.gradle index c75bb3d..8e6f551 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,7 +95,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.activity:activity:1.8.0' + implementation 'androidx.activity:activity-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.core:core-ktx:1.15.0' implementation 'androidx.constraintlayout:constraintlayout:2.2.0' diff --git a/app/src/main/java/de/jrpie/android/launcher/Application.kt b/app/src/main/java/de/jrpie/android/launcher/Application.kt index e674e4e..e6cce23 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Application.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Application.kt @@ -7,11 +7,8 @@ import android.content.IntentFilter import android.content.SharedPreferences import android.content.pm.LauncherApps import android.content.pm.ShortcutInfo -import android.os.AsyncTask import android.os.Build import android.os.Build.VERSION_CODES -import android.os.Handler -import android.os.Looper import android.os.UserHandle import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData @@ -23,6 +20,9 @@ import de.jrpie.android.launcher.apps.isPrivateSpaceLocked import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.migratePreferencesToNewVersion import de.jrpie.android.launcher.preferences.resetPreferences +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch class Application : android.app.Application() { val apps = MutableLiveData>() @@ -153,6 +153,8 @@ class Application : android.app.Application() { private fun loadApps() { privateSpaceLocked.postValue(isPrivateSpaceLocked(this)) - AsyncTask.execute { apps.postValue(getApps(packageManager, applicationContext)) } + CoroutineScope(Dispatchers.Default).launch { + apps.postValue(getApps(packageManager, applicationContext)) + } } } diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index d5e8d13..7bbbdb5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -12,7 +12,6 @@ import android.content.pm.LauncherApps import android.content.pm.LauncherApps.ShortcutQuery import android.content.pm.PackageManager import android.content.pm.ShortcutInfo -import android.net.Uri import android.os.Build import android.os.Bundle import android.os.UserHandle @@ -34,15 +33,9 @@ import de.jrpie.android.launcher.apps.getPrivateSpaceUser import de.jrpie.android.launcher.apps.isPrivateSpaceSupported import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.tutorial.TutorialActivity +import androidx.core.net.toUri -/* REQUEST CODES */ - -const val REQUEST_CHOOSE_APP = 1 -const val REQUEST_UNINSTALL = 2 - -const val REQUEST_SET_DEFAULT_HOME = 42 - const val LOG_TAG = "Launcher" fun isDefaultHomeScreen(context: Context): Boolean { @@ -69,9 +62,8 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { && !isDefault // using role manager only works when µLauncher is not already the default. ) { val roleManager = context.getSystemService(RoleManager::class.java) - context.startActivityForResult( - roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), - REQUEST_SET_DEFAULT_HOME + context.startActivity( + roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME) ) return } @@ -125,7 +117,7 @@ fun removeUnusedShortcuts(context: Context) { } fun openInBrowser(url: String, context: Context) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) intent.putExtras(Bundle().apply { putBoolean("new_window", true) }) try { context.startActivity(intent) @@ -212,14 +204,6 @@ fun getApps( return loadList } - -// Used in Tutorial and Settings `ActivityOnResult` -fun saveListActivityChoice(data: Intent?) { - val forGesture = data?.getStringExtra("forGesture") ?: return - Gesture.byId(forGesture)?.let { Action.setActionForGesture(it, Action.fromIntent(data)) } -} - - // used for the bug report button fun getDeviceInfo(): String { return """ diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt b/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt index ddef92a..9a2dc62 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt @@ -2,7 +2,6 @@ package de.jrpie.android.launcher.actions import android.app.Activity import android.content.Context -import android.content.Intent import android.content.SharedPreferences.Editor import android.graphics.Rect import android.graphics.drawable.Drawable @@ -12,6 +11,7 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import androidx.core.content.edit @Serializable @@ -29,10 +29,6 @@ sealed interface Action { prefEditor.putString(id, Json.encodeToString(this)) } - fun writeToIntent(intent: Intent) { - intent.putExtra("action", Json.encodeToString(this)) - } - companion object { fun forGesture(gesture: Gesture): Action? { @@ -44,23 +40,23 @@ sealed interface Action { } fun resetToDefaultActions(context: Context) { - val editor = LauncherPreferences.getSharedPreferences().edit() - val boundActions = HashSet() - Gesture.entries.forEach { gesture -> - context.resources - .getStringArray(gesture.defaultsResource) - .filterNot { boundActions.contains(it) } - .map { Pair(it, Json.decodeFromString(it)) } - .firstOrNull { it.second.isAvailable(context) } - ?.apply { - // allow to bind CHOOSE to multiple gestures - if (second != LauncherAction.CHOOSE) { - boundActions.add(first) + LauncherPreferences.getSharedPreferences().edit { + val boundActions = HashSet() + Gesture.entries.forEach { gesture -> + context.resources + .getStringArray(gesture.defaultsResource) + .filterNot { boundActions.contains(it) } + .map { Pair(it, Json.decodeFromString(it)) } + .firstOrNull { it.second.isAvailable(context) } + ?.apply { + // allow to bind CHOOSE to multiple gestures + if (second != LauncherAction.CHOOSE) { + boundActions.add(first) + } + second.bindToGesture(this@edit, gesture.id) } - second.bindToGesture(editor, gesture.id) - } + } } - editor.apply() } fun setActionForGesture(gesture: Gesture, action: Action?) { @@ -68,15 +64,15 @@ sealed interface Action { clearActionForGesture(gesture) return } - val editor = LauncherPreferences.getSharedPreferences().edit() - action.bindToGesture(editor, gesture.id) - editor.apply() + LauncherPreferences.getSharedPreferences().edit { + action.bindToGesture(this, gesture.id) + } } fun clearActionForGesture(gesture: Gesture) { - LauncherPreferences.getSharedPreferences().edit() - .remove(gesture.id) - .apply() + LauncherPreferences.getSharedPreferences().edit { + remove(gesture.id) + } } fun launch( @@ -87,6 +83,9 @@ sealed interface Action { ) { if (action != null && action.invoke(context)) { if (context is Activity) { + // There does not seem to be a good alternative to overridePendingTransition. + // Note that we can't use overrideActivityTransition here. + @Suppress("deprecation") context.overridePendingTransition(animationIn, animationOut) } } else { @@ -97,10 +96,5 @@ sealed interface Action { ).show() } } - - fun fromIntent(data: Intent): Action? { - val json = data.getStringExtra("action") ?: return null - return Json.decodeFromString(json) - } } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt index 110e4f8..a2434e1 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt @@ -250,7 +250,7 @@ enum class Gesture( "action.back", R.string.settings_gesture_back, R.string.settings_gesture_description_back, - R.array.default_up + R.array.default_back ); enum class Edge { diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt index 8ae2415..541510a 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt @@ -9,7 +9,6 @@ import de.jrpie.android.launcher.R import de.jrpie.android.launcher.preferences.LauncherPreferences -@Suppress("unused") enum class LockMethod( private val lock: (Context) -> Unit, private val isEnabled: (Context) -> Boolean, diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/AppInfo.kt b/app/src/main/java/de/jrpie/android/launcher/apps/AppInfo.kt index 944cfaa..9534431 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/AppInfo.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/AppInfo.kt @@ -15,19 +15,7 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("app") -class AppInfo(val packageName: String, val activityName: String?, val user: Int = INVALID_USER): AbstractAppInfo { - - override fun equals(other: Any?): Boolean { - if(other is AppInfo) { - return other.user == user && other.packageName == packageName - && other.activityName == activityName - } - return super.equals(other) - } - - override fun hashCode(): Int { - return packageName.hashCode() - } +data class AppInfo(val packageName: String, val activityName: String?, val user: Int = INVALID_USER): AbstractAppInfo { fun getLauncherActivityInfo( context: Context @@ -38,10 +26,4 @@ class AppInfo(val packageName: String, val activityName: String?, val user: Int return activityList.firstOrNull { app -> app.name == activityName } ?: activityList.firstOrNull() } - - - override fun toString(): String { - return "AppInfo {package=$packageName, activity=$activityName, user=$user}" - } - } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/PinnedShortcutInfo.kt b/app/src/main/java/de/jrpie/android/launcher/apps/PinnedShortcutInfo.kt index 1dc1e1f..54230ae 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/PinnedShortcutInfo.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/PinnedShortcutInfo.kt @@ -16,7 +16,7 @@ import kotlinx.serialization.Serializable @RequiresApi(Build.VERSION_CODES.N_MR1) @Serializable @SerialName("shortcut") -class PinnedShortcutInfo( +data class PinnedShortcutInfo( val id: String, val packageName: String, val activityName: String, @@ -43,25 +43,4 @@ class PinnedShortcutInfo( null } } - - override fun equals(other: Any?): Boolean { - return (other as? PinnedShortcutInfo)?.let { - packageName == this.packageName && - activityName == this.activityName && - id == this.id && - user == this.user - } ?: false - } - - override fun hashCode(): Int { - var result = id.hashCode() - result = 31 * result + packageName.hashCode() - result = 31 * result + activityName.hashCode() - result = 31 * result + user - return result - } - - override fun toString(): String { - return "PinnedShortcutInfo { package=$packageName, activity=$activityName, user=$user, id=$id}" - } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt index e44ff1c..24665d7 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt @@ -123,6 +123,7 @@ fun togglePrivateSpaceLock(context: Context) { } } +@Suppress("SameReturnValue") fun hidePrivateSpaceWhenLocked(context: Context): Boolean { // Trying to access the setting as a 3rd party launcher raises a security exception. // This is an Android bug: https://issuetracker.google.com/issues/352276244#comment5 diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/ColorPreference.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/ColorPreference.kt index a21d458..0f95efd 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/ColorPreference.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/ColorPreference.kt @@ -17,6 +17,7 @@ import androidx.core.graphics.green import androidx.core.graphics.red import androidx.preference.Preference import de.jrpie.android.launcher.R +import androidx.core.graphics.toColorInt class ColorPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) { @@ -52,7 +53,7 @@ class ColorPreference(context: Context, attrs: AttributeSet?) : AlertDialog.Builder(context, R.style.AlertDialogCustom).apply { setView(R.layout.dialog_choose_color) setTitle(R.string.dialog_choose_color_title) - setPositiveButton(R.string.dialog_select_color_ok) { _, _ -> + setPositiveButton(android.R.string.ok) { _, _ -> persistInt(currentColor) summary = currentColor.getHex() } @@ -83,10 +84,10 @@ class ColorPreference(context: Context, attrs: AttributeSet?) : override fun onTextChanged(text: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun afterTextChanged(editable: Editable?) { preview.hasFocus() || return - val newText = editable?.toString() - newText.isNullOrBlank() && return + val newText = editable?.toString() ?: return + newText.isBlank() && return try { - val newColor = Color.parseColor(newText.toString()) + val newColor = newText.toColorInt() currentColor = newColor updateColor(false) } catch (_: IllegalArgumentException) { diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/ListLayout.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/ListLayout.kt index e20945a..5f7b9d6 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/ListLayout.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/ListLayout.kt @@ -1,6 +1,7 @@ package de.jrpie.android.launcher.preferences import android.content.Context +import android.util.TypedValue import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -27,8 +28,10 @@ enum class ListLayout( GRID( { c -> val displayMetrics = c.resources.displayMetrics - val widthSp = displayMetrics.widthPixels / displayMetrics.scaledDensity - GridLayoutManager(c, (widthSp / 90).toInt()) + val widthColumnPx = + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 90f, displayMetrics) + val numColumns = (displayMetrics.widthPixels / widthColumnPx).toInt() + GridLayoutManager(c, numColumns) }, R.layout.list_apps_row_variant_grid, false diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt index 6252811..a1cb022 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt @@ -13,9 +13,11 @@ import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.json.JSONException import org.json.JSONObject +import androidx.core.content.edit @Serializable +@Suppress("unused") private class LegacyMapEntry(val key: AppInfo, val value: String) private fun serializeMapAppInfo(value: Map?): Set? { @@ -100,7 +102,7 @@ private fun migrateAppInfoStringMap(key: String) { } }?.toMap(HashMap()) )?.let { - preferences.edit().putStringSet(key, it).apply() + preferences.edit { putStringSet(key, it) } } } @@ -109,16 +111,16 @@ private fun migrateAppInfoSet(key: String) { .map(AppInfo.Companion::legacyDeserialize) .map(AppInfo::serialize) .toSet() - .let { LauncherPreferences.getSharedPreferences().edit().putStringSet(key, it).apply() } + .let { LauncherPreferences.getSharedPreferences().edit { putStringSet(key, it) } } } private fun migrateAction(key: String) { Action.legacyFromPreference(key)?.let { action -> - LauncherPreferences.getSharedPreferences().edit() - .putString(key, Json.encodeToString(action)) - .remove("$key.app") - .remove("$key.user") - .apply() + LauncherPreferences.getSharedPreferences().edit { + putString(key, Json.encodeToString(action)) + .remove("$key.app") + .remove("$key.user") + } } } diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt index a33670b..2d1152d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt @@ -6,7 +6,7 @@ import android.util.Log import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.theme.Background import de.jrpie.android.launcher.preferences.theme.ColorTheme - +import androidx.core.content.edit private fun migrateStringPreference( @@ -64,318 +64,317 @@ fun migratePreferencesFromVersionUnknown(context: Context) { return } - val newPrefs = LauncherPreferences.getSharedPreferences().edit() + LauncherPreferences.getSharedPreferences().edit { - migrateBooleanPreference( - oldPrefs, - newPrefs, - "startedBefore", - "internal.started_before", - false - ) + migrateBooleanPreference( + oldPrefs, + this, + "startedBefore", + "internal.started_before", + false + ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_volumeUpApp", - "action.volume_up.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_volumeUpApp_user", - "action.volume_up.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_volumeDownApp", - "action.volume_down.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_volumeDownApp_user", - "action.volume_down.user", - -1 - ) - migrateStringPreference(oldPrefs, newPrefs, "action_timeApp", "action.time.app", "") - migrateIntPreference(oldPrefs, newPrefs, "action_timeApp_user", "action.time.user", -1) - migrateStringPreference(oldPrefs, newPrefs, "action_dateApp", "action.date.app", "") - migrateIntPreference(oldPrefs, newPrefs, "action_dateApp_user", "action.date.user", -1) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_longClickApp", - "action.long_click.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_longClickApp_user", - "action.long_click.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_doubleClickApp", - "action.double_click.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_doubleClickApp_user", - "action.double_click.user", - -1 - ) - migrateStringPreference(oldPrefs, newPrefs, "action_upApp", "action.up.app", "") - migrateIntPreference(oldPrefs, newPrefs, "action_upApp_user", "action.up.user", -1) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_up_leftApp", - "action.up_left.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_up_leftApp_user", - "action.up_left.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_up_rightApp", - "action.up_right.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_up_rightApp_user", - "action.up_right.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_doubleUpApp", - "action.double_up.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_doubleUpApp_user", - "action.double_up.user", - -1 - ) - migrateStringPreference(oldPrefs, newPrefs, "action_downApp", "action.down.app", "") - migrateIntPreference(oldPrefs, newPrefs, "action_downApp_user", "action.down.user", -1) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_down_leftApp", - "action.down_left.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_down_leftApp_user", - "action.down_left.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_down_rightApp", - "action.down_right.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_down_rightApp_user", - "action.down_right.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_doubleDownApp", - "action.double_down.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_doubleDownApp_user", - "action.double_down.user", - -1 - ) - migrateStringPreference(oldPrefs, newPrefs, "action_leftApp", "action.left.app", "") - migrateIntPreference(oldPrefs, newPrefs, "action_leftApp_user", "action.left.user", -1) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_left_topApp", - "action.left_top.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_left_topApp_user", - "action.left_top.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_left_bottomApp", - "action.left_bottom.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_left_bottomApp_user", - "action.left_bottom.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_doubleLeftApp", - "action.double_left.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_doubleLeftApp_user", - "action.double_left.user", - -1 - ) - migrateStringPreference(oldPrefs, newPrefs, "action_rightApp", "action.right.app", "") - migrateIntPreference( - oldPrefs, - newPrefs, - "action_rightApp_user", - "action.right.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_right_topApp", - "action.right_top.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_right_topApp_user", - "action.right_top.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_right_bottomApp", - "action.right_bottom.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_right_bottomApp_user", - "action.right_bottom.user", - -1 - ) - migrateStringPreference( - oldPrefs, - newPrefs, - "action_doubleRightApp", - "action.double_right.app", - "" - ) - migrateIntPreference( - oldPrefs, - newPrefs, - "action_doubleRightApp_user", - "action.double_right.user", - -1 - ) - migrateBooleanPreference(oldPrefs, newPrefs, "timeVisible", "clock.time_visible", true) - migrateBooleanPreference(oldPrefs, newPrefs, "dateVisible", "clock.date_visible", true) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "dateLocalized", - "clock.date_localized", - false - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "dateTimeFlip", - "clock.date_time_flip", - false - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "disableTimeout", - "display.disable_timeout", - false - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "useFullScreen", - "display.use_full_screen", - true - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "enableDoubleActions", - "enabled_gestures.double_actions", - true - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "enableEdgeActions", - "enabled_gestures.edge_actions", - true - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "searchAutoLaunch", - "functionality.search_auto_launch", - true - ) - migrateBooleanPreference( - oldPrefs, - newPrefs, - "searchAutoKeyboard", - "functionality.search_auto_keyboard", - true - ) - - newPrefs.apply() + migrateStringPreference( + oldPrefs, + this, + "action_volumeUpApp", + "action.volume_up.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_volumeUpApp_user", + "action.volume_up.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_volumeDownApp", + "action.volume_down.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_volumeDownApp_user", + "action.volume_down.user", + -1 + ) + migrateStringPreference(oldPrefs, this, "action_timeApp", "action.time.app", "") + migrateIntPreference(oldPrefs, this, "action_timeApp_user", "action.time.user", -1) + migrateStringPreference(oldPrefs, this, "action_dateApp", "action.date.app", "") + migrateIntPreference(oldPrefs, this, "action_dateApp_user", "action.date.user", -1) + migrateStringPreference( + oldPrefs, + this, + "action_longClickApp", + "action.long_click.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_longClickApp_user", + "action.long_click.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_doubleClickApp", + "action.double_click.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_doubleClickApp_user", + "action.double_click.user", + -1 + ) + migrateStringPreference(oldPrefs, this, "action_upApp", "action.up.app", "") + migrateIntPreference(oldPrefs, this, "action_upApp_user", "action.up.user", -1) + migrateStringPreference( + oldPrefs, + this, + "action_up_leftApp", + "action.up_left.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_up_leftApp_user", + "action.up_left.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_up_rightApp", + "action.up_right.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_up_rightApp_user", + "action.up_right.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_doubleUpApp", + "action.double_up.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_doubleUpApp_user", + "action.double_up.user", + -1 + ) + migrateStringPreference(oldPrefs, this, "action_downApp", "action.down.app", "") + migrateIntPreference(oldPrefs, this, "action_downApp_user", "action.down.user", -1) + migrateStringPreference( + oldPrefs, + this, + "action_down_leftApp", + "action.down_left.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_down_leftApp_user", + "action.down_left.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_down_rightApp", + "action.down_right.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_down_rightApp_user", + "action.down_right.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_doubleDownApp", + "action.double_down.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_doubleDownApp_user", + "action.double_down.user", + -1 + ) + migrateStringPreference(oldPrefs, this, "action_leftApp", "action.left.app", "") + migrateIntPreference(oldPrefs, this, "action_leftApp_user", "action.left.user", -1) + migrateStringPreference( + oldPrefs, + this, + "action_left_topApp", + "action.left_top.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_left_topApp_user", + "action.left_top.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_left_bottomApp", + "action.left_bottom.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_left_bottomApp_user", + "action.left_bottom.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_doubleLeftApp", + "action.double_left.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_doubleLeftApp_user", + "action.double_left.user", + -1 + ) + migrateStringPreference(oldPrefs, this, "action_rightApp", "action.right.app", "") + migrateIntPreference( + oldPrefs, + this, + "action_rightApp_user", + "action.right.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_right_topApp", + "action.right_top.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_right_topApp_user", + "action.right_top.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_right_bottomApp", + "action.right_bottom.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_right_bottomApp_user", + "action.right_bottom.user", + -1 + ) + migrateStringPreference( + oldPrefs, + this, + "action_doubleRightApp", + "action.double_right.app", + "" + ) + migrateIntPreference( + oldPrefs, + this, + "action_doubleRightApp_user", + "action.double_right.user", + -1 + ) + migrateBooleanPreference(oldPrefs, this, "timeVisible", "clock.time_visible", true) + migrateBooleanPreference(oldPrefs, this, "dateVisible", "clock.date_visible", true) + migrateBooleanPreference( + oldPrefs, + this, + "dateLocalized", + "clock.date_localized", + false + ) + migrateBooleanPreference( + oldPrefs, + this, + "dateTimeFlip", + "clock.date_time_flip", + false + ) + migrateBooleanPreference( + oldPrefs, + this, + "disableTimeout", + "display.disable_timeout", + false + ) + migrateBooleanPreference( + oldPrefs, + this, + "useFullScreen", + "display.use_full_screen", + true + ) + migrateBooleanPreference( + oldPrefs, + this, + "enableDoubleActions", + "enabled_gestures.double_actions", + true + ) + migrateBooleanPreference( + oldPrefs, + this, + "enableEdgeActions", + "enabled_gestures.edge_actions", + true + ) + migrateBooleanPreference( + oldPrefs, + this, + "searchAutoLaunch", + "functionality.search_auto_launch", + true + ) + migrateBooleanPreference( + oldPrefs, + this, + "searchAutoKeyboard", + "functionality.search_auto_keyboard", + true + ) + } when (oldPrefs.getString("theme", "finn")) { "finn" -> { diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt index 816d94f..d3088f4 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt @@ -5,7 +5,6 @@ import android.content.res.Resources import com.google.android.material.color.DynamicColors import de.jrpie.android.launcher.R -@Suppress("unused") enum class ColorTheme( private val id: Int, private val labelResource: Int, diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 14e04d5..a658cd1 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -57,6 +57,8 @@ class HomeActivity : UIObject, AppCompatActivity() { super.onCreate() val displayMetrics = DisplayMetrics() + + @Suppress("deprecation") // required to support API < 30 windowManager.defaultDisplay.getMetrics(displayMetrics) val width = displayMetrics.widthPixels @@ -78,6 +80,7 @@ class HomeActivity : UIObject, AppCompatActivity() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { binding.root.setOnApplyWindowInsetsListener { _, windowInsets -> + @Suppress("deprecation") // required to support API 29 val insets = windowInsets.systemGestureInsets touchGestureDetector.setSystemGestureInsets(insets) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt index 4d5d700..71908ba 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt @@ -24,6 +24,7 @@ import de.jrpie.android.launcher.actions.ShortcutAction import de.jrpie.android.launcher.apps.PinnedShortcutInfo import de.jrpie.android.launcher.databinding.ActivityPinShortcutBinding import de.jrpie.android.launcher.preferences.LauncherPreferences +import androidx.core.content.edit class PinShortcutActivity : AppCompatActivity(), UIObject { private lateinit var binding: ActivityPinShortcutBinding @@ -72,9 +73,12 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { isBound = true request.accept() } - val editor = LauncherPreferences.getSharedPreferences().edit() - ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture(editor, gesture.id) - editor.apply() + LauncherPreferences.getSharedPreferences().edit { + ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture( + this, + gesture.id + ) + } dialog.dismiss() } dialog.findViewById(R.id.dialog_select_gesture_recycler).apply { @@ -117,11 +121,11 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { } inner class GestureRecyclerAdapter(val context: Context, val onClick: (Gesture) -> Unit): RecyclerView.Adapter() { - val gestures = Gesture.entries.filter { it.isEnabled() }.toList() + private val gestures = Gesture.entries.filter { it.isEnabled() }.toList() inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val label = itemView.findViewById(R.id.dialog_select_gesture_row_name) - val description = itemView.findViewById(R.id.dialog_select_gesture_row_description) - val icon = itemView.findViewById(R.id.dialog_select_gesture_row_icon) + val label: TextView = itemView.findViewById(R.id.dialog_select_gesture_row_name) + val description: TextView = itemView.findViewById(R.id.dialog_select_gesture_row_description) + val icon: ImageView = itemView.findViewById(R.id.dialog_select_gesture_row_icon) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt b/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt index d97388f..51324f4 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt @@ -15,8 +15,10 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences * An interface implemented by every [Activity], Fragment etc. in Launcher. * It handles themes and window flags - a useful abstraction as it is the same everywhere. */ +@Suppress("deprecation") // FLAG_FULLSCREEN is required to support API level < 30 fun setWindowFlags(window: Window, homeScreen: Boolean) { window.setFlags(0, 0) // clear flags + // Display notification bar if (LauncherPreferences.display().hideStatusBar()) window.setFlags( diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 997d2b0..59d83e5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -1,13 +1,10 @@ package de.jrpie.android.launcher.ui.list -import android.app.Activity -import android.content.Intent import android.content.res.Resources import android.graphics.Rect import android.os.Build import android.os.Bundle import android.view.View -import android.widget.Toast import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources @@ -16,7 +13,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_UNINSTALL import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked @@ -113,10 +109,13 @@ class ListActivity : AppCompatActivity(), UIObject { ?.let { ListActivityIntention.valueOf(it) } ?: ListActivityIntention.VIEW + @Suppress("deprecation") // required to support API level < 33 favoritesVisibility = bundle.getSerializable("favoritesVisibility") as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility + @Suppress("deprecation") // required to support API level < 33 privateSpaceVisibility = bundle.getSerializable("privateSpaceVisibility") as? AppFilter.Companion.AppSetVisibility ?: privateSpaceVisibility + @Suppress("deprecation") // required to support API level < 33 hiddenVisibility = bundle.getSerializable("hiddenVisibility") as? AppFilter.Companion.AppSetVisibility ?: hiddenVisibility @@ -183,20 +182,6 @@ class ListActivity : AppCompatActivity(), UIObject { finish() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_UNINSTALL) { - if (resultCode == Activity.RESULT_OK) { - Toast.makeText(this, getString(R.string.list_removed), Toast.LENGTH_LONG).show() - finish() - } else if (resultCode == Activity.RESULT_FIRST_USER) { - Toast.makeText(this, getString(R.string.list_not_removed), Toast.LENGTH_LONG).show() - finish() - } - } - } - - fun updateTitle() { var titleResource = intention.titleResource if (intention == ListActivityIntention.VIEW) { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt index c4428b7..65278ce 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt @@ -2,7 +2,6 @@ package de.jrpie.android.launcher.ui.list.apps import android.annotation.SuppressLint import android.app.Activity -import android.content.Intent import android.graphics.Rect import android.view.LayoutInflater import android.view.View @@ -15,7 +14,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_CHOOSE_APP +import de.jrpie.android.launcher.actions.Action +import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.apps.AbstractDetailedAppInfo import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.AppInfo @@ -195,11 +195,10 @@ class AppsRecyclerAdapter( } ListActivity.ListActivityIntention.PICK -> { - val returnIntent = Intent() - appInfo.getAction().writeToIntent(returnIntent) - returnIntent.putExtra("forGesture", forGesture) - activity.setResult(REQUEST_CHOOSE_APP, returnIntent) activity.finish() + forGesture ?: return + val gesture = Gesture.byId(forGesture) ?: return + Action.setActionForGesture(gesture, appInfo.getAction()) } } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt index 8b681b9..22dff02 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt @@ -6,7 +6,6 @@ import android.content.Context import android.content.Intent import android.content.pm.LauncherApps import android.graphics.Rect -import android.net.Uri import android.os.Bundle import android.util.Log import android.view.View @@ -14,11 +13,9 @@ import android.widget.EditText import androidx.appcompat.app.AlertDialog import com.google.android.material.snackbar.Snackbar import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_UNINSTALL import de.jrpie.android.launcher.apps.AppInfo import de.jrpie.android.launcher.apps.AbstractAppInfo import de.jrpie.android.launcher.apps.AbstractDetailedAppInfo -import de.jrpie.android.launcher.apps.DetailedAppInfo import de.jrpie.android.launcher.apps.PinnedShortcutInfo import de.jrpie.android.launcher.getUserFromId import de.jrpie.android.launcher.preferences.LauncherPreferences @@ -44,17 +41,13 @@ fun AbstractAppInfo.uninstall(activity: Activity) { Log.i(LOG_TAG, "uninstalling $this") - val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) + val intent = Intent(Intent.ACTION_DELETE) intent.data = "package:$packageName".toUri() getUserFromId(userId, activity).let { user -> intent.putExtra(Intent.EXTRA_USER, user) } + activity.startActivity(intent) - intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) - activity.startActivityForResult( - intent, - REQUEST_UNINSTALL - ) } else if(this is PinnedShortcutInfo) { val pinned = LauncherPreferences.apps().pinnedShortcuts() ?: mutableSetOf() pinned.remove(this) @@ -102,8 +95,8 @@ fun AbstractDetailedAppInfo.showRenameDialog(context: Context) { AlertDialog.Builder(context, R.style.AlertDialogCustom).apply { setTitle(context.getString(R.string.dialog_rename_title, getLabel())) setView(R.layout.dialog_rename_app) - setNegativeButton(R.string.dialog_cancel) { d, _ -> d.cancel() } - setPositiveButton(R.string.dialog_rename_ok) { d, _ -> + setNegativeButton(android.R.string.cancel) { d, _ -> d.cancel() } + setPositiveButton(android.R.string.ok) { d, _ -> setCustomLabel( (d as? AlertDialog) ?.findViewById(R.id.dialog_rename_app_edit_text) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt index 70d5376..f176469 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt @@ -1,7 +1,6 @@ package de.jrpie.android.launcher.ui.list.other import android.app.Activity -import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,7 +8,8 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_CHOOSE_APP +import de.jrpie.android.launcher.actions.Action +import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.ui.list.ListActivity @@ -36,7 +36,10 @@ class OtherRecyclerAdapter(val activity: Activity) : val pos = bindingAdapterPosition val content = othersList[pos] - (activity as? ListActivity)?.forGesture?.let { returnChoiceIntent(it, content) } + activity.finish() + val gestureId = (activity as? ListActivity)?.forGesture ?: return + val gesture = Gesture.byId(gestureId) ?: return + Action.setActionForGesture(gesture, content) } init { @@ -61,12 +64,4 @@ class OtherRecyclerAdapter(val activity: Activity) : val view: View = inflater.inflate(R.layout.list_other_row, parent, false) return ViewHolder(view) } - - private fun returnChoiceIntent(forGesture: String, action: LauncherAction) { - val returnIntent = Intent() - returnIntent.putExtra("forGesture", forGesture) - action.writeToIntent(returnIntent) - activity.setResult(REQUEST_CHOOSE_APP, returnIntent) - activity.finish() - } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt index 2b3cdc6..4c464e5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt @@ -11,12 +11,10 @@ import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.databinding.SettingsBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.theme.Background import de.jrpie.android.launcher.preferences.theme.ColorTheme -import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.settings.actions.SettingsFragmentActions import de.jrpie.android.launcher.ui.settings.launcher.SettingsFragmentLauncher @@ -32,7 +30,6 @@ import de.jrpie.android.launcher.ui.settings.meta.SettingsFragmentMeta * Settings are closed automatically if the activity goes `onPause` unexpectedly. */ class SettingsActivity : AppCompatActivity(), UIObject { - private val EXTRA_TAB = "tab" private val solidBackground = LauncherPreferences.theme().background() == Background.SOLID || LauncherPreferences.theme().colorTheme() == ColorTheme.LIGHT @@ -106,11 +103,8 @@ class SettingsActivity : AppCompatActivity(), UIObject { } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - REQUEST_CHOOSE_APP -> saveListActivityChoice(data) - else -> super.onActivityResult(requestCode, resultCode, data) - } + companion object { + private const val EXTRA_TAB = "tab" } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt index 630b5b0..ae47ce2 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt @@ -16,7 +16,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.apps.AppFilter @@ -179,9 +178,6 @@ class ActionsRecyclerAdapter(val activity: Activity) : intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString()) intent.putExtra("hiddenVisibility", AppFilter.Companion.AppSetVisibility.VISIBLE) intent.putExtra("forGesture", gesture.id) // for which action we choose the app - activity.startActivityForResult( - intent, - REQUEST_CHOOSE_APP - ) + activity.startActivity(intent) } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt index 26f276a..dea0bcf 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt @@ -2,7 +2,6 @@ package de.jrpie.android.launcher.ui.settings.meta import android.app.AlertDialog import android.content.Intent -import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -20,7 +19,6 @@ import de.jrpie.android.launcher.openTutorial import de.jrpie.android.launcher.preferences.resetPreferences import de.jrpie.android.launcher.ui.LegalInfoActivity import de.jrpie.android.launcher.ui.UIObject -import de.jrpie.android.launcher.ui.tutorial.TutorialActivity /** * The [SettingsFragmentMeta] is a used as a tab in the SettingsActivity. diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt index 12c6c8a..847639c 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/TutorialActivity.kt @@ -1,6 +1,5 @@ package de.jrpie.android.launcher.ui.tutorial -import android.content.Intent import android.content.res.Resources import android.os.Build import android.os.Bundle @@ -12,10 +11,8 @@ import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator -import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.databinding.TutorialBinding import de.jrpie.android.launcher.preferences.LauncherPreferences -import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.blink import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment0Start @@ -36,6 +33,7 @@ class TutorialActivity : AppCompatActivity(), UIObject { private lateinit var binding: TutorialBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) super.onCreate() @@ -113,14 +111,9 @@ class TutorialActivity : AppCompatActivity(), UIObject { super.onStart() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - REQUEST_CHOOSE_APP -> saveListActivityChoice(data) - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - // prevent going back when the tutorial is shown for the first time + @Deprecated("Deprecated in Java", ReplaceWith("use anyway")) + @Suppress("deprecation") // support API level < 33 override fun onBackPressed() { if (LauncherPreferences.internal().started()) super.onBackPressed() diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/util/HtmlTextView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/util/HtmlTextView.kt index 549f10f..5e38b9f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/util/HtmlTextView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/util/HtmlTextView.kt @@ -12,6 +12,7 @@ class HtmlTextView(context: Context, attr: AttributeSet?, int: Int) : constructor(context: Context) : this(context, null, 0) init { + @Suppress("deprecation") // required to support API level < 24 text = Html.fromHtml(text.toString()) movementMethod = LinkMovementMethod.getInstance() } diff --git a/app/src/main/res/drawable/tutorial_app_list.png b/app/src/main/res/drawable-mdpi/tutorial_app_list.png similarity index 100% rename from app/src/main/res/drawable/tutorial_app_list.png rename to app/src/main/res/drawable-mdpi/tutorial_app_list.png diff --git a/app/src/main/res/drawable/tutorial_home_screen.png b/app/src/main/res/drawable-mdpi/tutorial_home_screen.png similarity index 100% rename from app/src/main/res/drawable/tutorial_home_screen.png rename to app/src/main/res/drawable-mdpi/tutorial_home_screen.png diff --git a/app/src/main/res/drawable/baseline_more_horiz_24.xml b/app/src/main/res/drawable/baseline_more_horiz_24.xml deleted file mode 100644 index 061fae2..0000000 --- a/app/src/main/res/drawable/baseline_more_horiz_24.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 4f1c4ab..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/round_outline.xml b/app/src/main/res/drawable/round_outline.xml deleted file mode 100644 index 3650338..0000000 --- a/app/src/main/res/drawable/round_outline.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pin_shortcut.xml b/app/src/main/res/layout/activity_pin_shortcut.xml index 5e10118..2519374 100644 --- a/app/src/main/res/layout/activity_pin_shortcut.xml +++ b/app/src/main/res/layout/activity_pin_shortcut.xml @@ -116,7 +116,7 @@ android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/pin_shortcut_button_ok" + android:text="@android:string/ok" app:layout_constraintBottom_toBottomOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_4_setup.xml b/app/src/main/res/layout/tutorial_4_setup.xml index bf62261..9650c57 100644 --- a/app/src/main/res/layout/tutorial_4_setup.xml +++ b/app/src/main/res/layout/tutorial_4_setup.xml @@ -33,7 +33,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tutorial_setup_title" /> - YN+qP}nwr%@u+qP|E$^`WE|I`0ZecR*NaVU8R3$Fbh+(gKMv_6ER zKK~v?@=pavo(oT!@EZhtNY&?yQm}*$7@EB3tr;S{7kdIH2yx|zYlh5}_iAzwf`y^V zlPTg}(e`}#@9*+}WyKv5F+kB?%8EFo!Z!M6*@EBj@_hM+>c5JKIKNSs_cS+ryvFnw z!%Geu2@pfu-?bdxE9QD$_;J5H@CENhe&{Df+UgQGK(R-2gEbz4g0*Z=U84UIi*D}# z#RkWdE0TO$WkqQCBN)dY5>9nK%!c^uUln9{OPwY4jlHNKrk=~xs z@&wJTmjf=Z&qdlRcyy~pXX!e}=PEM`Yc$tM7baZy40O>Kx?u4*hwep`myxSbStiL$ ziA*@{5fMz?6L>UhRjMG##Q~CB@wo`aH@9J~fz3B31~_x4ki2yrVFT-v8{Z=49i(u8 z$Shmn0B{aol>Q~90%=~50Sx{dA{6#31YHTPyavt|70~PRwr)& diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp deleted file mode 100644 index 7cfdde1db49d496c0c3f2adf905097bcc19c581d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmV-)0gL`pNk&F&0RRA3MM6+kP&iCr0RR9mYrq;1mB5lD$yKxWzjOlfT0Uh8?}-RF zkZhZ_&a?f#ZTqLTjmWlb+qP}n_Rnlvp=$#A_x}&E2JL!+`38dJuZb}D{|;i+tQR zl*%TvxO)~)+q$$8;)oUH2bOl8_|vm5FmOv6sBm|Kd4Rl`KQI?PQDC@9vv&U;+r`d8 z&^{^lQmnDM=!~ul@Y2Djwp^R^H4^srs`Yw*kD+2^Ej)gaUsF@O3?#^>?fc!n;POUp z7Ign`m3pZ~(?>a>R`%b43zy zMj7QTH23VE(6sQ+6b0ipSPg(#uTyh04dLo(^CDF?#qLsyisFJhJ8-BQVF0#5iizYR SvUTiGC!R8Zf0}>)|MUw1+Pb~~ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 68b43ba9113735c1998b0d9e54d7376cac7be60b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmV-$1CRVtNk&F!0{{S5MM6+kP&iCn0{{Ro*T6Lpbx3j>Ns^@e|DPK?L}XPq&@uZ= zS}isiAprouvXMHRZQHhO+qTWOZQJ(Qwr$%#Z+ExDnhD71|I`1c|4;v){{L0p2V>WD z8O8A>VApZc`Ihj_+bb_ls<1P;-b3PI?17^{In zH0K2L45MUSu!y!4Fxl}=8JV{;rV-$@@m!LKf>F#Eg}pAH(GTkD!o-XEJ{YYNHc>4h z0QG6c!bTlGjaYYFhO>{0D9D!V7VPu{j|KqErcoF$s<@d2fQza+wD+#&B?WI=n5(dys4`PEJw3RcOp}K`NxD^2~*fuD6yZ{@Vp*9GEEXSx+ zcXXgQNfHBoJ{~OzGIP(WTPUGx`L0 zyYu3m5n@SG2*^u94IkuLMzwV_304?D?grh83$~Jy1f7)%N#Zr2F;i|ei+-jBYO>Bd zu!-_TmvNI18-TfkWK9&*!z9#OI`^<0Vj2*eKpLz+T&B_hWLz^BvoJcAT3FM@YaMtV zBx&N`ge`zd>>g%2;x;H4t@cKTcxU1khQ(~P(!~f3Rk8PYc?|11B=I@EirW>7aVBat zly6}PAQ9W3(b-xY)YZkw`xtWIGXDff19dicE{GIbiSG!mdFTOBeXR|O>gfP!@EDAi z>h>qZ^J-omR+|;Q!@fvF2ab-51hGMh+cl0c30p_U#FZjZo#4Q81YJjH{AUmvd%)x+9R7eW8Y2zTA#sOOw8T_P0nPPlI+y&cn zjT!;Mj9fAA=CW{U2e&l|orEV!(GXFqk37P~W`hzaUw}Rwf_-!8ppeoIt|MeeMWuZR zdNkX$%QvmsIH0;g@V`5EBVbbUmm4Pye6(KmC9D G|94f_z>CoU diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 337c6cc9f7b4bd0d4faf8f5fed0ace1c244aa28b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcmV;31$X*VNk&G11pok7MM6+kP&iC;1pojqL%~oGb$*DG*kFQFM<)~^&;$rtVkBBii;d=byP(EB{c817CLDzgAV!%#9Ofr+REnq z6?~z}w9`?A5P~@pvcfD>6{R#SKPm+0Xi;cwyVs0J609%lZt2j-6fe>?jx=}?*U35( zy!mk)A~M=L7zFXPO(dQ|t8&V(D+$&&`{bghxVN=_As{$!b%$m!TDz+82Fc4+b?6xf zz42OB5gFnY79-!68G)Xs zk24S&(R?z7ts$FmC()Y1u?%fGUJO5NmVSB|VFv>U&Ls41ez#39tAlOA%OMUBMD>W= zuj*4Btm(_K#HRgh z$Mj@@uuJWrZA_T?E!5XHx>n!B#4k+85)glAYA6K`gP@tT6_`52J5^hjIJKX))#sK( zMTg4g#7^{scnq{i5aJD`=ZQ5nrt~3EKf@@t4ji!nHToHCLK4?N*6X{mOBs;h63sfI z5fEJ#>M;z^K-mq#Wh0y|(PDzoRS=_QJR~}9v?h28gUQcsj3Nib?1>f~4GApeLEhF- zF`RJUC{N;y9b-HFNX(mA_tasN;8l{mIks@(?rs`|JwVrlS@?t2R}auWUvEoiEIVxc zeN5OK)Kv;U+9X!}LG(x%g+7h03F4hs^KHV61xF1sH(}KVZ=w2a*@JZ1O`8NO?rF46 zU{O@_#NPk{&yuzRT|>yI7NZ>^MND(&ivS)naGjWf|o!#)ANPMMw7JO$x zT*DkaZayT&P7(Q$w21>k=acx^(=uU|)lbpAWxHspkOk(E#xRL}~3Z0hD%8K< z@2gi3Up=gGzz)-uQ7=>#t*A@Dpy+hB&H-DD5QAALJW-dhbVx*9!iffGk=I2zQ8yp0 z&9%*bo7)uCbT#BA>JmI66M0>Dqk?GFwQ06GXpdzEO6LqM)L5XXi|$CB{y+VH`v3I* W>HpLJr~gm?pZ-7nfBOG_g988tudbQ^ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index ba69e326f6bce4fd0505d3b0d04e5effcd427263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 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 PTJZmy?0;?eVCjDVRon>g diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 349d730..33e6c3d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -67,7 +67,6 @@ Uhr Auf die Uhrzeit klicken App wählen - Alle Anwendungen Apps installieren Store nicht gefunden Seleccionar Launcher Información de la aplicación - Su dispositivo no posee esta caracrerística. Desea cambiar los detalles de la aplicación? Ver tutorial de Launcher Configuración por defecto Todas sus preferencias se eliminarán. Desea continuar? @@ -96,8 +92,6 @@ Otros Desinstalar Información - Se eliminó la aplicación - No se pudo eliminar la aplicación Buscar Aplicaciones Configuración de Launcher Aplicaciones diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 388e089..0487823 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -37,7 +37,6 @@ Date Horloge Choisir une application - Voir toutes les applications Installer des applications Magasin d\'applications introuvable Choisir μLauncher comme application d\'écran d\'accueil par défaut Informations sur l\'application - Votre appareil ne prend pas en charge cette fonctionnalité. Souhaitez-vous plutôt accéder aux détails de l\'application ? Regarder le tutoriel Réinitialiser Vous allez réinitialiser tous vos paramètres. Souhaitez-vous poursuivre ? @@ -88,8 +84,6 @@ Autre Désinstaller Informations - Application supprimée - Impossible de désinstaller l\'application Chercher des applications Réglages d\'µLauncher Toutes les Applications diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 320bfc6..5a4b16a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -34,7 +34,6 @@



Puoi cambiare le tue scelte in seguito nelle impostazioni. ]]>
- Il tuo dispositivo non supporta questa funzione. Vuoi aprire la pagina di dettaglio dell\'applicazione? Impossibile aprire l\'applicazione Desideri modificare le impostazioni? Apri le impostazioni per abbinare un\'azione a questo gesto @@ -83,7 +82,6 @@ Premi il pulsante di aumento del volume Riduci il volume Premi il pulsante per ridurre il volume - Vedi tutte le applicazioni Installa le applicazioni Icone monocromatiche Mostra l\'ora @@ -112,10 +110,8 @@ Font Inverti data e ora Scegli uno sfondo - Cambia immagine di sfondo Schermo Mantieni lo schermo acceso - Schermo intero Ruota lo schermo Funzionalità Apri automaticamente la tastiera per cercare @@ -181,7 +177,6 @@ Nascondi Mostra Rinomina - Le applicazioni selezionate sono state rimosse Cerca Impostazioni μLauncher Espandi il pannello notifiche @@ -197,7 +192,6 @@ Questa funzione richiede Android 6 o successivi. Ok Rinomina %1$s - Impossibile rimuovere l\'applicazione Dinamico Colore Due dita verso l\'alto diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6a6149c..9a0544f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -45,7 +45,6 @@ Data Hora Selecione um app - Ver todos os apps Instalar aplicativos Loja não encontrada Definir o μLauncher como tela inicial Informações do aplicativo - Seu dispositivo não é compatível com esse recurso. Gerenciar detalhes do app em vez disso? Ver tutorial do launcher Redefinir configuraçãos Você vai descartar todas as suas preferências. Continuar? @@ -100,8 +96,6 @@ Outros Desinstalar Informações do aplicativo - O app selecionado foi removido - Não foi possível remover o app Busque Configurações do µLauncher Todos os apps diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bfd0cfe..e6fc115 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -105,7 +105,6 @@ Saat Saate tıklayın Uygulama Seçin - Tüm uygulamaları göster Uygulamaları yükle Mağaza bulunamadı Görünüş @@ -120,8 +119,6 @@ Hiçbir şey yapma Kaynak kodunu göster Hatayı bildirin - Seçilen uygulama kaldırıldı - Uygulama kaldırılamadı Uygulamaları Ara Tüm Uygulamalar Favori Uygulamalar @@ -134,10 +131,8 @@ Saniyeleri gösteri Tarih ile zamanı yer değiştir Duvar kağıdı seç - Duvar kağıdını değiştir Ekran Ekranı açık tut - Tam ekran kullan Ekranı döndür İşlevsellik Ekranın köşesinden kaydırın @@ -165,7 +160,6 @@ Metin Izgara Uygulama Detayı - Sizin cihazınız bu özelliği desteklemiyor. Onun yerine uygulama detaylarını düzenleyin? Ayarları Sıfırlayın Tüm tercihlerinizi bir kenara bırakacaksınız. Devam mı? Tek uzay diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 63fc816..0000000 --- a/app/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 64dp - diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 793ef9d..07b411d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,21 +37,17 @@ 日期 时间 选择应用 - 浏览全部应用 安装应用 没有找到应用市场 选择一个壁纸 - 换壁纸 保持屏幕常亮 - 使用全屏 功能 边缘滑动动作 零点击启动唯一搜索结果 搜索时呼出键盘 灵敏度 应用信息 - 您的设备不支持此功能。要不打开应用程序详细? 查看启动器教程 重置设置 你将放弃你所有的配置。继续吗? @@ -74,8 +70,6 @@ 应用 卸载 应用信息 - 无法移除应用 - 移除了选定的应用 搜索 启动器设置 全部应用 diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index beab31f..0000000 --- a/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #000000 - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b94a92b..6205281 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,8 +101,6 @@ Choose App - View all apps - Install apps Store not found @@ -148,7 +146,6 @@ Flip date and time Choose a wallpaper - Change wallpaper Display @@ -240,9 +237,6 @@ Show Rename - Removed the selected application - Unable to remove application - Search Search (no auto launch) @@ -265,7 +259,6 @@ Add Shortcut Bind to gesture - Ok Show in app list Taschenlampe umschalten Tutorial - Hier eine kurze Erklärung, wie dieser Launcher funktioniert. + 👋\n\nHier eine kurze Erklärung, wie dieser Launcher funktioniert. Konzept - µLauncher bietet eine minimalistische, effiziente und ablenkungsfreie digitale Umgebung.\n\nDie App ist freie Software, enthält keine Werbung und sammelt keinerlei Daten. + µLauncher bietet eine minimalistische, effiziente und ablenkungsfreie Umgebung.\n\nDie App ist freie Software, enthält keine Werbung und sammelt keinerlei Daten. Der Quellcode ist bei GitHub zu finden. Benutzung Der Homescreen zeigt nur das Datum und die Uhrzeit. Keine Ablenkung. - Häufig verwendete Apps können mittels Gesten, z.B. Wischen oder den Lautstärketasten geöffnet werden. Gleich können die Apps ausgewählt werden. + Häufig verwendete Apps können mittels Gesten, z.B. Wischen oder den Lautstärketasten geöffnet werden. Einrichtung Es wurden Standardapps ausgewählt, die Zuordnung kann hier angepasst werden: Die Auswahl kann in den Einstellungen später jederzeit geändert werden. Los gehts! - Es kann losgehen!\n\nWir hoffen, dass diese App hilfreich ist!\n\n- Finn (der Entwickler)\n\tund Josia (der einige Änderungen vorgenommen hat und den Fork μLauncher entwickelt) + Es kann losgehen!\n\nWir hoffen, dass diese App hilfreich ist!\n\n- Finn (der Entwickler)\nund Josia (der einige Änderungen vorgenommen hat und den Fork μLauncher entwickelt) Starten Einstellungen Mehr Optionen From 7094d55484cd2d52fad806f7e4cfc5557b448074 Mon Sep 17 00:00:00 2001 From: Josia Date: Mon, 17 Mar 2025 23:42:33 +0000 Subject: [PATCH 18/50] Translated using Weblate (German) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/de/ --- app/src/main/res/values-de/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c45e625..735aa9d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -197,18 +197,18 @@ Fehler: Kein Zugriff auf die Kamera möglich. Methode zum Sperren des Bildschirms wählen %1$s umbenennen - µLauncher muss als Standardlauncher eingerichtet sein um auf den privaten Bereich zugreifen zu können. + μLauncher muss als Standardlauncher eingerichtet sein um auf den privaten Bereich zugreifen zu können. Fehler: Auf diesem Gerät kann der Bildschirm nicht mittels Bedienungshilfe gesperrt werden. Bitte stattdessen Geräteadministrator verwenden. - µLauncher - Bildschirm sperren + μLauncher - Bildschirm sperren Fehler: Bildschirm konnte nicht gesperrt werden. Die Bedienungshilfe ist nicht aktiviert. Bitte in den Einstellungen aktivieren Methode zum Sperren wählen Bedienungshilfe verwenden Geräteadministrator verwenden - µLauncher als Bedienungshilfe zu aktivieren ermöglicht es µLauncher, den Bildschirm zu sperren. Achtung: Hierfür sind weitgehende Berechtigungen erforderlich. Solche Berechtigungen sollten niemals leichtfertig vergeben werden. µLauncher wird diese Berechtigungen ausschließlich zum Sperren des Bildschirms verwenden. Alternativ kann der Bildschirm auch mithilfe von Geräteadministratorberechtigungen gesperrt werden. Dann ist jedoch ein Entsperren mit Fingerabdruck oder Gesichtserkennung nicht möglich. + μLauncher als Bedienungshilfe zu aktivieren ermöglicht es μLauncher, den Bildschirm zu sperren. Achtung: Hierfür sind weitgehende Berechtigungen erforderlich. Solche Berechtigungen sollten niemals leichtfertig vergeben werden. μLauncher wird diese Berechtigungen ausschließlich zum Sperren des Bildschirms verwenden. Alternativ kann der Bildschirm auch mithilfe von Geräteadministratorberechtigungen gesperrt werden. Dann ist jedoch ein Entsperren mit Fingerabdruck oder Gesichtserkennung nicht möglich. Methode zum Sperren auswählen - Es gibt zwei Möglichkeiten, wie µLauncher den Bildschirm sperren kann. + Es gibt zwei Möglichkeiten, wie μLauncher den Bildschirm sperren kann. Leider haben beide Nachteile:

@@ -258,9 +258,9 @@ Open Source Lizenzen Keine App gefunden um die Suche durchzuführen. URL kann nicht geöffnet werden: kein Browser gefunden. - Mir ist bewusst, dass µLauncher hierdurch weitreichende Berechtigungen erhält. + Mir ist bewusst, dass μLauncher hierdurch weitreichende Berechtigungen erhält. Mir ist bewusst, dass Alternativen existieren (Geräteadministrator oder der Power-Button). - Ich willige ein, dass µLauncher eine Bedienungshilfe für Zwecke verwendet, die nicht unter Barrierefreiheit fallen. + Ich willige ein, dass μLauncher eine Bedienungshilfe für Zwecke verwendet, die nicht unter Barrierefreiheit fallen. Ich willige ein, dass µLauncher keine Daten sammelt. Bedienungshilfe aktivieren Danke für die Mithilfe, μLauncher zu verbessern!\nEs wird darum gebeten, Bug Reports die folgenden Informationen anzufügen, um diese besser nachvollziehen zu können: From c8d7a1cc3e51d063e430e35563b3352710dc706e Mon Sep 17 00:00:00 2001 From: class0068 Date: Mon, 17 Mar 2025 22:02:58 +0000 Subject: [PATCH 19/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 91 ++++++++++++---------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 873ba6a..566d67d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -5,7 +5,7 @@ 更多选项 设置 外观 - 主题 + 主题风格 显示 其他 @@ -40,49 +40,49 @@ 安装应用 没有找到应用市场 - 选择一个壁纸 + 选择壁纸 保持屏幕常亮 功能 边缘滑动动作 - 直接启动匹配搜索内容的应用 + 启动搜索匹配项 搜索时呼出键盘 灵敏度 应用信息 - 查看启动器教程 + 查看 µLauncher 的使用教程 重置设置 - 你将放弃你所有的配置。继续吗? - 反馈 BUG + 该操作将丢弃您的所有配置。是否继续? + 错误反馈 联系该 fork 版本的作者 隐私政策 联系原作者 - 加入 Discord! + 加入我们的 Discord 社区! 全部应用 选择应用 - 花几秒时间学下咋用这个启动器吧! + 👋\n\n花几秒钟时间,了解一下如何用这个启动器吧! 概念 - 该应用是开源的(MIT许可),并在 GitHub 上可用!一定要来看看代码仓库! + 这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库! 使用方法 - 您的主屏幕仅包含本地日期和时间,没有其它纷纷扰扰。 + 您的主屏幕仅包含本地日期和时间,没有多余项目。 设置 - 我们为您选择了一些默认应用。如果您愿意,现在可以更改它们: - 您也可以稍后更改选择。 + 我们为您选择了一些默认应用。如果您希望进行更改,现在就可以: + 您也可以稍后对您的选择进行更改。 开始! 应用 卸载 应用信息 搜索 - 启动器设置 + μLauncher 设置 全部应用 - 音乐:大声 - 音乐:小声 + 增大音量 + 降低音量 音乐:上一首 音乐:下一首 啥也不干 教程 - μLauncher 的设计是最小、高效且无干扰。它不付费、无广告、不追踪。 - 您只需滑动屏幕或按下按钮即可启动应用程序。在下一步向导中选择一些应用程序。 + μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。 + 您可以通过手势或按键来启动最重要的应用程序。 将 μLauncher 设为默认桌面 - 您已经准备好开始了!我希望这对您很有价值!——Finn(Launcher 作者)和 Josia(做了一些改进并维护了 μLauncher 分支) + 您已经准备好开始使用本启动器了!\n\n希望这对你有帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护) 双滑动作 使用本地日期格式 显示时间 @@ -104,9 +104,9 @@ 不要在应用抽屉中显示被绑定到手势的应用 此功能需要 Android 6 或更高版本。 应用程序已隐藏。您可在设置中让它再次显示。 - µLauncher 需要是设备管理员才能够锁定屏幕。 - 这是锁屏动作所必需的。 - µLauncher -锁屏 + µLauncher 需要获得设备管理员权限才能够锁定屏幕。 + 这是执行锁屏操作所必需的。 + µLauncher - 锁屏 收藏的应用 添加到收藏夹 从收藏夹中移除 @@ -138,18 +138,18 @@ 点击日期 点击时间 查看源代码 - 加入 µLauncher 聊天群 + 加入 μLauncher 的聊天群 收藏的应用 锁屏 文本阴影 双指滑动 重命名 %1$s 默认 - 深色 + 暗色 透明 - 昏暗 + 变暗 模糊 - 固实 + 纯色 系统默认 等宽 衬线 @@ -158,16 +158,16 @@ 边缘宽度 重命名 启用锁屏动作 - μLauncher 的无障碍服务未启用。请在设置中启用它 - 错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员。 + μLauncher 的无障碍服务未启用,请在设置中启用它。 + 错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员模式。 使用无障碍服务 - 使用设备管理员 + 使用设备管理员模式 取消 - 浅色 + 亮色 快速设置 - 错误:锁定屏幕失败。(如果您刚刚升级了应用程序,请尝试在手机设置中手动禁用并重新启用无障碍服务) + 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用无障碍服务) 在屏幕边缘滑动 - 将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意,这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审计源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁。 + 将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意,这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审核源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁。 返回 红色 蓝色 @@ -178,7 +178,7 @@ 私人空间 选择颜色 颜色 - 报告错误 + 错误反馈 ]]> 锁定私人空间 V @@ -202,7 +202,7 @@ 私人空间已锁定 私人空间已解锁 私人空间不可用 - µLauncher 需要作为默认的主屏幕来访问私人空间。 + µLauncher 需要作为默认主屏幕才能访问私人空间。 没有找到处理搜索的应用。 无法打开 URL:找不到浏览器。 我已知晓,这将赋予 µLauncher 广泛且重要的权限。 @@ -237,7 +237,7 @@



你可以在设置中随时更改这个选项。 ]]>
- 搜索(不触发自动启动应用程序) + 搜索(不触发自动启动匹配项) 广泛且重要的权限。
µLauncher 将这些权限仅用于锁定屏幕。µLauncher 绝不会收集任何数据。尤其是,µLauncher 不会使用“无障碍”服务来收集任何数据。]]>
(从)左上 (滑向)中右(滑向)左下 单击 + 上滑 @@ -254,14 +254,25 @@ (从)右下 (滑向)中上(滑向)左下 Λ (反向) V(反向) - (反向)]]> - - 按空格键临时暂停该功能。 + (反向)]]> + + 开启后将直接启动匹配搜索内容的应用,可以通过按空格键临时暂停该功能。 应用程序列表样式 绑定到手势 音乐:播放 / 暂停 报告安全漏洞 - 安全漏洞请不要在 Github 上以公开的方式提交,而是使用以下方式进行报告: - 感谢您帮助改进 µLauncher!\n请考虑在您的应用程序错误报告中添加以下信息: - 我已知晓,还有其他替代方法(使用设备管理员权限或电源按键)。 + 请不要在 Github 上以公开的方式报告安全漏洞,请使用以下方式进行报告: + 感谢您帮助改进 µLauncher!\n请考虑在您的应用程序错误反馈中添加以下信息: + 我已知晓,还有其他替代方法(使用设备管理员模式或电源按键)。 + 我同意 μLauncher 不收集任何数据。 + 捐赠 + 调整音量 + 版本 + 所有应用 + 您可以在应用程序列表中快速所搜所有应用。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。 + 当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,在查询内容前加上空格即可禁用。 + 隐藏状态栏 + 隐藏导航栏 + 倒序排列应用程序 + 我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。 From 7ac09bd465cb65de9a0da52f997cc579b2e1766f Mon Sep 17 00:00:00 2001 From: Josia Date: Mon, 17 Mar 2025 23:39:00 +0000 Subject: [PATCH 20/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 566d67d..55376c3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -205,7 +205,7 @@ µLauncher 需要作为默认主屏幕才能访问私人空间。 没有找到处理搜索的应用。 无法打开 URL:找不到浏览器。 - 我已知晓,这将赋予 µLauncher 广泛且重要的权限。 + 我已知晓,这将赋予 μLauncher 广泛且重要的权限。 在应用程序列表中隐藏私人空间 隐藏已被暂停的应用 返回按键 / 返回手势 @@ -227,7 +227,7 @@

通过“无障碍”功能

需要更多的权限。 - µLauncher 将这些权限仅用于锁定屏幕。 + μLauncher 将这些权限仅用于锁定屏幕。
(对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的源代码.)
@@ -238,7 +238,7 @@ 你可以在设置中随时更改这个选项。 ]]>
搜索(不触发自动启动匹配项) - 广泛且重要的权限。
µLauncher 将这些权限仅用于锁定屏幕。µLauncher 绝不会收集任何数据。尤其是,µLauncher 不会使用“无障碍”服务来收集任何数据。]]>
+ 广泛且重要的权限。
μLauncher 将这些权限仅用于锁定屏幕。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
(从)左上 (滑向)中右(滑向)左下 单击 + 上滑 单击 + 下滑 From 0baa889de5fdd577a076e71d6935c62cac384d2d Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Wed, 19 Mar 2025 17:55:35 +0100 Subject: [PATCH 21/50] 0.1.1 --- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/41.txt | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/41.txt diff --git a/app/build.gradle b/app/build.gradle index 2ca3729..9c779e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 40 - versionName "0.1.0" + versionCode 41 + versionName "0.1.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/fastlane/metadata/android/en-US/changelogs/41.txt b/fastlane/metadata/android/en-US/changelogs/41.txt new file mode 100644 index 0000000..4458a89 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/41.txt @@ -0,0 +1,5 @@ + * Improved tutorial (thank you, wassupluke!) + * Added Japanese translation (thank you, anmoti!) + * Improved Chinese translation (thank you, nobody!) + * Fixed bug where gesture navigation triggered long click + * Fixed bug: switching from grayscale icons back to normal now works as expected From 58ddd3c8cc8c428708fb1a76a9fe090b59c038bf Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 20 Mar 2025 14:08:21 +0100 Subject: [PATCH 22/50] fix #130 - revert part of 9043461 as ViewPager2 causes an issue with opening the keyboard --- .../android/launcher/ui/list/ListActivity.kt | 26 ++++++++++--------- app/src/main/res/layout/list.xml | 7 ++++- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 59d83e5..fe27f0f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -9,8 +9,7 @@ import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter -import com.google.android.material.tabs.TabLayoutMediator +import androidx.fragment.app.FragmentPagerAdapter import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.actions.LauncherAction @@ -225,13 +224,10 @@ class ListActivity : AppCompatActivity(), UIObject { updateTitle() val sectionsPagerAdapter = ListSectionsPagerAdapter(this) - binding.listViewpager.apply { - adapter = sectionsPagerAdapter - currentItem = 0 + binding.listViewpager.let { + it.adapter = sectionsPagerAdapter + binding.listTabs.setupWithViewPager(it) } - TabLayoutMediator(binding.listTabs, binding.listViewpager) { tab, position -> - tab.text = sectionsPagerAdapter.getPageTitle(position) - }.attach() } } @@ -243,11 +239,17 @@ private val TAB_TITLES = arrayOf( /** * The [ListSectionsPagerAdapter] returns the fragment, * which corresponds to the selected tab in [ListActivity]. + * + * This should eventually be replaced by a [FragmentStateAdapter] + * However this keyboard does not open when using [ViewPager2] + * so currently [ViewPager] is used here. + * https://github.com/jrpie/launcher/issues/130 */ +@Suppress("deprecation") class ListSectionsPagerAdapter(private val activity: ListActivity) : - FragmentStateAdapter(activity) { + FragmentPagerAdapter(activity.supportFragmentManager) { - override fun createFragment(position: Int): Fragment { + override fun getItem(position: Int): Fragment { return when (position) { 0 -> ListFragmentApps() 1 -> ListFragmentOther() @@ -255,11 +257,11 @@ class ListSectionsPagerAdapter(private val activity: ListActivity) : } } - fun getPageTitle(position: Int): CharSequence { + override fun getPageTitle(position: Int): CharSequence { return activity.resources.getString(TAB_TITLES[position]) } - override fun getItemCount(): Int { + override fun getCount(): Int { return when (activity.intention) { ListActivity.ListActivityIntention.VIEW -> 1 else -> 2 diff --git a/app/src/main/res/layout/list.xml b/app/src/main/res/layout/list.xml index 45bcb85..8a3b5d9 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -95,7 +95,12 @@ - + Date: Thu, 20 Mar 2025 14:12:29 +0100 Subject: [PATCH 23/50] 0.1.2 --- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/42.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/42.txt diff --git a/app/build.gradle b/app/build.gradle index 9c779e1..349f75c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 41 - versionName "0.1.1" + versionCode 42 + versionName "0.1.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/fastlane/metadata/android/en-US/changelogs/42.txt b/fastlane/metadata/android/en-US/changelogs/42.txt new file mode 100644 index 0000000..39011cf --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/42.txt @@ -0,0 +1 @@ +* Fixed bug where keyboard does not open automatically From 54409b63121fe6d6bca3c71dee9980da5944fab7 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 20 Mar 2025 14:55:22 +0100 Subject: [PATCH 24/50] fix #133 --- .../jrpie/android/launcher/ui/HomeActivity.kt | 22 +++++++------------ .../launcher/ui/TouchGestureDetector.kt | 14 ++++++++++-- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index a658cd1..53a0876 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -2,10 +2,10 @@ package de.jrpie.android.launcher.ui import android.annotation.SuppressLint import android.content.SharedPreferences +import android.content.res.Configuration import android.content.res.Resources import android.os.Build import android.os.Bundle -import android.util.DisplayMetrics import android.view.KeyEvent import android.view.MotionEvent import android.view.View @@ -56,22 +56,11 @@ class HomeActivity : UIObject, AppCompatActivity() { super.onCreate(savedInstanceState) super.onCreate() - val displayMetrics = DisplayMetrics() - - @Suppress("deprecation") // required to support API < 30 - windowManager.defaultDisplay.getMetrics(displayMetrics) - - val width = displayMetrics.widthPixels - val height = displayMetrics.heightPixels - touchGestureDetector = TouchGestureDetector( - this, - width, - height, + this, 0, 0, LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f ) - - + touchGestureDetector.updateScreenSize(windowManager) // Initialise layout binding = HomeBinding.inflate(layoutInflater) @@ -103,6 +92,11 @@ class HomeActivity : UIObject, AppCompatActivity() { } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + touchGestureDetector.updateScreenSize(windowManager) + } + override fun onStart() { super.onStart() diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt index 9000fa8..8e8ed4e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt @@ -5,8 +5,10 @@ import android.graphics.Insets import android.os.Build import android.os.Handler import android.os.Looper +import android.util.DisplayMetrics import android.view.MotionEvent import android.view.ViewConfiguration +import android.view.WindowManager import androidx.annotation.RequiresApi import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.preferences.LauncherPreferences @@ -17,8 +19,8 @@ import kotlin.math.tan class TouchGestureDetector( private val context: Context, - val width: Int, - val height: Int, + var width: Int, + var height: Int, var edgeWidth: Float ) { private val ANGULAR_THRESHOLD = tan(Math.PI / 6) @@ -319,6 +321,14 @@ class TouchGestureDetector( } } + fun updateScreenSize(windowManager: WindowManager) { + val displayMetrics = DisplayMetrics() + @Suppress("deprecation") // required to support API < 30 + windowManager.defaultDisplay.getMetrics(displayMetrics) + width = displayMetrics.widthPixels + height = displayMetrics.heightPixels + } + @RequiresApi(Build.VERSION_CODES.Q) fun setSystemGestureInsets(insets: Insets) { systemGestureInsetTop = insets.top From 7fc58fe38482a692b297a746358e3a04daf01a87 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 20 Mar 2025 15:52:12 +0100 Subject: [PATCH 25/50] 0.1.3 --- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/43.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/43.txt diff --git a/app/build.gradle b/app/build.gradle index 349f75c..c280794 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 42 - versionName "0.1.2" + versionCode 43 + versionName "0.1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/fastlane/metadata/android/en-US/changelogs/43.txt b/fastlane/metadata/android/en-US/changelogs/43.txt new file mode 100644 index 0000000..2bca600 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/43.txt @@ -0,0 +1 @@ +* Fixed gesture detection in landscape orientation From 8e140e2e69d88ab3190642cc271ffb0f793e7c82 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 20 Mar 2025 16:23:01 +0100 Subject: [PATCH 26/50] rename tab "Apps" to "Actions" and "Volume Up/Down" to "Volume Up/Down Key" --- .../jrpie/android/launcher/ui/settings/SettingsActivity.kt | 2 +- app/src/main/res/values-de/strings.xml | 6 +++--- app/src/main/res/values/strings.xml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt index 4c464e5..cd59726 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/SettingsActivity.kt @@ -109,7 +109,7 @@ class SettingsActivity : AppCompatActivity(), UIObject { } private val TAB_TITLES = arrayOf( - R.string.settings_tab_app, + R.string.settings_tab_actions, R.string.settings_tab_launcher, R.string.settings_tab_meta ) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 735aa9d..d07ff7d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -14,7 +14,7 @@ - --> Einstellungen - Apps + Aktionen Launcher Meta Settings - Apps + Actions Launcher Meta @@ -85,9 +85,9 @@ Λ (Reverse) Bottom right -> top mid -> bottom left - Volume Up + Volume Up Key Press the volume up button - Volume Down + Volume Down Key Press the volume down button Double Click Double click an empty area From b4608ef15338891d9715ec7ca133c05bbde3ec28 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 24 Mar 2025 13:21:58 +0100 Subject: [PATCH 27/50] add new action: show recent apps --- app/src/main/AndroidManifest.xml | 4 +-- .../launcher/actions/LauncherAction.kt | 12 +++++++- .../lock/LauncherAccessibilityService.kt | 30 +++++++++++++++---- .../launcher/actions/lock/LockMethod.kt | 1 + .../main/res/drawable/baseline_apps_24.xml | 11 +++++++ app/src/main/res/values/strings.xml | 21 ++++++++++--- 6 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_apps_24.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 93f6ce8..a5f8831 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -85,7 +85,7 @@ @@ -97,4 +97,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index 5d2be94..ee9502c 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -11,7 +11,9 @@ import android.view.KeyEvent import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import de.jrpie.android.launcher.Application +import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked import de.jrpie.android.launcher.apps.isPrivateSpaceSupported @@ -132,6 +134,14 @@ enum class LauncherAction( R.drawable.baseline_settings_applications_24, ::expandSettingsPanel ), + RECENT_APPS( + "recent_apps", + R.string.list_other_recent_apps, + R.drawable.baseline_apps_24, + LauncherAccessibilityService::openRecentApps, + false, + { _ -> BuildConfig.USE_ACCESSIBILITY_SERVICE } + ), LOCK_SCREEN( "lock_screen", R.string.list_other_lock_screen, @@ -142,7 +152,7 @@ enum class LauncherAction( "toggle_torch", R.string.list_other_torch, R.drawable.baseline_flashlight_on_24, - ::toggleTorch + ::toggleTorch, ), NOP("nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {}); diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt index a8ef6f2..7cb32d9 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt @@ -22,26 +22,44 @@ class LauncherAccessibilityService : AccessibilityService() { companion object { private const val TAG = "Launcher Accessibility" + private const val ACTION_REQUEST_ENABLE = "ACTION_REQUEST_ENABLE" const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN" + const val ACTION_RECENT_APPS = "ACTION_RECENT_APPS" - fun lockScreen(context: Context) { + private fun invoke(context: Context, action: String, failureMessageRes: Int) { try { context.startService( Intent( context, LauncherAccessibilityService::class.java ).apply { - action = ACTION_LOCK_SCREEN + this.action = action }) - } catch (e: Exception) { + } catch (_: Exception) { Toast.makeText( context, - context.getString(R.string.alert_lock_screen_failed), + context.getString(failureMessageRes), Toast.LENGTH_LONG ).show() } } + fun lockScreen(context: Context) { + if (!isEnabled(context)) { + showEnableDialog(context) + } else { + invoke(context, ACTION_LOCK_SCREEN, R.string.alert_lock_screen_failed) + } + } + + fun openRecentApps(context: Context) { + if (!isEnabled(context)) { + showEnableDialog(context) + } else { + invoke(context, ACTION_RECENT_APPS, R.string.alert_recent_apps_failed) + } + } + fun isEnabled(context: Context): Boolean { val enabledServices = Settings.Secure.getString( context.contentResolver, @@ -58,7 +76,7 @@ class LauncherAccessibilityService : AccessibilityService() { setView(R.layout.dialog_consent_accessibility) setTitle(R.string.dialog_consent_accessibility_title) setPositiveButton(R.string.dialog_consent_accessibility_ok) { _, _ -> - lockScreen(context) + invoke(context, ACTION_REQUEST_ENABLE, R.string.alert_enable_accessibility_failed) } setNegativeButton(R.string.dialog_cancel) { _, _ -> } }.create().also { it.show() }.apply { @@ -94,7 +112,9 @@ class LauncherAccessibilityService : AccessibilityService() { } when (action) { + ACTION_REQUEST_ENABLE -> {} // do nothing ACTION_LOCK_SCREEN -> handleLockScreen() + ACTION_RECENT_APPS -> performGlobalAction(GLOBAL_ACTION_RECENTS) } } return super.onStartCommand(intent, flags, startId) diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt index 541510a..93b4cbf 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt @@ -6,6 +6,7 @@ import android.widget.Button import androidx.appcompat.app.AlertDialog import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService import de.jrpie.android.launcher.preferences.LauncherPreferences diff --git a/app/src/main/res/drawable/baseline_apps_24.xml b/app/src/main/res/drawable/baseline_apps_24.xml new file mode 100644 index 0000000..c5a49a0 --- /dev/null +++ b/app/src/main/res/drawable/baseline_apps_24.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c426a5c..83b963b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -252,6 +252,7 @@ Music: Previous Music: Play / Pause Expand notifications panel + Recent Apps Do nothing Lock Screen Toggle Torch @@ -307,6 +308,8 @@ No camera with torch detected. Error: Can\'t access torch. Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings) + Error: Failed to show recent apps. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings) + Error: Failed to enable the accessibility service. μLauncher\'s accessibility service is not enabled. Please enable it in settings Private space locked Private space unlocked @@ -315,12 +318,17 @@ Lock private space Unlock private space Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead. - μLauncher - lock screen + μLauncher - Setting μLauncher as an accessibility service allows it to lock the screen. + Setting μLauncher as an accessibility service allows it to lock the screen and open the recent apps menu. Note that excessive permissions are required. You should never grant such permissions lightly to any app. - μLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure. + μLauncher will use the accessibility service only for performing the following actions when requested by the user: + + * lock screen + * open recent apps + + μLauncher will never use the accessibility service to collect data. You can check the source code to make sure. Note that locking the screen can also be accomplished by granting μLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock. @@ -365,7 +373,12 @@ I am aware that other options exist (using device administrator privileges or the power button). I consent to μLauncher using the accessibility service to provide functionality unrelated to accessibility. I consent to μLauncher not collecting any data. - far-reaching privileges to μLauncher.
μLauncher will use these privileges only to lock the screen. μLauncher will never collect any data. In particular, μLauncher does not use the accessibility service to collect any data.]]>
+ far-reaching privileges to μLauncher.
μLauncher will use these privileges only to perform the following actions: +
    +
  • Lock Screen
  • +
  • Recent Apps
  • +
+ μLauncher will never collect any data. In particular, μLauncher does not use the accessibility service to collect any data.]]>
Activating the Accessibility Service Activate Accessibility Service Cancel From 5d695ec0ea49177cf4627196e8ebcf2e7a1ce886 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 29 Mar 2025 18:45:53 +0100 Subject: [PATCH 28/50] fix #135 --- app/src/main/java/de/jrpie/android/launcher/Functions.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index 7bbbdb5..df57008 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -38,6 +38,8 @@ import androidx.core.net.toUri const val LOG_TAG = "Launcher" +const val REQUEST_SET_DEFAULT_HOME = 42 + fun isDefaultHomeScreen(context: Context): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val roleManager = context.getSystemService(RoleManager::class.java) @@ -62,8 +64,9 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { && !isDefault // using role manager only works when µLauncher is not already the default. ) { val roleManager = context.getSystemService(RoleManager::class.java) - context.startActivity( - roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME) + context.startActivityForResult( + roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), + REQUEST_SET_DEFAULT_HOME ) return } From 653d16b269f609d9de0c523d9f3bd56930e29302 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 29 Mar 2025 21:09:15 +0100 Subject: [PATCH 29/50] new action: launch other launchers --- .../java/de/jrpie/android/launcher/Functions.kt | 2 +- .../android/launcher/actions/LauncherAction.kt | 15 +++++++++++++++ app/src/main/res/drawable/baseline_home_24.xml | 11 +++++++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/baseline_home_24.xml diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index df57008..afc2c31 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -61,7 +61,7 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && context is Activity - && !isDefault // using role manager only works when µLauncher is not already the default. + && checkDefault // using role manager only works when µLauncher is not already the default. ) { val roleManager = context.getSystemService(RoleManager::class.java) context.startActivityForResult( diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index ee9502c..6ba467e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -154,6 +154,12 @@ enum class LauncherAction( R.drawable.baseline_flashlight_on_24, ::toggleTorch, ), + LAUNCH_OTHER_LAUNCHER( + "launcher_other_launcher", + R.string.list_other_launch_other_launcher, + R.drawable.baseline_home_24, + ::launchOtherLauncher + ), NOP("nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {}); override fun invoke(context: Context, rect: Rect?): Boolean { @@ -258,6 +264,15 @@ private fun expandSettingsPanel(context: Context) { } } +private fun launchOtherLauncher(context: Context) { + context.startActivity( + Intent.createChooser( + Intent(Intent.ACTION_MAIN).also { it.addCategory(Intent.CATEGORY_HOME) }, + context.getString(R.string.list_other_launch_other_launcher) + ) + ) +} + private fun openSettings(context: Context) { context.startActivity(Intent(context, SettingsActivity::class.java)) } diff --git a/app/src/main/res/drawable/baseline_home_24.xml b/app/src/main/res/drawable/baseline_home_24.xml new file mode 100644 index 0000000..935d1b6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_home_24.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83b963b..a8bc9b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -256,6 +256,7 @@ Do nothing Lock Screen Toggle Torch + Launch other Home Screen Add Shortcut From e7c1d285766bb0f8a3625653158d70a15b72abf1 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 13 Apr 2025 14:40:57 +0200 Subject: [PATCH 30/50] upgrade AGP --- .scripts/release.sh | 2 +- build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.scripts/release.sh b/.scripts/release.sh index 0c71f4a..f207c87 100755 --- a/.scripts/release.sh +++ b/.scripts/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -export JAVA_HOME="/usr/lib/jvm/java-23-openjdk/" +export JAVA_HOME="/usr/lib/jvm/java-21-openjdk/" OUTPUT_DIR="$HOME/launcher-release" BUILD_TOOLS_DIR="$HOME/Android/Sdk/build-tools/35.0.0" KEYSTORE="$HOME/data/keys/launcher_jrpie.jks" diff --git a/build.gradle b/build.gradle index 2bb501f..57dd74a 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.kotlin_version = '2.0.0' - ext.android_plugin_version = '8.9.0' + ext.android_plugin_version = '8.9.1' repositories { google() mavenCentral() @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:8.9.0' + classpath 'com.android.tools.build:gradle:8.9.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.android.tools.build:gradle:$android_plugin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" From 0441b3fd3d76cde098c496327b42af20a2f9b929 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 13 Apr 2025 14:54:11 +0200 Subject: [PATCH 31/50] set max width for choose app button; change label from scegliere l'applicazione to scegliere in Italian --- app/src/main/res/layout/settings_actions_row.xml | 6 ++++-- app/src/main/res/values-it/strings.xml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/settings_actions_row.xml b/app/src/main/res/layout/settings_actions_row.xml index df449c4..a60a5a4 100644 --- a/app/src/main/res/layout/settings_actions_row.xml +++ b/app/src/main/res/layout/settings_actions_row.xml @@ -43,13 +43,15 @@ android:id="@+id/settings_actions_row_button_choose" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="2" + android:maxWidth="100dp" android:text="@string/settings_apps_choose" android:textAllCaps="false" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - /> + app:layout_constraintTop_toTopOf="parent" /> Scorri verso destra sul bordo inferiore dello schermo Aspetto - Scegliere l\'applicazione + Scegliere Tema Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni. Non contiene pagamenti, pubblicità o servizi di tracciamento. Predefinito From e6dd2634ae434bdde7a47fb24e8f5b251f7e3c3a Mon Sep 17 00:00:00 2001 From: class0068 Date: Tue, 18 Mar 2025 19:41:41 +0000 Subject: [PATCH 32/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 55376c3..12e6a68 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -104,7 +104,7 @@ 不要在应用抽屉中显示被绑定到手势的应用 此功能需要 Android 6 或更高版本。 应用程序已隐藏。您可在设置中让它再次显示。 - µLauncher 需要获得设备管理员权限才能够锁定屏幕。 + µLauncher 需要激活“设备管理应用”权限才能够锁定屏幕。 这是执行锁屏操作所必需的。 µLauncher - 锁屏 收藏的应用 @@ -158,16 +158,16 @@ 边缘宽度 重命名 启用锁屏动作 - μLauncher 的无障碍服务未启用,请在设置中启用它。 - 错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员模式。 - 使用无障碍服务 - 使用设备管理员模式 + μLauncher 的“无障碍”服务未启用,请在设置中启用它。 + 错误:此设备不支持使用“无障碍”服务锁定屏幕。请改用激活“设备管理应用”权限。 + 使用“无障碍”服务 + 激活“设备管理应用”权限 取消 亮色 快速设置 - 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用无障碍服务) + 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用“无障碍”服务) 在屏幕边缘滑动 - 将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意,这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审核源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁。 + 将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。获得授权后“无障碍”服务将仅被用于锁定屏幕。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。 返回 红色 蓝色 @@ -193,8 +193,8 @@ 复制到剪贴板 此功能需要 Android 15 或更高版本。 切换私人空间锁 - 激活无障碍服务 - 正在激活无障碍服务 + 激活“无障碍”服务 + 正在激活“无障碍”服务 开源许可证 开源许可证 在应用列表中显示 @@ -219,8 +219,8 @@ 有2种方式可以用来锁定屏幕。 遗憾的是,两者都有缺点:

-

通过设置“设备管理应用”

- 无法和指纹解锁和脸部解锁共同使用。 +

通过激活“设备管理应用”权限

+ 该方法无法和指纹解锁和脸部解锁共同使用。

@@ -229,16 +229,16 @@ 需要更多的权限。 μLauncher 将这些权限仅用于锁定屏幕。
- (对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的源代码.) + (对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的源代码.)
- 在某些设备上,激活辅助功能服务后,启动PIN码将不再用于加密数据。 - 如果遇到该问题,可以通过该方法重新激活启动PIN码用于数据加密。 + 在某些设备上,激活“无障碍”服务后,启动 PIN 码将不再用于加密数据。 + 如果遇到该问题,可以通过该方法重新激活启动 PIN 码用于数据加密。



你可以在设置中随时更改这个选项。 ]]>
搜索(不触发自动启动匹配项) - 广泛且重要的权限。
μLauncher 将这些权限仅用于锁定屏幕。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
+ 广泛且重要的权限。
但 μLauncher 仅会在需要锁定屏幕时使用这些权限。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
(从)左上 (滑向)中右(滑向)左下 单击 + 上滑 单击 + 下滑 @@ -263,7 +263,7 @@ 报告安全漏洞 请不要在 Github 上以公开的方式报告安全漏洞,请使用以下方式进行报告: 感谢您帮助改进 µLauncher!\n请考虑在您的应用程序错误反馈中添加以下信息: - 我已知晓,还有其他替代方法(使用设备管理员模式或电源按键)。 + 我已知晓,还有其他替代方法(激活“设备管理应用”权限或通过电源按键)。 我同意 μLauncher 不收集任何数据。 捐赠 调整音量 From 8a487eb4c78a07b1f646bc64227625ff3694fce8 Mon Sep 17 00:00:00 2001 From: class0068 Date: Thu, 20 Mar 2025 23:06:32 +0000 Subject: [PATCH 33/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 12e6a68..e5ca8ac 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -13,7 +13,7 @@ 无法打开应用 要更改其设置吗? 打开设置,为该手势绑定一个应用程序 - 应用程序 + 快捷操作 启动器 杂项 From 4f801427a41d890788e1e3dd54eb1cc8d1513592 Mon Sep 17 00:00:00 2001 From: toolatebot Date: Fri, 21 Mar 2025 00:07:18 +0000 Subject: [PATCH 34/50] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ --- app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - 7 files changed, 7 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ccbeb3f..4a363b0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -23,7 +23,6 @@ - --> Configuración - Aplicaciones Launcher Meta Réglages - Applications Launcher Meta Configurações - Apps Launcher Meta No se pudo abrir la aplicación ¿Desea cambiar la configuración? - Abra la configuración para elegir una aplicación para esta acción + Abra la configuración para elegir una acción para este gesto - Deslizar Arriba + Arriba Doble Arriba - Deslizar Abajo + Abajo Doble Abajo - Deslizar Izquierda + Izquierda Doble Izquierda - Deslizar Derecha + Derecha Doble Derecha - Subir Volumen - Bajar Volumen + Tecla para subir el volumen + Tecla para bajar el volumen Doble Click Click Largo - Toca la fecha - Toca el reloj + Fecha + reloj Elegir Aplicación Instalar aplicaciones No se encontró la Store @@ -72,7 +72,7 @@ --> Seleccionar Launcher Información de la aplicación - Ver tutorial de Launcher + Ver el tutorial de µLauncher Configuración por defecto Todas sus preferencias se eliminarán. Desea continuar? Reportar un error @@ -91,11 +91,11 @@ Otros Desinstalar Información - Buscar Aplicaciones - Configuración de Launcher + Buscar + Configuración de μLauncher Aplicaciones - Música: Subir - Música: Bajar + Subir el volumen + Bajar volumen Música: Siguiente Música: Anterior Nada @@ -105,19 +105,214 @@ - --> Tutorial - Tómate unos segundos para aprender a usar este launcher + 👋\n\n¡Tómate unos segundos para aprender a utilizar este Launcher! Concepto - Launcher está diseñado para ser minimalista, eficiente y libre de distracciones.\n\nEs gratis y libre de anuncios y servicios de rastreo. - La aplicación es de código abierto (licencia MIT) y está disponible en GitHub!\n\nNo olvides echarle un vistazo al repositorio! + μLauncher está diseñado para ser mínimo, eficiente y libre de distracciones.\n\nNo contiene anuncios ni recopila datos. + ¡Es software libre (licencia MIT)!\n¡No olvides visitar el repositorio! Uso Tu pantalla de inicio contiene la fecha y hora local. Sin distracciones. - Puedes iniciar tus aplicaciones con solo presionar o deslizar una vez. Elige algunas en la siguiente pantalla. + Puede iniciar sus aplicaciones más importantes con gestos táctiles o presionando botones. Puesta a punto - Elegimos algunas aplicaciones por defecto para ti, si lo deseas puedes cambiarlas ahora. + Elegimos algunas aplicaciones predeterminadas para ti. Puedes cambiarlos ahora si lo deseas: También puedes cambiar tu selección más tarde. Vamos! - Estás listo para iniciar!\n\n Esperamos que esto te sea de gran ayuda!\n\n- Finn M Glas\n(el desarrollador) + ¡Estás listo para comenzar!\n\n¡Espero que esto sea de gran valor para ti!\n\n- Finn (quien creó Launcher) y Josia (quien hizo algunas mejoras y mantiene la bifurcación μLauncher) Iniciar Configuración Más opciones + atrás + Toca + Derecha Toca y desliza hacia la derecha + Desliza el dedo hacia la izquierda en la parte inferior de la pantalla + Desliza hacia abajo en el borde derecho de la pantalla + Botón de retroceso / gesto de retroceso + Desliza el dedo hacia arriba en el borde izquierdo de la pantalla + Desliza el dedo hacia arriba en el borde derecho de la pantalla + Desliza el dedo hacia abajo en el borde izquierdo de la pantalla + Dinámico + Color + Toca y desliza hacia arriba + Toque + Izquierda + Desliza el dedo hacia la derecha en la parte inferior de la pantalla + Desliza el dedo hacia la izquierda en la parte superior de la pantalla + Abajo (borde izquierdo) + Presione el botón para subir el volumen + Presione la barra espaciadora para desactivar esta función temporalmente. + Aplicaciones + Arriba a la izquierda -> Abajo en el medio -> Arriba a la derecha + Presione regresar mientras busca en la lista de aplicaciones para iniciar una búsqueda web. + Error: No se puede acceder a la antorcha. + Fondo (lista de aplicaciones y configuración) + Tema de color + Fuente + Iconos de aplicaciones monocromáticos + Derecha (arriba) + Derecha (Abajo) + Izquierda (arriba) + nunca recopilará ningún dato. En particular, μLauncher no utiliza el servicio de accesibilidad para recopilar ningún dato.]]> + Configurar μLauncher como un servicio de accesibilidad le permite bloquear la pantalla. Tenga en cuenta que se requieren permisos excesivos. Nunca debe otorgar dichos permisos a la ligera a ninguna aplicación. μLauncher utilizará el servicio de accesibilidad solo para bloquear la pantalla. Puedes consultar el código fuente para asegurarte. Tenga en cuenta que también se puede bloquear la pantalla otorgando permisos de administrador del dispositivo μLauncher. Sin embargo, ese método no funciona con el desbloqueo mediante huellas dactilares y rostro. + Ocultar el espacio privado de la lista de aplicaciones + Diseño de la lista de aplicaciones + Espacio privado + No se detectó ninguna cámara con linterna. + Activar o desactivar el bloqueo del espacio privado + Activar o desactivar la antorcha + Ocultar aplicaciones pausadas + Aplicaciones ocultas + Cambiar el nombre de %1$s + Cancelar + V + Informar un error + mostrar + μLauncher debe ser la pantalla de inicio predeterminada para acceder al espacio privado. + No informe vulnerabilidades de seguridad públicamente en GitHub, sino utilice lo siguiente: + Informar sobre una vulnerabilidad de seguridad + Crear informe + Únete al chat de μLauncher + Donar + Ajustar el volumen + Expandir el panel de notificaciones + El espacio privado no está disponible + Desliza hacia arriba + Haga doble clic en un área vacía + Presione el botón para bajar el volumen + Haga clic largo en un área vacía + Haga clic en la fecha + Haga clic en el reloj + Mostrar la hora + Sombra de texto + Ocultar la barra de estado + Ocultar la barra de navegación + Deslizar con dos dedos + predeterminado + Aplicaciones favoritas + Aplicaciones ocultas + Deshacer + Doy mi consentimiento para que μLauncher utilice el servicio de accesibilidad para proporcionar una funcionalidad no relacionada con la accesibilidad. + Buscar (sin inicio automático) + Soy consciente de que esto otorgará privilegios de gran alcance a μLauncher. + Soy consciente de que existen otras opciones (utilizando privilegios de administrador del dispositivo o el botón de encendido). + Licencias de código abierto + Licencias de código abierto + versión + Todas las aplicaciones + Elija el método para bloquear +
+ + Administrador del dispositivo + No funciona con desbloqueo por huella dactilar ni reconocimiento facial. + +
+
+ + Servicio de Accesibilidad + Requiere privilegios excesivos. + μLauncher utilizará esos privilegios solo para bloquear la pantalla. +
+ (Realmente no deberías confiar en una aplicación aleatoria que acabas de descargar con tal afirmación, pero puedes consultar el código fuente). +
+ En algunos dispositivos, el PIN de inicio ya no se utilizará para cifrar datos después de activar un servicio de accesibilidad. + Esto se puede reactivar posteriormente. + +



+ Puede cambiar su selección más tarde en la configuración. + ]]>
+ Utilice el servicio de accesibilidad + Usar el administrador del dispositivo + Elija el método para bloquear la pantalla + Rojo + alfa + Azul + Verde + Sans serif + Serif + Monoespaciado + Serif monoespaciado + Mostrar la fecha + Utilice el formato de fecha localizado + Mostrar segundos + Cambiar fecha y hora + Girar la pantalla + Acciones de deslizamiento de borde + Desliza el dedo por el borde de la pantalla + Ancho del borde + No mostrar aplicaciones que estén vinculadas a un gesto en la lista de aplicaciones + Ver el código fuente + ¡Gracias por ayudarnos a mejorar μLauncher!\nConsidere agregar la siguiente información a su informe de error: + Copiar al portapapeles + Añadir a favoritos + Eliminar de favoritos + Esconder + Renombrar + Aplicaciones favoritas + Espacio privado + Puede buscar rápidamente entre todas las aplicaciones en la lista de aplicaciones.\n\nDesliza hacia arriba para abrirlo o asigne un gesto diferente. + Una vez que sólo coincide una aplicación, se inicia automáticamente.\nEsto se puede desactivar anteponiendo un espacio a la consulta. + Error: No se puede expandir la barra de estado. Esta acción utiliza una funcionalidad que no forma parte de la API de Android publicada. Lamentablemente, no parece funcionar en su dispositivo. + Esta funcionalidad requiere Android 6 o posterior. + Esta funcionalidad requiere Android 15 o posterior. + Aplicación oculta. Puedes hacerlo visible nuevamente en la configuración. + Configuración rápida + μLauncher debe ser administrador del dispositivo para poder bloquear la pantalla. + Esto es necesario para la acción de la pantalla de bloqueo. + Habilitar la acción de bloqueo de pantalla + Error: Error al bloquear la pantalla. (Si acaba de actualizar la aplicación, intente deshabilitar y volver a habilitar el servicio de accesibilidad en la configuración del teléfono) + El servicio de accesibilidad de μLauncher no está habilitado. Por favor, habilítelo en la configuración + Espacio privado bloqueado + Espacio privado desbloqueado + Bloquear el espacio privado + Desbloquear espacio privado + Error: El bloqueo de la pantalla mediante accesibilidad no es compatible con este dispositivo. En su lugar, utilice el administrador del dispositivo. + μLauncher - pantalla de bloqueo + Color + Elige el color + Doy mi consentimiento para que μLauncher no recopile ningún dato. + Activación del servicio de accesibilidad + Activar el servicio de accesibilidad + No se encontró ninguna aplicación para gestionar la búsqueda. + No se puede abrir la URL: no se encontró ningún navegador. + Acciones + Toca + Arriba + Desliza hacia arriba con dos dedos + Desliza hacia abajo + Toque + Abajo + Toca y desliza hacia abajo + Desliza hacia abajo con dos dedos + Desliza hacia la izquierda + Toca y desliza hacia la izquierda + Desliza dos dedos hacia la izquierda + Desliza hacia la derecha + Toque + Derecha + Desliza con dos dedos hacia la derecha + Desliza el dedo hacia la derecha en la parte superior de la pantalla + Izquierda (Abajo) + Arriba (borde izquierdo) + Arriba (borde derecho) + Abajo (borde derecho) + Arriba a la izquierda -> centro a la derecha -> abajo a la izquierda + Abajo a la izquierda -> centro a la derecha -> arriba a la izquierda + Arriba a la derecha -> centro a la izquierda -> abajo a la derecha + Abajo a la derecha -> centro a la izquierda -> arriba a la derecha + V (Reversa) + Arriba a la derecha -> Abajo en el medio -> Arriba a la izquierda + Λ + Abajo a la izquierda -> arriba en el medio -> abajo a la derecha + Λ (Inverso) + Abajo a la derecha -> arriba en el medio -> abajo a la izquierda + Atenuación + Sólido + Valor predeterminado del sistema + Transparente + Difuminar + Buscar en la web + texto + Red + Música: Reproducir / Pausa + Pantalla de bloqueo + Agregar acceso directo + Vincular al gesto + Mostrar en la lista de aplicaciones + Invertir la lista de aplicaciones From bfc84b57ca573a8699dd6a9c29dc2482ca4c61c7 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Sat, 22 Mar 2025 16:48:40 +0000 Subject: [PATCH 36/50] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 57 +++++++++++++--------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c39f0cb..4b2bcd2 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -37,8 +37,8 @@ Para cima (borda direita) Para baixo (borda esquerda) Para baixo (borda direita) - Aumento de volume - Diminuição de volume + Botão de aumentar volume + Botão de diminuição de volume Toque duplo Toque longo Data @@ -76,7 +76,7 @@ --> Definir o μLauncher como tela inicial Informações do aplicativo - Ver tutorial do launcher + Ver tutorial do µLauncher Redefinir configuraçãos Você vai descartar todas as suas preferências. Continuar? Reportar um bug @@ -96,10 +96,10 @@ Desinstalar Informações do aplicativo Busque - Configurações do µLauncher + Configurações do μLauncher Todos os apps - Música: Mais alto - Música: Mais silencioso + Aumento de volume + Diminuição de volume Música: Próximo Música: Anterior Não faça nada @@ -109,18 +109,18 @@ - --> Tutorial - Tire alguns segundos para aprender a usar este Launcher! + 👋\n\nTire alguns segundos para aprender a usar este Launcher! Conceito - O Launcher foi criado para ser minimalista, eficiente e livre de distrações. Ele é livre de pagamentos, anúncios e serviços de rastreamento. - O app é de código aberto (licença MIT) e está disponível no GitHub! Não deixe de conferir o repositório! + O μLauncher foi criado para ser minimalista, eficiente e livre de distrações. \n\n\nNão contém anúncios e não coleta dados. + É um software livre (sob licença MIT)!\nNão deixe de conferir o repositório! Uso Sua tela inicial contém a data e hora local. Sem distrações. - Você pode iniciar seus aplicativos com um gesto único ou apertando um botão. Escolha algumas ações no próximo slide. + Você pode iniciar seus aplicativos com gestos de toque ou apertando um botão. Configurar Selecionamos alguns aplicativos padrão para você. Se quiser, você pode alterá-los agora: Você pode alterar suas escolhas mais tarde. Vamos lá! - Tá todo pronto para começar! Espero que isso seja de grande valor para você! - Finn (que criou o Launcher) \te Josia (que fez algumas melhorias e tb mantém o fork do μLauncher) + Tá todo pronto para começar!\n\nEspero que isso seja de grande valor para você!\n\n- Finn (que criou o Launcher) e Josia (que fez algumas melhorias e tb mantém o fork do μLauncher) Começar Configurações Mais opções @@ -147,11 +147,11 @@ Erro: Falha ao bloquear a tela. (Se você acabou de atualizar o app, tente desativar e reativar o Serviço de acessibilidade em configurações do aparelho) O Serviço de acessibilidade do μLauncher não está ativado. Entre em configurações para ativar Não mostrar apps com um gesto atribuído na lista de aplicativos - O µLauncher precisa tornar-se o Administrador do dispositivo para poder bloquear a tela. + O μLauncher precisa virar um Administrador do dispositivo para poder bloquear a tela. Isto é necessário para realizar a ação de bloqueio da tela. Permitir a ação de bloqueio da tela Erro: Não é possível acessar a lanterna. - µLauncher - bloqueio da tela + μLauncher - bloqueio da tela Usar o Serviço de acessibilidade Usar o Administrador do dispositivo Escolha um método de bloqueio @@ -160,7 +160,7 @@ Essa funcionalidade requer o Android 6 ou mais recente. Nenhuma câmera com lanterna detectada. Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo. - Definindo µLauncher como Serviço de acessibilidade permite a ele bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O µLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao µLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. + Definindo o μLauncher como Serviço de acessibilidade permite bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O μLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao μLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. Escolha um método de bloqueio Há dois métodos para bloquear a tela. @@ -174,9 +174,9 @@

Serviço de acessibilidade

Exige permissões elevadas. - O µLauncher usará essas permissões apenas para bloquear a tela. + O μLauncher usará essas permissões apenas para bloquear a tela.
- (Você realmente não deveria confiar num app aleatório que você baixou que tá pedindo estas permissões, mas pode verificar o código-fonte.) + (Você realmente não deveria confiar num app aleatório que você baixou e tá pedindo estas permissões, mas pode verificar o código-fonte.)
Em alguns aparelhos após ativação do Serviço de acessibilidade não será mais exigido o PIN para acessar dados criptografados, na inicialização do celular. Isto pode ser reativado depois. @@ -210,7 +210,7 @@ Deslize na borda da tela Largura da borda Ver código-fonte - Entre no chat do µLauncher + Entre no chat do μLauncher Bloquear a tela Sombra no texto Transparente @@ -236,13 +236,13 @@ Verde Cor Escola a cor - Autorizo a utilização do Serviço de acessibilidade para disponibilizar funcionalidades não relacionadas com a acessibilidade. - Não autorizo ao µLauncher a coleta de quaisquer dados. + Autorizo o μLauncher a usar Serviço de acessibilidade para acessar funcionalidades não relacionadas com a acessibilidade. + Não autorizo ao μLauncher coletar quaisquer dados. Ativação do Serviço de acessibilidade Ativar o Serviço de acessibilidade Cancelar - permissões elevadas ao µLauncher.
µLauncher usará estas permissões apenas para bloquear a tela. µLauncher nunca coletará nenhum dado. Sobretudo, o µLauncher não implementa o Serviço de acessibilidade para coletar dados.]]>
- Estou ciente de que isto concederá permissões elevadas ao µLauncher. + permissões elevadas ao μLauncher.
μLauncher usará estas permissões apenas para bloquear a tela. μLauncher nunca coletará nenhum dado. Sobretudo, o μLauncher não implementa o Serviço de acessibilidade para coletar dados.]]>
+ Estou ciente de que isto concederá permissões elevadas ao μLauncher. Estou ciente de que existem outras opções (permissões de Administrador do aparelho ou o botão de ligar). Pesquise na internet Ao buscar na lista de apps toque no Enter para iniciar uma pesquisa na internet. @@ -255,13 +255,13 @@ Espaço privado trancado Espaço privado liberado Espaço privado indisponível - O µLauncher precisa ser definido como a tela inicial padrão para poder usar Espaço privado. + O μLauncher precisa ser definido como a tela inicial padrão para poder usar Espaço privado. Copiar para memória Não relate vulnerabilidades de segurança publicamente no GitHub, use o seguinte: Relatar vulnerabilidade de segurança Criar relatório Relatar um bug - Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug: + Obrigado por ajudar a melhorar o μLauncher!\nConsidere adicionar as seguintes informações ao relatório dos bugs: Toque no espaço para temporariamente desativar esta funcionalidade. Não foi possível abrir a URL: nenhum navegador encontrado. Nenhum app encontrado para efetuar a pesquisa. @@ -300,5 +300,14 @@ Música: Reproduzir / Pausar Canto inferior direito -> centro esquerdo -> canto superior direito Inferior direito -> superior médio -> inferior esquerdo - Lista de apps inversa + Inverter a lista de apps + Doar + Ajuste de volume + Ocultar barra de status + Ocultar barra de navegação + Versão + Todos apps + Você pode encontrar rápido todos os apps na lista de aplicativos.\n\nDeslize para cima para abrir ou definir um gesto específico. + Quando apenas um aplicativo corresponde, vai ser iniciado automaticamente.\nIsso pode ser desativado acrescentando um espaço durante a busca. + Ações From 14ffbd1f6cefe6e8b74c8d027729c16ce43e4a53 Mon Sep 17 00:00:00 2001 From: class0068 Date: Mon, 24 Mar 2025 13:07:24 +0000 Subject: [PATCH 37/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 135 +++++++++++---------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3eeaf50..4a7cd64 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -5,36 +5,36 @@ 更多选项 设置 外观 - 主题风格 + 色调风格 显示 其他 - - + 上滑 + 下滑 无法打开应用 要更改其设置吗? 打开设置,为该手势绑定一个应用程序 启动器 杂项 - 左滑两次 - 上滑两次 - 下滑两次 + 双指左滑 + 双指上滑 + 双指下滑 - 右滑两次 - 右(顶部) - 右(底部) - 左(底部) - 左(顶部) - 上(左边缘) - 上(右边缘) - 下(左边缘) - 下(右边缘) - 音量加 - 音量减 + 双指右滑 + 右滑(顶部) + 右滑(底部) + 左滑(底部) + 左滑(顶部) + 上滑(左边缘) + 上滑(右边缘) + 下滑(左边缘) + 下滑(右边缘) + 音量增加键 + 音量降低键 双击 长按 - 日期 - 时间 + 桌面日期 + 桌面时钟 选择应用 安装应用 没有找到应用市场 @@ -42,9 +42,9 @@ 选择壁纸 保持屏幕常亮 功能 - 边缘滑动动作 - 启动搜索匹配项 - 搜索时呼出键盘 + 边缘滑动手势 + 自动启动搜索匹配项 + 自动激活搜索 灵敏度 应用信息 查看 µLauncher 的使用教程 @@ -61,10 +61,10 @@ 概念 这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库! 使用方法 - 您的主屏幕仅包含本地日期和时间,没有多余项目。 + 您的主屏幕仅包含本地日期和时间,没有多余的项目。 设置 - 我们为您选择了一些默认应用。如果您希望进行更改,现在就可以: - 您也可以稍后对您的选择进行更改。 + 我们为您预设了一些快捷操作。如果您不满意,现在就试试点击右侧图标: + 您也可以稍后更改您的选择。 开始! 应用 卸载 @@ -79,15 +79,15 @@ 啥也不干 教程 μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。 - 您可以通过手势或按键来启动最重要的应用程序。 - 将 μLauncher 设为默认桌面 - 您已经准备好开始使用本启动器了!\n\n希望这对你有帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护) - 双滑动作 + 您可以通过手势或按键来启动对您来说最重要的应用程序。 + 将 μLauncher 设为默认启动器 + 您已经准备好开始使用本启动器了!\n\n希望本快捷教程能对您有所帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护) + 双指滑动手势 使用本地日期格式 显示时间 显示日期 - 翻转日期和时间 - 背景(应用列表和设置) + 交换日期和时间位置 + 背景(应用程序列表和设置页面) 字体 黑白应用图标 显示秒 @@ -100,7 +100,7 @@ 错误:无法访问闪光灯。 选择锁屏方法 选择锁屏的方法 - 不要在应用抽屉中显示被绑定到手势的应用 + 不要在应用程序列表中显示已被绑定到手势操作的应用 此功能需要 Android 6 或更高版本。 应用程序已隐藏。您可在设置中让它再次显示。 µLauncher 需要激活“设备管理应用”权限才能够锁定屏幕。 @@ -114,34 +114,34 @@ 撤销 隐藏的应用 隐藏的应用 - 上滑 - 用双指向上滑动 - 下滑 + 向上滑动 + 双指向上滑动 + 向下滑动 双指向下滑动 - 左滑 + 向左滑动 双指向左滑动 - 右滑 + 向右滑动 双指向右滑动 - 在屏幕顶部向右滑动 - 在屏幕底部向右滑动 - 在屏幕底部向左滑动 - 在屏幕顶部向左滑动 - 在屏幕左边缘向上滑动 - 在屏幕右边缘向上滑动 - 在屏幕左边缘向下滑动 - 在屏幕右边缘向下滑动 - 按下音量增大按钮 - 按下音量降低按钮 + 在桌面顶部向右滑动 + 在桌面底部向右滑动 + 在桌面底部向左滑动 + 在桌面顶部向左滑动 + 在桌面左边缘向上滑动 + 在桌面右边缘向上滑动 + 在桌面左边缘向下滑动 + 在桌面右边缘向下滑动 + 按下音量增加键 + 按下音量降低键 双击空白区域 长按空白区域 - 点击日期 - 点击时间 + 点击桌面日期 + 点击桌面时钟 查看源代码 加入 μLauncher 的聊天群 收藏的应用 锁屏 文本阴影 - 双指滑动 + 使用双指进行滑动手势操作 重命名 %1$s 默认 暗色 @@ -165,9 +165,9 @@ 亮色 快速设置 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用“无障碍”服务) - 在屏幕边缘滑动 + 在桌面边缘进行滑动手势操作 将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。获得授权后“无障碍”服务将仅被用于锁定屏幕。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。 - 返回 + 返回操作 红色 蓝色 透明度 @@ -175,19 +175,19 @@ 动态 私人空间 私人空间 - 选择颜色 + 设置颜色 颜色 错误反馈 ]]> 锁定私人空间 V Λ - 文本 + 纯文本 网格 创建报告 解锁私人空间 默认 - 颜色 + 文本颜色 复制到剪贴板 此功能需要 Android 15 或更高版本。 @@ -210,9 +210,9 @@ 返回按键 / 返回手势 先单击然后再下滑 在网络上搜索 - (从)右上 (滑向)中左(滑向)右下 - 通过按回车键在应用列表搜索界面激活网络搜索。 - (从)左下 (滑向)中上(滑向)右下 + (从)右上(滑向)中左(滑向)右下 + 输入搜索内容后,按回车键直接在应用列表界面启动网络搜索。 + (从)左下(滑向)中上(滑向)右下 选择锁定设备的方式 有2种方式可以用来锁定屏幕。 @@ -238,7 +238,7 @@ ]]> 搜索(不触发自动启动匹配项) 广泛且重要的权限。
但 μLauncher 仅会在需要锁定屏幕时使用这些权限。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
- (从)左上 (滑向)中右(滑向)左下 + (从)左上(滑向)中右(滑向)左下 单击 + 上滑 单击 + 下滑 单击 + 左滑 @@ -246,16 +246,16 @@ 先单击然后再上滑 单击 + 右滑 先单击然后再右滑 - (从)左下 (滑向)中右(滑向)左上 - (从)右下 (滑向)中左(滑向)右上 - (从)左上 (滑向)中下(滑向)右上 - (从)右上 (滑向)中下(滑向)左上 - (从)右下 (滑向)中上(滑向)左下 + (从)左下(滑向)中右(滑向)左上 + (从)右下(滑向)中左(滑向)右上 + (从)左上(滑向)中下(滑向)右上 + (从)右上(滑向)中下(滑向)左上 + (从)右下(滑向)中上(滑向)左下 Λ (反向) V(反向) (反向)]]> - 开启后将直接启动匹配搜索内容的应用,可以通过按空格键临时暂停该功能。 + 开启后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。 应用程序列表样式 绑定到手势 音乐:播放 / 暂停 @@ -268,10 +268,11 @@ 调整音量 版本 所有应用 - 您可以在应用程序列表中快速所搜所有应用。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。 - 当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,在查询内容前加上空格即可禁用。 + 您可以在应用程序列表中快速找到已安装的应用程序。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。 + 您还可以搜索,当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,可以在搜索内容前加上空格以禁用。 隐藏状态栏 隐藏导航栏 倒序排列应用程序 我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。 + 快捷操作 From 940e5785dc4d716c633bd603f115b6c60335411d Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Mon, 24 Mar 2025 20:00:26 +0000 Subject: [PATCH 38/50] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (254 of 254 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 4b2bcd2..5ee6a46 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -38,7 +38,7 @@ Para baixo (borda esquerda) Para baixo (borda direita) Botão de aumentar volume - Botão de diminuição de volume + Botão de diminuir volume Toque duplo Toque longo Data @@ -98,8 +98,8 @@ Busque Configurações do μLauncher Todos os apps - Aumento de volume - Diminuição de volume + Aumentar volume + Diminuir volume Música: Próximo Música: Anterior Não faça nada @@ -302,7 +302,7 @@ Inferior direito -> superior médio -> inferior esquerdo Inverter a lista de apps Doar - Ajuste de volume + Ajustar volume Ocultar barra de status Ocultar barra de navegação Versão From cbd23159da4a64ba5eaf7327fcdce97ba636478f Mon Sep 17 00:00:00 2001 From: class0068 Date: Tue, 25 Mar 2025 12:40:13 +0000 Subject: [PATCH 39/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 98.8% (254 of 257 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4a7cd64..a0d7381 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -61,7 +61,7 @@ 概念 这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库! 使用方法 - 您的主屏幕仅包含本地日期和时间,没有多余的项目。 + 您的桌面仅包含本地日期和时间,没有多余的项目。 设置 我们为您预设了一些快捷操作。如果您不满意,现在就试试点击右侧图标: 您也可以稍后更改您的选择。 @@ -76,7 +76,7 @@ 降低音量 音乐:上一首 音乐:下一首 - 啥也不干 + 不做任何设置 教程 μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。 您可以通过手势或按键来启动对您来说最重要的应用程序。 @@ -115,13 +115,13 @@ 隐藏的应用 隐藏的应用 向上滑动 - 双指向上滑动 + 使用双指向上滑动 向下滑动 - 双指向下滑动 + 使用双指向下滑动 向左滑动 - 双指向左滑动 + 使用双指向左滑动 向右滑动 - 双指向右滑动 + 使用双指向右滑动 在桌面顶部向右滑动 在桌面底部向右滑动 在桌面底部向左滑动 @@ -163,8 +163,8 @@ 激活“设备管理应用”权限 取消 亮色 - 快速设置 - 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用“无障碍”服务) + 启动器设置 + 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) 在桌面边缘进行滑动手势操作 将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。获得授权后“无障碍”服务将仅被用于锁定屏幕。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。 返回操作 @@ -201,14 +201,14 @@ 私人空间已锁定 私人空间已解锁 私人空间不可用 - µLauncher 需要作为默认主屏幕才能访问私人空间。 + µLauncher 需要作为默认启动器才能访问私人空间。 没有找到处理搜索的应用。 无法打开 URL:找不到浏览器。 我已知晓,这将赋予 μLauncher 广泛且重要的权限。 在应用程序列表中隐藏私人空间 隐藏已被暂停的应用 返回按键 / 返回手势 - 先单击然后再下滑 + 先单击然后再向下滑动 在网络上搜索 (从)右上(滑向)中左(滑向)右下 输入搜索内容后,按回车键直接在应用列表界面启动网络搜索。 @@ -242,10 +242,10 @@ 单击 + 上滑 单击 + 下滑 单击 + 左滑 - 先单击然后再左滑 - 先单击然后再上滑 + 先单击然后再向左滑动 + 先单击然后再向上滑动 单击 + 右滑 - 先单击然后再右滑 + 先单击然后再向右滑动 (从)左下(滑向)中右(滑向)左上 (从)右下(滑向)中左(滑向)右上 (从)左上(滑向)中下(滑向)右上 @@ -275,4 +275,7 @@ 倒序排列应用程序 我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。 快捷操作 + 最近使用的应用 + 错误:启用“无障碍”服务失败。 + 错误:无法显示最近使用的应用。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) From c085087e1ef2b7b27d2e2b0a3e588c7e66cb1a56 Mon Sep 17 00:00:00 2001 From: class0068 Date: Tue, 25 Mar 2025 20:55:21 +0000 Subject: [PATCH 40/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (257 of 257 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a0d7381..de7c02b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -105,7 +105,7 @@ 应用程序已隐藏。您可在设置中让它再次显示。 µLauncher 需要激活“设备管理应用”权限才能够锁定屏幕。 这是执行锁屏操作所必需的。 - µLauncher - 锁屏 + µLauncher 收藏的应用 添加到收藏夹 从收藏夹中移除 @@ -166,7 +166,7 @@ 启动器设置 错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) 在桌面边缘进行滑动手势操作 - 将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。获得授权后“无障碍”服务将仅被用于锁定屏幕。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。 + 将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕和展示最近应用屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。μLauncher 仅在被用户要求时才会使用“无障碍”服务权限以实现: * 锁定屏幕 * 展示最近应用屏幕。μLauncher 不会使用“无障碍”服务来收集任何数据。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。 返回操作 红色 蓝色 @@ -237,7 +237,12 @@ 你可以在设置中随时更改这个选项。 ]]>
搜索(不触发自动启动匹配项) - 广泛且重要的权限。
但 μLauncher 仅会在需要锁定屏幕时使用这些权限。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
+ 广泛且重要的权限。
但 μLauncher 将这些权限用于: +
    +
  • 锁定屏幕
  • +
  • 展示最近应用屏幕
  • +
+µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
(从)左上(滑向)中右(滑向)左下 单击 + 上滑 单击 + 下滑 @@ -275,7 +280,7 @@ 倒序排列应用程序 我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。 快捷操作 - 最近使用的应用 + 最近应用屏幕 错误:启用“无障碍”服务失败。 - 错误:无法显示最近使用的应用。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) + 错误:无法展示最近应用屏幕。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) From ce65741717e314057d59b21d43b5dabf83b6a5e4 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Sun, 30 Mar 2025 16:53:37 +0000 Subject: [PATCH 41/50] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (258 of 258 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5ee6a46..fcdd9e8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -151,7 +151,7 @@ Isto é necessário para realizar a ação de bloqueio da tela. Permitir a ação de bloqueio da tela Erro: Não é possível acessar a lanterna. - μLauncher - bloqueio da tela + μLauncher Usar o Serviço de acessibilidade Usar o Administrador do dispositivo Escolha um método de bloqueio @@ -160,7 +160,7 @@ Essa funcionalidade requer o Android 6 ou mais recente. Nenhuma câmera com lanterna detectada. Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo. - Definindo o μLauncher como Serviço de acessibilidade permite bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O μLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao μLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. + Definindo o μLauncher como Serviço de acessibilidade permite bloquear a tela e abrir o menu de apps recentes. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O μLauncher usará o Serviço de acessibilidade somente para executar as seguintes ações quando solicitado pelo usuário: * bloquear a tela * abrir aplicativos recentes μLauncher nunca usará o Serviço de acessibilidade para coletar os dados. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao μLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. Escolha um método de bloqueio Há dois métodos para bloquear a tela. @@ -241,7 +241,12 @@ Ativação do Serviço de acessibilidade Ativar o Serviço de acessibilidade Cancelar - permissões elevadas ao μLauncher.
μLauncher usará estas permissões apenas para bloquear a tela. μLauncher nunca coletará nenhum dado. Sobretudo, o μLauncher não implementa o Serviço de acessibilidade para coletar dados.]]>
+ permissões elevadas ao μLauncher.
μLauncher usará estas permissões apenas para executar as seguintes ações: +
    +
  • Bloquear a tela
  • +
  • Apps recentes
  • +
+ μLaunchernunca coletará nenhum dado. Sobretudo, o μLauncher não implementa o Serviço de acessibilidade para coletar os dados.]]>
Estou ciente de que isto concederá permissões elevadas ao μLauncher. Estou ciente de que existem outras opções (permissões de Administrador do aparelho ou o botão de ligar). Pesquise na internet @@ -310,4 +315,8 @@ Você pode encontrar rápido todos os apps na lista de aplicativos.\n\nDeslize para cima para abrir ou definir um gesto específico. Quando apenas um aplicativo corresponde, vai ser iniciado automaticamente.\nIsso pode ser desativado acrescentando um espaço durante a busca. Ações + Apps recentes + Erro: Falha ao ativar o Serviço de acessibilidade. + Usar outro iniciador + Erro: Falha ao mostrar apps recentes. (Se você acabou de atualizar o app, tente desativar e reativar o Serviço de acessibilidade em configurações do Android) From 03a9833b5154335b31bd5a753e4ecb1517c3f792 Mon Sep 17 00:00:00 2001 From: class0068 Date: Wed, 2 Apr 2025 19:01:34 +0000 Subject: [PATCH 42/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (258 of 258 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index de7c02b..608e57b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -196,7 +196,7 @@ 正在激活“无障碍”服务 开源许可证 开源许可证 - 在应用列表中显示 + 在应用程序列表中显示 添加快捷方式 私人空间已锁定 私人空间已解锁 @@ -211,7 +211,7 @@ 先单击然后再向下滑动 在网络上搜索 (从)右上(滑向)中左(滑向)右下 - 输入搜索内容后,按回车键直接在应用列表界面启动网络搜索。 + 输入搜索内容后,按回车键直接在应用程序列表界面启动网络搜索。 (从)左下(滑向)中上(滑向)右下 选择锁定设备的方式 @@ -283,4 +283,5 @@ 最近应用屏幕 错误:启用“无障碍”服务失败。 错误:无法展示最近应用屏幕。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。) + 启动其他启动器 From 0877ca677260a52377c21f5ca26b323746b52887 Mon Sep 17 00:00:00 2001 From: class0068 Date: Wed, 2 Apr 2025 18:56:56 +0000 Subject: [PATCH 43/50] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 14.2% (3 of 21 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/zh_Hans/ --- .../android/zh-CN/full_description.txt | 32 ++++++++++--------- .../android/zh-CN/short_description.txt | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt index b4defca..89025a5 100644 --- a/fastlane/metadata/android/zh-CN/full_description.txt +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -1,19 +1,21 @@ -µLauncher 是主屏幕启动程序,允许您使用滑动手势和按下按钮来启动其他应用。 -它是最小、高效且无干扰。 +µLauncher 是桌面启动器程序,允许您使用各种滑动手势和按下按钮来启动其他应用。 +它是简约、高效且无干扰的。 -您的主屏幕仅显示日期、时间和壁纸。 -按返回或向上滑动(可以配置)打开 -所有已安装应用的列表,可以高效地搜索。 +您的桌面仅显示日期、时间和壁纸。 +按返回按键或向上滑动(可自定义其他手势)即可打开 +应用程序列表,且支持高效地搜索。 -这是 Finn M Glas 的应用 Launcher 的一个 fork。 +本启动器是基于 Finn M Glas 开发的 Launcher 启动器 的一个派生应用程序。 -显著变化: -* 边缘手势:可分为屏幕边缘滑动和中心滑动的设置。 -* 与工作配置文件兼容,因此可以使用 Shelter 等应用。 -* 此应用使用系统壁纸而不是自定义解决方案。 -* 字体已更改为 Hack。 -* Material 图标所取代了 Font Awesome 图标。 -* 移除了主屏幕上的齿轮按钮。按返回按钮会打开应用列表,可以从那里访问应用设置。 -* 搜索算法已修改为优先匹配应用名称开头的内容,即当搜索“te”时,“termux”会排在“notes”之前。 -* 搜索栏已移动到屏幕底部 +功能: +* 您可以设定 35 个不同的手势操作。如: + - 启动一个应用程序 + - 打开应用程序列表 + - 打开收藏的应用程序列表 + - 调整音量 + - 快速切换 上一首/下一首 音乐 + - 锁定屏幕 + - 开启/关闭 手机闪光灯 + - 展开通知栏 / 快捷设定栏 +* 兼容工作空间配置,因此支持使用 Shelter 等应用。 diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt index d49c27c..66d4684 100644 --- a/fastlane/metadata/android/zh-CN/short_description.txt +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -1 +1 @@ -无干扰的最小主屏幕应用启动器。 +无干扰的简约风格启动器。 From 7cce425339a84449dc9c2c121867cb730a2f3781 Mon Sep 17 00:00:00 2001 From: Lukas Hamm Date: Fri, 11 Apr 2025 20:54:28 +0000 Subject: [PATCH 44/50] Added translation using Weblate (Lithuanian) --- app/src/main/res/values-lt/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-lt/strings.xml diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 24250ad345a95f440bac1e48e3bd032cce0d59ac Mon Sep 17 00:00:00 2001 From: Lukas Hamm Date: Fri, 11 Apr 2025 20:57:34 +0000 Subject: [PATCH 45/50] Translated using Weblate (Lithuanian) Currently translated at 5.4% (14 of 258 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/lt/ --- app/src/main/res/values-lt/strings.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index a6b3dae..0a45d57 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -1,2 +1,16 @@ - \ No newline at end of file + + Norite pakeisti nustatymus? + Nustatymai + Veiksmai + Paleidimo programėlė + Apie + Atgal + Grįžimo mygtukas / grįžimo gestas + Perbraukimas aukštyn + Bakstelėkite + aukštyn + Nepavyksta paleisti programėlės + Atidarykite nustatymus norėdami pasirinkti šio gesto veiksmą + Aukštyn + Bakstelėjimas ir perbraukimas aukštyn + From 20a01e9f0329b222e1637e59ef0c1cd4d7d51caf Mon Sep 17 00:00:00 2001 From: letterhaven Date: Sat, 12 Apr 2025 14:03:03 +0000 Subject: [PATCH 46/50] Added translation using Weblate (Arabic) --- app/src/main/res/values-ar/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-ar/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From a0b2417363850772db574f82654fbadb5e228b07 Mon Sep 17 00:00:00 2001 From: letterhaven Date: Sat, 12 Apr 2025 14:04:14 +0000 Subject: [PATCH 47/50] Translated using Weblate (Arabic) Currently translated at 99.6% (257 of 258 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/ --- app/src/main/res/values-ar/strings.xml | 264 ++++++++++++++++++++++++- 1 file changed, 263 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a6b3dae..1b7d9a2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,2 +1,264 @@ - \ No newline at end of file + + لا يمكن فتح التطبيق + هل تريد تعديل اعداداته؟ + افتح الاعدادات لاختيار أمر لهذه الإيماءة + الاعدادات + الأوامر + المشغل + بيانات + رجوع + أعلى + لأعلى بأصبعين + اسحب لأعلى بأصبعين + أنقر ثم اسحب لأعلى + اضغط على زر الرجوع + اسحب لأعلى + نقرة + أعلى + أسفل + اسحب لأسفل + نقرة + لأسفل + لأسفل بأصبعين + يسار + اسحب من اليسار + نقرة + يسار + أنقر ثم اسحب إلى اليسار + يسار بأصبعين + يمين + اسحب إلى اليمين + نقرة + يمين + أنقر ثم اسحب إلى اليمين + يمين بأصبعين + اسحب إلى اليمين بأصبعين + يمين (في الأعلى) + يمين (في الأسفل) + اسحب إلى اليمين من أسفل الشاشة + يسار (في الأعلى) + اسحب إلى اليسار من أعلى الشاشة + أعلى (الحافة اليسرى) + اسحب إلى الأعلى من حافة الشاشة اليسرى + أعلى (الحافة اليمنى) + أسفل (الحافة اليسرى) + اسحب إلى الأسفل من حافة الشاشة اليسرى + أسفل (الحافة اليمنى) + أعلى اليسار -> وسط اليمين -> أسفل اليسار + أسفل اليسار -> وسط اليمين -> أعلى اليسار + أعلى اليمين -> وسط اليسار -> أسفل اليمين + أعلى اليسار -> الأسفل الوسط -> أعلى اليمين + V (معكوس) + أعلى اليمين -> الأسفل الوسط -> أعلى اليسار + أسفل اليسار -> أعلى الوسط -> أسفل اليمين + Λ (معكوس) + زر رفع الصوت + اضغط على زر رفع الصوت + زر خفض الصوت + اضغط على زر خفض الصوت + نقرة مزدوجة + نقرة مطولة + أنقر مطولًا في مكان فارغ على الشاشة + التاريخ + أنقر على التاريخ + الوقت + أنقر على الوقت + اختر تطبيق + ثبت تطبيقات + المظهر + السمة + ]]> + (معكوس)]]> + + + V + Λ + داكن + فاتح + متغير + ظل النص + شفاف + مظلل + مُموه + لون ثابت + الخط + خط النظام + بدون تذييل + مذيل + أحادي المسافة + أيقونات تطبيقات أحادية اللون + اللون + أظهر الوقت + أظهر التاريخ + استخدم تنسيق التاريخ المحلي + إقلب مكان التاريخ مع الوقت + اختر خلفية + العرض + حافظ على بقاء الشاشة قيد التشغيل + إخفِ شريط الحالة + تدوير الشاشة + الوظائف + أوامر السحب بأصبعين + اسحب باستخدام أصبعين + أوامر السحب من الحواف + عرض الحواف + إظهار نتائج البحث + اضغط مسافة لتعطيل هذه الميزة مؤقتًا + ابحث في الويب + أظهر لوحة المفاتيح عند البحث + الحساسية + التطبيقات + التطبيقات المخفية + + إخفِ المساحة الخاصة من قائمة التطبيقات + تخطيط قائمة التطبيقات + الافتراضي + نص + شبكة + تعيين μauncher كشاشة المنزل + معلومات التطبيق + إعادة تعيين الإعدادات + أنت على وشك تجاهل كل تفضيلاتك، هل تريد الإكمال؟ + عرض شيفرة المصدر + الإبلاغ عن خطأ + النسخ إلى الحافظة + يرجى عدم الإبلاغ عن الثغرات الأمنية علنًا على Github ، استخدم ما يلي بدلاً من ذلك: + الإبلاغ عن ثغرة أمنية + إنشاء تقرير + اتصل بمطور النسخة + انضم إلى دردشة μauncher + تبرع + سياسة الخصوصية + كل التطبيقات + التطبيقات المفضلة + التطبيقات المخفية + المساحة الخاصة + اختر تطبيق + التطبيقات + أخرى + إلغاء التثبيت + إزالة من المفضلة + إخفِ + أظهر + إعادة التسمية + بحث + بحث (بدون تشغيل تلقائي) + اعدادات التطبيق + درج التطبيقات + المساحة الخاصة + تبديل قفل المساحة الخاصة + ارفع الصوت + إنضم إلى مجموعة discord! + ضبط مستوى الصوت + الموسيقى: السابق + الموسيقى: تشغيل / ايقاف مؤقت + التطبيقات الحديثة + لا تفعل شيئًا + قفل الشاشة + تبديل الفلاش + شغل شاشة منزل أخرى + أضف اختصارًا + اربط بإيماءة + درس تعليمي + 👋\n\nخذ بضع ثوان لمعرفة كيفية استخدام هذا المشغل! + المفهوم + إنه برنامج مجاني (ترخيص MIT)!\nتأكد من مراجعة المستودع! + النسخة + الاستخدام + تحتوي شاشتك الرئيسية على التاريخ والوقت المحليين. لا الهاء. + كل التطبيقات + بمجرد تطابق تطبيق واحد فقط، يتم تشغيله تلقائيًا.\nيمكن تعطيل ذلك عن طريق اضافة مساحة في بداية استعلام. + الإعداد + اخترنا بعض التطبيقات الافتراضية لك. يمكنك تغييرها الآن إذا كنت تريد: + يمكنك أيضًا تغيير اختيارك لاحقًا. + لنبدأ! + ابدأ + الإعدادات + المزيد من الخيارات + هذه الوظيفة تتطلب أندرويد 6 أو أحدث. + هذه الوظيفة تتطلب أندرويد 15 أو أحدث. + تراجع + تم إخفاء التطبيق. يمكنك جعله مرئيًا مرة أخرى في الإعدادات. + الاعدادات السريعة + يجب أن يكون μlauncher مسؤولًا من أجل قفل الشاشة. + هذا مطلوب لإجراء شاشة القفل. + تمكين إجراء شاشة القفل + لم يتم اكتشاف كاميرا مع فلاش. + خطأ: لا يمكن الوصول إلى الفلاش. + خطأ: فشل في إظهار التطبيقات الحديثة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف) + خطأ: فشل في تمكين خدمة الوصول. + لم يتم تمكين خدمة الوصول إلى μlauncher. يرجى تمكينه في الإعدادات + المساحة الخاصة مقفلة + المساحة الخاصة مفتوحة + المساحة الخاصة غير متوافرة + قفل المساحة الخاصة + فتح المساحة الخاصة + μLauncher + اختر طريقة القفل + استخدام خدمة إمكانية الوصول + استخدم مسؤول الجهاز + اختر طريقة لقفل الشاشة + اعادة تسمية %1$s + أحمر + شفافية + أزرق + أخضر + اللون + اختر لونًا + أدرك أن هذا سيمنح أذونات كثيرة لـμauncher. + أدرك وجود خيارات أخرى (باستخدام أذونات مسؤول الجهاز أو زر الطاقة). + أوافق لـμlauncher باستخدام خدمة إمكانية الوصول لتوفير الوظائف ليس لها صلة بإمكانية الوصول. + أوافق على أن μlauncher لا يجمع أي بيانات. + يتم تفعيل خدمة إمكانية الوصول + تفعيل خدمة إمكانية الوصول + إلغاء + تراخيص المصادر المفتوحة + تراخيص المصادر المفتوحة + لم يتم العثور على تطبيق للتعامل مع البحث. + لا يمكن فتح عنوان URL: لم يتم العثور على متصفح. + أذونات كثيرة إلى التطبيق: +
    +
  • قفل الشاشة
  • +
  • التطبيقات الحديثة
  • +
+ لن يقومμlauncher أبدًا بجمع أي بيانات . على وجه الخصوص ، لا يستخدم μlauncher خدمة إمكانية الوصول لجمع أي بيانات.]]>
+ أنقر ثم اسحب لأسفل + الافتراضي + أظهر في قائمة التطبيقات + اسحب لأسفل بأصبعين + أظهر الثواني + الإبلاغ عن خطأ + اسحب إلى اليسار بأصبعين + أنقر مرتين في مكان فارغ على الشاشة + اضغط على زر الرجوع أثناء البحث في قائمة التطبيقات لإظهار البحث على الويب + اسحب إلى اليمين من أعلى الشاشة + يسار (في الأسفل) + اسحب إلى الأعلى من حافة الشاشة اليمنى + أسفل اليمين -> أعلى الوسط -> أسفل اليسار + لا تظهر التطبيقات المرتبطة بإيماءة في قائمة التطبيقات + درج التطبيقات المفضلة + الموسيقى: التالي + تم تصميم μlauncher ليكون فعال، وخالي من الهاء.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات. + أنت مستعد للبدء!\n\nآمل أن يكون هذا ذا قيمة كبيرة بالنسبة لك!\n\n- المطورين + يجب أن يكون μlauncher الشاشة الرئيسية الافتراضية للوصول إلى مساحة خاصة. + اسحب إلى اليسار من أسفل الشاشة + أسفل اليمين -> وسط اليسار -> أعلى اليمين + لم يتم العثور على تطبيق المتجر + إخفِ شريط التنقل + معلومات التطبيق + أضف إلى المفضلة + توسيع لوحة الاشعارات + يمكنك البحث بسرعة من خلال جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتح القائمة، أو ربطها بإيماءة ما. + خطأ: فشل في قفل الشاشة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف) + اسحب إلى الأسفل من حافة الشاشة اليمنى + أحادي المسافة مذيل + عكس قائمة التطبيقات + خطأ: لا يمكن توسيع شريط الحالة. يستخدم هذا الإجراء وظيفة ليست جزءًا من نظام أندرويد. لسوء الحظ ، لا يبدو أنه يعمل على جهازك. + خلفية القوائم + إخفِ التطبيقات المتوقفة + أظهر العرض التعليمي للتطبيق + شكرا لك على المساعدة في تحسين μLauncher!\nيرجى إضافة المعلومات التالية إلى تقرير الأخطاء الخاص بك: + اتصل بالمطور الأصلي + اخفض الصوت + يمكنك تشغيل أهم تطبيقاتك بوسطة إيماءات اللمس أو الضغط على الأزرار. + اسحب من حواف الشاشة + خطأ: قفل الشاشة باستخدام إمكانية الوصول غير مدعوم على هذا الجهاز. الرجاء استخدام طريقة مسؤول الجهاز بدلاً من ذلك. + يتيح تعيين μlauncher كخدمة إمكانية الوصول قفل الشاشة وفتح قائمة التطبيقات الحديثة. يرجى ملاحظة أنه يتطلب كمية كبيرة من الأذونات. يجب ألا تمنح مثل هذه الأذونات باستخفاف لأي تطبيق. سوف يستخدم μlauncher خدمة إمكانية الوصول فقط لأداء الإجراءات التالية عند طلب المستخدم: * قفل شاشة * فتح التطبيقات الحديثة μlauncher لن يستخدم أبدًا خدمة إمكانية الوصول لجمع البيانات. يمكنك التحقق من شيفرة المصدر للتأكد. يرجى ملاحظة أنه يمكنك قفل الشاشة من خلال منح أذونات مسؤول الجهاز، لكنها لا تعمل مع بصمات الأصابع وفتح الوجه. +
From 2774b74d9d47539dcb08fb29bdce6b1ffd409965 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Tue, 15 Apr 2025 18:38:00 +0200 Subject: [PATCH 48/50] 0.1.4 --- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/44.txt | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/44.txt diff --git a/app/build.gradle b/app/build.gradle index c280794..1a0a6fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 43 - versionName "0.1.3" + versionCode 44 + versionName "0.1.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/fastlane/metadata/android/en-US/changelogs/44.txt b/fastlane/metadata/android/en-US/changelogs/44.txt new file mode 100644 index 0000000..6c6c4f7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/44.txt @@ -0,0 +1,11 @@ +* New action: Launch other launchers +* New action: Show recent apps (workaround for an Android bug) +* Fixed "Set µLauncher as home screen" button +* Size of "choose app" button was limited + +* Added Arabic translation (thank you, letterhaven!) +* Started Lithuanian translation (thank you, IdeallyGrey!) +* Improved Chinese translation (thank you, monkeyotg!) +* Improved Portuguese translation (thank you, "Vossa Excelencia"!) +* Improved Spanish translation (thank you, T!) + From 4f795289d5176fb6c9130cd8aa136061eb6d0793 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Tue, 15 Apr 2025 18:55:13 +0200 Subject: [PATCH 49/50] improve English translation --- app/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8bc9b3..21f25f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -251,12 +251,12 @@ Music: Next Music: Previous Music: Play / Pause - Expand notifications panel + Expand Notifications Panel Recent Apps - Do nothing + Do Nothing Lock Screen Toggle Torch - Launch other Home Screen + Launch Other Home Screen Add Shortcut From 22633bdac3d057b552258d8bd84868c9cc7473b8 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Tue, 15 Apr 2025 19:24:23 +0200 Subject: [PATCH 50/50] try to fix #138 --- .../jrpie/android/launcher/ui/HomeActivity.kt | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 53a0876..2ab5d9f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -37,7 +37,7 @@ import java.util.Locale class HomeActivity : UIObject, AppCompatActivity() { private lateinit var binding: HomeBinding - private lateinit var touchGestureDetector: TouchGestureDetector + private var touchGestureDetector: TouchGestureDetector? = null private var sharedPreferencesListener = SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey -> @@ -56,29 +56,12 @@ class HomeActivity : UIObject, AppCompatActivity() { super.onCreate(savedInstanceState) super.onCreate() - touchGestureDetector = TouchGestureDetector( - this, 0, 0, - LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f - ) - touchGestureDetector.updateScreenSize(windowManager) // Initialise layout binding = HomeBinding.inflate(layoutInflater) setContentView(binding.root) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - binding.root.setOnApplyWindowInsetsListener { _, windowInsets -> - @Suppress("deprecation") // required to support API 29 - val insets = windowInsets.systemGestureInsets - touchGestureDetector.setSystemGestureInsets(insets) - - windowInsets - } - } - - - // Handle back key / gesture on Android 13+, cf. onKeyDown() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { onBackInvokedDispatcher.registerOnBackInvokedCallback( @@ -94,7 +77,7 @@ class HomeActivity : UIObject, AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - touchGestureDetector.updateScreenSize(windowManager) + touchGestureDetector?.updateScreenSize(windowManager) } override fun onStart() { @@ -188,8 +171,28 @@ class HomeActivity : UIObject, AppCompatActivity() { override fun onResume() { super.onResume() - touchGestureDetector.edgeWidth = + /* This should be initialized in onCreate() + However on some devices there seems to be a bug where the touchGestureDetector + is not working properly after resuming the app. + Reinitializing the touchGestureDetector every time the app is resumed might help to fix that. + (see issue #138) + */ + touchGestureDetector = TouchGestureDetector( + this, 0, 0, LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f + ).also { + it.updateScreenSize(windowManager) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + binding.root.setOnApplyWindowInsetsListener { _, windowInsets -> + @Suppress("deprecation") // required to support API 29 + val insets = windowInsets.systemGestureInsets + touchGestureDetector?.setSystemGestureInsets(insets) + + windowInsets + } + } initClock() updateSettingsFallbackButtonVisibility() @@ -230,7 +233,7 @@ class HomeActivity : UIObject, AppCompatActivity() { } override fun onTouchEvent(event: MotionEvent): Boolean { - touchGestureDetector.onTouchEvent(event) + touchGestureDetector?.onTouchEvent(event) return true }