add PinDeviceService

This commit is contained in:
Yury Polek
2020-08-22 18:44:32 +03:00
parent 76391ef6fc
commit e0254df434
7 changed files with 95 additions and 4 deletions

View File

@@ -13,4 +13,5 @@ style:
MagicNumber:
active: false
WildcardImport:
active: false
excludeImports: ['java.util.*', 'kotlinx.coroutines.*', 'dev.polek.adbwifi.utils.*']

View File

@@ -0,0 +1,9 @@
package dev.polek.adbwifi.model
data class PinnedDevice(
val androidId: String = "",
val name: String = "",
val address: String? = null,
val androidVersion: String = "",
val apiLevel: String = ""
)

View File

@@ -0,0 +1,21 @@
package dev.polek.adbwifi.model
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.util.ArrayList
class PinnedDeviceListConverter : com.intellij.util.xmlb.Converter<List<PinnedDevice>>() {
override fun toString(value: List<PinnedDevice>): String? {
return gson.toJson(value)
}
override fun fromString(value: String): List<PinnedDevice>? {
return gson.fromJson(value, listType)
}
private companion object {
private val gson = Gson()
private val listType = object : TypeToken<ArrayList<PinnedDevice>>() {}.type
}
}

View File

@@ -0,0 +1,56 @@
package dev.polek.adbwifi.services
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.util.xmlb.XmlSerializerUtil
import com.intellij.util.xmlb.annotations.OptionTag
import dev.polek.adbwifi.model.Device
import dev.polek.adbwifi.model.PinnedDevice
import dev.polek.adbwifi.model.PinnedDeviceListConverter
@State(
name = "PinDeviceService",
storages = [Storage("adbWifiPinnedDevices.xml")]
)
class PinDeviceService : PersistentStateComponent<PinDeviceService> {
@OptionTag(converter = PinnedDeviceListConverter::class)
var pinnedDevices: List<PinnedDevice> = listOf()
fun pinDevice(device: Device) {
if (pinnedDevices.contains(device)) return
pinnedDevices = pinnedDevices.add(device)
}
fun unpinDevice(device: Device) {
pinnedDevices = pinnedDevices.remove(device)
}
override fun getState() = this
override fun loadState(state: PinDeviceService) {
XmlSerializerUtil.copyBean(state, this)
}
private companion object {
private fun List<PinnedDevice>.contains(device: Device): Boolean {
return this.find { it.androidId == device.androidId } != null
}
private fun List<PinnedDevice>.add(device: Device): List<PinnedDevice> {
return this + PinnedDevice(
androidId = device.id,
name = device.name,
address = device.address,
androidVersion = device.androidVersion,
apiLevel = device.apiLevel
)
}
private fun List<PinnedDevice>.remove(device: Device): List<PinnedDevice> {
return this.filter { it.androidId != device.androidId }
}
}
}

View File

@@ -12,7 +12,6 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerListener
import com.intellij.ui.JBSplitter
import com.intellij.ui.components.JBScrollPane
import com.intellij.util.ui.components.BorderLayoutPanel
import dev.polek.adbwifi.LOG
import dev.polek.adbwifi.model.CommandHistory
import dev.polek.adbwifi.model.LogEntry
import dev.polek.adbwifi.services.AdbService
@@ -64,7 +63,6 @@ class AdbWiFiToolWindow(project: Project, private val toolWindow: ToolWindow) :
ToolWindowManagerListener.TOPIC,
object : ToolWindowManagerListener {
override fun stateChanged(toolWindowManager: ToolWindowManager) {
LOG.warn("ToolWindow. isActive: ${toolWindow.isActive}, isVisible: ${toolWindow.isVisible}")
if (toolWindow.isVisible) {
subscribeToDeviceList()
} else {

View File

@@ -2,7 +2,7 @@ package dev.polek.adbwifi.ui
import com.intellij.icons.AllIcons
import com.intellij.ide.plugins.newui.InstallButton
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.components.service
import com.intellij.openapi.ui.JBMenuItem
import com.intellij.openapi.ui.JBPopupMenu
import com.intellij.openapi.util.IconLoader
@@ -13,6 +13,7 @@ import com.intellij.util.ui.UIUtil
import dev.polek.adbwifi.MyBundle
import dev.polek.adbwifi.model.Device
import dev.polek.adbwifi.services.AdbService
import dev.polek.adbwifi.services.PinDeviceService
import dev.polek.adbwifi.utils.*
import java.awt.Dimension
import java.awt.GridBagConstraints
@@ -24,7 +25,8 @@ import javax.swing.JProgressBar
class DevicePanel(device: Device) : JBPanel<DevicePanel>(GridBagLayout()) {
private val adbService = ServiceManager.getService(AdbService::class.java)
private val adbService = service<AdbService>()
private val pinDeviceService = service<PinDeviceService>()
private val button: JButton
@@ -123,6 +125,9 @@ class DevicePanel(device: Device) : JBPanel<DevicePanel>(GridBagLayout()) {
)
val pinButton = IconButton(ICON_PIN, MyBundle.message("pinDeviceTooltip"))
pinButton.onClickedListener = {
pinDeviceService.pinDevice(device)
}
val menuButton = IconButton(ICON_MENU)
menuButton.onClickedListener = { event ->

View File

@@ -10,6 +10,7 @@
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="dev.polek.adbwifi.services.AdbService"/>
<applicationService serviceImplementation="dev.polek.adbwifi.services.LogService"/>
<applicationService serviceImplementation="dev.polek.adbwifi.services.PinDeviceService"/>
<toolWindow
id="ADB Wi-Fi"
anchor="right"