GithubHelp home page GithubHelp logo

mm2-0 / kvaesitso Goto Github PK

View Code? Open in Web Editor NEW
1.9K 29.0 49.0 58.38 MB

A search-focused Android launcher

Home Page: https://kvaesitso.mm20.de/

License: GNU General Public License v3.0

Kotlin 95.61% Java 4.39%
android launcher jetpack-compose kotlin

kvaesitso's Introduction

Kvaesitso

Kvaesitso is a search focused, free and open source launcher for Android.

Website and documentation

Installation

Using an F-Droid client and MM20's repo

The preferred way of installation is using the F-Droid application. That way you will always be notified about updates. Kvaesitso is available in the official F-Droid repository, but all features depending on non-foss external APIs were removed. For feature-complete builds you can add MM20's repository. Just scan the code below or open the link on your phone:

QR code

https://fdroid.mm20.de/repo/

The same version is also available in IzzyOnDroid's repository.

Manual installation

You can also download the latest release from the releases page and install it manually.

Report issues

If you notice any bugs or issues create a new issue in the issue tracker. Before you do, please search the existing issues for any similar issues. Please include any relevant information such as steps to reproduce, stack traces, logs, and device information. These information can be founder under Settings > Debug > Crash reporter and Settings > Debug > Export debug information.

Feature requests

If you have an idea for a new feature, just create a new issue. However, there is no guarantee that they will be implemented. If it's important for you, consider implementing it yourself, see contribute.

Contribute

Contributions are always welcome. If you want to fix any existing issues or implement smaller new features just create a new pull request. If you plan to implement any (bigger) new features, please create an issue first so we can discuss if and how this feature should be implemented.

If you want to help translating, see how to translate the project.

Translation Status

Links

Thanks to

License

This software is free software licensed under the GNU General Public License 3.0.


Copyright (C) 2021–2024 MM2-0 and the Kvaesitso contributors

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

The plugin SDK modules (plugins/sdk and core/shared) are licensed under the Apache License 2.0.

kvaesitso's People

Contributors

abc0922001 avatar anevaiopvn avatar bartlibert avatar brightdv avatar cultcats avatar eliotaku avatar fjuro avatar glemco avatar grsoul avatar isarobeadot avatar kaajjo avatar kernoeb avatar labrusca avatar mapi68 avatar mm2-0 avatar mvilvi avatar rafael2616 avatar sir-photch avatar smarquespt avatar softinterlingua avatar stefanalexandru92 avatar strongville avatar summoner001 avatar tkbremnes avatar v1s7 avatar weblate avatar wwwwwwari avatar yen-shock avatar yurical avatar zekiu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kvaesitso's Issues

Group widgets per app

When adding widgets, they're sorted alphabetically, bit it's not always clear to which app they belong.
I think this could be solved by either adding an app icon to the widget preview or grouping the widgets per app.
It's no deal breaker for me, but I think it will improve the user experience.

Really slow in some cases

I've tried this launcher on my Galaxies s9+ and my A32. For some reason on my A32, it is unusably slow, and frequently won't respond to the pull up or pull down gestures at all. Not sure why that is since the A32 is an older phone (Android 11). The s9+ is still on 9.

[Enhancement] Manual sort favorites

It would be nice to prevent the auto sorting of favorite apps based on recent usage to better accommodate quick selection by muscle memory.

Disabling all sources in file search crashes launcher

Here's how to recreate the issue

Disable local files in launcher settings>search>files>local files

Now close settings and type something in the search bar

And it crashes the launcher

Here's the crash log

java.util.NoSuchElementException: List is empty.
at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:212)
at de.mm20.launcher2.files.FileRepositoryImpl$search$1$1$1.invokeSuspend(FilesRepository.kt:77)
at de.mm20.launcher2.files.FileRepositoryImpl$search$1$1$1.invoke(Unknown Source:8)
at de.mm20.launcher2.files.FileRepositoryImpl$search$1$1$1.invoke(Unknown Source:4)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invokeSuspend(Merge.kt:214)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(Unknown Source:13)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(Unknown Source:4)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invokeSuspend(Merge.kt:34)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(Unknown Source:8)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:112)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1.emit(Merge.kt:33)
at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:398)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invokeSuspend(Merge.kt:27)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invoke(Unknown Source:8)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest.flowCollect(Merge.kt:25)
at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo$suspendImpl(ChannelFlow.kt:157)
at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo(Unknown Source:0)
at kotlinx.coroutines.flow.internal.ChannelFlow$collectToFun$1.invokeSuspend(ChannelFlow.kt:60)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:69)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:376)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
at de.mm20.launcher2.ui.launcher.search.SearchVM.search(SearchVM.kt:68)
at de.mm20.launcher2.ui.launcher.search.SearchBarKt$SearchBar$3.invoke(SearchBar.kt:76)
at de.mm20.launcher2.ui.launcher.search.SearchBarKt$SearchBar$3.invoke(SearchBar.kt:71)
at androidx.compose.foundation.text.BasicTextFieldKt$BasicTextField$3$1.invoke(BasicTextField.kt:147)
at androidx.compose.foundation.text.BasicTextFieldKt$BasicTextField$3$1.invoke(BasicTextField.kt:144)
at androidx.compose.foundation.text.TextFieldState$onValueChange$1.invoke(CoreTextField.kt:745)
at androidx.compose.foundation.text.TextFieldState$onValueChange$1.invoke(CoreTextField.kt:740)
at androidx.compose.foundation.text.TextFieldDelegate$Companion.onEditCommand(TextFieldDelegate.kt:198)
at androidx.compose.foundation.text.TextFieldDelegate$Companion.access$onEditCommand(TextFieldDelegate.kt:90)
at androidx.compose.foundation.text.TextFieldDelegate$Companion$restartInput$1.invoke(TextFieldDelegate.kt:246)
at androidx.compose.foundation.text.TextFieldDelegate$Companion$restartInput$1.invoke(TextFieldDelegate.kt:243)
at androidx.compose.ui.text.input.TextInputServiceAndroid$createInputConnection$1.onEditCommands(TextInputServiceAndroid.android.kt:111)
at androidx.compose.ui.text.input.RecordingInputConnection.endBatchEditInternal(RecordingInputConnection.android.kt:162)
at androidx.compose.ui.text.input.RecordingInputConnection.endBatchEdit(RecordingInputConnection.android.kt:156)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:758)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:111)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7837)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Here' my device info

Screenshot_20220201-030534_Kvæsitso

Messaging App Issue

While Opening Samsung Messaging App (through icon)Launcher opens the Compose Message section instead of Received message section.
But when notification of new message arrives it directly opens that particular message.

I'm using Samsung J7 Prime OS- Android Oreo(8.1.0)

[Enhancement] Add a favorites widget

Could be nice to have a widget to display your favorite apps for when a user wishes to hide the favorites bar in the app drawer.

Optionally having it as something you could swap the fixed clock widget out for would address the more "traditional" launcher feel some users may prefer without necessarily impinging the main style of Kvaesitso.

Crash when updating Google play system

When Google play system attempts to update, a placeholder icon appears in the application list. Clicking the icon causes the below crash. Sorry for the formatting as I'm creating this from my phone.

Screenshot_20220207-173934

`Device: oriole
SDK version: 31

02-07 17:43:12.301 3651 27179 E AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
02-07 17:43:12.301 3651 27179 E AndroidRuntime: Process: de.mm20.launcher2.release, PID: 3651
02-07 17:43:12.301 3651 27179 E AndroidRuntime: org.koin.core.error.InstanceCreationException: Could not create instance for [Factory:'de.mm20.launcher2.search.SearchableSerializer']
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:60)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.scope.Scope.resolveValue(Scope.kt:254)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.scope.Scope.resolveInstance(Scope.kt:241)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.scope.Scope.get(Scope.kt:204)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.FavoritesItem$special$$inlined$inject$default$1.invoke(KoinComponent.kt:74)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.FavoritesItem.getSerializer(FavoritesItem.kt:21)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.FavoritesItem.toDatabaseEntity(FavoritesItem.kt:28)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.FavoritesRepositoryImpl$incrementLaunchCounter$1$1.invokeSuspend(FavoritesRepository.kt:153)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:39)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: No known serializer exists for type de.mm20.launcher2.search.data.AppInstallation
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.ModuleKt$favoritesModule$1$1.invoke(Module.kt:53)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at de.mm20.launcher2.favorites.ModuleKt$favoritesModule$1$1.invoke(Module.kt:19)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:53)
02-07 17:43:12.301 3651 27179 E AndroidRuntime: ... 18 more`

[Enhancement] Sort app search results by relevance

At the moment, the results are sorted alphabetically. I think that it would be better if it was sorted by "relevance". By that, I'm thinking of something like this:

  • apps starting with the search term
  • apps with a word starting with the term (also taking into account that some apps are in PascalCase)
  • substring match
  • other fuzzy matches

App Crashes On Lanscape

Running a community provided LineageOS port, fixing the issue may be up to the maintainer of that, but even still the ability to lock Kvæsitso to portrait mode would be nice.

java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.os.Bundle instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x3. Make sure other views do not use the same id.
at android.view.View.onRestoreInstanceState(View.java:20771)
at android.view.View.dispatchRestoreInstanceState(View.java:20743)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3986)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3992)
at android.view.View.restoreHierarchyState(View.java:20721)
at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2183)
at android.app.Activity.onRestoreInstanceState(Activity.java:1679)
at android.app.Activity.performRestoreInstanceState(Activity.java:1632)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1356)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3473)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7664)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

APP.VERSION : 1.7.1-20220324 APP.VERSIONCODE : 2022032400 LAUNCHER.APP : android TIMEZONE : America/New_York VERSION.RELEASE : 11 VERSION.INCREMENTAL : eng.user.20220319.093803 VERSION.SDK.NUMBER : 30 BOARD : exynos9810 BOOTLOADER : N960FXXU9FUK2 BRAND : samsung CPU_ABI : arm64-v8a CPU_ABI2 : DISPLAY : lineage_crownlte-userdebug 11 RQ3A.211001.001 eng.user.20220319.093803 test-keys FINGERPRINT : samsung/crownltexx/crownlte:10/QP1A.190711.020/N960FXXU6FTK1:user/release-keys HARDWARE : samsungexynos9810 HOST : DESKTOP-7MLK2RH ID : RQ3A.211001.001 MANUFACTURER : samsung MODEL : SM-N960F PRODUCT : crownltexx TAGS : test-keys TIME : 1647697029000 TYPE : userdebug

[Feature request] Option to reverse drawer direction

Currently the search results and drawer in general is bottom to top with most relevant results and favorites being at the very top. This is fine in general but with big screen it becomes major inconvenience. I have screen of 6.67 inches and I can only touch up to half of the screen comfortably, you can probably imagine how annoying it becomes when you would have to change your hand position every time you do something like opening app which is quite common task.

My suggestion to fix this is quite simple in theory but may be hard to implement, basically I would suggest just reversing the whole drawer structure to be top to bottom with bottom having the most relevant results. For consistency the search bar should be at the bottom too just above the keyboard.

This would make it less unique since all the other search based launchers do it this way, but the accessibility for bigger phone users would greatly increase.

[QoL] Launch app even if in long press mode

While in the app drawer, whenever an icon is longpressed, there's a number of useful options displayed.
However, that same app cannot be launched until it exits from this mode.
My suggestion would be to enable an app to be launched regardless whether it's in that mode or not.
This saves on clicking on the left arrow to exit the mode each time.

[bug] music widget crash

Currently, the music widget does not allow picking specific music player.
In the situation where the default music player is unclear, it will crash upon opening. Can the default music player be specified by user?

android.app.PendingIntent$CanceledException
	at android.app.PendingIntent.send(PendingIntent.java:886)
	at android.app.PendingIntent.send(PendingIntent.java:698)
	at de.mm20.launcher2.ui.widget.MusicWidgetKt$MusicWidget$1$3.invoke(MusicWidget.kt:125)
	at de.mm20.launcher2.ui.widget.MusicWidgetKt$MusicWidget$1$3.invoke(MusicWidget.kt:121)
	at androidx.compose.foundation.ClickableKt$combinedClickable$4$gesture$1$4.invoke-k-4lQ0M(Clickable.kt:339)
	at androidx.compose.foundation.ClickableKt$combinedClickable$4$gesture$1$4.invoke(Clickable.kt:318)
	at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapGestures$2$1$1.invokeSuspend(TapGestureDetector.kt:125)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178)
	at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
	at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:511)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:406)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:419)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:310)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:297)
	at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:179)
	at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:98)
	at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:80)
	at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1159)
	at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1109)
	at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1059)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:488)
	at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1873)
	at android.app.Activity.dispatchTouchEvent(Activity.java:4125)
	at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
	at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:446)
	at android.view.View.dispatchPointerEvent(View.java:14568)
	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6022)
	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5825)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5316)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5491)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5548)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8086)
	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8037)
	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7998)
	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8209)
	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220)
	at android.os.MessageQueue.nativePollOnce(Native Method)
	at android.os.MessageQueue.next(MessageQueue.java:335)
	at android.os.Looper.loop(Looper.java:183)
	at android.app.ActivityThread.main(ActivityThread.java:7664)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Launcher home screen redesign

My issue is related to some unusability of home screen

Issues:-

  1. I cant access the the notification of my phone with one
    hand because the swipe down gesture brings
    application drawer

  2. I also cant access search bar with one hand because its
    too far upwards

  3. I also cant bring app icons to home screen every time i
    have to open an app its by either searching or with app
    drawer

Solutions:-

  1. Related to notification make swipe down gesture to
    bring down notification panel

  2. Move search bar at the bottom for easier access and
    also create bock above search bar for favourite
    application icons

  3. And add home screen icons support so we can access
    apps easily.

Please see on to it and give your feedback.

Kvaesitso crashes when searching website

Found another issue. When I search for a website, e.g. google.com, the launcher crashes.

’’’
java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps
at android.graphics.BaseCanvas.onHwBitmapInSwMode(BaseCanvas.java:742)
at android.graphics.BaseCanvas.throwIfHwBitmapInSwMode(BaseCanvas.java:749)
at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:94)
at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:152)
at android.graphics.Canvas.drawBitmap(Canvas.java:1605)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:560)
at de.mm20.launcher2.ui.legacy.view.LauncherIconView.onDraw(LauncherIconView.kt:402)
at android.view.View.draw(View.java:23893)
at android.view.View.buildDrawingCacheImpl(View.java:23159)
at android.view.View.buildDrawingCache(View.java:23019)
at android.view.View.updateDisplayListIfDirty(View.java:22730)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.View.draw(View.java:23623)
at android.view.ViewGroup.drawChild(ViewGroup.java:5355)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5112)
at android.view.View.updateDisplayListIfDirty(View.java:22748)
at android.view.View.draw(View.java:23623)
at android.view.ViewGroup.drawChild(ViewGroup.java:5355)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5112)
at android.view.View.updateDisplayListIfDirty(View.java:22748)
at android.view.View.draw(View.java:23623)
at android.view.ViewGroup.drawChild(ViewGroup.java:5355)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5112)
at android.view.View.draw(View.java:23896)
at androidx.core.widget.NestedScrollView.draw(NestedScrollView.java:2073)
at android.view.View.updateDisplayListIfDirty(View.java:22762)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
at android.view.View.updateDisplayListIfDirty(View.java:22709)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:602)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:608)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:684)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:5306)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5014)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4107)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2832)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10332)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1063)
at android.view.Choreographer.doCallbacks(Choreographer.java:845)
at android.view.Choreographer.doFrame(Choreographer.java:780)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1048)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
’’’

Adding a widget from com.google.android.deskclock crashes the launcher

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=4412, result=-1, data=Intent { (has extras) }} to activity {de.mm20.launcher2.debug/de.mm20.launcher2.ui.legacy.activity.LauncherActivity}: java.lang.SecurityException: Permission Denial: starting Intent { act=android.appwidget.action.APPWIDGET_CONFIGURE cmp=com.google.android.deskclock/com.android.deskclock.AnalogAppWidgetConfigActivity (has extras) } from ProcessRecord{2202302 23061:de.mm20.launcher2.debug/u0a232} (pid=23061, uid=10232) not exported from uid 10158
	at android.app.ActivityThread.deliverResults(ActivityThread.java:5301)
	at android.app.ActivityThread.handleSendResult(ActivityThread.java:5340)
	at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
	at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7839)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.appwidget.action.APPWIDGET_CONFIGURE cmp=com.google.android.deskclock/com.android.deskclock.AnalogAppWidgetConfigActivity (has extras) } from ProcessRecord{2202302 23061:de.mm20.launcher2.debug/u0a232} (pid=23061, uid=10232) not exported from uid 10158
	at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
	at android.os.Parcel.createException(Parcel.java:2409)
	at android.os.Parcel.readException(Parcel.java:2392)
	at android.os.Parcel.readException(Parcel.java:2334)
	at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2284)
	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1743)
	at android.app.Activity.startActivityForResult(Activity.java:5404)
	at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:647)
	at android.app.Activity.startActivityForResult(Activity.java:5362)
	at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:628)
	at de.mm20.launcher2.ui.legacy.activity.LauncherActivity.onActivityResult(LauncherActivity.kt:700)
	at android.app.Activity.dispatchActivityResult(Activity.java:8382)
	at android.app.ActivityThread.deliverResults(ActivityThread.java:5294)
	... 13 more
Caused by: android.os.RemoteException: Remote stack trace:
	at com.android.server.wm.ActivityTaskSupervisor.checkStartAnyActivityPermission(ActivityTaskSupervisor.java:1047)
	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:975)
	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:665)
	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1201)
	at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1173)


localization:Chinese

I’m interesting in this APP,and maybe I can help you guys to translate to Chinese.
could I be a contributor or reviewer?

Alarm reminder uses only minutes

Hello,

If the alarm is set to more than an hour, but ended for example in 1h06, it will show the reminder Alarm in 6 minutes instead of Alarm in 1h06 minutes or even no reminder, see the screenshots below.

screen for further infoscreen for further info

Icon of removed app don't disappear in the pin section

Hello,

If you pin an app to the favorites and delete it, the app would still be visible in the pin section. Then, clicking on it makes the launcher crash, as there is no such activity.
Also, I am using the latest version (1.4.3 & APP.VERSION : 2022020700)

Logs if needed

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
	... 1 more
Caused by: android.content.pm.PackageManager$NameNotFoundException: org.kde.bettercounter
	at android.app.ApplicationPackageManager.getInstallSourceInfo(ApplicationPackageManager.java:2698)
	at de.mm20.launcher2.compat.PackageManagerCompat.getInstallSource(PackageManagerCompat.kt:12)
	at de.mm20.launcher2.search.data.Application.getStoreDetails(Application.kt:50)
	at de.mm20.launcher2.ui.legacy.search.ApplicationDetailRepresentation.setupToolbar(ApplicationDetailRepresentation.kt:263)
	at de.mm20.launcher2.ui.legacy.search.ApplicationDetailRepresentation.getScene$lambda-3(ApplicationDetailRepresentation.kt:170)
	at de.mm20.launcher2.ui.legacy.search.ApplicationDetailRepresentation.$r8$lambda$AOnaSngOhFzA90jnDzhH3pvEK1E(Unknown Source:0)
	at de.mm20.launcher2.ui.legacy.search.ApplicationDetailRepresentation$$ExternalSyntheticLambda9.run(Unknown Source:8)
	at androidx.transition.Scene.enter(Scene.java:181)
	at androidx.transition.TransitionManager.changeScene(TransitionManager.java:191)
	at androidx.transition.TransitionManager.go(TransitionManager.java:366)
	at de.mm20.launcher2.ui.legacy.searchable.SearchableView.applyScene(SearchableView.kt:123)
	at de.mm20.launcher2.ui.legacy.searchable.SearchableView.setFullRepresentation(SearchableView.kt:107)
	at de.mm20.launcher2.ui.legacy.searchable.SearchableView.updateRepresentation$ui_release(SearchableView.kt:53)
	at de.mm20.launcher2.ui.legacy.searchable.SearchableView.setRepresentation(SearchableView.kt:42)
	at de.mm20.launcher2.ui.legacy.search.BasicGridRepresentation.getScene$lambda-4$lambda-3$lambda-2$lambda-1(BasicGridRepresentation.kt:82)
	at de.mm20.launcher2.ui.legacy.search.BasicGridRepresentation.$r8$lambda$NsPTJ-jfWOQ_9oYg6998ODJaM8g(Unknown Source:0)
	at de.mm20.launcher2.ui.legacy.search.BasicGridRepresentation$$ExternalSyntheticLambda1.onLongClick(Unknown Source:2)
	at android.view.View.performLongClickInternal(View.java:8240)
	at android.view.View.performLongClick(View.java:8198)
	at de.mm20.launcher2.ui.legacy.view.LauncherIconView.longClickRunnable$lambda-13(LauncherIconView.kt:498)
	at de.mm20.launcher2.ui.legacy.view.LauncherIconView.$r8$lambda$y2p9-V9-gKh2w73rs-XL8SojxHI(Unknown Source:0)
	at de.mm20.launcher2.ui.legacy.view.LauncherIconView$$ExternalSyntheticLambda0.run(Unknown Source:2)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:246)
	at android.app.ActivityThread.main(ActivityThread.java:8633)
	... 3 more

Add a result to search for the input on the web

Hello,
It would be nice to have a feature similar to Blue line console :
blue line console screen
When you search for something, it adds a possibility to open the input in a web search.

It could be implemented by selecting the first search engine of the launcher
For example, it would open
kvaesitso screen
In Brave Search.

[Feature request] Allow user to add search engines

Hi, just found out about this project and i'm loving it so far, very refreshing take on the launcher style. My small suggestion is to have the ability to add custom search engines, would be very useful to not have to go through google for starters. Thank you for reading!

Off-topic p.s.: This may be subjective but when you clear the search bar, i feel like the animation for the application list to return is still just a too slow. Probably because i'm coming from Nova which is instant (no animation), but maybe being able to tweak the value of the animation duration could be considered as well. Would love to hear what you think.

Rebuild UI in Jetpack Compose

Jetpack Compose is a new declarative UI framework for Android. It simplifies the UI logic by a lot and makes customization a lot easier.

  • Scaffold
  • Modals
    • Hidden items
    • Edit favorites
  • Widgets
    • Music
    • Weather
    • Calendar
    • Edit widgets
  • Search
    • Favorites
    • Apps
    • Files
    • Wikipedia
    • Calculator
    • Unit converter
    • Contacts
    • Calendar
    • Websites
    • Websearch
    • Hidden items
  • Settings (depends on #1 )
    • Appearance
    • Search
    • Badges
    • Weather
    • Calendar
    • Accounts
    • About

App crash

Description

Unfortunately I don't have real steps to reproduce the issue, pretty much every morning when I take the phone (that has been on and either connected or not, this time it wasn't), I get a launcher crash (this one) or exception (Unable to resolve api.openweathermap.org).
I hope this helps.

Strack trace

java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.os.Bundle instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x9. Make sure other views do not use the same id.
	at android.view.View.onRestoreInstanceState(View.java:20918)
	at android.view.View.dispatchRestoreInstanceState(View.java:20890)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4011)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4017)
[19 lines truncated]

Device info

APP.VERSION : 1.7.1-20220324
APP.VERSIONCODE : 2022032400
LAUNCHER.APP : android
TIMEZONE : Europe/Berlin
VERSION.RELEASE : 11
VERSION.INCREMENTAL : 2202182344
VERSION.SDK.NUMBER : 30
BOARD : kona
BOOTLOADER : unknown
BRAND : OnePlus
CPU_ABI : arm64-v8a
CPU_ABI2 :
DISPLAY : KB2003_15_220218
FINGERPRINT : OnePlus/OnePlus8T_EEA/OnePlus8T:11/RP1A.201005.001/2202182344:user/release-keys
HARDWARE : qcom
HOST : rd-build-72
ID : RP1A.201005.001
MANUFACTURER : OnePlus
MODEL : KB2003
PRODUCT : OnePlus8T_EEA
TAGS : release-keys
TIME : 1645199356000
TYPE : user

[Feature Request] change app names

I'd like to be able to change the name of apps as they appear in the drawer. For instance, I use Open Camera, but I'd like to be able to rename it to "Camera". Similarly, I would like to be able to rename Material-Files to "My Files".

Hiding Navbar/Status Bar Breaks Widget Tray

Not really broken, just a simpler title, but when the launcher opens up and hides the bars the widget tray is allowed to peek up above the bottom of the page.
Screenshot_20220328-203055_Kvæsitso

APP.VERSION : 1.7.1-20220324 APP.VERSIONCODE : 2022032400 LAUNCHER.APP : android TIMEZONE : America/New_York VERSION.RELEASE : 11 VERSION.INCREMENTAL : eng.user.20220319.093803 VERSION.SDK.NUMBER : 30 BOARD : exynos9810 BOOTLOADER : N960FXXU9FUK2 BRAND : samsung CPU_ABI : arm64-v8a CPU_ABI2 : DISPLAY : lineage_crownlte-userdebug 11 RQ3A.211001.001 eng.user.20220319.093803 test-keys FINGERPRINT : samsung/crownltexx/crownlte:10/QP1A.190711.020/N960FXXU6FTK1:user/release-keys HARDWARE : samsungexynos9810 HOST : DESKTOP-7MLK2RH ID : RQ3A.211001.001 MANUFACTURER : samsung MODEL : SM-N960F PRODUCT : crownltexx

[feature request] search Chinese and Japanese by Roman characters

For international users, Asian characters in search is always a painful point in open source applications.

Can the search be extended to pinyin of Chinese and hiragana of Japanese?

For example, "gao" would match "高" in Chinese pinyin, "te" would match "て" in Japanese.

There are online libraries for these search functions for sure.

Search among shortcuts

This launcher has a much nicer interface compared a similar search based (KISS), however I'm missing the way it manages shortcuts.
As far as I understood, shortcuts on Kvaesitso are normal favorites and stay in the favorite bar, with no possibility to search among them as they don't belong to the app drawer.
What KISS does is to allow to search among any user-generated shortcut (e.g. browser favourites or chats) as well as showing all automatic shortcuts (simple actions from apps, like new tab in a browser or take a selfie from the camera, I suppose those are the same shown on long-press, which you can already set as favourites in Kvaesitso). Whatever is not an app doesn't stay in the drawer, but everything can be searched for.
I understand this could require quite some work, but it would be very nice, especially to avoid running out of spots in the favourite bar, by filling it with shortcuts that could appear only when needed.

[feature request] horizontal widget resizing

Currently only widgets horizontally fully width on the screen show up in the widget picker. This greatly limits available widget amount.

Can the launcher support horizontally resizing of widgets to make use of some other widgets that are not full width by default?

[Feature Request] Open Nextcloud files in app

I noticed that when I select a file on my Nextcloud in the search bar, it opens in the webbrowser. I think it would be nice if it opened in the Android app.
I'm no expert, but I think thos should be possible with nc:[url].

[Enhancement] Hide keyboard after opening an app

Hello,

In the latest version, the keyboard can be shown when going to the drawer.
However, while opening an app, the keyboard don't disappear.
It would be nice to have the keyboard disappearing when opening an app, because for some apps with a big loading time, it's a little annoying. However, I don't know how difficult would it be to add such a feature.

Here is an example with the ProtonMail app :
screenshot of the example

Adding Kvaesitso widget (Weather, Music, Calendar) crashes Kvaesitso

When I try to add a native Kvaesitso widget, the launcher crashes. Third party widgets work fine.
Below the crash report:

java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to androidx.lifecycle.LifecycleOwner
at de.mm20.launcher2.ktx.ViewKt.getLifecycleScope(View.kt:20)
at de.mm20.launcher2.ui.legacy.view.LauncherCardView.onAttachedToWindow(LauncherCardView.kt:84)
at android.view.View.dispatchAttachedToWindow(View.java:21971)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:4293)
at android.view.ViewGroup.addViewInner(ViewGroup.java:6127)
at android.view.ViewGroup.addView(ViewGroup.java:5903)
at android.view.ViewGroup.addView(ViewGroup.java:5843)
at android.view.ViewGroup.addView(ViewGroup.java:5815)
at com.jmedeisis.draglinearlayout.DragLinearLayout.addDragView(DragLinearLayout.java:237)
at de.mm20.launcher2.ui.launcher.widgets.WidgetsView$addWidget$1$2.invoke(WidgetsView.kt:217)
at de.mm20.launcher2.ui.launcher.widgets.WidgetsView$addWidget$1$2.invoke(WidgetsView.kt:206)
at com.afollestad.materialdialogs.internal.list.PlainListDialogAdapter.itemClicked(PlainListDialogAdapter.kt:76)
at com.afollestad.materialdialogs.internal.list.PlainListViewHolder.onClick(PlainListDialogAdapter.kt:46)
at android.view.View.performClick(View.java:7792)
at android.view.View.performClickInternal(View.java:7769)
at android.view.View.access$3800(View.java:910)
at android.view.View$PerformClick.run(View.java:30184)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)

Device Information

DEVICE.ID : d3200eec34f60ff7
APP.VERSION : 2022013001
LAUNCHER.APP : de.mm20.launcher2.release
TIMEZONE : Europe/Amsterdam
VERSION.RELEASE : 12
VERSION.INCREMENTAL : G970FXXUEGVA4
VERSION.SDK.NUMBER : 31
BOARD : exynos9820
BOOTLOADER : G970FXXUEGVA4
BRAND : samsung
CPU_ABI : arm64-v8a
CPU_ABI2 :
DISPLAY : SP1A.210812.016.G970FXXUEGVA4
FINGERPRINT : samsung/beyond0lteeea/beyond0:12/SP1A.210812.016/G970FXXUEGVA4:user/release-keys
HARDWARE : exynos9820
HOST : 21DJ7D18
ID : SP1A.210812.016
MANUFACTURER : samsung
MODEL : SM-G970F
PRODUCT : beyond0lteeea
SERIAL : unknown
TAGS : release-keys
TIME : 1642001741000
TYPE : user
UNKNOWN : unknown
USER : dpi

[ENHANCEMENT] Customise Grid Size

As a user of a large screen device, I'd like to maximize the use of my screen realestate & would thus appreciate the consideration of options to customize the grid size of the app drawer - number of icons per row/column or number of rows/columns, size of the icons.

App crash (diffrent to other issue as far as im concerened)

Steps to reproduce (at least for me)
Have the protonmail app (beta) on your favorites bar and try to open it. (Opening it from app bar > no crash)
Logs (Crash message):
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=ch.protonmail.android/.activities.SplashActivity } from ProcessRecord{b97e1c9 1519:de.mm20.launcher2.release/u0a404} (pid=1519, uid=10404) not exported from uid 10284 at android.os.Parcel.createExceptionOrNull(Parcel.java:2385) at android.os.Parcel.createException(Parcel.java:2369) at android.os.Parcel.readException(Parcel.java:2352) at android.os.Parcel.readException(Parcel.java:2294) at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:4276) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1723) at android.app.Activity.startActivityForResult(Activity.java:5377) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:647) at android.app.Activity.startActivity(Activity.java:5717) at de.mm20.launcher2.search.data.LauncherApp.launch(LauncherApp.kt:83) at de.mm20.launcher2.ui.launcher.search.common.SearchableItemVM.launch(SearchableItemVM.kt:66) at de.mm20.launcher2.ui.launcher.search.common.GridItemKt$GridItem$1$2.invoke(GridItem.kt:69) at de.mm20.launcher2.ui.launcher.search.common.GridItemKt$GridItem$1$2.invoke(GridItem.kt:60) at de.mm20.launcher2.ui.component.ShapedLauncherIconKt$ShapedLauncherIcon$1$2$1.invoke(ShapedLauncherIcon.kt:68) at de.mm20.launcher2.ui.component.ShapedLauncherIconKt$ShapedLauncherIcon$1$2$1.invoke(ShapedLauncherIcon.kt:67) at androidx.compose.foundation.ClickableKt$combinedClickable$4$gesture$1$4.invoke-k-4lQ0M(Clickable.kt:339) at androidx.compose.foundation.ClickableKt$combinedClickable$4$gesture$1$4.invoke(Clickable.kt:318) at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapGestures$2$1$1.invokeSuspend(TapGestureDetector.kt:125) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178) at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166) at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397) at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431) at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420) at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:509) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:404) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:417) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:310) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:297) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:297) at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:179) at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:98) at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:80) at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1223) at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1173) at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1113) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:913) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1957) at android.app.Activity.dispatchTouchEvent(Activity.java:4182) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:871) at android.view.View.dispatchPointerEvent(View.java:15458) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:7457) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7233) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6595) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6786) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6843) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9880) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9718) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9671) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:10014) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loop(Looper.java:206) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1344) at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1260) at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:894) at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1721) at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1571)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.