treehouses / remote

⚡ control Raspberry Pi from Android Device through Bluetooth ⚡
https://play.google.com/store/apps/details?id=io.treehouses.remote
GNU Affero General Public License v3.0
61 stars 27 forks source link

foreground: smoother service termination (fixes #2059) #2060

Open Okuro3499 opened 1 week ago

Okuro3499 commented 1 week ago

fixes #2059

https://github.com/treehouses/remote/assets/64019708/ff7f85ef-e2de-47d8-be5a-fe91d7d8bd08

xyb994 commented 1 week ago

Seem to work as intended. But I did notice an issue and I'm unsure if it's device specific. Upon swipe closing the app, when I try to open the app again from the app drawer, it would says "Treehouses Remote keeps stopping."

FATAL EXCEPTION: main
Process: io.treehouses.remote, PID: 4459
java.lang.RuntimeException: Cannot create an instance of class io.treehouses.remote.ui.home.HomeViewModel
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:315)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:299)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:273)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128)
    at androidx.lifecycle.ViewModelProvider$Factory.create(ViewModelProvider.android.kt:158)
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl_androidKt.createViewModel(ViewModelProviderImpl.android.kt:34)
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release(ViewModelProviderImpl.kt:65)
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release$default(ViewModelProviderImpl.kt:47)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.android.kt:91)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:51)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
    at io.treehouses.remote.ui.home.BaseHomeFragment.getViewModel(BaseHomeFragment.kt:35)
    at io.treehouses.remote.ui.home.HomeFragment.observeConnectionState(HomeFragment.kt:244)
    at io.treehouses.remote.ui.home.HomeFragment.onViewCreated(HomeFragment.kt:69)
    at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3148)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:600)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2152)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2047)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3255)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3165)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1525)
    at android.app.Activity.performStart(Activity.java:8030)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3642)
    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:2251)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:233)
    at android.app.ActivityThread.main(ActivityThread.java:8068)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:307)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:299) 
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.android.kt:273) 
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128) 
    at androidx.lifecycle.ViewModelProvider$Factory.create(ViewModelProvider.android.kt:158) 
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl_androidKt.createViewModel(ViewModelProviderImpl.android.kt:34) 
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release(ViewModelProviderImpl.kt:65) 
    at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release$default(ViewModelProviderImpl.kt:47) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.android.kt:91) 
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:51) 
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35) 
    at io.treehouses.remote.ui.home.BaseHomeFragment.getViewModel(BaseHomeFragment.kt:35) 
    at io.treehouses.remote.ui.home.HomeFragment.observeConnectionState(HomeFragment.kt:244) 
    at io.treehouses.remote.ui.home.HomeFragment.onViewCreated(HomeFragment.kt:69) 
    at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3148) 
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:600) 
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278) 
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2152) 
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2047) 
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990) 
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3255) 
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3165) 
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263) 
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350) 
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1525) 
    at android.app.Activity.performStart(Activity.java:8030) 
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3642) 
    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:2251) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:233) 
    at android.app.ActivityThread.main(ActivityThread.java:8068) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978) 
Caused by: java.lang.NullPointerException
    at io.treehouses.remote.bases.FragmentViewModel.loadBT(FragmentViewModel.kt:113)
Okuro3499 commented 1 week ago

@xyb994 updated the pr to resolve the crash but bluetooth does not connect after relaunch working on this

xyb994 commented 1 week ago

@xyb994 updated the pr to resolve the crash but bluetooth does not connect after relaunch working on this

The app seem to be able to launch fine after "swipe to close." But after clicking on "CONNECT" and selecting the device, nothing would happen. I'd have to force close the app for it to work again. I'm not seeing anything particular interesting in logcat though.

https://github.com/treehouses/remote/assets/7483137/8bc33ccf-4a97-4fc7-a085-ae89cff28104

Okuro3499 commented 1 week ago

yeah it's still a work in progress not ready for testing

Okuro3499 commented 5 days ago

@xyb994 retest this