Skip to content

Commit 59de944

Browse files
committed
Release V5.1.0: ADB Logcat viewer & improved specs dialog
1 parent 857ed6e commit 59de944

6 files changed

Lines changed: 608 additions & 122 deletions

File tree

CHANGELOG.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@ The changelog only includes what's new. To read feature descriptions, see [Featu
33

44
For the old changelog, see [README_OLD](https://github.com/codefl0w/QuickADB/blob/main/README_OLD.md).
55

6+
# [5.1.0] - 09.04.2026
7+
8+
### Added
9+
10+
- Live Logcat: live ADB logcat viewer with exporting, color coding and level filtering (Advanced)
11+
12+
### Fixed
13+
14+
- File Explorer: fix metadata parsing in special root directories
15+
16+
### Improved
17+
18+
- Device Info: seperate information into 3 categories: Hardware, Android, Device Specs
19+
- Device Info: add 8 new checks
620

721
# [5.0.0] - 05.04.2026
822

@@ -17,7 +31,6 @@ For the old changelog, see [README_OLD](https://github.com/codefl0w/QuickADB/blo
1731
- QuickADB: changed button order in the advanced section
1832
- QuickADB: update & improve credits
1933

20-
2134
### Improved
2235

2336
- Device Manager: include manufacturer names
@@ -42,12 +55,10 @@ For the old changelog, see [README_OLD](https://github.com/codefl0w/QuickADB/blo
4255
- GSI Flasher: Removed support for compressed GSI images (.img.gz, .img.xz)
4356
- Wireless ADB: fixed freezing on 15-second timeout
4457

45-
4658
### Improved
4759

4860
- File Explorer: Refactored code to eliminate duplication and redundancy
4961

50-
5162
# [4.0.2] - 14.03.2026
5263

5364
### Added
@@ -63,8 +74,6 @@ For the old changelog, see [README_OLD](https://github.com/codefl0w/QuickADB/blo
6374

6475
- File Explorer: Added many new viewable text file extensions
6576

66-
67-
6877
# [4.0.1] - 13.03.2026
6978

7079
### Added
@@ -79,8 +88,6 @@ For the old changelog, see [README_OLD](https://github.com/codefl0w/QuickADB/blo
7988

8089
- Boot Animation Creator: FFmpeg PATH detection
8190

82-
83-
8491
# [4.0.0] - 10.03.2026
8592

8693
### Added

main/adbfunc.py

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,15 @@ def run(self):
9797

9898
class DeviceInfoWorker(QThread):
9999
info_ready = pyqtSignal(str)
100+
SECTION_SEPARATOR = "=" * 36
100101

101102
def __init__(self, platform_tools_path):
102103
super().__init__()
103104
self.platform_tools_path = platform_tools_path
104105
self.adb_path = ToolPaths.instance().adb
105106

106107
def run(self):
107-
commands = self._get_device_commands()
108+
command_sections = self._get_device_commands()
108109
results = []
109110

110111
# Windows specific: Create a new process group and hide the console window.
@@ -115,50 +116,74 @@ def run(self):
115116
subprocess.CREATE_NO_WINDOW
116117
)
117118

118-
for label, command in commands.items():
119-
try:
120-
result = subprocess.run(
121-
command,
122-
stdout=subprocess.PIPE,
123-
stderr=subprocess.PIPE,
124-
text=True,
125-
shell=True,
126-
timeout=10,
127-
creationflags=creationflags
128-
)
129-
130-
if result.returncode == 0:
131-
output = result.stdout.strip()
132-
formatted_output = self._format_output(label, output)
133-
results.append(f"{label}: {formatted_output}")
134-
else:
135-
results.append(f"{label}: Error - {result.stderr.strip()}")
136-
137-
except subprocess.TimeoutExpired:
138-
results.append(f"{label}: Timeout")
139-
except Exception as e:
140-
results.append(f"{label}: Error - {str(e)}")
141-
142-
self.info_ready.emit("\n".join(results))
119+
for section_name, commands in command_sections:
120+
results.append(self.SECTION_SEPARATOR)
121+
results.append(section_name.upper())
122+
results.append(self.SECTION_SEPARATOR)
123+
124+
for label, command in commands:
125+
try:
126+
result = subprocess.run(
127+
command,
128+
stdout=subprocess.PIPE,
129+
stderr=subprocess.PIPE,
130+
text=True,
131+
shell=True,
132+
timeout=10,
133+
creationflags=creationflags
134+
)
135+
136+
if result.returncode == 0:
137+
output = result.stdout.strip()
138+
formatted_output = self._format_output(label, output)
139+
results.append(f"{label}: {formatted_output}")
140+
else:
141+
results.append(f"{label}: Error - {result.stderr.strip()}")
142+
143+
except subprocess.TimeoutExpired:
144+
results.append(f"{label}: Timeout")
145+
except Exception as e:
146+
results.append(f"{label}: Error - {str(e)}")
147+
148+
results.append("")
149+
150+
self.info_ready.emit("\n".join(results).strip())
143151

144152
def _get_device_commands(self):
145153
from util.devicemanager import DeviceManager
146154
serial_flag = DeviceManager.instance().serial_flag()
147155
adb_cmd = f'"{self.adb_path}" {serial_flag}'
148-
return {
149-
"Fingerprint": f"{adb_cmd} shell getprop ro.build.fingerprint",
150-
"Board": f"{adb_cmd} shell getprop ro.product.board",
151-
"Build ID": f"{adb_cmd} shell getprop ro.build.id",
152-
"Android Version": f"{adb_cmd} shell getprop ro.build.version.release",
153-
"Manufacturer": f"{adb_cmd} shell getprop ro.product.manufacturer",
154-
"Model": f"{adb_cmd} shell getprop ro.product.model",
155-
"Product Name": f"{adb_cmd} shell getprop ro.product.name",
156-
"Architecture": f"{adb_cmd} shell getprop ro.product.cpu.abi",
157-
"Resolution": f"{adb_cmd} shell wm size",
158-
"Total RAM": f"{adb_cmd} shell cat /proc/meminfo",
159-
"Total Storage": f"{adb_cmd} shell df",
160-
"Root Method": f"{adb_cmd} shell su -v"
161-
}
156+
return [
157+
("Hardware Info", [
158+
("Board", f"{adb_cmd} shell getprop ro.product.board"),
159+
("Chipset", f"{adb_cmd} shell getprop ro.hardware"),
160+
("Architecture", f"{adb_cmd} shell getprop ro.product.cpu.abi"),
161+
("Serial Number", f"{adb_cmd} shell getprop ro.serialno"),
162+
("Resolution", f"{adb_cmd} shell wm size"),
163+
("Total RAM", f"{adb_cmd} shell cat /proc/meminfo"),
164+
("Total Storage", f"{adb_cmd} shell df"),
165+
]),
166+
("Android Info", [
167+
("Android Version", f"{adb_cmd} shell getprop ro.build.version.release"),
168+
("SDK Version", f"{adb_cmd} shell getprop ro.build.version.sdk"),
169+
("Minimum SDK", f"{adb_cmd} shell getprop ro.build.version.min_supported_target_sdk"),
170+
("Build ID", f"{adb_cmd} shell getprop ro.build.id"),
171+
("Build Type", f"{adb_cmd} shell getprop ro.build.type"),
172+
("Build Date", f"{adb_cmd} shell getprop ro.build.date"),
173+
("Security Patch", f"{adb_cmd} shell getprop ro.build.version.security_patch"),
174+
("Treble Support", f"{adb_cmd} shell getprop ro.treble.enabled"),
175+
("A/B Support", f"{adb_cmd} shell getprop ro.build.ab_update"),
176+
("Dynamic Partitions", f"{adb_cmd} shell getprop ro.boot.dynamic_partitions"),
177+
("Fingerprint", f"{adb_cmd} shell getprop ro.build.fingerprint"),
178+
]),
179+
("Device Specs", [
180+
("Manufacturer", f"{adb_cmd} shell getprop ro.product.manufacturer"),
181+
("Model", f"{adb_cmd} shell getprop ro.product.model"),
182+
("Product Name", f"{adb_cmd} shell getprop ro.product.name"),
183+
("Carrier", f"{adb_cmd} shell getprop ro.carrier"),
184+
("Root Method", f"{adb_cmd} shell su -v"),
185+
]),
186+
]
162187

163188
def _format_output(self, label, output):
164189
# Human-readable sizes

main/quickadb.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from modules.payloaddumper import show_payload_dumper_window
2525
from modules.fossmarket import run_foss_market
2626
from modules.gsiflasher import GSIFlasherUI
27+
from modules.logcat import run_logcat_window
2728
from modules.magiskmanager import run_root_manager
2829
from modules.superdumper import show_super_img_dumper
2930
from modules.fileexplorer import ADBFileExplorer
@@ -64,15 +65,15 @@ class QuickADBApp(QMainWindow):
6465
# Main window
6566

6667
# Constants
67-
APP_VERSION = "V5.0.0"
68+
APP_VERSION = "V5.1.0"
6869
APP_SUFFIX = "Full"
6970
BUTTON_WIDTH = 150
7071
BUTTON_HEIGHT = 40
7172
GITHUB_URL = "https://github.com/codefl0w/QuickADB"
7273
XDA_URL = "https://xdaforums.com/t/new-quickadb-v4-adb-app-manager-file-explorer-gsi-flasher-and-more.4781847/"
7374
DONATE_URL = "https://buymeacoffee.com/fl0w" # please?
7475
CONTACT_URL = "https://codefl0w.xyz/contact"
75-
CHANGELOG_URL_TEMPLATE = "https://raw.githubusercontent.com/codefl0w/QuickADB/{ref}/res/whatsnew.html"
76+
CHANGELOG_URL_TEMPLATE = "https://raw.githubusercontent.com/codefl0w/QuickADB/refs/heads/main/res/whatsnew.html"
7677

7778
def __init__(self):
7879
super().__init__()
@@ -91,6 +92,7 @@ def __init__(self):
9192
self.partition_manager = None
9293
self.bootanim_creator_window = None
9394
self.foss_market_window = None
95+
self.logcat_window = None
9496

9597
# Init
9698
self.init_ui()
@@ -292,7 +294,6 @@ def _populate_commands_grid(self, commands: List[Tuple[str, Callable]], items_pe
292294
# --- Command Button Sections ---
293295

294296
def show_adb_commands(self): # If a command can be executed without needing a path (e.g. adb devices), it's executed directly. Otherwise, it's executed by adbfunc.py.
295-
"""Populates the grid with ADB command buttons."""
296297
commands = [
297298
("Check for Devices", lambda: self.run_command_async("adb devices", "Check for Devices", "ADB")),
298299
("Kill ADB Server", lambda: self.run_command_async("adb kill-server", "Kill ADB Server", "ADB")),
@@ -313,7 +314,6 @@ def show_adb_commands(self): # If a command can be executed without needing a pa
313314
self._populate_commands_grid(commands)
314315

315316
def show_fastboot_commands(self):
316-
"""Populates the grid with Fastboot command buttons."""
317317
commands = [
318318
("List Devices", lambda: self.run_command_async("fastboot devices", "List Fastboot Devices", "Fastboot")),
319319
("Get All Variables", lambda: self.run_command_async("fastboot getvar all", "Get All Variables", "Fastboot")),
@@ -334,7 +334,6 @@ def show_fastboot_commands(self):
334334
self._populate_commands_grid(commands)
335335

336336
def show_flashing_commands(self):
337-
"""Populates the grid with partition flashing command buttons."""
338337
partitions = [
339338
"boot", "init_boot", "system", "vbmeta", "vbmeta_system", "vbmeta_vendor",
340339
"cust", "userdata", "preloader (⚠️)", "logo", "super", "recovery", "dtbo",
@@ -347,13 +346,13 @@ def show_flashing_commands(self):
347346
self._populate_commands_grid(commands, items_per_row=4)
348347

349348
def show_advanced(self):
350-
"""Populates the grid with advanced tool buttons."""
351349
commands = [
352350
("Magisk Manager", self.launch_root_manager),
353351
("App Manager", self.launch_app_manager),
354352
("File Explorer", self.open_file_explorer),
355353
("GSI Flasher", self.open_gsi_flasher),
356354
("Partition Manager (#)", self.open_partition_manager),
355+
("Live Logcat", self.launch_logcat),
357356
("Dump super.img", self.launch_super_dumper),
358357
("Dump payload.bin", self.show_payload_dumper),
359358
]
@@ -428,6 +427,12 @@ def launch_root_manager(self):
428427
lambda: run_root_manager()
429428
)
430429

430+
def launch_logcat(self):
431+
self._focus_or_launch(
432+
'logcat_window',
433+
lambda: run_logcat_window()
434+
)
435+
431436
def _focus_or_launch(self, attr: str, factory: Callable):
432437
"""Raise the existing window if visible, otherwise create it via factory."""
433438
try:

0 commit comments

Comments
 (0)