Skip to content

Commit

Permalink
Merge pull request #65 from kaleidot725/feature/restart_adb_server
Browse files Browse the repository at this point in the history
Feature/restart adb server
  • Loading branch information
kaleidot725 authored May 27, 2024
2 parents 25e3612 + 4244344 commit 70ca93f
Show file tree
Hide file tree
Showing 16 changed files with 150 additions and 38 deletions.
5 changes: 5 additions & 0 deletions src/jvmMain/kotlin/jp/kaleidot725/adbpad/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,11 @@ fun DecoratedWindowScope.App(mainStateHolder: MainStateHolder) {
adbPortNumber = settingState.adbPortNumber,
onChangeAdbPortNumber = settingStateHolder::updateAdbPortNumberPath,
isValidAdbPortNumber = settingState.isValidAdbPortNumber,
onRestartAdb = {
settingStateHolder.restartAdb()
mainStateHolder.menuStateHolder.refersh()
},
isRestartingAdb = settingState.isRestartingAdb,
onSave = {
settingStateHolder.save { mainStateHolder.closeSetting() }
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package jp.kaleidot725.adbpad.domain.di

import jp.kaleidot725.adbpad.domain.usecase.adb.RestartAdbUseCase
import jp.kaleidot725.adbpad.domain.usecase.adb.StartAdbUseCase
import jp.kaleidot725.adbpad.domain.usecase.appearance.GetAppearanceUseCase
import jp.kaleidot725.adbpad.domain.usecase.appearance.SaveAppearanceUseCase
Expand Down Expand Up @@ -33,6 +34,9 @@ val domainModule =
factory {
StartAdbUseCase(get())
}
factory {
RestartAdbUseCase(get())
}
factory {
ExecuteCommandUseCase(get(), get())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ object Language : StringResources {
get() = getCurrentResources().settingAdbDirectoryPathTitle
override val settingAdbPortNumberTitle: String
get() = getCurrentResources().settingAdbPortNumberTitle
override val settingAdbRestartTitle: String
get() = getCurrentResources().settingAdbRestartTitle
override val settingAndroidSdkHeader: String
get() = getCurrentResources().settingAndroidSdkHeader
override val settingAndroidSdkDirectoryPathTitle: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ object EnglishResources : StringResources {
override val settingAdbPortNumberTitle = "Server Port"
override val settingAndroidSdkHeader = "Android SDK"
override val settingAndroidSdkDirectoryPathTitle = "Directory Path"
override val settingAdbRestartTitle: String = "Restart ADB"

override val adbErrorTitle = "Adb Error"
override val adbErrorMessage = "Can't start adb server, Please change adb setting."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ object JapaneseResources : StringResources {
override val settingAdbPortNumberTitle = "Server Port"
override val settingAndroidSdkHeader = "Android SDK"
override val settingAndroidSdkDirectoryPathTitle = "Directory Path"
override val settingAdbRestartTitle: String = "ADB再起動"

override val adbErrorTitle = "ADBエラー"
override val adbErrorMessage = "ADBサーバーを開始できませんでした、ADBの設定を変更してください"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ interface StringResources {
val settingAdbPortNumberTitle: String
val settingAndroidSdkHeader: String
val settingAndroidSdkDirectoryPathTitle: String
val settingAdbRestartTitle: String

val adbErrorTitle: String
val adbErrorMessage: String
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package jp.kaleidot725.adbpad.domain.usecase.adb

import com.malinskiy.adam.interactor.StartAdbInteractor
import com.malinskiy.adam.interactor.StopAdbInteractor
import jp.kaleidot725.adbpad.domain.repository.SettingRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
import java.io.File

class RestartAdbUseCase(
private val settingRepository: SettingRepository,
) {
suspend operator fun invoke(): Boolean {
return withContext(Dispatchers.IO) {
try {
val sdkPath = settingRepository.getSdkPath()
StopAdbInteractor().execute(
adbBinary = File(sdkPath.adbDirectory),
serverPort = sdkPath.adbServerPort,
)

delay(100)

return@withContext StartAdbInteractor().execute(
adbBinary = File(sdkPath.adbDirectory),
serverPort = sdkPath.adbServerPort,
)
} catch (e: Exception) {
println(e)
return@withContext false
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,27 @@ class NormalCommandRepositoryImpl : NormalCommandRepository {
onFailed: suspend () -> Unit,
) {
withContext(Dispatchers.IO) {
runningCommands.add(command)
onStart()
try {
runningCommands.add(command)
onStart()

delay(300)
delay(300)

command.requests.forEach { request ->
val result = adbClient.execute(request, device.serial)
if (result.exitCode != 0) {
runningCommands.remove(command)
onFailed()
return@withContext
command.requests.forEach { request ->
val result = adbClient.execute(request, device.serial)
if (result.exitCode != 0) {
runningCommands.remove(command)
onFailed()
return@withContext
}
}
}

runningCommands.remove(command)
onComplete()
runningCommands.remove(command)
onComplete()
} catch (e: Exception) {
runningCommands.remove(command)
onFailed()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package jp.kaleidot725.adbpad.view.common.resource

import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun Modifier.selectedBackground(isSelected: Boolean): Modifier {
Expand All @@ -13,3 +16,12 @@ fun Modifier.selectedBackground(isSelected: Boolean): Modifier {
this
}
}

@Composable
fun Modifier.selectorBorder(): Modifier {
return this.border(
width = 2.dp,
color = MaterialTheme.colors.primary.copy(alpha = 0.5f),
shape = RoundedCornerShape(8.dp),
)
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package jp.kaleidot725.adbpad.view.component.device

import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
Expand All @@ -19,6 +16,7 @@ import androidx.compose.ui.unit.dp
import jp.kaleidot725.adbpad.domain.model.device.Device
import jp.kaleidot725.adbpad.domain.model.device.DeviceState
import jp.kaleidot725.adbpad.domain.model.language.Language
import jp.kaleidot725.adbpad.view.common.resource.selectorBorder

@Composable
fun DeviceSelector(
Expand All @@ -29,10 +27,7 @@ fun DeviceSelector(
Box(
modifier =
Modifier
.border(
border = BorderStroke(2.dp, MaterialTheme.colors.primary),
shape = RoundedCornerShape(8.dp),
)
.selectorBorder()
.padding(vertical = 8.dp, horizontal = 16.dp),
) {
Text(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package jp.kaleidot725.adbpad.view.component.menu

import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import jp.kaleidot725.adbpad.domain.model.Menu
import jp.kaleidot725.adbpad.view.common.resource.selectedBackground

@Composable
fun MenuList(
Expand Down Expand Up @@ -42,15 +41,6 @@ fun MenuList(
}
}

@Composable
private fun Modifier.selectedBackground(isSelected: Boolean): Modifier {
return if (isSelected) {
this.background(color = MaterialTheme.colors.primary.copy(alpha = 0.1f))
} else {
this
}
}

@Preview
@Composable
private fun MenuList_Preview() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ val stateHolderModule =
saveAppearanceUseCase = get(),
getLanguageUseCase = get(),
saveLanguageUseCase = get(),
restartAdbUseCase = get(),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import jp.kaleidot725.adbpad.domain.usecase.menu.GetMenuListUseCase
import jp.kaleidot725.adbpad.view.common.ChildStateHolder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
Expand All @@ -29,13 +31,13 @@ class MenuStateHolder(
private val menus: MutableStateFlow<List<Menu>> = MutableStateFlow(emptyList())
private val selectedMenu: MutableStateFlow<Menu?> = MutableStateFlow(null)

private val devices: StateFlow<List<Device>> =
getAndroidDevicesFlowUseCase()
.stateIn(coroutineScope, SharingStarted.WhileSubscribed(), emptyList())
private var deviceJob: Job? = null
private val _devices: MutableStateFlow<List<Device>> = MutableStateFlow(emptyList())
private val devices: StateFlow<List<Device>> = _devices.asStateFlow()

private val selectedDevice: StateFlow<Device?> =
getSelectedDeviceFlowUseCase()
.stateIn(coroutineScope, SharingStarted.WhileSubscribed(), null)
private var selectedDeviceJob: Job? = null
private val _selectedDevice: MutableStateFlow<Device?> = MutableStateFlow(null)
private val selectedDevice: StateFlow<Device?> = _selectedDevice.asStateFlow()

override val state: StateFlow<MenuState> =
combine(
Expand All @@ -50,6 +52,11 @@ class MenuStateHolder(
override fun setup() {
menus.value = getMenuListUseCase()
selectedMenu.value = menus.value.firstOrNull()
collectDevices()
}

fun refersh() {
collectDevices()
}

override fun dispose() {
Expand All @@ -65,4 +72,22 @@ class MenuStateHolder(
fun selectMenu(menu: Menu) {
selectedMenu.value = menu
}

private fun collectDevices() {
deviceJob?.cancel()
deviceJob =
coroutineScope.launch {
getAndroidDevicesFlowUseCase().collect {
_devices.value = it
}
}

selectedDeviceJob?.cancel()
selectedDeviceJob =
coroutineScope.launch {
getSelectedDeviceFlowUseCase().collect {
_selectedDevice.value = it
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.Button
import androidx.compose.material.Divider
import androidx.compose.material.Text
Expand All @@ -16,10 +17,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.min
import jp.kaleidot725.adbpad.domain.model.language.Language
import jp.kaleidot725.adbpad.domain.model.setting.Appearance
import jp.kaleidot725.adbpad.view.component.FloatingDialog
import jp.kaleidot725.adbpad.view.component.RadioButtons
import jp.kaleidot725.adbpad.view.component.RunningIndicator
import jp.kaleidot725.adbpad.view.component.language.LanguageDropButton
import jp.kaleidot725.adbpad.view.component.setting.SettingField
import jp.kaleidot725.adbpad.view.component.setting.SettingHeader
Expand All @@ -38,6 +41,8 @@ fun SettingScreen(
adbPortNumber: String,
onChangeAdbPortNumber: (String) -> Unit,
isValidAdbPortNumber: Boolean,
onRestartAdb: () -> Unit,
isRestartingAdb: Boolean,
onSave: () -> Unit,
canSave: Boolean,
onCancel: () -> Unit,
Expand Down Expand Up @@ -101,6 +106,23 @@ fun SettingScreen(
isError = !isValidAdbPortNumber,
onValueChange = onChangeAdbPortNumber,
)

Button(
onClick = onRestartAdb,
modifier =
Modifier
.widthIn(min = 150.dp)
.align(Alignment.End),
) {
when {
isRestartingAdb -> RunningIndicator()
else ->
Text(
text = Language.settingAdbRestartTitle,
textAlign = TextAlign.Center,
)
}
}
}

Row(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ data class SettingState(
val appearance: Appearance = Appearance.DARK,
val adbDirectoryPath: String = "",
val adbPortNumber: String = "",
val isRestartingAdb: Boolean = false,
) {
val isValidAdbDirectoryPath: Boolean = adbDirectoryPath.isNotEmpty()
val isValidAdbPortNumber: Boolean = adbPortNumber.toIntOrNull() != null
Expand Down
Loading

0 comments on commit 70ca93f

Please sign in to comment.