14935db63e
Adds full ADB client, device manager, static DeviceInfo fetcher, and live DeviceLiveStats poller. Exposes ListDevices, ConnectDevice, DisconnectDevice, GetDeviceInfo, GetDeviceLiveStats as Wails-bound methods with a 1s devices:changed event loop. Bundles ADB binary infrastructure via //go:embed all:bin with runtime fallback chain.
99 lines
2.3 KiB
Go
99 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"git.achmad.dev/admin/droidscope/backend/adb"
|
|
"git.achmad.dev/admin/droidscope/backend/device"
|
|
"github.com/wailsapp/wails/v2/pkg/runtime"
|
|
|
|
"git.achmad.dev/admin/droidscope/desktop/internal/adbembed"
|
|
)
|
|
|
|
type App struct {
|
|
ctx context.Context
|
|
deviceManager *device.Manager
|
|
}
|
|
|
|
func NewApp() *App {
|
|
return &App{}
|
|
}
|
|
|
|
func (a *App) startup(ctx context.Context) {
|
|
a.ctx = ctx
|
|
|
|
adbPath, err := adbembed.Resolve()
|
|
if err != nil {
|
|
runtime.LogErrorf(ctx, "ADB not found: %v", err)
|
|
return
|
|
}
|
|
runtime.LogInfof(ctx, "Using ADB at: %s", adbPath)
|
|
|
|
client := adb.New(adbPath)
|
|
if err := client.StartServer(ctx); err != nil {
|
|
runtime.LogWarningf(ctx, "ADB start-server: %v", err)
|
|
}
|
|
|
|
a.deviceManager = device.NewManager(client)
|
|
go a.pollDevices()
|
|
}
|
|
|
|
func (a *App) pollDevices() {
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
defer ticker.Stop()
|
|
for {
|
|
select {
|
|
case <-a.ctx.Done():
|
|
return
|
|
case <-ticker.C:
|
|
devices, err := a.deviceManager.List(a.ctx)
|
|
if err != nil {
|
|
runtime.LogWarningf(a.ctx, "device poll: %v", err)
|
|
continue
|
|
}
|
|
runtime.EventsEmit(a.ctx, "devices:changed", devices)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ListDevices returns the current list of connected devices.
|
|
func (a *App) ListDevices() ([]device.Device, error) {
|
|
if a.deviceManager == nil {
|
|
return nil, nil
|
|
}
|
|
return a.deviceManager.List(a.ctx)
|
|
}
|
|
|
|
// ConnectDevice connects to a wireless ADB device by address (e.g. "192.168.1.5:5555").
|
|
func (a *App) ConnectDevice(address string) error {
|
|
if a.deviceManager == nil {
|
|
return nil
|
|
}
|
|
return a.deviceManager.Connect(a.ctx, address)
|
|
}
|
|
|
|
// DisconnectDevice disconnects a device by its serial ID.
|
|
func (a *App) DisconnectDevice(deviceID string) error {
|
|
if a.deviceManager == nil {
|
|
return nil
|
|
}
|
|
return a.deviceManager.Disconnect(a.ctx, deviceID)
|
|
}
|
|
|
|
// GetDeviceInfo fetches static device information for the given device ID.
|
|
func (a *App) GetDeviceInfo(deviceID string) (*device.DeviceInfo, error) {
|
|
if a.deviceManager == nil {
|
|
return nil, nil
|
|
}
|
|
return a.deviceManager.Info(a.ctx, deviceID)
|
|
}
|
|
|
|
// GetDeviceLiveStats fetches dynamic device stats (RAM, battery, thermal, storage, IP).
|
|
func (a *App) GetDeviceLiveStats(deviceID string) (*device.DeviceLiveStats, error) {
|
|
if a.deviceManager == nil {
|
|
return nil, nil
|
|
}
|
|
return a.deviceManager.LiveStats(a.ctx, deviceID)
|
|
}
|