├── ExeUI.res ├── DelphiAdbWifi.res ├── DelphiAdbWifiExe.res ├── README.md ├── DAW.Main.pas ├── ExeUI.dpr ├── DelphiAdbWifiExe.dpr ├── DAW.Model.Device_.pas ├── DelphiAdbWifi.dpk ├── DAW.Model.Device.New.pas ├── DAW.View.New.fmx ├── .gitignore ├── DAW.View.DeviceEdit.pas ├── DAW.Model.Devices.pas ├── ProjectGroup1.groupproj ├── DAW.Adb.Parser.pas ├── Daw.Controller.New.pas ├── DAW.Controller.pas ├── DAW.View.DeviceEdit.fmx ├── DAW.Utils.DosCMD.pas ├── DAW.Tools.pas ├── DAW.View.New.pas ├── DAW.Adb.pas ├── DAW.ViewADB.pas ├── DAW.ViewADB.fmx ├── DAW.View.Main.pas ├── androidwifiadb.pas ├── DAW.View.Main.fmx ├── DelphiAdbWifi.dproj └── DelphiAdbWifiExe.dproj /ExeUI.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rareMaxim/Delphi-Adb-WiFi/HEAD/ExeUI.res -------------------------------------------------------------------------------- /DelphiAdbWifi.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rareMaxim/Delphi-Adb-WiFi/HEAD/DelphiAdbWifi.res -------------------------------------------------------------------------------- /DelphiAdbWifiExe.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rareMaxim/Delphi-Adb-WiFi/HEAD/DelphiAdbWifiExe.res -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Delphi-Adb-WiFi - Alpha 2 | A plug-in for RAD Studio that allows you to run and debug on an Android device without connecting to a computer via USB. Works over WiFi. 3 | 4 | [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct-team.svg)](https://stand-with-ukraine.pp.ua) -------------------------------------------------------------------------------- /DAW.Main.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Main; 2 | 3 | interface 4 | 5 | uses 6 | ToolsAPI, 7 | Menus, 8 | DAW.Controller; 9 | 10 | procedure Register; 11 | 12 | implementation 13 | 14 | var 15 | GController: IInterface = nil; 16 | 17 | procedure Register; 18 | begin 19 | 20 | end; 21 | 22 | initialization 23 | GController := TDAWController.Create(); 24 | 25 | finalization 26 | GController := nil; 27 | 28 | end. 29 | 30 | -------------------------------------------------------------------------------- /ExeUI.dpr: -------------------------------------------------------------------------------- 1 | program ExeUI; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | androidwifiadb in 'androidwifiadb.pas', 7 | DAW.Adb.Parser in 'DAW.Adb.Parser.pas', 8 | DAW.Adb in 'DAW.Adb.pas', 9 | DAW.Tools in 'DAW.Tools.pas', 10 | DAW.Utils.DosCMD in 'DAW.Utils.DosCMD.pas', 11 | DAW.View.New in 'DAW.View.New.pas' {ViewAdbDialogNew}, 12 | DAW.ViewADB in 'DAW.ViewADB.pas' {ViewAdbDialog}, 13 | DAW.Model.Devices in 'DAW.Model.Devices.pas', 14 | DAW.Model.Device.New in 'DAW.Model.Device.New.pas'; 15 | 16 | {$R *.res} 17 | 18 | begin 19 | Application.Initialize; 20 | Application.CreateForm(TViewAdbDialogNew, ViewAdbDialogNew); 21 | Application.Run; 22 | end. 23 | -------------------------------------------------------------------------------- /DelphiAdbWifiExe.dpr: -------------------------------------------------------------------------------- 1 | program DelphiAdbWifiExe; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | DAW.View.Main in 'DAW.View.Main.pas' {Form2}, 7 | DAW.Model.Device.New in 'DAW.Model.Device.New.pas', 8 | Daw.Controller.New in 'Daw.Controller.New.pas', 9 | DAW.Model.Devices in 'DAW.Model.Devices.pas', 10 | DAW.View.DeviceEdit in 'DAW.View.DeviceEdit.pas' {ViewDeviceEdit}, 11 | DAW.Adb.Parser in 'DAW.Adb.Parser.pas', 12 | DAW.Adb in 'DAW.Adb.pas', 13 | DAW.Tools in 'DAW.Tools.pas', 14 | DAW.Utils.DosCMD in 'DAW.Utils.DosCMD.pas'; 15 | 16 | {$R *.res} 17 | 18 | begin 19 | Application.Initialize; 20 | Application.CreateForm(TForm2, Form2); 21 | Application.CreateForm(TViewDeviceEdit, ViewDeviceEdit); 22 | Application.Run; 23 | end. 24 | -------------------------------------------------------------------------------- /DAW.Model.Device_.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Model.Device; 2 | 3 | interface 4 | 5 | type 6 | TdawDevice = record 7 | private 8 | FID: string; 9 | FName: string; 10 | FIP: string; 11 | FIsConnected: Boolean; 12 | public 13 | procedure SetIP(const Value: string); 14 | constructor Create(const AName, AID: string); 15 | procedure SetIsConnected(const Value: Boolean); 16 | function GetIsConnected: Boolean; 17 | property ID: string read FID write FID; 18 | property Name: string read FName write FName; 19 | property IP: string read FIP write SetIP; 20 | property IsConnected: Boolean read GetIsConnected write SetIsConnected; 21 | end; 22 | 23 | implementation 24 | 25 | { TdawDevice } 26 | 27 | constructor TdawDevice.Create(const AName, AID: string); 28 | begin 29 | Self.FID := AID; 30 | Self.FName := AName; 31 | SetIsConnected(False); 32 | end; 33 | 34 | function TdawDevice.GetIsConnected: Boolean; 35 | begin 36 | Result := FIsConnected; 37 | end; 38 | 39 | procedure TdawDevice.SetIP(const Value: string); 40 | begin 41 | FIP := Value; 42 | end; 43 | 44 | procedure TdawDevice.SetIsConnected(const Value: Boolean); 45 | begin 46 | FIsConnected := Value; 47 | end; 48 | 49 | end. 50 | -------------------------------------------------------------------------------- /DelphiAdbWifi.dpk: -------------------------------------------------------------------------------- 1 | package DelphiAdbWifi; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$DEFINE NEW_UI} 28 | {$ENDIF IMPLICITBUILDING} 29 | {$DESIGNONLY} 30 | {$IMPLICITBUILD ON} 31 | 32 | requires 33 | rtl, 34 | DesignIDE, 35 | fmx; 36 | 37 | contains 38 | DAW.Controller in 'DAW.Controller.pas', 39 | DAW.Main in 'DAW.Main.pas', 40 | DAW.Tools in 'DAW.Tools.pas', 41 | DAW.Utils.DosCMD in 'DAW.Utils.DosCMD.pas', 42 | DAW.Adb in 'DAW.Adb.pas', 43 | DAW.Adb.Parser in 'DAW.Adb.Parser.pas', 44 | DAW.View.DeviceEdit in 'DAW.View.DeviceEdit.pas' {ViewDeviceEdit}, 45 | DAW.View.Main in 'DAW.View.Main.pas' {Form2}, 46 | DAW.Model.Device.New in 'DAW.Model.Device.New.pas'; 47 | 48 | end. 49 | 50 | 51 | -------------------------------------------------------------------------------- /DAW.Model.Device.New.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Model.Device.New; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils; 7 | 8 | type 9 | {$SCOPEDENUMS ON} 10 | 11 | TdawDevice = class 12 | private 13 | FID: string; 14 | FName: string; 15 | FIP: string; 16 | FLastConnected: TDateTime; 17 | FIsConnected: Boolean; 18 | procedure SetIsConnected(const Value: Boolean); 19 | function GetLastConnected: TDateTime; 20 | public 21 | constructor Create(const AName, AId: string); 22 | published 23 | property ID: string read FID write FID; 24 | property Name: string read FName write FName; 25 | property IP: string read FIP write FIP; 26 | property LastConnected: TDateTime read GetLastConnected write FLastConnected; 27 | property IsConnected: Boolean read FIsConnected write SetIsConnected; 28 | 29 | end; 30 | 31 | implementation 32 | 33 | { TdawDevice } 34 | 35 | constructor TdawDevice.Create(const AName, AId: string); 36 | begin 37 | FID := AId; 38 | FName := AName; 39 | end; 40 | 41 | function TdawDevice.GetLastConnected: TDateTime; 42 | begin 43 | Result := FLastConnected; 44 | end; 45 | 46 | procedure TdawDevice.SetIsConnected(const Value: Boolean); 47 | begin 48 | FIsConnected := Value; 49 | if Value then 50 | FLastConnected := Now; 51 | end; 52 | 53 | end. 54 | 55 | -------------------------------------------------------------------------------- /DAW.View.New.fmx: -------------------------------------------------------------------------------- 1 | object ViewAdbDialogNew: TViewAdbDialogNew 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form1' 5 | ClientHeight = 323 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | OnDestroy = FormDestroy 12 | DesignerMasterStyle = 0 13 | object Grid1: TGrid 14 | Align = Top 15 | CanFocus = True 16 | ClipChildren = True 17 | Size.Width = 640.000000000000000000 18 | Size.Height = 193.000000000000000000 19 | Size.PlatformDefault = False 20 | TabOrder = 1 21 | RowCount = 0 22 | OnGetValue = Grid1GetValue 23 | OnSetValue = Grid1SetValue 24 | Viewport.Width = 636.000000000000000000 25 | Viewport.Height = 168.000000000000000000 26 | object StringColumn1: TStringColumn 27 | Header = 'Device' 28 | HeaderSettings.TextSettings.WordWrap = False 29 | end 30 | object StringColumn2: TStringColumn 31 | Header = 'IP' 32 | HeaderSettings.TextSettings.WordWrap = False 33 | end 34 | object CheckColumn1: TCheckColumn 35 | Header = 'Connected' 36 | HeaderSettings.TextSettings.WordWrap = False 37 | Size.Width = 119.000000000000000000 38 | end 39 | object StringColumn3: TStringColumn 40 | HeaderSettings.TextSettings.WordWrap = False 41 | end 42 | object StringColumn4: TStringColumn 43 | HeaderSettings.TextSettings.WordWrap = False 44 | end 45 | end 46 | object Button1: TButton 47 | Position.X = 400.000000000000000000 48 | Position.Y = 224.000000000000000000 49 | TabOrder = 3 50 | Text = 'Update' 51 | TextSettings.Trimming = None 52 | OnClick = Button1Click 53 | end 54 | object Timer1: TTimer 55 | OnTimer = Timer1Timer 56 | Left = 296 57 | Top = 240 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | dunitx-results.xml 68 | -------------------------------------------------------------------------------- /DAW.View.DeviceEdit.pas: -------------------------------------------------------------------------------- 1 | unit DAW.View.DeviceEdit; 2 | 3 | interface 4 | 5 | uses 6 | DAW.Model.Device.New, 7 | System.SysUtils, 8 | System.Types, 9 | System.UITypes, 10 | System.Classes, 11 | System.Variants, 12 | FMX.Types, 13 | FMX.Controls, 14 | FMX.Forms, 15 | FMX.Graphics, 16 | FMX.Dialogs, 17 | FMX.StdCtrls, 18 | FMX.Edit, 19 | FMX.Layouts, 20 | FMX.Controls.Presentation; 21 | 22 | type 23 | TViewDeviceEdit = class(TForm) 24 | lblName: TLabel; 25 | lytName: TLayout; 26 | edtName: TEdit; 27 | lytIP: TLayout; 28 | lblIP: TLabel; 29 | edtIP: TEdit; 30 | lytDialogActions: TLayout; 31 | btnOk: TButton; 32 | btnCancel: TButton; 33 | private 34 | { Private declarations } 35 | procedure FillUI(ADevice: TdawDevice); 36 | procedure UItoModel(var ADevice: TdawDevice); 37 | public 38 | { Public declarations } 39 | class function Edit(var ADevice: TdawDevice): Boolean; 40 | end; 41 | 42 | var 43 | ViewDeviceEdit: TViewDeviceEdit; 44 | 45 | implementation 46 | 47 | {$R *.fmx} 48 | 49 | { TViewDeviceEdit } 50 | 51 | class function TViewDeviceEdit.Edit(var ADevice: TdawDevice): Boolean; 52 | var 53 | LForm: TViewDeviceEdit; 54 | LModalResult: TModalResult; 55 | begin 56 | LForm := TViewDeviceEdit.Create(nil); 57 | try 58 | LForm.FillUI(ADevice); 59 | LModalResult := LForm.ShowModal; 60 | Result := IsPositiveResult(LModalResult); 61 | if Result then 62 | begin 63 | LForm.UItoModel(ADevice); 64 | end; 65 | finally 66 | LForm.Free; 67 | end; 68 | end; 69 | 70 | procedure TViewDeviceEdit.FillUI(ADevice: TdawDevice); 71 | begin 72 | edtName.Text := ADevice.Name; 73 | edtIP.Text := ADevice.IP; 74 | end; 75 | 76 | procedure TViewDeviceEdit.UItoModel(var ADevice: TdawDevice); 77 | begin 78 | ADevice.Name := edtName.Text; 79 | ADevice.IP := edtIP.Text; 80 | end; 81 | 82 | end. 83 | 84 | -------------------------------------------------------------------------------- /DAW.Model.Devices.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Model.Devices; 2 | 3 | interface 4 | 5 | uses 6 | System.Generics.Collections, 7 | DAW.Model.Device.New; 8 | 9 | type 10 | TdawDevices = class(TList) 11 | private 12 | function Compare(const ALeft, ARight: string): Boolean; 13 | public 14 | function IsDuplicat(const ADevice: TdawDevice): Integer; 15 | function ToJSON: string; 16 | procedure FromJSON(const AData: string); 17 | end; 18 | 19 | implementation 20 | 21 | uses 22 | System.SysUtils, 23 | System.IOUtils, 24 | System.JSON.Types, 25 | System.JSON.Serializers; 26 | { TdawDevices } 27 | 28 | function TdawDevices.Compare(const ALeft, ARight: string): Boolean; 29 | begin 30 | Result := not(ALeft.IsEmpty and ARight.IsEmpty); 31 | if Result then 32 | Result := ALeft = ARight; 33 | end; 34 | 35 | procedure TdawDevices.FromJSON(const AData: string); 36 | var 37 | JS: TJsonSerializer; 38 | LDevices: TArray; 39 | begin 40 | JS := TJsonSerializer.Create; 41 | try 42 | LDevices := JS.Deserialize < TArray < TdawDevice >> (AData); 43 | AddRange(LDevices); 44 | finally 45 | JS.Free; 46 | end; 47 | end; 48 | 49 | function TdawDevices.IsDuplicat(const ADevice: TdawDevice): Integer; 50 | var 51 | I: Integer; 52 | LD: TdawDevice; 53 | begin 54 | Result := -1; 55 | for I := 0 to Count - 1 do 56 | begin 57 | LD := Items[I]; 58 | if Compare(LD.ID, ADevice.ID) or Compare(LD.IP, ADevice.IP) then 59 | begin 60 | Result := I; 61 | Break; 62 | end; 63 | end; 64 | end; 65 | 66 | function TdawDevices.ToJSON: string; 67 | var 68 | JS: TJsonSerializer; 69 | LDevices: TArray; 70 | begin 71 | JS := TJsonSerializer.Create; 72 | try 73 | JS.Formatting := TJsonFormatting.Indented; 74 | LDevices := Self.ToArray; 75 | Result := JS.Serialize(LDevices); 76 | finally 77 | JS.Free; 78 | end; 79 | 80 | end; 81 | 82 | end. 83 | -------------------------------------------------------------------------------- /ProjectGroup1.groupproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {05A9EBB8-2258-40DB-BA3F-D2BFD4FC7D81} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Default.Personality.12 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /DAW.Adb.Parser.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Adb.Parser; 2 | 3 | interface 4 | 5 | uses 6 | DAW.Model.Device.New; 7 | 8 | type 9 | TdawAdbParser = class 10 | private 11 | function parseDeviceName(const ALine: string): string; 12 | public 13 | function parseGetDevicesOutput(const AAdbDevicesOutput: string) 14 | : TArray; 15 | function parseGetDeviceIp(const AIpInfo: string): string; 16 | function parseAdbServiceTcpPort(getPropOutput: string): string; 17 | end; 18 | 19 | implementation 20 | 21 | uses 22 | DAW.Tools, 23 | System.SysUtils, 24 | System.Generics.Collections; 25 | 26 | { TdawAdbParser } 27 | 28 | function TdawAdbParser.parseAdbServiceTcpPort(getPropOutput: string): string; 29 | 30 | begin 31 | raise Exception.Create(getPropOutput); 32 | end; 33 | 34 | function TdawAdbParser.parseDeviceName(const ALine: string): string; 35 | const 36 | MODEL_INDICATOR = 'model:'; 37 | DEVICE_INDICATOR = 'device:'; 38 | var 39 | LData: TArray; 40 | begin 41 | LData := TDawTools.GetInTag(ALine, MODEL_INDICATOR, DEVICE_INDICATOR); 42 | if Length(LData) > 0 then 43 | Result := LData[0]; 44 | end; 45 | 46 | function TdawAdbParser.parseGetDeviceIp(const AIpInfo: string): string; 47 | const 48 | START_DEVICE_IP_INDICATOR = 'inet '; 49 | END_DEVICE_IP_INDICATOR = '/'; 50 | var 51 | LData: TArray; 52 | begin 53 | LData := TDawTools.GetInTag(AIpInfo, START_DEVICE_IP_INDICATOR, 54 | END_DEVICE_IP_INDICATOR); 55 | if Length(LData) > 0 then 56 | Result := LData[0]; 57 | end; 58 | 59 | function TdawAdbParser.parseGetDevicesOutput(const AAdbDevicesOutput: string) 60 | : TArray; 61 | var 62 | LDevices: TList; 63 | splittedOutput: TArray; 64 | i: integer; 65 | line: string; 66 | deviceLine: TArray; 67 | id: string; 68 | name: string; 69 | Device: TdawDevice; 70 | begin 71 | // 'List of devices attached'#$D#$A'0123456789ABCDEF device product:havoc_santoni model:Redmi_4X device:santoni transport_id:1'#$D#$A#$D#$A 72 | Result := nil; 73 | if AAdbDevicesOutput.contains('daemon') then 74 | Exit(nil); 75 | splittedOutput := AAdbDevicesOutput.Split([#$D#$A], 76 | TStringSplitOptions.ExcludeEmpty); 77 | if Length(splittedOutput) <= 1 then 78 | Exit(nil); 79 | LDevices := TList.Create(); 80 | try 81 | for i := 1 to High(splittedOutput) do 82 | begin 83 | line := splittedOutput[i]; 84 | deviceLine := line.Split([' '], TStringSplitOptions.ExcludeEmpty); 85 | id := deviceLine[0].Split([':'])[0]; 86 | name := parseDeviceName(line); 87 | Device := TdawDevice.Create(name, id); 88 | LDevices.add(Device); 89 | end; 90 | Result := LDevices.ToArray; 91 | finally 92 | LDevices.Free; 93 | end; 94 | end; 95 | 96 | end. 97 | -------------------------------------------------------------------------------- /Daw.Controller.New.pas: -------------------------------------------------------------------------------- 1 | unit Daw.Controller.New; 2 | 3 | interface 4 | 5 | uses 6 | Daw.Adb, 7 | DAW.Adb.Parser, 8 | DAW.Utils.DosCMD, 9 | DAW.Model.Device.New, 10 | DAW.Model.Devices; 11 | 12 | type 13 | TdawController = class 14 | private 15 | FLastDevices: TdawDevices; 16 | FAvaibleDevices: TdawDevices; 17 | FAdb: TdawAdb; 18 | FCmd: TDosCMD; 19 | FAdbParser: TdawAdbParser; 20 | public 21 | constructor Create; 22 | function GetDosCMD: TDosCMD; 23 | procedure Add(ADevice: TdawDevice); 24 | procedure Delete(ADevice: TdawDevice); 25 | procedure Connect(ADevice: TdawDevice); 26 | procedure Disconnect(ADevice: TdawDevice); 27 | procedure AddConnectedInAdb; 28 | destructor Destroy; override; 29 | property LastDevices: TdawDevices read FLastDevices write FLastDevices; 30 | property AvaibleDevices: TdawDevices read FAvaibleDevices write FAvaibleDevices; 31 | end; 32 | 33 | implementation 34 | 35 | uses 36 | Daw.Tools, 37 | System.SysUtils; 38 | { TdawController } 39 | 40 | procedure TdawController.Add(ADevice: TdawDevice); 41 | var 42 | x: Integer; 43 | begin 44 | x := FLastDevices.IsDuplicat(ADevice); 45 | if x > -1 then 46 | begin 47 | FAdb.Upgrade(ADevice); 48 | FLastDevices[x] := ADevice; 49 | end 50 | else 51 | begin 52 | FAdb.Upgrade(ADevice); 53 | FLastDevices.Add(ADevice); 54 | end; 55 | end; 56 | 57 | procedure TdawController.AddConnectedInAdb; 58 | var 59 | LFromAdb: TArray; 60 | begin 61 | FAvaibleDevices.Clear; 62 | LFromAdb := FAdb.getDevicesConnectedByUSB; 63 | FAvaibleDevices.AddRange(LFromAdb); 64 | end; 65 | 66 | procedure TdawController.Connect(ADevice: TdawDevice); 67 | begin 68 | FAdb.connectDevices([ADevice]); 69 | end; 70 | 71 | constructor TdawController.Create; 72 | var 73 | LDevices: string; 74 | begin 75 | FLastDevices := TdawDevices.Create(); 76 | FAvaibleDevices := TdawDevices.Create(); 77 | FAdbParser := TdawAdbParser.Create; 78 | FCmd := TDosCMD.Create('', TDawTools.AdbPath); 79 | FAdb := TdawAdb.Create(FCmd, FAdbParser); 80 | LDevices := TDawTools.LoadData('devices'); 81 | if not LDevices.IsEmpty then 82 | FLastDevices.FromJSON(LDevices); 83 | end; 84 | 85 | procedure TdawController.Delete(ADevice: TdawDevice); 86 | begin 87 | FLastDevices.Remove(ADevice); 88 | end; 89 | 90 | destructor TdawController.Destroy; 91 | begin 92 | TDawTools.SaveData('devices', FLastDevices.ToJSON); 93 | FAvaibleDevices.Free; 94 | FLastDevices.Free; 95 | inherited; 96 | end; 97 | 98 | procedure TdawController.Disconnect(ADevice: TdawDevice); 99 | begin 100 | FAdb.disconnectDevices([ADevice]); 101 | end; 102 | 103 | function TdawController.GetDosCMD: TDosCMD; 104 | begin 105 | Result := FCmd; 106 | end; 107 | 108 | end. 109 | 110 | -------------------------------------------------------------------------------- /DAW.Controller.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Controller; 2 | 3 | interface 4 | 5 | uses 6 | 7 | Types, 8 | Menus, 9 | Windows, 10 | Graphics, 11 | ImgList, 12 | Dialogs, 13 | DAW.View.Main, 14 | Classes; 15 | 16 | type 17 | TDAWController = class(TInterfacedObject) 18 | private 19 | FMenuItem: TMenuItem; 20 | FDialog: TForm2; 21 | FIcon: TIcon; 22 | procedure HandleClickDelphinus(Sender: TObject); 23 | procedure InstallMenu(); 24 | procedure UninstallMenu(); 25 | function GetIndexOfConfigureTools(AToolsMenu: TMenuItem): Integer; 26 | public 27 | constructor Create(); 28 | destructor Destroy(); override; 29 | end; 30 | 31 | implementation 32 | 33 | uses 34 | ToolsAPI; 35 | 36 | const 37 | CToolsMenu = 'ToolsMenu'; 38 | CConfigureTools = 'ToolsToolsItem'; // heard you like tools.... 39 | 40 | { TDelphinusController } 41 | 42 | constructor TDAWController.Create; 43 | var 44 | LBitmap: TBitmap; 45 | begin 46 | inherited; 47 | FIcon := TIcon.Create(); 48 | FIcon.SetSize(16, 16); 49 | // FIcon.Handle := LoadImage(HInstance, Ico_Delphinus, IMAGE_ICON, 0, 0, 0); 50 | LBitmap := TBitmap.Create(); 51 | try 52 | LBitmap.SetSize(24, 24); 53 | LBitmap.Canvas.Draw((24 - FIcon.Width) div 2, 54 | (24 - FIcon.Height) div 2, FIcon); 55 | // SplashScreenServices.AddPluginBitmap(CVersionedDelphinus, LBitmap.Handle); 56 | finally 57 | LBitmap.Free; 58 | end; 59 | InstallMenu(); 60 | FDialog := TForm2.Create(nil); 61 | end; 62 | 63 | destructor TDAWController.Destroy; 64 | begin 65 | UninstallMenu(); 66 | FDialog.Free; 67 | FIcon.Free; 68 | inherited; 69 | end; 70 | 71 | function TDAWController.GetIndexOfConfigureTools(AToolsMenu: TMenuItem) 72 | : Integer; 73 | var 74 | i: Integer; 75 | begin 76 | Result := AToolsMenu.Count; 77 | for i := 0 to AToolsMenu.Count - 1 do 78 | begin 79 | if AToolsMenu.Items[i].Name = CConfigureTools then 80 | Exit(i); 81 | end; 82 | end; 83 | 84 | procedure TDAWController.HandleClickDelphinus(Sender: TObject); 85 | begin 86 | FDialog.Show(); 87 | end; 88 | 89 | procedure TDAWController.InstallMenu; 90 | var 91 | LItem: TMenuItem; 92 | LService: INTAServices; 93 | i, LIndex: Integer; 94 | LImageList: TCustomImageList; 95 | begin 96 | LService := BorlandIDEServices as INTAServices; 97 | for i := LService.MainMenu.Items.Count - 1 downto 0 do 98 | begin 99 | LItem := LService.MainMenu.Items[i]; 100 | if LItem.Name = CToolsMenu then 101 | begin 102 | FMenuItem := TMenuItem.Create(LService.MainMenu); 103 | FMenuItem.Caption := 'Adb WiFi'; 104 | FMenuItem.Name := 'DelphiAdbWiFiMenu'; 105 | FMenuItem.OnClick := HandleClickDelphinus; 106 | LIndex := GetIndexOfConfigureTools(LItem); 107 | LItem.Insert(LIndex, FMenuItem); 108 | LImageList := LItem.GetImageList; 109 | if Assigned(LImageList) then 110 | begin 111 | FMenuItem.ImageIndex := LImageList.AddIcon(FIcon); 112 | end; 113 | Break; 114 | end; 115 | end; 116 | end; 117 | 118 | procedure TDAWController.UninstallMenu; 119 | begin 120 | if Assigned(FMenuItem) then 121 | begin 122 | FMenuItem.Free; 123 | end; 124 | end; 125 | 126 | end. 127 | -------------------------------------------------------------------------------- /DAW.View.DeviceEdit.fmx: -------------------------------------------------------------------------------- 1 | object ViewDeviceEdit: TViewDeviceEdit 2 | Left = 0 3 | Top = 0 4 | Caption = 'Device Editor' 5 | ClientHeight = 121 6 | ClientWidth = 364 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object lytName: TLayout 12 | Align = Top 13 | Padding.Left = 5.000000000000000000 14 | Padding.Top = 5.000000000000000000 15 | Padding.Right = 5.000000000000000000 16 | Padding.Bottom = 5.000000000000000000 17 | Size.Width = 364.000000000000000000 18 | Size.Height = 32.000000000000000000 19 | Size.PlatformDefault = False 20 | TabOrder = 1 21 | object lblName: TLabel 22 | Align = Left 23 | Position.X = 5.000000000000000000 24 | Position.Y = 5.000000000000000000 25 | Size.Width = 120.000000000000000000 26 | Size.Height = 22.000000000000000000 27 | Size.PlatformDefault = False 28 | Text = 'Name' 29 | TabOrder = 0 30 | end 31 | object edtName: TEdit 32 | Touch.InteractiveGestures = [LongTap, DoubleTap] 33 | Align = Client 34 | TabOrder = 1 35 | Size.Width = 234.000000000000000000 36 | Size.Height = 22.000000000000000000 37 | Size.PlatformDefault = False 38 | end 39 | end 40 | object lytIP: TLayout 41 | Align = Top 42 | Padding.Left = 5.000000000000000000 43 | Padding.Top = 5.000000000000000000 44 | Padding.Right = 5.000000000000000000 45 | Padding.Bottom = 5.000000000000000000 46 | Position.Y = 32.000000000000000000 47 | Size.Width = 364.000000000000000000 48 | Size.Height = 32.000000000000000000 49 | Size.PlatformDefault = False 50 | TabOrder = 0 51 | object lblIP: TLabel 52 | Align = Left 53 | Position.X = 5.000000000000000000 54 | Position.Y = 5.000000000000000000 55 | Size.Width = 120.000000000000000000 56 | Size.Height = 22.000000000000000000 57 | Size.PlatformDefault = False 58 | Text = 'IP' 59 | TabOrder = 0 60 | end 61 | object edtIP: TEdit 62 | Touch.InteractiveGestures = [LongTap, DoubleTap] 63 | Align = Client 64 | TabOrder = 1 65 | Size.Width = 234.000000000000000000 66 | Size.Height = 22.000000000000000000 67 | Size.PlatformDefault = False 68 | end 69 | end 70 | object lytDialogActions: TLayout 71 | Align = Bottom 72 | Padding.Left = 5.000000000000000000 73 | Padding.Top = 5.000000000000000000 74 | Padding.Right = 5.000000000000000000 75 | Padding.Bottom = 5.000000000000000000 76 | Position.Y = 89.000000000000000000 77 | Size.Width = 364.000000000000000000 78 | Size.Height = 32.000000000000000000 79 | Size.PlatformDefault = False 80 | TabOrder = 2 81 | object btnOk: TButton 82 | Align = Right 83 | ModalResult = 1 84 | Margins.Right = 5.000000000000000000 85 | Position.X = 194.000000000000000000 86 | Position.Y = 5.000000000000000000 87 | TabOrder = 0 88 | Text = 'Ok' 89 | end 90 | object btnCancel: TButton 91 | Align = Right 92 | ModalResult = 2 93 | Position.X = 279.000000000000000000 94 | Position.Y = 5.000000000000000000 95 | TabOrder = 1 96 | Text = 'Cancel' 97 | end 98 | end 99 | end 100 | -------------------------------------------------------------------------------- /DAW.Utils.DosCMD.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Utils.DosCMD; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils; 7 | 8 | type 9 | TDosCMD = class 10 | private 11 | FWorkDir: string; 12 | FCommandLine: string; 13 | FOnExecute: TProc; 14 | procedure DoOnExecute(const AData: string); 15 | public 16 | function Execute: string; overload; 17 | function Execute(const ACommandLine: string): string; overload; 18 | function Execute(const ACommandLine, AWork: string): string; overload; 19 | function Execute(const ACommandLine: string; const Args: array of const): string; overload; 20 | constructor Create(const ACommandLine, AWorkDir: string); 21 | property WorkDir: string read FWorkDir write FWorkDir; 22 | property CommandLine: string read FCommandLine write FCommandLine; 23 | property OnExecute: TProc read FOnExecute write FOnExecute; 24 | end; 25 | 26 | implementation 27 | 28 | uses 29 | Winapi.Windows; 30 | 31 | { TDosCMD } 32 | 33 | function TDosCMD.Execute: string; 34 | var 35 | SecurityAttributes: TSecurityAttributes; 36 | StartupInfo: TStartupInfo; 37 | ProcessInfo: TProcessInformation; 38 | StdOutRead, StdOutWrite: THandle; 39 | WasOK: Boolean; 40 | Buffer: array [0 .. 1023] of AnsiChar; 41 | BytesRead: DWORD; 42 | Handle: Boolean; 43 | begin 44 | Result := ''; 45 | with SecurityAttributes do 46 | begin 47 | nLength := SizeOf(SecurityAttributes); 48 | bInheritHandle := True; 49 | lpSecurityDescriptor := nil; 50 | end; 51 | CreatePipe(StdOutRead, StdOutWrite, @SecurityAttributes, 0); 52 | try 53 | with StartupInfo do 54 | begin 55 | FillChar(StartupInfo, SizeOf(StartupInfo), 0); 56 | cb := SizeOf(StartupInfo); 57 | dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 58 | wShowWindow := SW_HIDE; 59 | hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin 60 | hStdOutput := StdOutWrite; 61 | hStdError := StdOutWrite; 62 | end; 63 | Handle := CreateProcess(nil, PChar('cmd.exe /C ' + FCommandLine), nil, nil, True, 0, nil, PChar(FWorkDir), StartupInfo, 64 | ProcessInfo); 65 | CloseHandle(StdOutWrite); 66 | if Handle then 67 | try 68 | repeat 69 | WasOK := ReadFile(StdOutRead, Buffer, 255, BytesRead, nil); 70 | if BytesRead > 0 then 71 | begin 72 | Buffer[BytesRead] := #0; 73 | Result := Result + Buffer; 74 | end; 75 | until not WasOK or (BytesRead = 0); 76 | WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 77 | finally 78 | CloseHandle(ProcessInfo.hThread); 79 | CloseHandle(ProcessInfo.hProcess); 80 | end; 81 | finally 82 | CloseHandle(StdOutRead); 83 | end; 84 | DoOnExecute(Result); 85 | end; 86 | 87 | constructor TDosCMD.Create(const ACommandLine, AWorkDir: string); 88 | begin 89 | FWorkDir := AWorkDir; 90 | FCommandLine := ACommandLine; 91 | end; 92 | 93 | procedure TDosCMD.DoOnExecute(const AData: string); 94 | begin 95 | if Assigned(OnExecute) then 96 | OnExecute(AData); 97 | end; 98 | 99 | function TDosCMD.Execute(const ACommandLine: string; const Args: array of const): string; 100 | begin 101 | Result := Execute(Format(ACommandLine, Args)); 102 | end; 103 | 104 | function TDosCMD.Execute(const ACommandLine, AWork: string): string; 105 | begin 106 | FWorkDir := AWork; 107 | FCommandLine := ACommandLine; 108 | Result := Execute; 109 | end; 110 | 111 | function TDosCMD.Execute(const ACommandLine: string): string; 112 | begin 113 | FCommandLine := ACommandLine; 114 | Result := Execute; 115 | end; 116 | 117 | end. 118 | -------------------------------------------------------------------------------- /DAW.Tools.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Tools; 2 | 3 | interface 4 | 5 | uses 6 | System.Win.Registry; 7 | 8 | type 9 | TDawTools = class 10 | private 11 | class var 12 | FAdbExe: string; 13 | class function ReadFromRegAdbExe: string; 14 | public 15 | class function CompilerVersionToProduct(const AVer: Single): Integer; 16 | class function AdbExe: string; 17 | class function AdbPath: string; 18 | class function GetInTag(AInput, AStartTag, AEndTag: string): TArray; 19 | class procedure SaveData(const AName, AValue: string); 20 | class function LoadData(const AName: string): string; 21 | end; 22 | 23 | implementation 24 | 25 | uses 26 | Winapi.Windows, 27 | System.Generics.Collections, 28 | System.SysUtils; 29 | 30 | { TDawTools } 31 | 32 | class function TDawTools.AdbExe: string; 33 | begin 34 | if not FileExists(FAdbExe) then 35 | FAdbExe := ReadFromRegAdbExe; 36 | Result := FAdbExe; 37 | end; 38 | 39 | class function TDawTools.AdbPath: string; 40 | begin 41 | Result := ExtractFilePath(AdbExe); 42 | end; 43 | 44 | class function TDawTools.CompilerVersionToProduct(const AVer: Single): Integer; 45 | begin 46 | if AVer < 30.0 then 47 | raise Exception.Create('Unsupported IDE version.'); 48 | Result := Round(AVer) - 13; 49 | end; 50 | 51 | class function TDawTools.GetInTag(AInput, AStartTag, AEndTag: string): TArray; 52 | var 53 | LData: TList; 54 | LInpCash: string; 55 | var 56 | start: Integer; 57 | count: Integer; 58 | ForAdd: string; 59 | begin 60 | LInpCash := AInput; 61 | LData := TList.Create; 62 | try 63 | while not LInpCash.IsEmpty do 64 | begin 65 | start := LInpCash.indexOf(AStartTag); // + ; 66 | if start < 0 then 67 | Break; 68 | Inc(start, AStartTag.Length); 69 | LInpCash := LInpCash.Substring(start); 70 | count := LInpCash.indexOf(AEndTag); 71 | if (count < 0) then 72 | count := LInpCash.Length; 73 | ForAdd := LInpCash.Substring(0, count); 74 | LData.Add(ForAdd); 75 | LInpCash := LInpCash.Substring(count); 76 | end; 77 | Result := LData.ToArray; 78 | finally 79 | LData.Free; 80 | end; 81 | end; 82 | 83 | class function TDawTools.LoadData(const AName: string): string; 84 | const 85 | REG_KEY = '\Software\rareMax\DAW\'; 86 | var 87 | Reg: TRegistry; 88 | begin 89 | Reg := TRegistry.Create; 90 | try 91 | Reg.RootKey := HKEY_CURRENT_USER; 92 | if Reg.OpenKey(REG_KEY, False) then 93 | Result := Reg.ReadString(AName); 94 | finally 95 | Reg.Free; 96 | end; 97 | end; 98 | 99 | class function TDawTools.ReadFromRegAdbExe: string; 100 | const 101 | REG_KEY = '\Software\Embarcadero\BDS\%d.0\PlatformSDKs\'; 102 | var 103 | Reg: TRegistry; 104 | tmpVer: Integer; 105 | tmpSdk: string; 106 | begin 107 | Result := 'Cant find path :('; 108 | Reg := TRegistry.Create; 109 | try 110 | Reg.RootKey := HKEY_CURRENT_USER; 111 | tmpVer := CompilerVersionToProduct(CompilerVersion); 112 | if Reg.OpenKeyReadOnly(Format(REG_KEY, [tmpVer])) then 113 | begin 114 | tmpSdk := Reg.ReadString('Default_Android'); 115 | if Reg.OpenKeyReadOnly(tmpSdk) then 116 | begin 117 | Result := Reg.ReadString('SDKAdbPath'); 118 | end; 119 | end; 120 | finally 121 | Reg.Free; 122 | end; 123 | end; 124 | 125 | class procedure TDawTools.SaveData(const AName, AValue: string); 126 | const 127 | REG_KEY = '\Software\rareMax\DAW\'; 128 | var 129 | Reg: TRegistry; 130 | begin 131 | Reg := TRegistry.Create; 132 | try 133 | Reg.RootKey := HKEY_CURRENT_USER; 134 | if Reg.OpenKey(REG_KEY, True) then 135 | Reg.WriteString(AName, AValue); 136 | finally 137 | Reg.Free; 138 | end; 139 | end; 140 | 141 | end. 142 | 143 | -------------------------------------------------------------------------------- /DAW.View.New.pas: -------------------------------------------------------------------------------- 1 | unit DAW.View.New; 2 | 3 | interface 4 | 5 | uses 6 | androidwifiadb, 7 | DAW.Utils.DosCmd, 8 | DAW.Adb.Parser, 9 | DAW.Tools, 10 | DAW.Model.Device.New, 11 | System.SysUtils, System.Types, System.UITypes, System.Classes, 12 | System.Variants, 13 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti, 14 | FMX.Grid.Style, FMX.Grid, FMX.Controls.Presentation, FMX.ScrollBox, DAW.Adb, 15 | FMX.StdCtrls; 16 | 17 | type 18 | TViewAdbDialogNew = class(TForm) 19 | Grid1: TGrid; 20 | StringColumn1: TStringColumn; 21 | StringColumn2: TStringColumn; 22 | CheckColumn1: TCheckColumn; 23 | Timer1: TTimer; 24 | Button1: TButton; 25 | StringColumn3: TStringColumn; 26 | StringColumn4: TStringColumn; 27 | procedure FormCreate(Sender: TObject); 28 | procedure Button1Click(Sender: TObject); 29 | procedure FormDestroy(Sender: TObject); 30 | procedure Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; 31 | var Value: TValue); 32 | procedure Timer1Timer(Sender: TObject); 33 | procedure Grid1SetValue(Sender: TObject; const ACol, ARow: Integer; 34 | const Value: TValue); 35 | private 36 | { Private declarations } 37 | FAdb: TdawAdb; 38 | FCmd: TDosCMD; 39 | FAdbParser: TdawAdbParser; 40 | FAndroidWifiADB: TAndroidWiFiADB; 41 | function GetDeviceByRow(const ARow: Integer): TdawDevice; 42 | public 43 | { Public declarations } 44 | procedure createToolWindowContent; 45 | procedure ConnectDevice(ADevice: TdawDevice); 46 | procedure DisconnectDevice(ADevice: TdawDevice); 47 | procedure SetupUI; 48 | procedure monitorDevices; 49 | procedure updateUi; 50 | end; 51 | 52 | var 53 | ViewAdbDialogNew: TViewAdbDialogNew; 54 | 55 | implementation 56 | 57 | {$R *.fmx} 58 | 59 | procedure TViewAdbDialogNew.Button1Click(Sender: TObject); 60 | begin 61 | monitorDevices; 62 | end; 63 | 64 | procedure TViewAdbDialogNew.ConnectDevice(ADevice: TdawDevice); 65 | begin 66 | FAndroidWifiADB.ConnectDevice(ADevice); 67 | updateUi(); 68 | end; 69 | 70 | procedure TViewAdbDialogNew.createToolWindowContent; 71 | begin 72 | SetupUI(); 73 | monitorDevices(); 74 | end; 75 | 76 | procedure TViewAdbDialogNew.DisconnectDevice(ADevice: TdawDevice); 77 | begin 78 | FAndroidWifiADB.DisconnectDevice(ADevice); 79 | updateUi(); 80 | end; 81 | 82 | procedure TViewAdbDialogNew.FormCreate(Sender: TObject); 83 | begin 84 | FCmd := TDosCMD.Create('', TDawTools.AdbPath); 85 | FAdbParser := TdawAdbParser.Create; 86 | FAdb := TdawAdb.Create(FCmd, FAdbParser); 87 | FAndroidWifiADB := TAndroidWiFiADB.Create(FAdb, TAlertService.Create); 88 | end; 89 | 90 | procedure TViewAdbDialogNew.FormDestroy(Sender: TObject); 91 | begin 92 | FreeAndNil(FCmd); 93 | FreeAndNil(FAdbParser); 94 | FreeAndNil(FAdb); 95 | FreeAndNil(FAndroidWifiADB); 96 | end; 97 | 98 | function TViewAdbDialogNew.GetDeviceByRow(const ARow: Integer): TdawDevice; 99 | begin 100 | Result := FAndroidWifiADB.getDevices[ARow]; 101 | end; 102 | 103 | procedure TViewAdbDialogNew.Grid1GetValue(Sender: TObject; 104 | const ACol, ARow: Integer; var Value: TValue); 105 | var 106 | LDevice: TdawDevice; 107 | begin 108 | LDevice := GetDeviceByRow(ARow); 109 | case ACol of 110 | 0: 111 | Value := LDevice.Name; 112 | 1: 113 | Value := LDevice.IP; 114 | 2, 3: 115 | begin 116 | Value := LDevice.IsConnected.ToString(TUseBoolStrs.True); 117 | end; 118 | 4: 119 | Value := LDevice.ID; 120 | end; 121 | end; 122 | 123 | procedure TViewAdbDialogNew.Grid1SetValue(Sender: TObject; 124 | const ACol, ARow: Integer; const Value: TValue); 125 | var 126 | LDevice: TdawDevice; 127 | LIsConnect: Boolean; 128 | begin 129 | case ACol of 130 | 2: 131 | begin 132 | LDevice := GetDeviceByRow(ARow); 133 | LIsConnect := Value.AsBoolean; 134 | if LIsConnect then 135 | ConnectDevice(LDevice) 136 | else 137 | DisconnectDevice(LDevice); 138 | end; 139 | end; 140 | 141 | end; 142 | 143 | procedure TViewAdbDialogNew.monitorDevices; 144 | var 145 | refreshRequired: Boolean; 146 | begin 147 | refreshRequired := FAndroidWifiADB.refreshDevicesList(); 148 | if (refreshRequired) then 149 | updateUi(); 150 | end; 151 | 152 | procedure TViewAdbDialogNew.SetupUI; 153 | begin 154 | // cardLayoutDevices.createAndShowGUI(); 155 | end; 156 | 157 | procedure TViewAdbDialogNew.Timer1Timer(Sender: TObject); 158 | begin 159 | monitorDevices; 160 | end; 161 | 162 | procedure TViewAdbDialogNew.updateUi; 163 | begin 164 | Grid1.RowCount := FAndroidWifiADB.getDevices.Count; 165 | end; 166 | 167 | end. 168 | -------------------------------------------------------------------------------- /DAW.Adb.pas: -------------------------------------------------------------------------------- 1 | unit DAW.Adb; 2 | 3 | interface 4 | 5 | uses 6 | DAW.Model.Device.New, 7 | DAW.Utils.DosCMD, 8 | DAW.Adb.Parser; 9 | 10 | type 11 | TdawAdb = class 12 | private const 13 | TCPIP_PORT = '5555'; 14 | private 15 | FCommandLine: TDosCMD; 16 | FAdbParser: TdawAdbParser; 17 | function DisconnectDevice(ADeviceIp: string): Boolean; 18 | procedure enableTCPCommand(); 19 | function checkTCPCommandExecuted: Boolean; 20 | function connectDeviceByIP(deviceIp: string): Boolean; 21 | function connectDevice(ADevice: TdawDevice): Boolean; 22 | public 23 | procedure Upgrade(ADevice: TdawDevice); 24 | constructor Create(ACommandLine: TDosCMD; AAdbParser: TdawAdbParser); 25 | function IsInstalled: Boolean; 26 | function getDevicesConnectedByUSB: TArray; 27 | function connectDevices(ADevices: TArray): TArray; 28 | function disconnectDevices(ADevices: TArray): TArray; 29 | function getDeviceIp(ADevice: TdawDevice): string; 30 | function getDeviceModel(ADevice: TdawDevice): string; 31 | 32 | end; 33 | 34 | implementation 35 | 36 | uses 37 | System.IOUtils, 38 | System.SysUtils, 39 | DAW.Tools; 40 | { TdawAdb } 41 | 42 | function TdawAdb.checkTCPCommandExecuted: Boolean; 43 | var 44 | getPropCommand: string; 45 | getPropOutput: string; 46 | adbTcpPort: string; 47 | begin 48 | getPropCommand := 'adb shell getprop | grep adb'; 49 | getPropOutput := FCommandLine.Execute(getPropCommand); 50 | adbTcpPort := FAdbParser.parseAdbServiceTcpPort(getPropOutput); 51 | Result := TCPIP_PORT.equals(adbTcpPort); 52 | end; 53 | 54 | function TdawAdb.connectDeviceByIP(deviceIp: string): Boolean; 55 | var 56 | enableTCPCommand: string; 57 | connectDeviceCommand: string; 58 | connectOutput: string; 59 | begin 60 | enableTCPCommand := 'adb tcpip 5555'; 61 | FCommandLine.Execute(enableTCPCommand); 62 | connectDeviceCommand := 'adb connect ' + deviceIp; 63 | connectOutput := FCommandLine.Execute(connectDeviceCommand); 64 | Result := connectOutput.contains('connected'); 65 | end; 66 | 67 | function TdawAdb.connectDevice(ADevice: TdawDevice): Boolean; 68 | begin 69 | if ADevice.IP.IsEmpty then 70 | ADevice.IP := getDeviceIp(ADevice); 71 | if ADevice.IP.IsEmpty() then 72 | Result := False 73 | else 74 | begin 75 | ADevice.ID := ADevice.IP; 76 | Result := connectDeviceByIP(ADevice.IP); 77 | end; 78 | end; 79 | 80 | function TdawAdb.connectDevices(ADevices: TArray): TArray; 81 | var 82 | LConnected: Boolean; 83 | I: Integer; 84 | begin 85 | Result := ADevices; 86 | for I := Low(Result) to High(Result) do 87 | begin 88 | LConnected := connectDevice(Result[I]); 89 | Result[I].IsConnected := (LConnected); 90 | end; 91 | end; 92 | 93 | constructor TdawAdb.Create(ACommandLine: TDosCMD; AAdbParser: TdawAdbParser); 94 | begin 95 | FCommandLine := ACommandLine; 96 | FAdbParser := AAdbParser; 97 | end; 98 | 99 | function TdawAdb.DisconnectDevice(ADeviceIp: string): Boolean; 100 | var 101 | connectDeviceCommand: string; 102 | begin 103 | enableTCPCommand(); 104 | connectDeviceCommand := 'adb disconnect ' + ADeviceIp; 105 | Result := FCommandLine.Execute(connectDeviceCommand).IsEmpty(); 106 | end; 107 | 108 | function TdawAdb.disconnectDevices(ADevices: TArray): TArray; 109 | var 110 | LDevice: TdawDevice; 111 | LDisconnected: Boolean; 112 | begin 113 | for LDevice in ADevices do 114 | begin 115 | LDisconnected := DisconnectDevice(LDevice.IP); 116 | LDevice.IsConnected := LDisconnected; 117 | end; 118 | Result := ADevices; 119 | end; 120 | 121 | procedure TdawAdb.enableTCPCommand; 122 | var 123 | LEnableTCPCommand: string; 124 | begin 125 | if not checkTCPCommandExecuted() then 126 | begin 127 | LEnableTCPCommand := ('adb tcpip ' + TCPIP_PORT); 128 | FCommandLine.Execute(LEnableTCPCommand); 129 | end; 130 | end; 131 | 132 | function TdawAdb.getDeviceIp(ADevice: TdawDevice): string; 133 | var 134 | getDeviceIpCommand: string; 135 | ipInfoOutput: string; 136 | begin 137 | getDeviceIpCommand := 'adb -s ' + ADevice.ID + ' shell ip -f inet addr show wlan0'; 138 | ipInfoOutput := FCommandLine.Execute(getDeviceIpCommand); 139 | Result := FAdbParser.parseGetDeviceIp(ipInfoOutput); 140 | end; 141 | 142 | function TdawAdb.getDeviceModel(ADevice: TdawDevice): string; 143 | begin 144 | Result := FCommandLine.Execute('adb -s %s shell getprop ro.product.model', [ADevice.ID]); 145 | end; 146 | 147 | function TdawAdb.getDevicesConnectedByUSB: TArray; 148 | var 149 | adbDevicesOutput: string; 150 | begin 151 | adbDevicesOutput := FCommandLine.Execute('adb devices -l'); 152 | Result := FAdbParser.parseGetDevicesOutput(adbDevicesOutput); 153 | end; 154 | 155 | function TdawAdb.IsInstalled: Boolean; 156 | begin 157 | Result := TFile.Exists(TDawTools.AdbExe); 158 | end; 159 | 160 | procedure TdawAdb.Upgrade(ADevice: TdawDevice); 161 | begin 162 | ADevice.IP := getDeviceIp(ADevice); 163 | end; 164 | 165 | end. 166 | -------------------------------------------------------------------------------- /DAW.ViewADB.pas: -------------------------------------------------------------------------------- 1 | unit DAW.ViewADB; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, 7 | System.Types, 8 | System.UITypes, 9 | System.Classes, 10 | System.Variants, 11 | FMX.Types, 12 | FMX.Controls, 13 | FMX.Forms, 14 | FMX.Graphics, 15 | FMX.Dialogs, 16 | FMX.Edit, 17 | FMX.Controls.Presentation, 18 | FMX.StdCtrls, 19 | FMX.Layouts, 20 | FMX.ScrollBox, 21 | FMX.Memo; 22 | 23 | type 24 | TViewAdbDialog = class(TForm) 25 | lytAdbExe: TLayout; 26 | lblAdbExe: TLabel; 27 | edtAdbExe: TEdit; 28 | lytDeviceIp: TLayout; 29 | lblDeviceIp: TLabel; 30 | edtDeviceIp: TEdit; 31 | grpLog: TGroupBox; 32 | mmoLog: TMemo; 33 | btnConnect: TEditButton; 34 | btnBrowse: TEditButton; 35 | lytExec: TLayout; 36 | lblExec: TLabel; 37 | edtExec: TEdit; 38 | btnExec: TEditButton; 39 | procedure btnConnectClick(Sender: TObject); 40 | procedure btnBrowseClick(Sender: TObject); 41 | procedure FormCreate(Sender: TObject); 42 | procedure btnExecClick(Sender: TObject); 43 | private 44 | { Private declarations } 45 | FDir: string; 46 | public 47 | { Public declarations } 48 | procedure Log(const AData: string); 49 | class function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string; 50 | function SetupDir: Boolean; 51 | procedure CheckResult(const Msg: string); 52 | procedure ADBExecute(const ACmd: string); 53 | end; 54 | 55 | var 56 | ViewAdbDialog: TViewAdbDialog; 57 | 58 | implementation 59 | 60 | uses 61 | DAW.Tools, 62 | Winapi.Windows; 63 | 64 | {$R *.fmx} 65 | { TViewAdbDialog } 66 | 67 | procedure TViewAdbDialog.ADBExecute(const ACmd: string); 68 | begin 69 | CheckResult(GetDosOutput(ACmd, FDir)); 70 | end; 71 | 72 | procedure TViewAdbDialog.btnBrowseClick(Sender: TObject); 73 | var 74 | OD: TOpenDialog; 75 | begin 76 | OD := TOpenDialog.Create(nil); 77 | try 78 | OD.DefaultExt := 'adb.exe'; 79 | if OD.Execute then 80 | edtAdbExe.Text := OD.FileName; 81 | SetupDir; 82 | finally 83 | OD.Free; 84 | end; 85 | end; 86 | 87 | procedure TViewAdbDialog.btnConnectClick(Sender: TObject); 88 | begin 89 | if SetupDir then 90 | begin 91 | CheckResult(GetDosOutput('adb kill-server', FDir)); 92 | CheckResult(GetDosOutput('adb tcpip 5555', FDir)); 93 | CheckResult(GetDosOutput('adb connect ' + edtDeviceIp.Text, FDir)); 94 | end; 95 | end; 96 | 97 | procedure TViewAdbDialog.btnExecClick(Sender: TObject); 98 | begin 99 | ADBExecute(edtExec.Text); 100 | end; 101 | 102 | procedure TViewAdbDialog.CheckResult(const Msg: string); 103 | begin 104 | if Msg.Contains('adb: usage: adb connect [:]') then 105 | begin 106 | Log('Unsupperted format IP. Check settings'); 107 | end 108 | else if Msg.Contains('error: no devices/emulators found') then 109 | begin 110 | 111 | end 112 | else 113 | Log(Msg); 114 | end; 115 | 116 | procedure TViewAdbDialog.FormCreate(Sender: TObject); 117 | begin 118 | edtAdbExe.Text := TDawTools.AdbExe; 119 | end; 120 | 121 | class function TViewAdbDialog.GetDosOutput(CommandLine, Work: string): string; 122 | var 123 | SA: TSecurityAttributes; 124 | SI: TStartupInfo; 125 | PI: TProcessInformation; 126 | StdOutPipeRead, StdOutPipeWrite: THandle; 127 | WasOK: Boolean; 128 | Buffer: array [0 .. 255] of AnsiChar; 129 | BytesRead: Cardinal; 130 | WorkDir: string; 131 | Handle: Boolean; 132 | begin 133 | Result := ''; 134 | with SA do 135 | begin 136 | nLength := SizeOf(SA); 137 | bInheritHandle := True; 138 | lpSecurityDescriptor := nil; 139 | end; 140 | CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); 141 | try 142 | with SI do 143 | begin 144 | FillChar(SI, SizeOf(SI), 0); 145 | cb := SizeOf(SI); 146 | dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 147 | wShowWindow := SW_HIDE; 148 | hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin 149 | hStdOutput := StdOutPipeWrite; 150 | hStdError := StdOutPipeWrite; 151 | end; 152 | WorkDir := Work; 153 | Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), nil, nil, True, 0, nil, 154 | PChar(WorkDir), SI, PI); 155 | CloseHandle(StdOutPipeWrite); 156 | if Handle then 157 | try 158 | repeat 159 | WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 160 | if BytesRead > 0 then 161 | begin 162 | Buffer[BytesRead] := #0; 163 | Result := Result + Buffer; 164 | end; 165 | until not WasOK or (BytesRead = 0); 166 | WaitForSingleObject(PI.hProcess, INFINITE); 167 | finally 168 | CloseHandle(PI.hThread); 169 | CloseHandle(PI.hProcess); 170 | end; 171 | finally 172 | CloseHandle(StdOutPipeRead); 173 | end; 174 | end; 175 | 176 | procedure TViewAdbDialog.Log(const AData: string); 177 | begin 178 | mmoLog.Lines.Add(AData); 179 | end; 180 | 181 | function TViewAdbDialog.SetupDir: Boolean; 182 | begin 183 | FDir := ExtractFilePath(edtAdbExe.Text); 184 | if (DirectoryExists(FDir) and FileExists(edtAdbExe.Text)) then 185 | begin 186 | Result := True; 187 | end 188 | else 189 | begin 190 | Log('bad path, adb not found'); 191 | Result := False; 192 | end; 193 | end; 194 | 195 | end. 196 | -------------------------------------------------------------------------------- /DAW.ViewADB.fmx: -------------------------------------------------------------------------------- 1 | object ViewAdbDialog: TViewAdbDialog 2 | Left = 0 3 | Top = 0 4 | Caption = 'Delphi ADB WiFi' 5 | ClientHeight = 379 6 | ClientWidth = 543 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | DesignerMasterStyle = 0 12 | object lytAdbExe: TLayout 13 | Align = Top 14 | Padding.Left = 5.000000000000000000 15 | Padding.Top = 1.000000000000000000 16 | Padding.Right = 5.000000000000000000 17 | Padding.Bottom = 1.000000000000000000 18 | Size.Width = 543.000000000000000000 19 | Size.Height = 24.000000000000000000 20 | Size.PlatformDefault = False 21 | TabOrder = 2 22 | object lblAdbExe: TLabel 23 | Align = Left 24 | Position.X = 5.000000000000000000 25 | Position.Y = 1.000000000000000000 26 | Size.Width = 120.000000000000000000 27 | Size.Height = 22.000000000000000000 28 | Size.PlatformDefault = False 29 | Text = 'Path to ADB.EXE' 30 | TabOrder = 0 31 | end 32 | object edtAdbExe: TEdit 33 | Touch.InteractiveGestures = [LongTap, DoubleTap] 34 | Align = Client 35 | TabOrder = 1 36 | Size.Width = 413.000000000000000000 37 | Size.Height = 22.000000000000000000 38 | Size.PlatformDefault = False 39 | object btnBrowse: TEditButton 40 | CanFocus = False 41 | Cursor = crArrow 42 | Size.Width = 84.000000000000000000 43 | Size.Height = 18.000000000000000000 44 | Size.PlatformDefault = False 45 | TabOrder = 0 46 | Text = 'Browse' 47 | OnClick = btnBrowseClick 48 | end 49 | end 50 | end 51 | object lytDeviceIp: TLayout 52 | Align = Top 53 | Padding.Left = 5.000000000000000000 54 | Padding.Top = 1.000000000000000000 55 | Padding.Right = 5.000000000000000000 56 | Padding.Bottom = 1.000000000000000000 57 | Margins.Top = 5.000000000000000000 58 | Position.Y = 29.000000000000000000 59 | Size.Width = 543.000000000000000000 60 | Size.Height = 24.000000000000000000 61 | Size.PlatformDefault = False 62 | TabOrder = 1 63 | object lblDeviceIp: TLabel 64 | Align = Left 65 | Position.X = 5.000000000000000000 66 | Position.Y = 1.000000000000000000 67 | Size.Width = 120.000000000000000000 68 | Size.Height = 22.000000000000000000 69 | Size.PlatformDefault = False 70 | Text = 'Device IP' 71 | TabOrder = 0 72 | end 73 | object edtDeviceIp: TEdit 74 | Touch.InteractiveGestures = [LongTap, DoubleTap] 75 | Align = Client 76 | TabOrder = 1 77 | Size.Width = 413.000000000000000000 78 | Size.Height = 22.000000000000000000 79 | Size.PlatformDefault = False 80 | TextPrompt = '192.168.1.5' 81 | object btnConnect: TEditButton 82 | CanFocus = False 83 | Cursor = crArrow 84 | Size.Width = 84.000000000000000000 85 | Size.Height = 18.000000000000000000 86 | Size.PlatformDefault = False 87 | TabOrder = 0 88 | Text = 'Connect' 89 | OnClick = btnConnectClick 90 | end 91 | end 92 | end 93 | object grpLog: TGroupBox 94 | Align = Client 95 | Padding.Left = 2.000000000000000000 96 | Padding.Top = 20.000000000000000000 97 | Padding.Right = 2.000000000000000000 98 | Padding.Bottom = 2.000000000000000000 99 | Size.Width = 543.000000000000000000 100 | Size.Height = 297.000000000000000000 101 | Size.PlatformDefault = False 102 | Text = 'Log' 103 | TabOrder = 3 104 | object mmoLog: TMemo 105 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 106 | DataDetectorTypes = [] 107 | Align = Client 108 | Size.Width = 539.000000000000000000 109 | Size.Height = 275.000000000000000000 110 | Size.PlatformDefault = False 111 | TabOrder = 0 112 | Viewport.Width = 535.000000000000000000 113 | Viewport.Height = 271.000000000000000000 114 | end 115 | end 116 | object lytExec: TLayout 117 | Align = Bottom 118 | Padding.Left = 5.000000000000000000 119 | Padding.Top = 1.000000000000000000 120 | Padding.Right = 5.000000000000000000 121 | Padding.Bottom = 1.000000000000000000 122 | Margins.Top = 5.000000000000000000 123 | Position.Y = 355.000000000000000000 124 | Size.Width = 543.000000000000000000 125 | Size.Height = 24.000000000000000000 126 | Size.PlatformDefault = False 127 | TabOrder = 0 128 | object lblExec: TLabel 129 | Align = Left 130 | Position.X = 5.000000000000000000 131 | Position.Y = 1.000000000000000000 132 | Size.Width = 120.000000000000000000 133 | Size.Height = 22.000000000000000000 134 | Size.PlatformDefault = False 135 | Text = 'ADB Exec' 136 | TabOrder = 0 137 | end 138 | object edtExec: TEdit 139 | Touch.InteractiveGestures = [LongTap, DoubleTap] 140 | Align = Client 141 | TabOrder = 1 142 | Size.Width = 413.000000000000000000 143 | Size.Height = 22.000000000000000000 144 | Size.PlatformDefault = False 145 | TextPrompt = 'adb devices' 146 | object btnExec: TEditButton 147 | CanFocus = False 148 | Cursor = crArrow 149 | Size.Width = 84.000000000000000000 150 | Size.Height = 18.000000000000000000 151 | Size.PlatformDefault = False 152 | TabOrder = 0 153 | Text = 'Execute' 154 | OnClick = btnExecClick 155 | end 156 | end 157 | end 158 | end 159 | -------------------------------------------------------------------------------- /DAW.View.Main.pas: -------------------------------------------------------------------------------- 1 | unit DAW.View.Main; 2 | 3 | interface 4 | 5 | uses 6 | DAW.Controller.New, 7 | DAW.Model.Device.New, 8 | System.SysUtils, 9 | System.Types, 10 | System.UITypes, 11 | System.Classes, 12 | System.Variants, 13 | FMX.Types, 14 | FMX.Controls, 15 | FMX.Forms, 16 | FMX.Graphics, 17 | FMX.Dialogs, 18 | System.Rtti, 19 | FMX.Grid.Style, 20 | FMX.Grid, 21 | FMX.StdCtrls, 22 | FMX.Layouts, 23 | FMX.Controls.Presentation, 24 | FMX.ScrollBox, 25 | FMX.Edit, 26 | FMX.Memo, 27 | FMX.TabControl, FMX.Memo.Types; 28 | 29 | type 30 | TForm2 = class(TForm) 31 | grdLastDevices: TGrid; 32 | dtclmnLastConnected: TDateColumn; 33 | lytToolbarLastConnected: TLayout; 34 | btnAdd: TButton; 35 | strngclmnDeviceName: TStringColumn; 36 | btnConnect: TButton; 37 | btnDisconnect: TButton; 38 | strngclmnIP: TStringColumn; 39 | strngclmnID: TStringColumn; 40 | mmoLog: TMemo; 41 | edtCmdEdit: TEdit; 42 | btnCmdExecute: TEditButton; 43 | btn1: TButton; 44 | btnDelete: TButton; 45 | grpLastConnectedDevices: TGroupBox; 46 | tbcMenu: TTabControl; 47 | tbtmGeneral: TTabItem; 48 | tbtmLog: TTabItem; 49 | grp1: TGroupBox; 50 | spl1: TSplitter; 51 | tmr1: TTimer; 52 | lyt1: TLayout; 53 | btn2: TButton; 54 | grdAvaibleDevices: TGrid; 55 | strngclmn1: TStringColumn; 56 | strngclmn3: TStringColumn; 57 | procedure btn1Click(Sender: TObject); 58 | procedure FormCreate(Sender: TObject); 59 | procedure FormDestroy(Sender: TObject); 60 | procedure btnAddClick(Sender: TObject); 61 | procedure grdLastDevicesGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 62 | procedure grdLastDevicesSetValue(Sender: TObject; const ACol, ARow: Integer; const Value: TValue); 63 | procedure btnConnectClick(Sender: TObject); 64 | procedure btnCmdExecuteClick(Sender: TObject); 65 | procedure btnDeleteClick(Sender: TObject); 66 | procedure btnDisconnectClick(Sender: TObject); 67 | procedure tmr1Timer(Sender: TObject); 68 | procedure grdAvaibleDevicesGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 69 | procedure btn2Click(Sender: TObject); 70 | private 71 | { Private declarations } 72 | FController: TdawController; 73 | procedure UpdateCount; 74 | function SelectedDevice(const IsLast: Boolean): TdawDevice; 75 | public 76 | { Public declarations } 77 | end; 78 | 79 | var 80 | Form2: TForm2; 81 | 82 | implementation 83 | 84 | uses 85 | DAW.View.DeviceEdit; 86 | {$R *.fmx} 87 | 88 | procedure TForm2.btn1Click(Sender: TObject); 89 | begin 90 | FController.AddConnectedInAdb; 91 | UpdateCount; 92 | end; 93 | 94 | procedure TForm2.btn2Click(Sender: TObject); 95 | var 96 | LDevice: TdawDevice; 97 | begin 98 | LDevice := SelectedDevice(False); 99 | FController.Add(LDevice); 100 | FController.Connect(LDevice); 101 | UpdateCount; 102 | end; 103 | 104 | procedure TForm2.btnAddClick(Sender: TObject); 105 | var 106 | LDevice: TdawDevice; 107 | begin 108 | LDevice := TdawDevice.Create('', ''); 109 | try 110 | if TViewDeviceEdit.Edit(LDevice) then 111 | FController.Add(LDevice); 112 | finally 113 | // LDevice.Free; 114 | end; 115 | UpdateCount; 116 | end; 117 | 118 | procedure TForm2.btnCmdExecuteClick(Sender: TObject); 119 | begin 120 | mmoLog.Lines.Add(FController.GetDosCMD.Execute(edtCmdEdit.Text)) 121 | end; 122 | 123 | procedure TForm2.btnConnectClick(Sender: TObject); 124 | begin 125 | FController.Connect(SelectedDevice(True)); 126 | UpdateCount; 127 | end; 128 | 129 | procedure TForm2.btnDeleteClick(Sender: TObject); 130 | begin 131 | FController.Delete(SelectedDevice(True)); 132 | UpdateCount; 133 | end; 134 | 135 | procedure TForm2.btnDisconnectClick(Sender: TObject); 136 | begin 137 | FController.Disconnect(SelectedDevice(True)); 138 | UpdateCount; 139 | end; 140 | 141 | procedure TForm2.FormCreate(Sender: TObject); 142 | begin 143 | FController := TdawController.Create; 144 | FController.GetDosCMD.OnExecute := 145 | procedure(AData: string) 146 | begin 147 | mmoLog.Lines.Add(AData); 148 | UpdateCount; 149 | end; 150 | // FController.Devices.AddRange(f); 151 | UpdateCount; 152 | end; 153 | 154 | procedure TForm2.FormDestroy(Sender: TObject); 155 | begin 156 | FreeAndNil(FController); 157 | end; 158 | 159 | procedure TForm2.grdAvaibleDevicesGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 160 | var 161 | LColumnName: string; 162 | begin 163 | LColumnName := grdAvaibleDevices.Columns[ACol].Name; 164 | if LColumnName = strngclmn1.Name then 165 | begin 166 | Value := FController.AvaibleDevices[ARow].Name; 167 | end 168 | else if LColumnName = strngclmn3.Name then 169 | begin 170 | Value := FController.AvaibleDevices[ARow].ID; 171 | end 172 | end; 173 | 174 | procedure TForm2.grdLastDevicesGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 175 | var 176 | LColumnName: string; 177 | begin 178 | LColumnName := grdLastDevices.Columns[ACol].Name; 179 | if LColumnName = strngclmnDeviceName.Name then 180 | begin 181 | Value := FController.LastDevices[ARow].Name; 182 | end 183 | else if LColumnName = dtclmnLastConnected.Name then 184 | begin 185 | Value := FController.LastDevices[ARow].LastConnected; 186 | end 187 | else if LColumnName = strngclmnIP.Name then 188 | begin 189 | Value := FController.LastDevices[ARow].IP; 190 | end 191 | else if LColumnName = strngclmnID.Name then 192 | begin 193 | Value := FController.LastDevices[ARow].ID; 194 | end 195 | end; 196 | 197 | procedure TForm2.grdLastDevicesSetValue(Sender: TObject; const ACol, ARow: Integer; const Value: TValue); 198 | var 199 | LColumnName: string; 200 | begin 201 | LColumnName := grdLastDevices.Columns[ACol].Name; 202 | if LColumnName = strngclmnDeviceName.Name then 203 | begin 204 | FController.LastDevices[ARow].Name := Value.AsString; 205 | end 206 | else if LColumnName = dtclmnLastConnected.Name then 207 | begin 208 | FController.LastDevices[ARow].LastConnected := Value.AsType; 209 | end 210 | else if LColumnName = strngclmnIP.Name then 211 | begin 212 | FController.LastDevices[ARow].IP := Value.AsString; 213 | end 214 | else if LColumnName = strngclmnID.Name then 215 | begin 216 | FController.LastDevices[ARow].ID := Value.AsString; 217 | end 218 | end; 219 | 220 | function TForm2.SelectedDevice(const IsLast: Boolean): TdawDevice; 221 | begin 222 | if IsLast then 223 | Result := FController.LastDevices[grdLastDevices.Selected] 224 | else 225 | Result := FController.AvaibleDevices[grdAvaibleDevices.Selected]; 226 | end; 227 | 228 | procedure TForm2.tmr1Timer(Sender: TObject); 229 | begin 230 | FController.AddConnectedInAdb; 231 | UpdateCount; 232 | end; 233 | 234 | procedure TForm2.UpdateCount; 235 | begin 236 | // grdLastDevices.RowCount := 0; 237 | if grdLastDevices.RowCount <> FController.LastDevices.Count then 238 | grdLastDevices.RowCount := FController.LastDevices.Count; 239 | // grdAvaibleDevices.RowCount := 0; 240 | if grdAvaibleDevices.RowCount <> FController.AvaibleDevices.Count then 241 | grdAvaibleDevices.RowCount := FController.AvaibleDevices.Count; 242 | end; 243 | 244 | end. 245 | 246 | -------------------------------------------------------------------------------- /androidwifiadb.pas: -------------------------------------------------------------------------------- 1 | unit androidwifiadb; 2 | 3 | interface 4 | 5 | uses 6 | DAW.Model.Device.New, 7 | System.Generics.Collections, 8 | DAW.Adb; 9 | 10 | type 11 | IdawView = interface 12 | ['{1900284A-C00D-423E-9488-C7D32C06919C}'] 13 | procedure showNoConnectedDevicesNotification(); 14 | procedure showConnectedDeviceNotification(ADevice: TdawDevice); 15 | procedure showDisconnectedDeviceNotification(ADevice: TdawDevice); 16 | procedure showErrorConnectingDeviceNotification(ADevice: TdawDevice); 17 | procedure showErrorDisconnectingDeviceNotification(ADevice: TdawDevice); 18 | procedure showADBNotInstalledNotification(); 19 | end; 20 | 21 | TAlertService = class(TInterfacedObject, IdawView) 22 | procedure showNoConnectedDevicesNotification(); 23 | procedure showConnectedDeviceNotification(ADevice: TdawDevice); 24 | procedure showDisconnectedDeviceNotification(ADevice: TdawDevice); 25 | procedure showErrorConnectingDeviceNotification(ADevice: TdawDevice); 26 | procedure showErrorDisconnectingDeviceNotification(ADevice: TdawDevice); 27 | procedure showADBNotInstalledNotification(); 28 | end; 29 | 30 | TAndroidWiFiADB = class 31 | private 32 | FAdb: TdawAdb; 33 | FView: IdawView; 34 | FDevices: TList; 35 | function checkDeviceExistance(connectedDevice: TdawDevice): boolean; 36 | procedure showConnectionResultNotification(Adevices: TArray); 37 | procedure showDisconnectionResultNotification(Adevices: TArray); 38 | public 39 | procedure updateDeviceConnectionState(updatedDevice: TdawDevice); 40 | procedure removeNotConnectedDevices; 41 | function isADBInstalled: boolean; 42 | function refreshDevicesList: boolean; 43 | procedure connectDevices; 44 | procedure connectDevice(Device: TdawDevice); 45 | procedure disconnectDevice(Device: TdawDevice); 46 | constructor Create(AAdb: TdawAdb; AView: IdawView); 47 | destructor Destroy; override; 48 | function getDevices: TList; 49 | end; 50 | 51 | implementation 52 | 53 | uses System.SysUtils; 54 | { TAndroidWiFiADB } 55 | 56 | function TAndroidWiFiADB.checkDeviceExistance(connectedDevice 57 | : TdawDevice): boolean; 58 | var 59 | LDevice: TdawDevice; 60 | begin 61 | Result := False; 62 | for LDevice in FDevices do 63 | if connectedDevice.ID.Equals(LDevice.ID) then 64 | Exit(True); 65 | end; 66 | 67 | procedure TAndroidWiFiADB.connectDevice(Device: TdawDevice); 68 | var 69 | connectedDevices: TList; 70 | LDevice: TdawDevice; 71 | begin 72 | if not(isADBInstalled()) then 73 | begin 74 | FView.showADBNotInstalledNotification(); 75 | Exit; 76 | end; 77 | connectedDevices := TList.Create; 78 | try 79 | connectedDevices.AddRange(FAdb.connectDevices([Device])); 80 | for LDevice in connectedDevices do 81 | updateDeviceConnectionState(LDevice); 82 | showConnectionResultNotification(connectedDevices.ToArray); 83 | finally 84 | connectedDevices.Free; 85 | end; 86 | 87 | end; 88 | 89 | procedure TAndroidWiFiADB.connectDevices; 90 | begin 91 | if not isADBInstalled() then 92 | begin 93 | FView.showADBNotInstalledNotification(); 94 | Exit; 95 | end; 96 | FDevices.clear(); 97 | FDevices.AddRange(FAdb.getDevicesConnectedByUSB()); 98 | if (FDevices.Count = 0) then 99 | begin 100 | FView.showNoConnectedDevicesNotification(); 101 | Exit; 102 | end; 103 | FDevices.AddRange(FAdb.connectDevices(FDevices.ToArray)); 104 | showConnectionResultNotification(FDevices.ToArray); 105 | end; 106 | 107 | constructor TAndroidWiFiADB.Create(AAdb: TdawAdb; AView: IdawView); 108 | begin 109 | FDevices := TList.Create; 110 | FAdb := AAdb; 111 | FView := AView; 112 | end; 113 | 114 | destructor TAndroidWiFiADB.Destroy; 115 | begin 116 | FDevices.Free; 117 | inherited; 118 | end; 119 | 120 | procedure TAndroidWiFiADB.disconnectDevice(Device: TdawDevice); 121 | var 122 | disconnectedDevices: TList; 123 | LDevice: TdawDevice; 124 | begin 125 | if not(isADBInstalled()) then 126 | begin 127 | FView.showADBNotInstalledNotification(); 128 | Exit; 129 | end; 130 | disconnectedDevices := TList.Create; 131 | try 132 | disconnectedDevices.AddRange(FAdb.disconnectDevices([Device])); 133 | for LDevice in disconnectedDevices do 134 | FDevices.Add(LDevice); 135 | showDisconnectionResultNotification(disconnectedDevices.ToArray); 136 | finally 137 | disconnectedDevices.Free; 138 | end; 139 | end; 140 | 141 | function TAndroidWiFiADB.getDevices: TList; 142 | begin 143 | Result := FDevices; 144 | end; 145 | 146 | function TAndroidWiFiADB.isADBInstalled: boolean; 147 | begin 148 | Result := FAdb.IsInstalled; 149 | end; 150 | 151 | function TAndroidWiFiADB.refreshDevicesList: boolean; 152 | var 153 | Lconnected: TArray; 154 | LconnectedDevice: TdawDevice; 155 | begin 156 | if not isADBInstalled() then 157 | begin 158 | Exit(False); 159 | end; 160 | removeNotConnectedDevices(); 161 | // connectDevices; 162 | Lconnected := FAdb.getDevicesConnectedByUSB(); 163 | for LconnectedDevice in Lconnected do 164 | begin 165 | if not checkDeviceExistance(LconnectedDevice) then 166 | begin 167 | LconnectedDevice.IP := FAdb.getDeviceIp(LconnectedDevice); 168 | FDevices.Add(LconnectedDevice); 169 | end 170 | else 171 | begin 172 | FDevices.Add(LconnectedDevice); 173 | end; 174 | end; 175 | Result := True; 176 | end; 177 | 178 | procedure TAndroidWiFiADB.removeNotConnectedDevices; 179 | var 180 | connectedDevices: TList; 181 | LDevice: TdawDevice; 182 | begin 183 | connectedDevices := TList.Create(); 184 | try 185 | for LDevice in FDevices do 186 | begin 187 | if LDevice.IsConnected then 188 | connectedDevices.Add(LDevice); 189 | end; 190 | FDevices.clear(); 191 | FDevices.AddRange(connectedDevices); 192 | finally 193 | connectedDevices.Free; 194 | end; 195 | end; 196 | 197 | procedure TAndroidWiFiADB.showConnectionResultNotification 198 | (Adevices: TArray); 199 | var 200 | LDevice: TdawDevice; 201 | begin 202 | for LDevice in Adevices do 203 | begin 204 | if LDevice.IsConnected then 205 | FView.showConnectedDeviceNotification(LDevice) 206 | else 207 | FView.showErrorConnectingDeviceNotification(LDevice); 208 | end; 209 | end; 210 | 211 | procedure TAndroidWiFiADB.showDisconnectionResultNotification 212 | (Adevices: TArray); 213 | var 214 | LDevice: TdawDevice; 215 | begin 216 | for LDevice in Adevices do 217 | begin 218 | if not LDevice.IsConnected then 219 | FView.showDisconnectedDeviceNotification(LDevice) 220 | else 221 | FView.showErrorDisconnectingDeviceNotification(LDevice); 222 | end; 223 | 224 | end; 225 | 226 | procedure TAndroidWiFiADB.updateDeviceConnectionState(updatedDevice 227 | : TdawDevice); 228 | begin 229 | FDevices.Add(updatedDevice); 230 | end; 231 | 232 | { TAlertService } 233 | 234 | procedure TAlertService.showADBNotInstalledNotification; 235 | begin 236 | 237 | end; 238 | 239 | procedure TAlertService.showConnectedDeviceNotification(ADevice: TdawDevice); 240 | begin 241 | 242 | end; 243 | 244 | procedure TAlertService.showDisconnectedDeviceNotification(ADevice: TdawDevice); 245 | begin 246 | 247 | end; 248 | 249 | procedure TAlertService.showErrorConnectingDeviceNotification 250 | (ADevice: TdawDevice); 251 | begin 252 | 253 | end; 254 | 255 | procedure TAlertService.showErrorDisconnectingDeviceNotification 256 | (ADevice: TdawDevice); 257 | begin 258 | 259 | end; 260 | 261 | procedure TAlertService.showNoConnectedDevicesNotification; 262 | begin 263 | 264 | end; 265 | 266 | end. 267 | -------------------------------------------------------------------------------- /DAW.View.Main.fmx: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 0 3 | Top = 0 4 | Caption = 'Delphi Adb Wifi' 5 | ClientHeight = 550 6 | ClientWidth = 650 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | OnDestroy = FormDestroy 12 | DesignerMasterStyle = 0 13 | object tbcMenu: TTabControl 14 | Align = Client 15 | Size.Width = 650.000000000000000000 16 | Size.Height = 550.000000000000000000 17 | Size.PlatformDefault = False 18 | TabIndex = 0 19 | TabOrder = 1 20 | TabPosition = PlatformDefault 21 | Sizes = ( 22 | 650s 23 | 524s 24 | 650s 25 | 524s) 26 | object tbtmGeneral: TTabItem 27 | CustomIcon = < 28 | item 29 | end> 30 | TextSettings.Trimming = None 31 | IsSelected = True 32 | Size.Width = 61.000000000000000000 33 | Size.Height = 26.000000000000000000 34 | Size.PlatformDefault = False 35 | StyleLookup = '' 36 | TabOrder = 0 37 | Text = 'General' 38 | ExplicitSize.cx = 61.000000000000000000 39 | ExplicitSize.cy = 26.000000000000000000 40 | object grpLastConnectedDevices: TGroupBox 41 | Align = Client 42 | Padding.Left = 5.000000000000000000 43 | Padding.Top = 20.000000000000000000 44 | Padding.Right = 5.000000000000000000 45 | Padding.Bottom = 5.000000000000000000 46 | Size.Width = 650.000000000000000000 47 | Size.Height = 222.000000000000000000 48 | Size.PlatformDefault = False 49 | Text = 'Last connected devices' 50 | TabOrder = 0 51 | object grdLastDevices: TGrid 52 | Align = Client 53 | CanFocus = True 54 | ClipChildren = True 55 | Size.Width = 640.000000000000000000 56 | Size.Height = 155.000000000000000000 57 | Size.PlatformDefault = False 58 | TabOrder = 0 59 | RowCount = 3 60 | Options = [Editing, ColumnResize, ColumnMove, ColLines, RowLines, RowSelect, Tabs, Header, HeaderClick, AutoDisplacement] 61 | OnGetValue = grdLastDevicesGetValue 62 | OnSetValue = grdLastDevicesSetValue 63 | Viewport.Width = 636.000000000000000000 64 | Viewport.Height = 130.000000000000000000 65 | object dtclmnLastConnected: TDateColumn 66 | Header = 'Last connected' 67 | HeaderSettings.TextSettings.WordWrap = False 68 | ReadOnly = True 69 | Format = 'mmm dd - hh:nn' 70 | end 71 | object strngclmnDeviceName: TStringColumn 72 | Header = 'DeviceName' 73 | HeaderSettings.TextSettings.WordWrap = False 74 | end 75 | object strngclmnIP: TStringColumn 76 | Header = 'IP' 77 | HeaderSettings.TextSettings.WordWrap = False 78 | end 79 | object strngclmnID: TStringColumn 80 | Header = 'ID' 81 | HeaderSettings.TextSettings.WordWrap = False 82 | end 83 | end 84 | object lytToolbarLastConnected: TLayout 85 | Align = Top 86 | Padding.Left = 5.000000000000000000 87 | Padding.Top = 5.000000000000000000 88 | Padding.Right = 5.000000000000000000 89 | Padding.Bottom = 5.000000000000000000 90 | Position.X = 5.000000000000000000 91 | Position.Y = 20.000000000000000000 92 | Size.Width = 640.000000000000000000 93 | Size.Height = 42.000000000000000000 94 | Size.PlatformDefault = False 95 | TabOrder = 1 96 | object btnAdd: TButton 97 | Align = Left 98 | Position.X = 5.000000000000000000 99 | Position.Y = 5.000000000000000000 100 | Size.Width = 80.000000000000000000 101 | Size.Height = 32.000000000000000000 102 | Size.PlatformDefault = False 103 | TabOrder = 0 104 | Text = 'Add Device' 105 | TextSettings.Trimming = None 106 | OnClick = btnAddClick 107 | end 108 | object btnConnect: TButton 109 | Align = Left 110 | Margins.Left = 5.000000000000000000 111 | Position.X = 175.000000000000000000 112 | Position.Y = 5.000000000000000000 113 | Size.Width = 80.000000000000000000 114 | Size.Height = 32.000000000000000000 115 | Size.PlatformDefault = False 116 | TabOrder = 1 117 | Text = 'Connect' 118 | TextSettings.Trimming = None 119 | OnClick = btnConnectClick 120 | end 121 | object btnDisconnect: TButton 122 | Align = Left 123 | Margins.Left = 5.000000000000000000 124 | Position.X = 260.000000000000000000 125 | Position.Y = 5.000000000000000000 126 | Size.Width = 80.000000000000000000 127 | Size.Height = 32.000000000000000000 128 | Size.PlatformDefault = False 129 | TabOrder = 3 130 | Text = 'Disconnect' 131 | TextSettings.Trimming = None 132 | OnClick = btnDisconnectClick 133 | end 134 | object btn1: TButton 135 | Position.X = 408.000000000000000000 136 | Position.Y = 16.000000000000000000 137 | TabOrder = 4 138 | Text = 'btn1' 139 | TextSettings.Trimming = None 140 | OnClick = btn1Click 141 | end 142 | object btnDelete: TButton 143 | Align = Left 144 | Margins.Left = 5.000000000000000000 145 | Position.X = 90.000000000000000000 146 | Position.Y = 5.000000000000000000 147 | Size.Width = 80.000000000000000000 148 | Size.Height = 32.000000000000000000 149 | Size.PlatformDefault = False 150 | TabOrder = 2 151 | Text = 'Delete' 152 | TextSettings.Trimming = None 153 | OnClick = btnDeleteClick 154 | end 155 | end 156 | end 157 | object grp1: TGroupBox 158 | Align = Bottom 159 | Padding.Left = 5.000000000000000000 160 | Padding.Top = 20.000000000000000000 161 | Padding.Right = 5.000000000000000000 162 | Padding.Bottom = 5.000000000000000000 163 | Position.Y = 232.000000000000000000 164 | Size.Width = 650.000000000000000000 165 | Size.Height = 292.000000000000000000 166 | Size.PlatformDefault = False 167 | Text = 'Connected devices' 168 | TabOrder = 1 169 | object lyt1: TLayout 170 | Align = Top 171 | Padding.Left = 5.000000000000000000 172 | Padding.Top = 5.000000000000000000 173 | Padding.Right = 5.000000000000000000 174 | Padding.Bottom = 5.000000000000000000 175 | Position.X = 5.000000000000000000 176 | Position.Y = 20.000000000000000000 177 | Size.Width = 640.000000000000000000 178 | Size.Height = 42.000000000000000000 179 | Size.PlatformDefault = False 180 | TabOrder = 1 181 | object btn2: TButton 182 | Align = Left 183 | Position.X = 5.000000000000000000 184 | Position.Y = 5.000000000000000000 185 | Size.Width = 80.000000000000000000 186 | Size.Height = 32.000000000000000000 187 | Size.PlatformDefault = False 188 | TabOrder = 0 189 | Text = 'Add Device' 190 | TextSettings.Trimming = None 191 | OnClick = btn2Click 192 | end 193 | end 194 | object grdAvaibleDevices: TGrid 195 | Align = Client 196 | CanFocus = True 197 | ClipChildren = True 198 | Size.Width = 640.000000000000000000 199 | Size.Height = 225.000000000000000000 200 | Size.PlatformDefault = False 201 | TabOrder = 0 202 | RowCount = 3 203 | Options = [ColumnResize, ColumnMove, ColLines, RowLines, RowSelect, Tabs, Header, HeaderClick, AutoDisplacement] 204 | OnGetValue = grdAvaibleDevicesGetValue 205 | Viewport.Width = 636.000000000000000000 206 | Viewport.Height = 200.000000000000000000 207 | object strngclmn1: TStringColumn 208 | Header = 'DeviceName' 209 | HeaderSettings.TextSettings.WordWrap = False 210 | Size.Width = 249.000000000000000000 211 | end 212 | object strngclmn3: TStringColumn 213 | Header = 'ID' 214 | HeaderSettings.TextSettings.WordWrap = False 215 | Size.Width = 295.000000000000000000 216 | end 217 | end 218 | end 219 | object spl1: TSplitter 220 | Align = Bottom 221 | Cursor = crVSplit 222 | MinSize = 20.000000000000000000 223 | Position.Y = 222.000000000000000000 224 | Size.Width = 650.000000000000000000 225 | Size.Height = 10.000000000000000000 226 | Size.PlatformDefault = False 227 | end 228 | end 229 | object tbtmLog: TTabItem 230 | CustomIcon = < 231 | item 232 | end> 233 | TextSettings.Trimming = None 234 | IsSelected = False 235 | Size.Width = 40.000000000000000000 236 | Size.Height = 26.000000000000000000 237 | Size.PlatformDefault = False 238 | StyleLookup = '' 239 | TabOrder = 0 240 | Text = 'Log' 241 | ExplicitSize.cx = 40.000000000000000000 242 | ExplicitSize.cy = 26.000000000000000000 243 | object edtCmdEdit: TEdit 244 | Touch.InteractiveGestures = [LongTap, DoubleTap] 245 | Align = Top 246 | TabOrder = 0 247 | Size.Width = 650.000000000000000000 248 | Size.Height = 22.000000000000000000 249 | Size.PlatformDefault = False 250 | object btnCmdExecute: TEditButton 251 | Touch.InteractiveGestures = [LongTap] 252 | CanFocus = False 253 | Cursor = crArrow 254 | TextSettings.Trimming = None 255 | Size.Width = 84.000000000000000000 256 | Size.Height = 18.000000000000000000 257 | Size.PlatformDefault = False 258 | TabOrder = 0 259 | Text = 'Execute' 260 | OnClick = btnCmdExecuteClick 261 | end 262 | end 263 | object mmoLog: TMemo 264 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 265 | DataDetectorTypes = [] 266 | Align = Client 267 | Size.Width = 650.000000000000000000 268 | Size.Height = 502.000000000000000000 269 | Size.PlatformDefault = False 270 | TabOrder = 1 271 | Viewport.Width = 646.000000000000000000 272 | Viewport.Height = 498.000000000000000000 273 | end 274 | end 275 | end 276 | object tmr1: TTimer 277 | Interval = 5000 278 | OnTimer = tmr1Timer 279 | Left = 488 280 | Top = 338 281 | end 282 | end 283 | -------------------------------------------------------------------------------- /DelphiAdbWifi.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {0990B172-C221-4312-816E-1E634AF7EE2C} 4 | DelphiAdbWifi.dpk 5 | FMX 6 | True 7 | Debug 8 | 1 9 | Package 10 | DCC32 11 | True 12 | 18.6 13 | Win32 14 | 15 | 16 | true 17 | 18 | 19 | true 20 | Base 21 | true 22 | 23 | 24 | true 25 | Base 26 | true 27 | 28 | 29 | true 30 | Base 31 | true 32 | 33 | 34 | true 35 | Cfg_1 36 | true 37 | true 38 | 39 | 40 | true 41 | Base 42 | true 43 | 44 | 45 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;Winapi;System.Win;$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace);$(DCC_NameSpace) 46 | 00400000 47 | ..;$(DCC_UnitSearchPath) 48 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 49 | 1031 50 | true 51 | DelphiAdbWifi 52 | true 53 | true 54 | .\$(Platform)\$(Config) 55 | .\$(Platform)\$(Config) 56 | false 57 | false 58 | false 59 | false 60 | false 61 | true 62 | NEW_UI;$(DCC_Define) 63 | 64 | 65 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 66 | Debug 67 | false 68 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar 69 | rtl;dbrtl;DbxCommonDriver;fmx;$(DCC_UsePackage) 70 | 71 | 72 | Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 73 | Debug 74 | true 75 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) 76 | 1033 77 | $(BDS)\bin\bds.exe 78 | vclimg;rtl;dbrtl;DbxCommonDriver;fmx;$(DCC_UsePackage) 79 | 80 | 81 | DEBUG;$(DCC_Define) 82 | true 83 | false 84 | true 85 | true 86 | true 87 | 88 | 89 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) 90 | 1033 91 | 92 | 93 | false 94 | RELEASE;$(DCC_Define) 95 | 96 | 97 | 98 | MainSource 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 |
ViewDeviceEdit
111 | fmx 112 |
113 | 114 |
Form2
115 | fmx 116 |
117 | 118 | 119 | Cfg_2 120 | Base 121 | 122 | 123 | Base 124 | 125 | 126 | Cfg_1 127 | Base 128 | 129 |
130 | 131 | 132 | 133 | Delphi.Personality.12 134 | Package 135 | 136 | 137 | 138 | DelphiAdbWifi.dpk 139 | 140 | 141 | (untitled) 142 | Microsoft Office 2000 Sample Automation Server Wrapper Components 143 | Microsoft Office XP Sample Automation Server Wrapper Components 144 | 145 | 146 | True 147 | False 148 | 1 149 | 0 150 | 0 151 | 0 152 | False 153 | False 154 | False 155 | False 156 | False 157 | 1031 158 | 1252 159 | 160 | 161 | 162 | 163 | 1.0.0.0 164 | 165 | 166 | 167 | 168 | 169 | 1.0.0.0 170 | 171 | 172 | 173 | $(BDS)\bin\bds.exe 174 | 175 | 176 | 177 | 178 | 179 | true 180 | 181 | 182 | 183 | 184 | DelphiAdbWifi.rsm 185 | true 186 | 187 | 188 | 189 | 190 | true 191 | 192 | 193 | 194 | 195 | true 196 | 197 | 198 | 199 | 200 | true 201 | 202 | 203 | 204 | 205 | true 206 | 207 | 208 | 209 | 210 | DelphiAdbWifi.bpl 211 | true 212 | 213 | 214 | 215 | 216 | 1 217 | 218 | 219 | 0 220 | 221 | 222 | 223 | 224 | classes 225 | 1 226 | 227 | 228 | 229 | 230 | res\xml 231 | 1 232 | 233 | 234 | 235 | 236 | library\lib\armeabi-v7a 237 | 1 238 | 239 | 240 | 241 | 242 | library\lib\armeabi 243 | 1 244 | 245 | 246 | 247 | 248 | library\lib\mips 249 | 1 250 | 251 | 252 | 253 | 254 | library\lib\armeabi-v7a 255 | 1 256 | 257 | 258 | 259 | 260 | res\drawable 261 | 1 262 | 263 | 264 | 265 | 266 | res\values 267 | 1 268 | 269 | 270 | 271 | 272 | res\values-v21 273 | 1 274 | 275 | 276 | 277 | 278 | res\drawable 279 | 1 280 | 281 | 282 | 283 | 284 | res\drawable-xxhdpi 285 | 1 286 | 287 | 288 | 289 | 290 | res\drawable-ldpi 291 | 1 292 | 293 | 294 | 295 | 296 | res\drawable-mdpi 297 | 1 298 | 299 | 300 | 301 | 302 | res\drawable-hdpi 303 | 1 304 | 305 | 306 | 307 | 308 | res\drawable-xhdpi 309 | 1 310 | 311 | 312 | 313 | 314 | res\drawable-small 315 | 1 316 | 317 | 318 | 319 | 320 | res\drawable-normal 321 | 1 322 | 323 | 324 | 325 | 326 | res\drawable-large 327 | 1 328 | 329 | 330 | 331 | 332 | res\drawable-xlarge 333 | 1 334 | 335 | 336 | 337 | 338 | 1 339 | 340 | 341 | 1 342 | 343 | 344 | 0 345 | 346 | 347 | 348 | 349 | 1 350 | .framework 351 | 352 | 353 | 1 354 | .framework 355 | 356 | 357 | 0 358 | 359 | 360 | 361 | 362 | 1 363 | .dylib 364 | 365 | 366 | 1 367 | .dylib 368 | 369 | 370 | 0 371 | .dll;.bpl 372 | 373 | 374 | 375 | 376 | 1 377 | .dylib 378 | 379 | 380 | 1 381 | .dylib 382 | 383 | 384 | 1 385 | .dylib 386 | 387 | 388 | 1 389 | .dylib 390 | 391 | 392 | 1 393 | .dylib 394 | 395 | 396 | 0 397 | .bpl 398 | 399 | 400 | 401 | 402 | 0 403 | 404 | 405 | 0 406 | 407 | 408 | 0 409 | 410 | 411 | 0 412 | 413 | 414 | 0 415 | 416 | 417 | 0 418 | 419 | 420 | 0 421 | 422 | 423 | 424 | 425 | 1 426 | 427 | 428 | 1 429 | 430 | 431 | 1 432 | 433 | 434 | 435 | 436 | 1 437 | 438 | 439 | 1 440 | 441 | 442 | 1 443 | 444 | 445 | 446 | 447 | 1 448 | 449 | 450 | 1 451 | 452 | 453 | 1 454 | 455 | 456 | 457 | 458 | 1 459 | 460 | 461 | 1 462 | 463 | 464 | 1 465 | 466 | 467 | 468 | 469 | 1 470 | 471 | 472 | 1 473 | 474 | 475 | 1 476 | 477 | 478 | 479 | 480 | 1 481 | 482 | 483 | 1 484 | 485 | 486 | 1 487 | 488 | 489 | 490 | 491 | 1 492 | 493 | 494 | 1 495 | 496 | 497 | 1 498 | 499 | 500 | 501 | 502 | 1 503 | 504 | 505 | 506 | 507 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 508 | 1 509 | 510 | 511 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 512 | 1 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 1 521 | 522 | 523 | 1 524 | 525 | 526 | 1 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | Contents\Resources 535 | 1 536 | 537 | 538 | Contents\Resources 539 | 1 540 | 541 | 542 | 543 | 544 | library\lib\armeabi-v7a 545 | 1 546 | 547 | 548 | 1 549 | 550 | 551 | 1 552 | 553 | 554 | 1 555 | 556 | 557 | 1 558 | 559 | 560 | 1 561 | 562 | 563 | 1 564 | 565 | 566 | 0 567 | 568 | 569 | 570 | 571 | 1 572 | 573 | 574 | 1 575 | 576 | 577 | 578 | 579 | Assets 580 | 1 581 | 582 | 583 | Assets 584 | 1 585 | 586 | 587 | 588 | 589 | Assets 590 | 1 591 | 592 | 593 | Assets 594 | 1 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | False 609 | True 610 | 611 | 612 | 12 613 | 614 | 615 |
616 | -------------------------------------------------------------------------------- /DelphiAdbWifiExe.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {AD71CB25-2FB9-41C7-9DF4-9CC4EC5D7FB9} 4 | 20.1 5 | FMX 6 | DelphiAdbWifiExe.dpr 7 | True 8 | Debug 9 | Win32 10 | 32785 11 | Application 12 | DelphiAdbWifiExe 13 | 14 | 15 | true 16 | 17 | 18 | true 19 | Base 20 | true 21 | 22 | 23 | true 24 | Base 25 | true 26 | 27 | 28 | true 29 | Base 30 | true 31 | 32 | 33 | true 34 | Base 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_1 45 | true 46 | true 47 | 48 | 49 | true 50 | Cfg_1 51 | true 52 | true 53 | 54 | 55 | true 56 | Base 57 | true 58 | 59 | 60 | true 61 | Cfg_2 62 | true 63 | true 64 | 65 | 66 | true 67 | Cfg_2 68 | true 69 | true 70 | 71 | 72 | .\$(Platform)\$(Config) 73 | .\$(Platform)\$(Config) 74 | false 75 | false 76 | false 77 | false 78 | false 79 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 80 | true 81 | true 82 | true 83 | true 84 | true 85 | true 86 | true 87 | true 88 | $(BDS)\bin\delphi_PROJECTICON.ico 89 | $(BDS)\bin\delphi_PROJECTICNS.icns 90 | DelphiAdbWifiExe 91 | 92 | 93 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage) 94 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 95 | Debug 96 | true 97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 100 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 101 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 104 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 105 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 106 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar 107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 109 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 110 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 111 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 112 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 113 | 114 | 115 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 116 | Debug 117 | true 118 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage);$(DCC_UsePackage) 119 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 120 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 121 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 122 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 123 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 124 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 125 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 126 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 127 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 128 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar 129 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 130 | 131 | 132 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;svnui;TelegaPi;dsnapcon;FireDACADSDriver;VirtualTreesR;FireDACMSAccDriver;fmxFireDAC;vclimg;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;fgx;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;CloudApiCore;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage) 133 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 134 | Debug 135 | true 136 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 137 | 1033 138 | $(BDS)\bin\default_app.manifest 139 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 140 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 141 | 142 | 143 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 144 | Debug 145 | true 146 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 147 | 1033 148 | $(BDS)\bin\default_app.manifest 149 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 150 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 151 | 152 | 153 | DEBUG;$(DCC_Define) 154 | true 155 | false 156 | true 157 | true 158 | true 159 | 160 | 161 | false 162 | true 163 | PerMonitorV2 164 | 165 | 166 | PerMonitorV2 167 | 168 | 169 | false 170 | RELEASE;$(DCC_Define) 171 | 0 172 | 0 173 | 174 | 175 | true 176 | PerMonitorV2 177 | 178 | 179 | PerMonitorV2 180 | 181 | 182 | 183 | MainSource 184 | 185 | 186 |
Form2
187 | fmx 188 |
189 | 190 | 191 | 192 | 193 |
ViewDeviceEdit
194 | fmx 195 |
196 | 197 | 198 | 199 | 200 | 201 | Base 202 | 203 | 204 | Cfg_1 205 | Base 206 | 207 | 208 | Cfg_2 209 | Base 210 | 211 |
212 | 213 | Delphi.Personality.12 214 | Application 215 | 216 | 217 | 218 | DelphiAdbWifiExe.dpr 219 | 220 | 221 | 222 | 223 | 224 | true 225 | 226 | 227 | 228 | 229 | true 230 | 231 | 232 | 233 | 234 | 235 | true 236 | 237 | 238 | 239 | 240 | 241 | 242 | 1 243 | 244 | 245 | Contents\MacOS 246 | 1 247 | 248 | 249 | 0 250 | 251 | 252 | 253 | 254 | classes 255 | 64 256 | 257 | 258 | classes 259 | 64 260 | 261 | 262 | 263 | 264 | res\xml 265 | 1 266 | 267 | 268 | res\xml 269 | 1 270 | 271 | 272 | 273 | 274 | library\lib\armeabi 275 | 1 276 | 277 | 278 | library\lib\armeabi 279 | 1 280 | 281 | 282 | 283 | 284 | library\lib\armeabi-v7a 285 | 1 286 | 287 | 288 | 289 | 290 | library\lib\mips 291 | 1 292 | 293 | 294 | library\lib\mips 295 | 1 296 | 297 | 298 | 299 | 300 | library\lib\armeabi-v7a 301 | 1 302 | 303 | 304 | library\lib\arm64-v8a 305 | 1 306 | 307 | 308 | 309 | 310 | library\lib\armeabi-v7a 311 | 1 312 | 313 | 314 | 315 | 316 | res\drawable 317 | 1 318 | 319 | 320 | res\drawable 321 | 1 322 | 323 | 324 | 325 | 326 | res\drawable-anydpi-v21 327 | 1 328 | 329 | 330 | res\drawable-anydpi-v21 331 | 1 332 | 333 | 334 | 335 | 336 | res\values 337 | 1 338 | 339 | 340 | res\values 341 | 1 342 | 343 | 344 | 345 | 346 | res\values-v21 347 | 1 348 | 349 | 350 | res\values-v21 351 | 1 352 | 353 | 354 | 355 | 356 | res\values-v31 357 | 1 358 | 359 | 360 | res\values-v31 361 | 1 362 | 363 | 364 | 365 | 366 | res\drawable-anydpi-v26 367 | 1 368 | 369 | 370 | res\drawable-anydpi-v26 371 | 1 372 | 373 | 374 | 375 | 376 | res\drawable 377 | 1 378 | 379 | 380 | res\drawable 381 | 1 382 | 383 | 384 | 385 | 386 | res\drawable 387 | 1 388 | 389 | 390 | res\drawable 391 | 1 392 | 393 | 394 | 395 | 396 | res\drawable 397 | 1 398 | 399 | 400 | res\drawable 401 | 1 402 | 403 | 404 | 405 | 406 | res\drawable-anydpi-v33 407 | 1 408 | 409 | 410 | res\drawable-anydpi-v33 411 | 1 412 | 413 | 414 | 415 | 416 | res\values 417 | 1 418 | 419 | 420 | res\values 421 | 1 422 | 423 | 424 | 425 | 426 | res\values-night-v21 427 | 1 428 | 429 | 430 | res\values-night-v21 431 | 1 432 | 433 | 434 | 435 | 436 | res\drawable 437 | 1 438 | 439 | 440 | res\drawable 441 | 1 442 | 443 | 444 | 445 | 446 | res\drawable-xxhdpi 447 | 1 448 | 449 | 450 | res\drawable-xxhdpi 451 | 1 452 | 453 | 454 | 455 | 456 | res\drawable-xxxhdpi 457 | 1 458 | 459 | 460 | res\drawable-xxxhdpi 461 | 1 462 | 463 | 464 | 465 | 466 | res\drawable-ldpi 467 | 1 468 | 469 | 470 | res\drawable-ldpi 471 | 1 472 | 473 | 474 | 475 | 476 | res\drawable-mdpi 477 | 1 478 | 479 | 480 | res\drawable-mdpi 481 | 1 482 | 483 | 484 | 485 | 486 | res\drawable-hdpi 487 | 1 488 | 489 | 490 | res\drawable-hdpi 491 | 1 492 | 493 | 494 | 495 | 496 | res\drawable-xhdpi 497 | 1 498 | 499 | 500 | res\drawable-xhdpi 501 | 1 502 | 503 | 504 | 505 | 506 | res\drawable-mdpi 507 | 1 508 | 509 | 510 | res\drawable-mdpi 511 | 1 512 | 513 | 514 | 515 | 516 | res\drawable-hdpi 517 | 1 518 | 519 | 520 | res\drawable-hdpi 521 | 1 522 | 523 | 524 | 525 | 526 | res\drawable-xhdpi 527 | 1 528 | 529 | 530 | res\drawable-xhdpi 531 | 1 532 | 533 | 534 | 535 | 536 | res\drawable-xxhdpi 537 | 1 538 | 539 | 540 | res\drawable-xxhdpi 541 | 1 542 | 543 | 544 | 545 | 546 | res\drawable-xxxhdpi 547 | 1 548 | 549 | 550 | res\drawable-xxxhdpi 551 | 1 552 | 553 | 554 | 555 | 556 | res\drawable-small 557 | 1 558 | 559 | 560 | res\drawable-small 561 | 1 562 | 563 | 564 | 565 | 566 | res\drawable-normal 567 | 1 568 | 569 | 570 | res\drawable-normal 571 | 1 572 | 573 | 574 | 575 | 576 | res\drawable-large 577 | 1 578 | 579 | 580 | res\drawable-large 581 | 1 582 | 583 | 584 | 585 | 586 | res\drawable-xlarge 587 | 1 588 | 589 | 590 | res\drawable-xlarge 591 | 1 592 | 593 | 594 | 595 | 596 | res\values 597 | 1 598 | 599 | 600 | res\values 601 | 1 602 | 603 | 604 | 605 | 606 | res\drawable-anydpi-v24 607 | 1 608 | 609 | 610 | res\drawable-anydpi-v24 611 | 1 612 | 613 | 614 | 615 | 616 | res\drawable 617 | 1 618 | 619 | 620 | res\drawable 621 | 1 622 | 623 | 624 | 625 | 626 | res\drawable-night-anydpi-v21 627 | 1 628 | 629 | 630 | res\drawable-night-anydpi-v21 631 | 1 632 | 633 | 634 | 635 | 636 | res\drawable-anydpi-v31 637 | 1 638 | 639 | 640 | res\drawable-anydpi-v31 641 | 1 642 | 643 | 644 | 645 | 646 | res\drawable-night-anydpi-v31 647 | 1 648 | 649 | 650 | res\drawable-night-anydpi-v31 651 | 1 652 | 653 | 654 | 655 | 656 | 1 657 | 658 | 659 | Contents\MacOS 660 | 1 661 | 662 | 663 | 0 664 | 665 | 666 | 667 | 668 | Contents\MacOS 669 | 1 670 | .framework 671 | 672 | 673 | Contents\MacOS 674 | 1 675 | .framework 676 | 677 | 678 | Contents\MacOS 679 | 1 680 | .framework 681 | 682 | 683 | 0 684 | 685 | 686 | 687 | 688 | 1 689 | .dylib 690 | 691 | 692 | 1 693 | .dylib 694 | 695 | 696 | 1 697 | .dylib 698 | 699 | 700 | Contents\MacOS 701 | 1 702 | .dylib 703 | 704 | 705 | Contents\MacOS 706 | 1 707 | .dylib 708 | 709 | 710 | Contents\MacOS 711 | 1 712 | .dylib 713 | 714 | 715 | 0 716 | .dll;.bpl 717 | 718 | 719 | 720 | 721 | 1 722 | .dylib 723 | 724 | 725 | 1 726 | .dylib 727 | 728 | 729 | 1 730 | .dylib 731 | 732 | 733 | Contents\MacOS 734 | 1 735 | .dylib 736 | 737 | 738 | Contents\MacOS 739 | 1 740 | .dylib 741 | 742 | 743 | Contents\MacOS 744 | 1 745 | .dylib 746 | 747 | 748 | 0 749 | .bpl 750 | 751 | 752 | 753 | 754 | 0 755 | 756 | 757 | 0 758 | 759 | 760 | 0 761 | 762 | 763 | 0 764 | 765 | 766 | 0 767 | 768 | 769 | Contents\Resources\StartUp\ 770 | 0 771 | 772 | 773 | Contents\Resources\StartUp\ 774 | 0 775 | 776 | 777 | Contents\Resources\StartUp\ 778 | 0 779 | 780 | 781 | 0 782 | 783 | 784 | 785 | 786 | 1 787 | 788 | 789 | 1 790 | 791 | 792 | 793 | 794 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 795 | 1 796 | 797 | 798 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 799 | 1 800 | 801 | 802 | 803 | 804 | ..\ 805 | 1 806 | 807 | 808 | ..\ 809 | 1 810 | 811 | 812 | ..\ 813 | 1 814 | 815 | 816 | 817 | 818 | Contents 819 | 1 820 | 821 | 822 | Contents 823 | 1 824 | 825 | 826 | Contents 827 | 1 828 | 829 | 830 | 831 | 832 | Contents\Resources 833 | 1 834 | 835 | 836 | Contents\Resources 837 | 1 838 | 839 | 840 | Contents\Resources 841 | 1 842 | 843 | 844 | 845 | 846 | library\lib\armeabi-v7a 847 | 1 848 | 849 | 850 | library\lib\arm64-v8a 851 | 1 852 | 853 | 854 | 1 855 | 856 | 857 | 1 858 | 859 | 860 | 1 861 | 862 | 863 | 1 864 | 865 | 866 | Contents\MacOS 867 | 1 868 | 869 | 870 | Contents\MacOS 871 | 1 872 | 873 | 874 | Contents\MacOS 875 | 1 876 | 877 | 878 | 0 879 | 880 | 881 | 882 | 883 | library\lib\armeabi-v7a 884 | 1 885 | 886 | 887 | 888 | 889 | 1 890 | 891 | 892 | 1 893 | 894 | 895 | 1 896 | 897 | 898 | 899 | 900 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 901 | 1 902 | 903 | 904 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 905 | 1 906 | 907 | 908 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 909 | 1 910 | 911 | 912 | 913 | 914 | ..\ 915 | 1 916 | 917 | 918 | ..\ 919 | 1 920 | 921 | 922 | ..\ 923 | 1 924 | 925 | 926 | 927 | 928 | 1 929 | 930 | 931 | 1 932 | 933 | 934 | 1 935 | 936 | 937 | 938 | 939 | ..\$(PROJECTNAME).launchscreen 940 | 64 941 | 942 | 943 | ..\$(PROJECTNAME).launchscreen 944 | 64 945 | 946 | 947 | 948 | 949 | 1 950 | 951 | 952 | 1 953 | 954 | 955 | 1 956 | 957 | 958 | 959 | 960 | Assets 961 | 1 962 | 963 | 964 | Assets 965 | 1 966 | 967 | 968 | 969 | 970 | Assets 971 | 1 972 | 973 | 974 | Assets 975 | 1 976 | 977 | 978 | 979 | 980 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 981 | 1 982 | 983 | 984 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 985 | 1 986 | 987 | 988 | 989 | 990 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 991 | 1 992 | 993 | 994 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 995 | 1 996 | 997 | 998 | 999 | 1000 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1001 | 1 1002 | 1003 | 1004 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1005 | 1 1006 | 1007 | 1008 | 1009 | 1010 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1011 | 1 1012 | 1013 | 1014 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1015 | 1 1016 | 1017 | 1018 | 1019 | 1020 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1021 | 1 1022 | 1023 | 1024 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1025 | 1 1026 | 1027 | 1028 | 1029 | 1030 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1031 | 1 1032 | 1033 | 1034 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1035 | 1 1036 | 1037 | 1038 | 1039 | 1040 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1041 | 1 1042 | 1043 | 1044 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1045 | 1 1046 | 1047 | 1048 | 1049 | 1050 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1051 | 1 1052 | 1053 | 1054 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1055 | 1 1056 | 1057 | 1058 | 1059 | 1060 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1061 | 1 1062 | 1063 | 1064 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1065 | 1 1066 | 1067 | 1068 | 1069 | 1070 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1071 | 1 1072 | 1073 | 1074 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1075 | 1 1076 | 1077 | 1078 | 1079 | 1080 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1081 | 1 1082 | 1083 | 1084 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1085 | 1 1086 | 1087 | 1088 | 1089 | 1090 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1091 | 1 1092 | 1093 | 1094 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1095 | 1 1096 | 1097 | 1098 | 1099 | 1100 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1101 | 1 1102 | 1103 | 1104 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1105 | 1 1106 | 1107 | 1108 | 1109 | 1110 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1111 | 1 1112 | 1113 | 1114 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1115 | 1 1116 | 1117 | 1118 | 1119 | 1120 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1121 | 1 1122 | 1123 | 1124 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1125 | 1 1126 | 1127 | 1128 | 1129 | 1130 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1131 | 1 1132 | 1133 | 1134 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1135 | 1 1136 | 1137 | 1138 | 1139 | 1140 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1141 | 1 1142 | 1143 | 1144 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1145 | 1 1146 | 1147 | 1148 | 1149 | 1150 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1151 | 1 1152 | 1153 | 1154 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1155 | 1 1156 | 1157 | 1158 | 1159 | 1160 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1161 | 1 1162 | 1163 | 1164 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1165 | 1 1166 | 1167 | 1168 | 1169 | 1170 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1171 | 1 1172 | 1173 | 1174 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1175 | 1 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | True 1194 | True 1195 | True 1196 | False 1197 | 1198 | 1199 | 12 1200 | 1201 | 1202 | 1203 | 1204 |
1205 | --------------------------------------------------------------------------------