From c9af7f1ccb87147791699fece25b84c5d91c7e32 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Wed, 21 Dec 2022 18:25:10 +0530 Subject: [PATCH] fix: build service is not unbound even after application exit --- .../activities/editor/BaseEditorActivity.kt | 2 +- .../editor/ProjectHandlerActivity.kt | 23 +++++++-- .../itsaky/androidide/app/IDEApplication.kt | 43 +---------------- .../services/GradleBuildServiceConnnection.kt | 44 ++++++++++++++++++ .../androidide/ui/editor/CodeEditorView.java | 14 +----- .../androidide/viewmodel/EditorViewModel.kt | 12 ++++- tests/test-home/.androidide/init/model.jar | Bin 65261 -> 65261 bytes 7 files changed, 76 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/com/itsaky/androidide/services/GradleBuildServiceConnnection.kt diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt index 729f48620..58d499a4d 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt @@ -685,4 +685,4 @@ abstract class BaseEditorActivity : } } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt index 7714e517d..c41443627 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt @@ -17,7 +17,11 @@ package com.itsaky.androidide.activities.editor +import android.content.ComponentName +import android.content.Intent +import android.content.ServiceConnection import android.os.Bundle +import android.os.IBinder import android.view.ViewGroup.MarginLayoutParams import android.widget.CheckBox import androidx.annotation.GravityInt @@ -45,6 +49,8 @@ import com.itsaky.androidide.projects.ProjectManager.setupProject import com.itsaky.androidide.projects.api.Project import com.itsaky.androidide.projects.builder.BuildService import com.itsaky.androidide.services.GradleBuildService +import com.itsaky.androidide.services.GradleBuildService.GradleServiceBinder +import com.itsaky.androidide.services.GradleBuildServiceConnnection import com.itsaky.androidide.tooling.api.messages.result.InitializeResult import com.itsaky.androidide.utils.DialogUtils.newMaterialDialogBuilder import com.itsaky.androidide.utils.RecursiveFileSearcher @@ -71,6 +77,11 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { } protected val mBuildEventListener = EditorBuildEventListener() + + companion object { + @JvmStatic + private val buildServiceConnection = GradleBuildServiceConnnection() + } abstract fun doCloseAll(runAfter: () -> Unit) @@ -102,11 +113,12 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { if (isDestroying) { try { - app.unbindGradleBuildService() + unbindService(buildServiceConnection) } catch (err: Throwable) { log.error("Unable to unbind service") } finally { Lookup.DEFAULT.unregister(BuildService.KEY_BUILD_SERVICE) + viewModel.isBoundToBuildSerice = false } } } @@ -124,15 +136,17 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { } override fun startServices() { - + val service = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as GradleBuildService? - if (service != null) { + if (viewModel.isBoundToBuildSerice && service != null) { log.info("Reusing already started Gradle build service") onGradleBuildServiceConnected(service) return } - if (app.bindGradleBuildService(this::onGradleBuildServiceConnected)) { + buildServiceConnection.onConnected = this::onGradleBuildServiceConnected + + if (bindService(Intent(this, GradleBuildService::class.java), buildServiceConnection, BIND_AUTO_CREATE or BIND_IMPORTANT)) { log.info("Bind request for Gradle build service was successful...") } else { log.error("Gradle build service doesn't exist or the IDE is not allowed to access it.") @@ -202,6 +216,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { protected fun onGradleBuildServiceConnected(service: GradleBuildService) { log.info("Connected to Gradle build service") + viewModel.isBoundToBuildSerice = true Lookup.DEFAULT.update(BuildService.KEY_BUILD_SERVICE, service) service.setEventListener(mBuildEventListener) diff --git a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt index 906bf52b3..212d99805 100755 --- a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt +++ b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt @@ -17,11 +17,8 @@ */ package com.itsaky.androidide.app -import android.content.ComponentName import android.content.Intent -import android.content.ServiceConnection import android.net.Uri -import android.os.IBinder import com.blankj.utilcode.util.ThrowableUtils import com.itsaky.androidide.BuildConfig import com.itsaky.androidide.activities.CrashHandlerActivity @@ -29,10 +26,6 @@ import com.itsaky.androidide.events.AppEventsIndex import com.itsaky.androidide.events.LspApiEventsIndex import com.itsaky.androidide.events.LspJavaEventsIndex import com.itsaky.androidide.events.ProjectsApiEventsIndex -import com.itsaky.androidide.lookup.Lookup -import com.itsaky.androidide.projects.builder.BuildService -import com.itsaky.androidide.services.GradleBuildService -import com.itsaky.androidide.services.GradleBuildService.GradleServiceBinder import com.itsaky.androidide.utils.ILogger import com.itsaky.toaster.Toaster.Type.ERROR import com.itsaky.toaster.toast @@ -43,23 +36,7 @@ import org.greenrobot.eventbus.EventBus class IDEApplication : BaseApplication() { private var uncaughtExceptionHandler: UncaughtExceptionHandler? = null - private val log = ILogger.newInstance("IDEApplication") - - private var onGradleBuildServiceConnected: ((GradleBuildService) -> Unit)? = null - - private val mGradleServiceConnection: ServiceConnection = - object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, service: IBinder?) { - val buildService = (service as GradleServiceBinder).service - Lookup.DEFAULT.update(BuildService.KEY_BUILD_SERVICE, buildService) - onGradleBuildServiceConnected?.invoke(buildService) - } - - override fun onServiceDisconnected(name: ComponentName?) { - log.info("Disconnected from Gradle build service") - } - } - + override fun onCreate() { instance = this uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler() @@ -75,24 +52,6 @@ class IDEApplication : BaseApplication() { .installDefaultEventBus() } - fun bindGradleBuildService(onBound: (GradleBuildService) -> Unit): Boolean { - this.onGradleBuildServiceConnected = onBound - return bindService( - Intent(this, GradleBuildService::class.java), - mGradleServiceConnection, - BIND_AUTO_CREATE or BIND_IMPORTANT - ) - } - - fun unbindGradleBuildService() { - this.onGradleBuildServiceConnected = null - try { - unbindService(mGradleServiceConnection) - } catch (err: Throwable) { - log.error("Unable to unbind Gradle build service") - } - } - private fun handleCrash(thread: Thread, th: Throwable) { writeException(th) diff --git a/app/src/main/java/com/itsaky/androidide/services/GradleBuildServiceConnnection.kt b/app/src/main/java/com/itsaky/androidide/services/GradleBuildServiceConnnection.kt new file mode 100644 index 000000000..cad035f00 --- /dev/null +++ b/app/src/main/java/com/itsaky/androidide/services/GradleBuildServiceConnnection.kt @@ -0,0 +1,44 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE 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. + * + * AndroidIDE 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 AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.services + +import android.content.ComponentName +import android.content.ServiceConnection +import android.os.IBinder +import com.itsaky.androidide.services.GradleBuildService.GradleServiceBinder +import com.itsaky.androidide.utils.ILogger + +/** + * [ServiceConnection] for [GradleBuildService]. + * + * @author Akash Yadav + */ +class GradleBuildServiceConnnection : ServiceConnection { + + internal var onConnected: (GradleBuildService) -> Unit = {} + private val log = ILogger.newInstance("GradleBuildServiceConnnection") + + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + val buildService = (service as GradleServiceBinder).service + onConnected(buildService) + } + + override fun onServiceDisconnected(name: ComponentName?) { + log.info("Disconnected from Gradle build service") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java b/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java index 7ceb94f6d..cfa0f4539 100644 --- a/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java +++ b/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java @@ -407,19 +407,7 @@ public class CodeEditorView extends LinearLayout { editor.onEditorSelected(); } } - - public void undo() { - if (binding.editor.canUndo()) { - binding.editor.undo(); - } - } - - public void redo() { - if (binding.editor.canRedo()) { - binding.editor.redo(); - } - } - + public void beginSearch() { if (this.binding == null || searchLayout == null) { LOG.warn("Editor layout is null content=" + binding + ", searchLayout=" + searchLayout); diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt index 594228b69..f9f995bef 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt @@ -30,10 +30,12 @@ class EditorViewModel : ViewModel() { internal val _isBuildInProgress = MutableLiveData(false) internal val _isInitializing = MutableLiveData(false) - internal val _isConfigurationChange = MutableLiveData(false) internal val _statusText = MutableLiveData>("" to CENTER) internal val _displayedFile = MutableLiveData(-1) internal val _fileTreeDrawerOpened = MutableLiveData(false) + + private val _isBoundToBuildService = MutableLiveData(false) + private val _isConfigurationChange = MutableLiveData(false) private val files = MutableLiveData>(ArrayList()) private val fileModified = MutableLiveData(false) @@ -43,12 +45,18 @@ class EditorViewModel : ViewModel() { */ private val mCurrentFile = MutableLiveData?>(null) + var isBoundToBuildSerice: Boolean + get() = _isBoundToBuildService.value ?: false + set(value) { + _isBoundToBuildService.value = value + } + var isConfigChange: Boolean get() = _isConfigurationChange.value ?: false set(value) { _isConfigurationChange.value = value } - + var isBuildInProgress: Boolean get() = _isBuildInProgress.value ?: false set(value) { diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar index 455ca5b99a9b34162bb112f057520872b0c692ce..0c895205edbf6e2d89e2f3a8ca1d2477beeab00a 100644 GIT binary patch delta 31 ncmaF+m-+2qW}X0VW)?061`ZB}U6VHQ_`PS^HEDCq`-%JjxZexa delta 31 ncmaF+m-+2qW}X0VW)?061`ZAehCpU4jYt$+%@