• Introducing XDA Computing: Discussion zones for Hardware, Software, and more!    Check it out!

[DEV] AndroidCtrl.dll [7.1.46.0] (ADB/Fastboot/(apk/zip) Signer - Framework)

Search This thread

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
This (C# .NET 4.6|4.7|4.8) dll is a kind of ADB/Fastboot/(apk/zip) Signer - Framework, it provides a lot of predefined .NET functions to communicate with an Android device. It's designed to work in 1st case with any non-root device but you can also use it with any rooted device (A few functions requires root access).

License
This project is licensed under the Apache License Version 2.0.

The latest build 7.1.46.0 is currently only via FTP, GoogleDrive or Dropbox available, the DevDB has currently some upload issues!

The following (N)amespaces, (C)lasses & (I)nterfaces are currently available:

  • (N) ADB
    • (N) Binary (This is the binary/exe implementation of ADB)
      • (C) ADB (static Management Class for the ADBClient's)
      • (C) ADBClient (Implementation of IADBClient)
      • (C) Channel (Implementation of IChannel)
    • (N) Device
      • (N) BusyBox
        • (C) BusyBox
        • (C) Find
        • (C) Tar
      • (N) Dumpsys
        • (C) Battery
        • (C) Dumpsys
        • (I) IBattery
      • (N) Input
        • (I) IKeyEvent
        • (C) Input
        • (C) InputExtensions
        • (C) KeyEvent (Implementation of IKeyEvent)
      • (N) IO
        • (NS) Compression
          • (NS) BrotliSharp (Only available in .NET 4.6|4.7|4.8 - In .NET Standard >= 2.1 you have to use the native .NET implementation)
        • (C) ADirectoryInfo (Similar to .NET Directory/-Info)
        • (C) AFileInfo (Similar to .NET File/-Info)
        • (C) AFileStream (Similar to .NET FileStream)
        • (C) AFileSystemInfo (Similar to .NET FileSystemInfo, it's the abstract base for ADirectoryInfo & AFileInfo)
        • (C) AMountPointInfo (Similar to ADirectoryInfo & AFileInfo but only for mounts)
        • (C) FileSystemCache (A cache object for ADirectoryInfo & AFileInfo)
        • (I) IFileSystemCache (Interface for FileSystemCache)
        • (C) IO
        • (I) ITransferMessage
        • (C) MediaScanner (Manage the Android MediaScanner, useful after some file-transfers via ADB)
        • (C) Mount (Requires Root and manage the mounts)
        • (C) Stat (stat class for the ADB-Protocol)
        • (C) SyncStream (Base implementation of the ADB sync service. Utilized by AFileStream)
        • (C) TransferMessage
        • (C) UPath (Similar to .Net Path but for unix paths)
      • (N) Logcat
        • (I) ILogEntry
        • (C) Logcat
        • (C) LogEntry
      • (N) Manager
        • (C) ActivityManager
        • (I) IInstrumentation
        • (C) Instrumentation
        • (I) IPackage
        • (I) IPermission
        • (C) Manager
        • (C) Package
        • (C) PackageManager
        • (C) Permission
      • (N) Provider
        • (C) Contacts (Contacts provider)
        • (C) ContactsDataField
        • (C) ContactsEmail
        • (C) ContactsEvent
        • (C) ContactsGroup
        • (C) ContactsIdentity
        • (C) ContactsIM
        • (C) ContactsName
        • (C) ContactsNickname
        • (C) ContactsNote
        • (C) ContactsOrganization
        • (C) ContactsPhone
        • (C) ContactsPhoto
        • (C) ContactsPostalAddress
        • (C) ContactsRelation
        • (C) ContactsSipAddress
        • (C) ContactsWebsite
        • (I) IContactsDataField
        • (C) Provider
        • (C) Telephony (Telephony provider)
      • (N) Screen
        • (C) Framebuffer (Implementation of IFramebuffer)
        • (C) FramebufferInfo
        • (I) IFramebuffer (Interface of an RAW framebuffer)
        • (I) IFramebufferInfo
        • (I) IScreenDimension
        • (I) IScreenFocus
        • (C) Screen
        • (C) ScreenDimension
        • (C) ScreenFocus
      • (N) Shell
        • (I) IShell (Interface of an shell with in-/output abilities)
        • (C) Shell (Implementation of IShell)
      • (N) SQLite
        • (C) Options
        • (C) QueryTools
        • (C) SQLite3 (SQLite3 database connector)
      • (C) BuildProperties
      • (C) Daemon (Manage the daemon on the device)
      • (C) Device
      • (C) Forensics (ALFA-State)
      • (I) IUptime
      • (C) OpenRecoveryScript (Manage the OpenRecoveryScript)
      • (C) Phone (Start a call, dial a number, add a contact or send a sms)
      • (C) Su
      • (C) Uptime
      • (C) Wipe
    • (N) Shares
      • (C) Monitor (Implementation of IMonitor)
    • (N) Socket (This is the IP based implementation of ADB - Here is NO binary/exe required)
      • (C) ADB (static Management Class for the ADBClient's)
      • (C) ADBClient (Implementation of IADBClient)
      • (C) ADBSocket (IP based connector - Mimics the ADB-Server)
      • (C) Channel (Implementation of IChannel)
    • (C) ADBridge (Unified access to Binary.ADB and Socket.ADB)
    • (I) IADBClient (Interface for nearly all ADB commands)
    • (I) IChannel (Interface of an RAW data channel)
  • (N) Fastboot
    • (C) Backdoor (Some backdoor commands)
    • (C) Fastboot (static Management Class for the FastbootClient's)
    • (C) FastbootClient (Includes nearly all fastboot.exe commands)
    • (I) IFastbootClient (Interface for FastbootClient)
    • (C) Monitor (Implementation of IMonitor)
    • (C) OEM (Some OEM commands)
    • (C) Wipe
  • (N) ProcessModels
    • (C) General (Includes some predefined process models)
    • (I) IRealTimeBG (Interface of an background process with in-/output abilities)
    • (C) RealTimeBGExeV2 (Implementation of IRealTimeBG)
  • (N) Signer
    • (C) Signer (signapk.jar Interface)
  • (N) Tools
    • (C) CRC
    • (C) Deploy (Deploy the AAPT/ADB/Fastboot/Signer files needed by this dll)
    • (C) Hash
    • (C) Hex
    • (C) IMEI (Some helper to verify and rebuild a valid IMEI)
    • (C) ToolBox
  • (C) Cleanup (Delete the files/folders which were created by this dll)
  • (C) Config
  • (C) DeviceInfo (Basic device info, the return from "(Binary/Socket).ADB.Devices()" and "Fastboot.Devices()")
  • (I) IDeviceInfo (Interface for DeviceInfo)
  • (I) IMonitor (Interface for the ADB.Binary, ADB.Socket and Fastboot.Fastboot monitor)

Special
  • Ready-To-Go MVVM's for WPF, XAML via my AndroidCtrlUI.dll
  • Multi-Device compatible, you can manage unlimited devices at the same time with this dll. Each device gets it's own instance. (Thread-Safe, the dll use lock() for critical sections)
  • UTF8-File/Folder Transfer you can transfer files/folders with containing special chars (ü, ö, ä, €, @, à, è, etc.)
  • On-the-fly Device to Device copy (Binary <-> Binary | Binary <-> Socket | Socket <-> Socket)
  • Device-Monitor, if activated, it will check every 10 sec. ADB & Fastboot for new connected devices and call an defined callback, if something changed. So your program get's an info if an device is connected or removed.
  • All Android key-events as (int)enum and the ability to send them as single or stack.

Hint
  • You can use all ADB methods/commands via USB or W-Lan/Lan, if your Rom supports ADB via W-Lan/Lan (Settings/Developer Settings)
  • If you want to use all sub-classes of IADBClient with BusyBox instead of the Shell, you have to set IADBClient.UseBusyBox to true. This will tell the instance to use the BusyBox commands inside each method, if the device has BusyBox installed.

Referenced .NET assembly's
System
System.Numerics
System.XML

Used Code-analysis rules:
Basic & Advanced Microsoft-Rules for Accuracy
Microsoft-managed minimum & recommended rules
Microsoft Security Rules

About the usage, the namespaces (ADB, Fastboot, Signer) have one basic instance. For example, ADB.Instance(), Fastboot.Instance(), Signer.Instance. As you can see ADB.Instance() and Fastboot.Instance() can have a parameter. This parameter is in both cases an (string) DeviceID, an IDeviceInfo or null, if you use for example null, both classes will return it's Selected client. If you use the DeviceID or the IDeviceInfo the return is a fresh instance of the client or the already created instance. So, in any case, before you call ADB/Fastboot.Instance(). Check with ADB/Fastboot.Devices() if you have a connected device. If so, use the IDeviceInfo object to start your device instance or simply pass the serial to the Instance(). All instances which you have created on this way, will be hold inside an Dictionary<string, ADBClient>, so you can configure each device instance to it's needs and call it when ever you need it. This is also the point where i say it's multi-device and multi-thread safe. Because, if you always use ADB/Fastboot.Instance() you can't reach the wrong device. Also, all classes using lock() for critical sections, because [MethodImpl(MethodImplOptions.Synchronized)] is not longer available under .NET Standard.

If you have any wishes like new features, how-to's or something else, let me know! :cyclops:

Tested OS
Win Vista | 7 | 8 | 8.1 | 10 (32Bit/64Bit in VM-Ware)
Win 7 | 8 | 8.1 | 10 (64Bit Native)
Win XP is not longer supported by ADB! (But, if you have a old ADB binary, the dll will do it's job)

Tested Devices
Android Emulator some Versions (min. 2.x) in AVD
Android x86
HTC Sensation -/ XE (non-/rooted)
HTC One M9 (non-/rooted)
Huawei P9 Lite (VNS-L21,22,23,31,etc.) (non-/rooted)
Huawei P10 Lite (WAS-LX1A,etc.) (non-/rooted)
Samsung Galaxy 2-5 (non-/rooted)
Samsung Galaxy S Plus (non-rooted)
A few Samsung Tabs (non-/rooted)
Google Pixel 4 (Android 11) (non-/rooted)

Requirements
Android: min. 2.x
Platform: x86/x64 (Windows)
Frameworks: min. .NET 4.6 and JRE (only for the Signer)
(Installed ADB/Fastboot device driver)

Download
Mirror: XDA-DevDB (since 29.01.2019 no uploads possible)
Mirror #1: My FTP (Build archiv)
Mirror #2: GoogleDrive
Mirror #3: Dropbox
Each zip-archiv contains the AndroidCtrl.dll, its markup file AndroidCtrl.xml and the program debug database AndroidCtrl.pdb for .NET 4.6|4.7|4.8 and .NET Standard 2.1 (beta)

Examples (Updated to dll version 7.1.46.0) (Updated in the next 24 h)
Mirror: My FTP
Mirror #1: GoogleDrive
Mirror #2: Dropbox
(Contains a simple exe and its source written in C# WPF)

Source
N/A (If you want to have a look at it, send me a PM or simply decompile it.)

DO NOT MIRROR MY FILES! DO NOT COPY MY THREADS!

XDA:DevDB Information
AndroidCtrl.dll, Tool/Utility for the Android General

Contributors
k1ll3r8e, squabbi, Krystanos

Version Information
Status: Stable
Current Stable Version: 7.1.46.0
Stable Release Date: 2020-09-19

Created 2016-07-24
Last Updated 2020-09-19
 
Last edited:

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Problems & Solutions

1. Windows 8.x | 10.x

NOTE
If u use any callback functions, u have to invoke any UI-/ variable-interaction from an dispatcher like the following example:
Code:
public void Monitor(Added|Changed|Removed)EventHandler(object sender, Monitor(Added|Changed|Removed)EventArgs e)
{
     App.Current.Dispatcher.Invoke((Action)delegate
     {
          // IDeviceInfo[] e.Devices
          // Here u can interact with an UI-Element or an variable in ur program code
     });
}
if u do it without dispatcher, u'll get an "Thread Exception".


More examples coming soon...
(If u need a specific example, just let me know, i'll try my best to provide one.)
 
Last edited:

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Changelog

DD.MM.YYYY | (A) = Added | (C) = Changed | (D) = Deleted | (F) = Fixed | (R) = Recoded | (U) Updated
----------------------------------------------------------------------------------------------------------------------------------------------------
26.07.2020 [7.0.46.0]
(A) Some new Async overloads to the AFileInfo, AFileSystemInfo, ADirectoryInfo and AMountpointInfo.
(F) A few little bugs

01.02.2020 [6.7.46.0]
(A) ADB.IADBClient{} (The old IADB interface)

(A) ADB.Binary.ADB{} (The old ADB class - only the statics)
(A) ADB.Binary.ADBClient{} (The old ADB class - without any statics)

(A) ADB.Socket.ADB{} (The old ADB class - only the statics)
(A) ADB.Socket.ADBClient{} (The old ADB class - without any statics)

(A) ADB.Device.ADirectoryInfo{}
(A) ADB.Device.AFileInfo{}
(A) ADB.Device.AFileStream{}
(A) ADB.Device.AMountPointInfo{}
(A) ADB.Device.FileSystemCache{}
(A) ADB.Device.IFileSystemCache{}

(D) ADB.Device.Directories{}
(D) ADB.Device.Files{}
(D) ADB.Device.FileSystem{}
(D) ADB.Device.FileSystemItem{}
(D) ADB.Device.IFileSystemItem{}
And everything related to those classes... Directories has been replaced with ADirectoryInfo, Files has been replaced with AFileInfo and FileSystem has been replaced with AMountPointInfo.

31.05.2019 [6.0.46.0]
(C) The Framework Version from 4.0 to 4.6
(C) The versioning:
6 = Major
0 = Minor
46 = Framework Version (4.6)
0 = Hotfix

(A) (int) ADB.Instance().Device.Screen.GetAutoBrightness()
(A) (int) ADB.Instance().Device.Screen.GetBrightness()
(A) (ScreenBrightnessMode) ADB.Instance().Device.Screen.GetBrightnessMode()
(A) (ScreenRotation) ADB.Instance().Device.Screen.GetRotation()
(A) (ScreenRotationMode) ADB.Instance().Device.Screen.GetRotationMode()
(A) (bool) ADB.Instance().Device.Screen.SetBrightness(int brightness)
(A) (bool) ADB.Instance().Device.Screen.SetBrightnessMode(ScreenBrightnessMode mode)
(A) (bool) ADB.Instance().Device.Screen.SetRotation(ScreenRotation rotation)
(A) (bool) ADB.Instance().Device.Screen.SetRotationMode(ScreenRotationMode mode)

(D) ASDK (enum)
(C From) (ASDK) ADB.Instance().Device.GetSDK()
(C To) (int) ADB.Instance().Device. GetSDK()


10.04.2019 [0.0.5.2]
(A) A workaround for older SU binaries
Code:
// (Source ADB.Device.Su {})
///<summary>
/// Enables an (W)ork(A)round for older SU binaries, which needs the command as an single argument.
///<para/>For example, the latest SU binaries support a syntax like [su -c id -u] where older binaries need [su -c "id -u"]
///<para/>If u deactivate this workaround by enabled <see cref="IADB.UseSu"/>, <see cref="IADB.UseSu"/> gets also disabled!
///<para/>This workaround is by default disabled
///<para/>Affected Methods:
///<para/><see cref="ShellCmd(string, int)"/>, <see cref="ShellCmd(string, CancellationToken, int)"/>, <see cref="ShellCmd(string, ShellDataEventHandler, int)"/>, <see cref="ShellCmd(string, ShellDataEventHandler, CancellationToken, int)"/>
///<para/><see cref="ShellCmdHRes(string, int)"/>, <see cref="ShellCmdHRes(string, CancellationToken, int)"/>, <see cref="ShellCmdHRes(string, ShellDataEventHandler, int)"/>, <see cref="ShellCmdHRes(string, ShellDataEventHandler, CancellationToken, int)"/>
///</summary>
public bool WA_SingleArgument

(A) A fix for unresponsive interactive shells. This happened to me on Lineage on my HTC Sensation, where the device sends an "resize" request... Sending a command in this state caused the command getting cut at the 1st byte, for example, u send "id -u" the delivered command was "d -u".

(A) Added "feature" detection for Binary.ADB, now u can get the "features" of the device like: cmd, stat, stat_v2, shell, shell_v2, etc. in the "IChannel.Features".

(R) Removed the last bit of code duplication and optimized some internal logic's. For example, the "Socket.IChannel" got a speed boost from ~1.920.000 bytes during an transfer of 14.400.000 bytes.


06.03.2019 [0.0.5.1]
(C) ADB.Device structure (see 1st post)
(R) ADB.Device.Provider (Decreased the loading time of the contacts and their data)
(D) AAPT completely

Older Changes:

16.02.2019 [0.0.4.2]
(A) DNS lookup for ADB.Socket
(R) Reduced code duplication

07.02.2019 [0.0.4.1]
(F) An issue inside the ADB.Binary, the problem was that "ADB.Devices()" returned nothing, if more than one device was connected. Reason for the issue was the "(int)IChannel.ReadHexLength()" function, there i read an Int16 but it was an UInt16 which caused an overflow.


29.01.2019 [0.0.4.0]
(U) AAPT, ADB, Fastboot binaries and the required dlls to the latest version (1.0.40)

(A) ADB.ADBridge - Unified access to ADB.Binary and ADB.Socket
(A) ADB.IADB - Interface for ADB-/Socket with nearly all ADB commands
(A) ADB.IChannel - Interface of an ADB-/Socket RAW-data channel
(A) ADB.IFramebuffer - Interface for the ADB-/Socket framebuffer
(A) ADB.IShell - Interface for the ADB-/Socket Shell v1 & v2
(A) IMonitor - Interface for the ADB-/Socket and Fastboot device-monitor

(A) On-the-fly device to device copy (ADB.Binary <-> ADB.Binary | ADB.Binary <-> ADB.Socket | ADB.Socket <-> ADB.Socket)

Reordered the ADB namespace... The old layout was:
ADB - Binary based ADB
ADB.Device - Device helper
ADBSocket - Socket based ADB

The new layout is:
ADB - Main ADB
ADB.Binary - Binary based ADB
ADB.Device - Device helper
ADB.Shared - Shared helper, extensions for ADB.Binary and ADB.Socket
ADB.Socket - Socket based ADB

Implemented the framebuffer for ADB.Binary and ADB.Socket (A ready-to-go Remote-Desktop is available via my AndroidCtrlUI.dll)

09.04.2018 [0.0.3.1]
This is a complete new version!
-
I added a lot of new stuff like the "CancellationToken" overload, the "MediaScanner" class and also some fine tunes to the "Screen" class, there u can now also get the Screen dimensions. Also a lot models like the old MemDumpxxx_4xx have been removed (we are now 4 versions higher and the outputs are not longer available or have changed to much).

15.02.2018 [0.0.2.5]
(F) A problem where a NULL exception was raised during directory parsing
(F) A few UI freezes and applied a few tweaks to some logic's.

(D) Tools.Icons {}
(D) Tools.TrayNotify {}
Reason for this is the upcoming compatibility to .NET Core. BUT, the functions are not lost, i added those not .NET Core compatible calls to the AndroidCtrlUI.dll... Because the UI dll will be never migrated to .NET Core.

03.11.2017 [0.0.2.4]
Nearly full new build
-
Sadly my notes are lost, based on a data loss on my Dev Environment...
 
Last edited:

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Showcase

ADB-Overlay made by me

The XDA-Thread and Download can be found here

P10 Lite Toolkit made by me

The XDA-Thread and Download can be found here

P9 Lite Toolkit made by me

The XDA-Thread and Download can be found here


HTC One Toolkit from our Member @squabbi

The XDA-Thread and Download can be found here


--
U use this dll in ur project?

Send me a PM with:
  • Project Name
  • Small image
  • Short description
  • Download link
then i'll link it here.
 
Last edited:

squabbi

Senior Member
Jul 20, 2012
1,744
1,600
Sydney
Hey another question. How would I use for example:

Code:
Fastboot.Instance().OEM.ReadCid();

I would presume there would need to be a 'string' for it to save to.

Code:
private string _cid
??

EDIT: So i deciced to try this:

Code:
MessageBox.Show("cid: " + Fastboot.Instance().OEM.ReadCid());
When I press the button it shows:

eFrMOy8.png


Thanks! ;)
 
Last edited:

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Hey another question. How would I use for example:

Code:
Fastboot.Instance().OEM.ReadCid();

I would presume there would need to be a 'string' for it to save to.

Code:
private string _cid
??

EDIT: So i deciced to try this:

Code:
MessageBox.Show("cid: " + Fastboot.Instance().OEM.ReadCid());
When I press the button it shows:

Thanks! ;)

Hey there ;)

Methods/functions like "ReadCid()" returns a "List<string>" so u can do like:

Code:
string cid = string.Join(" ", Fastboot.Instance().OEM.ReadCid().ToArray());

// or

// The return are 3 lines, so we need to get the 2cnd
string cid = Fastboot.Instance().OEM.ReadCid()[1];

NOTE
I return there a "List<string> (the raw output)" coz i dun know if the output will be the same on each device.
In this case u have filter the right line ur self :)

Hope this helps ;)
 
Last edited:
  • Like
Reactions: squabbi

squabbi

Senior Member
Jul 20, 2012
1,744
1,600
Sydney
Hey there ;)

Methods/functions like "ReadCid()" returns a "List<string>" so u can do like:

Code:
string cid = string.Join(" ", Fastboot.Instance().OEM.ReadCid().ToArray());

// or

// The return are 3 lines, so we need to get the 2cnd
string cid = Fastboot.Instance().OEM.ReadCid()[1];

NOTE
I return there a "List<string> (the raw output)" coz i dun know if the output will be the same on each device.
In this case u have filter the right line ur self :)

Hope this helps ;)

Thanks again! :)

It worked perfectly! Another question. I'm now using a textbox to show the output like this:

Code:
MainWindow mainWin = (MainWindow)App.Current.MainWindow;
                mainWin.tBOutput.AppendText(String.Join("", "\n", Fastboot.Instance().OEM.ReadCid()[1]));
                mainWin.tBOutput.ScrollToEnd();

How can I do this but in a seperate window? Like one that is seperate from the MainWindow.

Thanks! :good:
 

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Thanks again! :)

It worked perfectly! Another question. I'm now using a textbox to show the output like this:

Code:
MainWindow mainWin = (MainWindow)App.Current.MainWindow;
                mainWin.tBOutput.AppendText(String.Join("", "\n", Fastboot.Instance().OEM.ReadCid()[1]));
                mainWin.tBOutput.ScrollToEnd();

How can I do this but in a seperate window? Like one that is seperate from the MainWindow.

Thanks! :good:

Hey there :)

There are 3 and more options how u can handle this...

1. Simple "MessageBox"

Code:
MessageBox.Show(string.Join("\n", Fastboot.Instance().OEM.ReadCid().ToArray()));


2. Extra Window

XAML
Code:
<Window x:Class="Multi_Explorer.viewmodel.android.fastboottools.htc.CidDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Show CID" Height="410" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <RichTextBox x:Name="TokenOutput" IsReadOnly="True" ScrollViewer.VerticalScrollBarVisibility="Auto">
            <RichTextBox.Resources>
                <Style TargetType="{x:Type Paragraph}">
                    <Setter Property="Margin" Value="0,0,0,0"/>
                </Style>
            </RichTextBox.Resources>
            <FlowDocument>
            </FlowDocument>
        </RichTextBox>
    </Grid>
</Window>

CS
Code:
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace Multi_Explorer.viewmodel.android.fastboottools.htc
{
    /// <summary>
    /// Interaktionslogik für CidDialog.xaml
    /// </summary>
    public partial class CidDialog : Window
    {
        #region Instance

        private static CidDialog _instance = null;

        public static CidDialog Instance
        {
            get
            {
                if (_instance != null)
                {
                    return _instance;
                }
                else
                {
                    _instance = new CidDialog();
                    return _instance;
                }
            }
        }

        #endregion

        public CidDialog()
        {
            InitializeComponent();
            this.Closing += WindowClosing;
            App.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
        }

        #region WindowClosing

        ///<summary>
        /// Clean exit
        ///</summary>
        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _instance = null;
        }
        #endregion

        #region Add

        public void Add(List<string> msg)
        {
            foreach (string tmp in msg)
            {
                TokenOutput.Document.Blocks.Add(new Paragraph(new Run(tmp)));
            }
            TokenOutput.ScrollToEnd();
        }
        #endregion

        #region Clear

        public void Clear()
        {
            TokenOutput.Document.Blocks.Clear();
        }
        #endregion
    }
}

Usage
Code:
CidDialog ciddiag = CidDialog.Instance;
ciddiag.Add(Fastboot.Instance().OEM.ReadCid());

// As window
ciddiag.Show();

// As dialog window (this will freeze the complete application until it's closed)
ciddiag.ShowDialog();


3. Extra Window with ADB/Fastboot instance

XAML
Code:
<Window x:Class="Multi_Explorer.viewmodel.android.fastboottools.htc.CidDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Show CID" Height="410" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <RichTextBox x:Name="TokenOutput" IsReadOnly="True" ScrollViewer.VerticalScrollBarVisibility="Auto">
            <RichTextBox.Resources>
                <Style TargetType="{x:Type Paragraph}">
                    <Setter Property="Margin" Value="0,0,0,0"/>
                </Style>
            </RichTextBox.Resources>
            <FlowDocument>
            </FlowDocument>
        </RichTextBox>
    </Grid>
</Window>

CS
Code:
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

using AndroidCtrl;
using AndroidCtrl.ADB;
using AndroidCtrl.Tools;
using AndroidCtrl.Fastboot;

namespace Multi_Explorer.viewmodel.android.fastboottools.htc
{
    /// <summary>
    /// Interaktionslogik für CidDialog.xaml
    /// </summary>
    public partial class CidDialog : Window
    {
        public CidDialog()
        {
            InitializeComponent();
            this.Closing += WindowClosing;
            App.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;

            // If u have a selected device this will work in all sub-windows
            Add(Fastboot.Instance().OEM.ReadCid());
        }

        #region WindowClosing

        ///<summary>
        /// Clean exit
        ///</summary>
        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _instance = null;
        }
        #endregion

        #region Add

        public void Add(List<string> msg)
        {
            foreach (string tmp in msg)
            {
                TokenOutput.Document.Blocks.Add(new Paragraph(new Run(tmp)));
            }
            TokenOutput.ScrollToEnd();
        }
        #endregion

        #region Clear

        public void Clear()
        {
            TokenOutput.Document.Blocks.Clear();
        }
        #endregion
    }
}

Usage
Code:
CidDialog ciddiag = CidDialog.Instance;

// Optional
// ciddiag.Add(Fastboot.Instance().OEM.ReadCid());

// As window
ciddiag.Show();

// As dialog window (this will freeze the complete application until it's closed)
ciddiag.ShowDialog();
 
Last edited:

squabbi

Senior Member
Jul 20, 2012
1,744
1,600
Sydney
Hey there :)

There are 3 and more options how u can handle this...

Thanks for clarifying! What if i want to get the identifier code? it has multiple strings? how can i choose to show all of them?

EDIT: (More questions! ;) )

Is it possible to use:

Code:
foreach (DataModelDevicesItem device in adbDevices)
            {
                App.Current.Dispatcher.Invoke((Action)delegate
                {
                    // here goes the add command ;)
                    deviceselector.Items.Add(device);
                });
            }
            foreach (DataModelDevicesItem device in fastbootDevices)
            {
                App.Current.Dispatcher.Invoke((Action)delegate
                {
                    deviceselector.Items.Add(device);
                });
            }

to check if the device is in fastboot or adb? e.g

I press a button to flash recovery. i can have my phone in adb or fastboot and it will check to see which it is in. Then it wil lcarry out a specific command?
 
Last edited:

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Hey there :)

Thanks for clarifying! What if i want to get the identifier code? it has multiple strings? how can i choose to show all of them?

If u mean the HTC-Bootloader unlock code, u can use the described 2 or 3. :)
(Both window examples have an "foreach loop" to print out each line from the List<string> into the RichTextBox)

If u want also replace the "(bootloader) " tag u can use this line:
Code:
TokenOutput.Document.Blocks.Add(new Paragraph(new Run(tmp.Replace("(bootloader) ", ""))));
just replace it in the CS code with the one in the "foreach loop".


EDIT: (More questions! ;) )

Is it possible to use:

Code:
foreach (DataModelDevicesItem device in adbDevices)
            {
                App.Current.Dispatcher.Invoke((Action)delegate
                {
                    // here goes the add command ;)
                    deviceselector.Items.Add(device);
                });
            }
            foreach (DataModelDevicesItem device in fastbootDevices)
            {
                App.Current.Dispatcher.Invoke((Action)delegate
                {
                    deviceselector.Items.Add(device);
                });
            }

to check if the device is in fastboot or adb? e.g

Yes, so i do it in my projects also.

I press a button to flash recovery. i can have my phone in adb or fastboot and it will check to see which it is in. Then it wil lcarry out a specific command?

For this scenario, u need a function which checks which state have the current device serial. After u have the state ADB or Fastboot, u can call 2 different methods from my dll:

ADB
Code:
// This requires Root in any case!
ADB.Instance().Device.FlashImage(IDDevicePartition partition, string localPath, bool tmpToSD = true, int timeOut = -1);

Fastboot
Code:
Fastboot.Instance().Flash(IDDevicePartition partition, string file, int timeOut = -1);

NOTE
I will build a function which will do the work in the future, next release will include it. ;)


#EDIT:
Release it out :D
Code:
AndroidCtrl.Tools.General.CheckDeviceState(string deviceID);
// return is a IDDeviceState

Hope this helps ;)
 
Last edited:
  • Like
Reactions: squabbi

squabbi

Senior Member
Jul 20, 2012
1,744
1,600
Sydney
Hey there :)



If u mean the HTC-Bootloader unlock code, u can use the described 2 or 3. :)
(Both window examples have an "foreach loop" to print out each line from the List<string> into the RichTextBox)

If u want also replace the "(bootloader) " tag u can use this line:
Code:
TokenOutput.Document.Blocks.Add(new Paragraph(new Run(tmp.Replace("(bootloader) ", ""))));
just replace it in the CS code with the one in the "foreach loop".

Yes, so i do it in my projects also.



For this scenario, u need a function which checks which state have the current device serial. After u have the state ADB or Fastboot, u can call 2 different methods from my dll:

ADB
Code:
// This requires Root in any case!
ADB.Instance().Device.FlashImage(IDDevicePartition partition, string localPath, bool tmpToSD = true, int timeOut = -1);

Fastboot
Code:
Fastboot.Instance().Flash(IDDevicePartition partition, string file, int timeOut = -1);

NOTE
I will build a function which will do the work in the future, next release will include it. ;)


#EDIT:
Release it out :D
Code:
AndroidCtrl.Tools.General.CheckDeviceState(string deviceID);
// return is a IDDeviceState

Hope this helps ;)

Hey there! :D

Im using this for the output:

Code:
IDDeviceState state = General.CheckDeviceState(ADB.Instance().DeviceID);
            if (state == IDDeviceState.DEVICE)
            {
                ADB.Instance().Reboot(IDBoot.BOOTLOADER);
                CidDialog ciddiag = CidDialog.Instance;
                ciddiag.Add(Fastboot.Instance().OEM.GetIdentifierToken());
                ciddiag.Show();
            }
            else if (state == IDDeviceState.FASTBOOT)
            {
                CidDialog ciddiag = CidDialog.Instance;
                ciddiag.Add(Fastboot.Instance().OEM.GetIdentifierToken());
                ciddiag.Show();
            }

When I first press the button the output window shows. When I close it and press the button again it gives me this error - even if I wait a couple of seconds.

TXkkov1.png


Thanks for your help! :fingers-crossed::good:
 
  • Like
Reactions: k1ll3r8e

k1ll3r8e

Senior Member
Mar 4, 2011
725
672
Delmenhorst
HTC Sensation
HTC One (M9)
Hey there! :D

Im using this for the output:

Code:
IDDeviceState state = General.CheckDeviceState(ADB.Instance().DeviceID);
            if (state == IDDeviceState.DEVICE)
            {
                ADB.Instance().Reboot(IDBoot.BOOTLOADER);
                CidDialog ciddiag = CidDialog.Instance;
                ciddiag.Add(Fastboot.Instance().OEM.GetIdentifierToken());
                ciddiag.Show();
            }
            else if (state == IDDeviceState.FASTBOOT)
            {
                CidDialog ciddiag = CidDialog.Instance;
                ciddiag.Add(Fastboot.Instance().OEM.GetIdentifierToken());
                ciddiag.Show();
            }

When I first press the button the output window shows. When I close it and press the button again it gives me this error - even if I wait a couple of seconds.

Thanks for your help! :fingers-crossed::good:

Hey there ;)

oh yes, that is my fault :(

U have to add this to ur Window constructor "CidDialog(){}"
Code:
        this.Closing += WindowClosing;


And this is the "WindowClosing method"
Code:
        #region WindowClosing

        ///<summary>
        /// Clean exit
        ///</summary>
        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _instance = null;
        }
        #endregion

Explain

"CidDialog.Instance" create a new instance of the window. But on close the instance will not be set to null. So u can't open it again, coz the system think it's still open.

Hope this helps ;)

#EDIT:
I updated the examples 2 and 3 also.
 
Last edited:
  • Like
Reactions: squabbi

squabbi

Senior Member
Jul 20, 2012
1,744
1,600
Sydney
Hey there ;)

oh yes, that is my fault :(

U have to add this to ur Window constructor "CidDialog(){}"
Code:
        this.Closing += WindowClosing;


And this is the "WindowClosing method"
Code:
        #region WindowClosing

        ///<summary>
        /// Clean exit
        ///</summary>
        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _instance = null;
        }
        #endregion

Explain

"CidDialog.Instance" create a new instance of the window. But on close the instance will not be set to null. So u can't open it again, coz the system think it's still open.

Hope this helps ;)

#EDIT:
I updated the examples 2 and 3 also.
Thanks a lot man! Time to put everything in full motion! ?

Sent from my HTC One_M8 using Tapatalk
 
  • Like
Reactions: k1ll3r8e

Top Liked Posts

  • There are no posts matching your filters.
  • 30
    This (C# .NET 4.6|4.7|4.8) dll is a kind of ADB/Fastboot/(apk/zip) Signer - Framework, it provides a lot of predefined .NET functions to communicate with an Android device. It's designed to work in 1st case with any non-root device but you can also use it with any rooted device (A few functions requires root access).

    License
    This project is licensed under the Apache License Version 2.0.

    The latest build 7.1.46.0 is currently only via FTP, GoogleDrive or Dropbox available, the DevDB has currently some upload issues!

    The following (N)amespaces, (C)lasses & (I)nterfaces are currently available:

    • (N) ADB
      • (N) Binary (This is the binary/exe implementation of ADB)
        • (C) ADB (static Management Class for the ADBClient's)
        • (C) ADBClient (Implementation of IADBClient)
        • (C) Channel (Implementation of IChannel)
      • (N) Device
        • (N) BusyBox
          • (C) BusyBox
          • (C) Find
          • (C) Tar
        • (N) Dumpsys
          • (C) Battery
          • (C) Dumpsys
          • (I) IBattery
        • (N) Input
          • (I) IKeyEvent
          • (C) Input
          • (C) InputExtensions
          • (C) KeyEvent (Implementation of IKeyEvent)
        • (N) IO
          • (NS) Compression
            • (NS) BrotliSharp (Only available in .NET 4.6|4.7|4.8 - In .NET Standard >= 2.1 you have to use the native .NET implementation)
          • (C) ADirectoryInfo (Similar to .NET Directory/-Info)
          • (C) AFileInfo (Similar to .NET File/-Info)
          • (C) AFileStream (Similar to .NET FileStream)
          • (C) AFileSystemInfo (Similar to .NET FileSystemInfo, it's the abstract base for ADirectoryInfo & AFileInfo)
          • (C) AMountPointInfo (Similar to ADirectoryInfo & AFileInfo but only for mounts)
          • (C) FileSystemCache (A cache object for ADirectoryInfo & AFileInfo)
          • (I) IFileSystemCache (Interface for FileSystemCache)
          • (C) IO
          • (I) ITransferMessage
          • (C) MediaScanner (Manage the Android MediaScanner, useful after some file-transfers via ADB)
          • (C) Mount (Requires Root and manage the mounts)
          • (C) Stat (stat class for the ADB-Protocol)
          • (C) SyncStream (Base implementation of the ADB sync service. Utilized by AFileStream)
          • (C) TransferMessage
          • (C) UPath (Similar to .Net Path but for unix paths)
        • (N) Logcat
          • (I) ILogEntry
          • (C) Logcat
          • (C) LogEntry
        • (N) Manager
          • (C) ActivityManager
          • (I) IInstrumentation
          • (C) Instrumentation
          • (I) IPackage
          • (I) IPermission
          • (C) Manager
          • (C) Package
          • (C) PackageManager
          • (C) Permission
        • (N) Provider
          • (C) Contacts (Contacts provider)
          • (C) ContactsDataField
          • (C) ContactsEmail
          • (C) ContactsEvent
          • (C) ContactsGroup
          • (C) ContactsIdentity
          • (C) ContactsIM
          • (C) ContactsName
          • (C) ContactsNickname
          • (C) ContactsNote
          • (C) ContactsOrganization
          • (C) ContactsPhone
          • (C) ContactsPhoto
          • (C) ContactsPostalAddress
          • (C) ContactsRelation
          • (C) ContactsSipAddress
          • (C) ContactsWebsite
          • (I) IContactsDataField
          • (C) Provider
          • (C) Telephony (Telephony provider)
        • (N) Screen
          • (C) Framebuffer (Implementation of IFramebuffer)
          • (C) FramebufferInfo
          • (I) IFramebuffer (Interface of an RAW framebuffer)
          • (I) IFramebufferInfo
          • (I) IScreenDimension
          • (I) IScreenFocus
          • (C) Screen
          • (C) ScreenDimension
          • (C) ScreenFocus
        • (N) Shell
          • (I) IShell (Interface of an shell with in-/output abilities)
          • (C) Shell (Implementation of IShell)
        • (N) SQLite
          • (C) Options
          • (C) QueryTools
          • (C) SQLite3 (SQLite3 database connector)
        • (C) BuildProperties
        • (C) Daemon (Manage the daemon on the device)
        • (C) Device
        • (C) Forensics (ALFA-State)
        • (I) IUptime
        • (C) OpenRecoveryScript (Manage the OpenRecoveryScript)
        • (C) Phone (Start a call, dial a number, add a contact or send a sms)
        • (C) Su
        • (C) Uptime
        • (C) Wipe
      • (N) Shares
        • (C) Monitor (Implementation of IMonitor)
      • (N) Socket (This is the IP based implementation of ADB - Here is NO binary/exe required)
        • (C) ADB (static Management Class for the ADBClient's)
        • (C) ADBClient (Implementation of IADBClient)
        • (C) ADBSocket (IP based connector - Mimics the ADB-Server)
        • (C) Channel (Implementation of IChannel)
      • (C) ADBridge (Unified access to Binary.ADB and Socket.ADB)
      • (I) IADBClient (Interface for nearly all ADB commands)
      • (I) IChannel (Interface of an RAW data channel)
    • (N) Fastboot
      • (C) Backdoor (Some backdoor commands)
      • (C) Fastboot (static Management Class for the FastbootClient's)
      • (C) FastbootClient (Includes nearly all fastboot.exe commands)
      • (I) IFastbootClient (Interface for FastbootClient)
      • (C) Monitor (Implementation of IMonitor)
      • (C) OEM (Some OEM commands)
      • (C) Wipe
    • (N) ProcessModels
      • (C) General (Includes some predefined process models)
      • (I) IRealTimeBG (Interface of an background process with in-/output abilities)
      • (C) RealTimeBGExeV2 (Implementation of IRealTimeBG)
    • (N) Signer
      • (C) Signer (signapk.jar Interface)
    • (N) Tools
      • (C) CRC
      • (C) Deploy (Deploy the AAPT/ADB/Fastboot/Signer files needed by this dll)
      • (C) Hash
      • (C) Hex
      • (C) IMEI (Some helper to verify and rebuild a valid IMEI)
      • (C) ToolBox
    • (C) Cleanup (Delete the files/folders which were created by this dll)
    • (C) Config
    • (C) DeviceInfo (Basic device info, the return from "(Binary/Socket).ADB.Devices()" and "Fastboot.Devices()")
    • (I) IDeviceInfo (Interface for DeviceInfo)
    • (I) IMonitor (Interface for the ADB.Binary, ADB.Socket and Fastboot.Fastboot monitor)

    Special
    • Ready-To-Go MVVM's for WPF, XAML via my AndroidCtrlUI.dll
    • Multi-Device compatible, you can manage unlimited devices at the same time with this dll. Each device gets it's own instance. (Thread-Safe, the dll use lock() for critical sections)
    • UTF8-File/Folder Transfer you can transfer files/folders with containing special chars (ü, ö, ä, €, @, à, è, etc.)
    • On-the-fly Device to Device copy (Binary <-> Binary | Binary <-> Socket | Socket <-> Socket)
    • Device-Monitor, if activated, it will check every 10 sec. ADB & Fastboot for new connected devices and call an defined callback, if something changed. So your program get's an info if an device is connected or removed.
    • All Android key-events as (int)enum and the ability to send them as single or stack.

    Hint
    • You can use all ADB methods/commands via USB or W-Lan/Lan, if your Rom supports ADB via W-Lan/Lan (Settings/Developer Settings)
    • If you want to use all sub-classes of IADBClient with BusyBox instead of the Shell, you have to set IADBClient.UseBusyBox to true. This will tell the instance to use the BusyBox commands inside each method, if the device has BusyBox installed.

    Referenced .NET assembly's
    System
    System.Numerics
    System.XML

    Used Code-analysis rules:
    Basic & Advanced Microsoft-Rules for Accuracy
    Microsoft-managed minimum & recommended rules
    Microsoft Security Rules

    About the usage, the namespaces (ADB, Fastboot, Signer) have one basic instance. For example, ADB.Instance(), Fastboot.Instance(), Signer.Instance. As you can see ADB.Instance() and Fastboot.Instance() can have a parameter. This parameter is in both cases an (string) DeviceID, an IDeviceInfo or null, if you use for example null, both classes will return it's Selected client. If you use the DeviceID or the IDeviceInfo the return is a fresh instance of the client or the already created instance. So, in any case, before you call ADB/Fastboot.Instance(). Check with ADB/Fastboot.Devices() if you have a connected device. If so, use the IDeviceInfo object to start your device instance or simply pass the serial to the Instance(). All instances which you have created on this way, will be hold inside an Dictionary<string, ADBClient>, so you can configure each device instance to it's needs and call it when ever you need it. This is also the point where i say it's multi-device and multi-thread safe. Because, if you always use ADB/Fastboot.Instance() you can't reach the wrong device. Also, all classes using lock() for critical sections, because [MethodImpl(MethodImplOptions.Synchronized)] is not longer available under .NET Standard.

    If you have any wishes like new features, how-to's or something else, let me know! :cyclops:

    Tested OS
    Win Vista | 7 | 8 | 8.1 | 10 (32Bit/64Bit in VM-Ware)
    Win 7 | 8 | 8.1 | 10 (64Bit Native)
    Win XP is not longer supported by ADB! (But, if you have a old ADB binary, the dll will do it's job)

    Tested Devices
    Android Emulator some Versions (min. 2.x) in AVD
    Android x86
    HTC Sensation -/ XE (non-/rooted)
    HTC One M9 (non-/rooted)
    Huawei P9 Lite (VNS-L21,22,23,31,etc.) (non-/rooted)
    Huawei P10 Lite (WAS-LX1A,etc.) (non-/rooted)
    Samsung Galaxy 2-5 (non-/rooted)
    Samsung Galaxy S Plus (non-rooted)
    A few Samsung Tabs (non-/rooted)
    Google Pixel 4 (Android 11) (non-/rooted)

    Requirements
    Android: min. 2.x
    Platform: x86/x64 (Windows)
    Frameworks: min. .NET 4.6 and JRE (only for the Signer)
    (Installed ADB/Fastboot device driver)

    Download
    Mirror: XDA-DevDB (since 29.01.2019 no uploads possible)
    Mirror #1: My FTP (Build archiv)
    Mirror #2: GoogleDrive
    Mirror #3: Dropbox
    Each zip-archiv contains the AndroidCtrl.dll, its markup file AndroidCtrl.xml and the program debug database AndroidCtrl.pdb for .NET 4.6|4.7|4.8 and .NET Standard 2.1 (beta)

    Examples (Updated to dll version 7.1.46.0) (Updated in the next 24 h)
    Mirror: My FTP
    Mirror #1: GoogleDrive
    Mirror #2: Dropbox
    (Contains a simple exe and its source written in C# WPF)

    Source
    N/A (If you want to have a look at it, send me a PM or simply decompile it.)

    DO NOT MIRROR MY FILES! DO NOT COPY MY THREADS!

    XDA:DevDB Information
    AndroidCtrl.dll, Tool/Utility for the Android General

    Contributors
    k1ll3r8e, squabbi, Krystanos

    Version Information
    Status: Stable
    Current Stable Version: 7.1.46.0
    Stable Release Date: 2020-09-19

    Created 2016-07-24
    Last Updated 2020-09-19
    6
    Problems & Solutions

    1. Windows 8.x | 10.x

    NOTE
    If u use any callback functions, u have to invoke any UI-/ variable-interaction from an dispatcher like the following example:
    Code:
    public void Monitor(Added|Changed|Removed)EventHandler(object sender, Monitor(Added|Changed|Removed)EventArgs e)
    {
         App.Current.Dispatcher.Invoke((Action)delegate
         {
              // IDeviceInfo[] e.Devices
              // Here u can interact with an UI-Element or an variable in ur program code
         });
    }
    if u do it without dispatcher, u'll get an "Thread Exception".


    More examples coming soon...
    (If u need a specific example, just let me know, i'll try my best to provide one.)
    3
    Changelog

    DD.MM.YYYY | (A) = Added | (C) = Changed | (D) = Deleted | (F) = Fixed | (R) = Recoded | (U) Updated
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    26.07.2020 [7.0.46.0]
    (A) Some new Async overloads to the AFileInfo, AFileSystemInfo, ADirectoryInfo and AMountpointInfo.
    (F) A few little bugs

    01.02.2020 [6.7.46.0]
    (A) ADB.IADBClient{} (The old IADB interface)

    (A) ADB.Binary.ADB{} (The old ADB class - only the statics)
    (A) ADB.Binary.ADBClient{} (The old ADB class - without any statics)

    (A) ADB.Socket.ADB{} (The old ADB class - only the statics)
    (A) ADB.Socket.ADBClient{} (The old ADB class - without any statics)

    (A) ADB.Device.ADirectoryInfo{}
    (A) ADB.Device.AFileInfo{}
    (A) ADB.Device.AFileStream{}
    (A) ADB.Device.AMountPointInfo{}
    (A) ADB.Device.FileSystemCache{}
    (A) ADB.Device.IFileSystemCache{}

    (D) ADB.Device.Directories{}
    (D) ADB.Device.Files{}
    (D) ADB.Device.FileSystem{}
    (D) ADB.Device.FileSystemItem{}
    (D) ADB.Device.IFileSystemItem{}
    And everything related to those classes... Directories has been replaced with ADirectoryInfo, Files has been replaced with AFileInfo and FileSystem has been replaced with AMountPointInfo.

    31.05.2019 [6.0.46.0]
    (C) The Framework Version from 4.0 to 4.6
    (C) The versioning:
    6 = Major
    0 = Minor
    46 = Framework Version (4.6)
    0 = Hotfix

    (A) (int) ADB.Instance().Device.Screen.GetAutoBrightness()
    (A) (int) ADB.Instance().Device.Screen.GetBrightness()
    (A) (ScreenBrightnessMode) ADB.Instance().Device.Screen.GetBrightnessMode()
    (A) (ScreenRotation) ADB.Instance().Device.Screen.GetRotation()
    (A) (ScreenRotationMode) ADB.Instance().Device.Screen.GetRotationMode()
    (A) (bool) ADB.Instance().Device.Screen.SetBrightness(int brightness)
    (A) (bool) ADB.Instance().Device.Screen.SetBrightnessMode(ScreenBrightnessMode mode)
    (A) (bool) ADB.Instance().Device.Screen.SetRotation(ScreenRotation rotation)
    (A) (bool) ADB.Instance().Device.Screen.SetRotationMode(ScreenRotationMode mode)

    (D) ASDK (enum)
    (C From) (ASDK) ADB.Instance().Device.GetSDK()
    (C To) (int) ADB.Instance().Device. GetSDK()


    10.04.2019 [0.0.5.2]
    (A) A workaround for older SU binaries
    Code:
    // (Source ADB.Device.Su {})
    ///<summary>
    /// Enables an (W)ork(A)round for older SU binaries, which needs the command as an single argument.
    ///<para/>For example, the latest SU binaries support a syntax like [su -c id -u] where older binaries need [su -c "id -u"]
    ///<para/>If u deactivate this workaround by enabled <see cref="IADB.UseSu"/>, <see cref="IADB.UseSu"/> gets also disabled!
    ///<para/>This workaround is by default disabled
    ///<para/>Affected Methods:
    ///<para/><see cref="ShellCmd(string, int)"/>, <see cref="ShellCmd(string, CancellationToken, int)"/>, <see cref="ShellCmd(string, ShellDataEventHandler, int)"/>, <see cref="ShellCmd(string, ShellDataEventHandler, CancellationToken, int)"/>
    ///<para/><see cref="ShellCmdHRes(string, int)"/>, <see cref="ShellCmdHRes(string, CancellationToken, int)"/>, <see cref="ShellCmdHRes(string, ShellDataEventHandler, int)"/>, <see cref="ShellCmdHRes(string, ShellDataEventHandler, CancellationToken, int)"/>
    ///</summary>
    public bool WA_SingleArgument

    (A) A fix for unresponsive interactive shells. This happened to me on Lineage on my HTC Sensation, where the device sends an "resize" request... Sending a command in this state caused the command getting cut at the 1st byte, for example, u send "id -u" the delivered command was "d -u".

    (A) Added "feature" detection for Binary.ADB, now u can get the "features" of the device like: cmd, stat, stat_v2, shell, shell_v2, etc. in the "IChannel.Features".

    (R) Removed the last bit of code duplication and optimized some internal logic's. For example, the "Socket.IChannel" got a speed boost from ~1.920.000 bytes during an transfer of 14.400.000 bytes.


    06.03.2019 [0.0.5.1]
    (C) ADB.Device structure (see 1st post)
    (R) ADB.Device.Provider (Decreased the loading time of the contacts and their data)
    (D) AAPT completely

    Older Changes:

    16.02.2019 [0.0.4.2]
    (A) DNS lookup for ADB.Socket
    (R) Reduced code duplication

    07.02.2019 [0.0.4.1]
    (F) An issue inside the ADB.Binary, the problem was that "ADB.Devices()" returned nothing, if more than one device was connected. Reason for the issue was the "(int)IChannel.ReadHexLength()" function, there i read an Int16 but it was an UInt16 which caused an overflow.


    29.01.2019 [0.0.4.0]
    (U) AAPT, ADB, Fastboot binaries and the required dlls to the latest version (1.0.40)

    (A) ADB.ADBridge - Unified access to ADB.Binary and ADB.Socket
    (A) ADB.IADB - Interface for ADB-/Socket with nearly all ADB commands
    (A) ADB.IChannel - Interface of an ADB-/Socket RAW-data channel
    (A) ADB.IFramebuffer - Interface for the ADB-/Socket framebuffer
    (A) ADB.IShell - Interface for the ADB-/Socket Shell v1 & v2
    (A) IMonitor - Interface for the ADB-/Socket and Fastboot device-monitor

    (A) On-the-fly device to device copy (ADB.Binary <-> ADB.Binary | ADB.Binary <-> ADB.Socket | ADB.Socket <-> ADB.Socket)

    Reordered the ADB namespace... The old layout was:
    ADB - Binary based ADB
    ADB.Device - Device helper
    ADBSocket - Socket based ADB

    The new layout is:
    ADB - Main ADB
    ADB.Binary - Binary based ADB
    ADB.Device - Device helper
    ADB.Shared - Shared helper, extensions for ADB.Binary and ADB.Socket
    ADB.Socket - Socket based ADB

    Implemented the framebuffer for ADB.Binary and ADB.Socket (A ready-to-go Remote-Desktop is available via my AndroidCtrlUI.dll)

    09.04.2018 [0.0.3.1]
    This is a complete new version!
    -
    I added a lot of new stuff like the "CancellationToken" overload, the "MediaScanner" class and also some fine tunes to the "Screen" class, there u can now also get the Screen dimensions. Also a lot models like the old MemDumpxxx_4xx have been removed (we are now 4 versions higher and the outputs are not longer available or have changed to much).

    15.02.2018 [0.0.2.5]
    (F) A problem where a NULL exception was raised during directory parsing
    (F) A few UI freezes and applied a few tweaks to some logic's.

    (D) Tools.Icons {}
    (D) Tools.TrayNotify {}
    Reason for this is the upcoming compatibility to .NET Core. BUT, the functions are not lost, i added those not .NET Core compatible calls to the AndroidCtrlUI.dll... Because the UI dll will be never migrated to .NET Core.

    03.11.2017 [0.0.2.4]
    Nearly full new build
    -
    Sadly my notes are lost, based on a data loss on my Dev Environment...
    3
    Contacts & MMS/SMS

    Hey all together,

    this is only an status update!

    The next build includes:

    1. SQLite3 database connector | ADB.Instance().Device.SQLite3{}
    2. Contacts viewer (The writer will take a bit more time and a few testers, coz the table structure is different between each ROM...)
    3. MMS/SMS viewer (For the writer goes here the same as for the contacts, the tables are different between each ROM...)
    4. A few fixes, mainly on ProcessModels.General{}, coz there is a bug inside the ExecuteBGStack() method.

    ------------------------------------------------------------------------------------------------------------------------------------------
    New build is out!

    About the sms/mms & contact reader, all classes require root access on the device!
    -
    About the writer, i have currently a very alfa-state writer which i test currently on some AVD's... Hopefully the next version will include it!

    And as always, if u find some bugs pls report them! ;)

    Regards,
    Sebastian