SystemKit — Android Device & Utility Extension (Zero Permissions)
Hey everyone! Releasing SystemKit — a lightweight, all-in-one utility extension for App Inventor / Niotron that packs 200+ blocks covering almost everything an app needs to know about the device and OS, plus handy formatting and quick-action tools — all without a single <uses-permission> entry.
If you've ever needed battery %, RAM, screen size, dark mode state, network status, or just wanted to format bytes into "5.2 MB" without writing boilerplate math — this extension replaces a dozen small extensions with one clean, well-organized kit.
com.zebdroid.systemkit.aix (91.0 KB) New update
Highlights
Deep device & app info — model, manufacturer, Android version, SDK level, CPU, RAM, app version/package/install source, and info on other installed apps too
Battery & thermal monitoring — live battery level/charging events, thermal throttling status, power-saver detection
Display & Edge-to-Edge UI control — screen size/density/refresh rate, safe-area insets, status/nav bar color & transparency, immersive mode, one-line EdgeToEdge(true)
Audio environment — volume levels, ringer mode, headset/bluetooth detection, audio focus request/abandon
Privacy-safe connectivity — connection type, metered/roaming/airplane-mode checks, live connectivity events — no SSID, BSSID, MAC, or IP address ever exposed
App storage tools — app data/cache size, available/total storage, low-storage warning, one-tap cache clear
Developer utilities — bytes⇄KB/MB/GB/TB conversion, human-readable byte/duration formatting, number rounding & comma formatting, random ID/UUID generation, range mapping
Clipboard, haptics, sharing, quick actions — clipboard get/set, standard haptic feedback, share sheet, dial/email/map intents
Color utilities — hex⇄color conversion, contrast color, light/dark detection
One-tap diagnostics — GetDiagnosticsText() dumps a full, readable device/app snapshot — perfect for bug reports, straight to clipboard with CopyDiagnostics()
Why zero permissions matters
SystemKit is built with one hard rule: no sensitive identifiers, no background services, no polling. It never touches IMEI, MAC address, SSID, Android ID, or location — everything is read from APIs that are freely available to any app on the platform. That means:
-
No permission prompts to scare off users
-
No Play Store data-safety disclosures to fill out
-
No manifest changes needed on your end — just drop it in
Reliability
Every property-lookup block routes through a null-safe parser, so an empty or accidentally-null text block from your app will never crash SystemKit — it just returns a safe default ("UNKNOWN", -1, or false) instead of throwing an exception. All lifecycle-aware listeners (battery, thermal, network, audio focus) register and unregister cleanly with guards against double-registration, and StopAllMonitors() is provided as a one-call cleanup you can wire into Screen.Closing.
Full Block Reference
App Information
| Block |
Description |
AppName() |
App's display name. |
AppPackage() |
App's package name. |
AppVersionName() |
Version name (e.g. 1.2.3). |
AppVersionCode() |
Version code as a number. |
AppTargetSdk() |
Target SDK level. |
AppMinSdk() |
Minimum SDK level. |
IsAppDebug() |
True if this is a debug build. |
AppInstallSource() |
Where the app was installed from (Play Store, etc). |
RestartApp() |
Restarts the app from its launch screen. |
GetAppInfoJSON() |
All app info as one JSON string. |
Package Information (other installed apps)
| Block |
Description |
IsPackageInstalled(packageName) |
True if the package is installed. |
PackageName(packageName) |
Display name of another package. |
PackageVersionName(packageName) |
Version name of another package. |
PackageVersionCode(packageName) |
Version code of another package. |
IsPackageSystemApp(packageName) |
True if it's a system app. |
LaunchPackage(packageName) |
Launches another app. |
OpenPackageInfoScreen(packageName) |
Opens the system App Info screen for it. |
OpenPackageInPlayStore(packageName) |
Opens its Play Store listing. |
OpenPackage(packageName, action) |
Generic opener: LAUNCH / APP_INFO / PLAY_STORE. |
Device Information
| Block |
Description |
DeviceModel() |
Device model name (e.g. Pixel 8). |
DeviceManufacturer() |
Manufacturer (Google, Samsung, etc). |
DeviceBrand() |
Device brand. |
AndroidVersion() |
Android version (e.g. 14). |
AndroidSdkLevel() |
Android SDK/API level. |
DeviceSecurityPatch() |
Security patch date. |
CpuCoreCount() |
Number of CPU cores. |
Is64BitDevice() |
True if the CPU is 64-bit. |
GetDeviceInfoJSON() |
All device info as JSON. |
Memory
| Block |
Description |
TotalMemory() |
Total device RAM, in bytes. |
AvailableMemory() |
Free RAM, in bytes. |
UsedMemory() |
Used RAM, in bytes. |
MemoryUsagePercent() |
Memory usage as a percentage. |
IsLowMemory() |
True if the system is in a low-memory state. |
GetMemoryInfoJSON() |
All memory info as JSON. |
Display / Screen
| Block |
Description |
ScreenWidthPx() / ScreenHeightPx() |
Screen size in pixels. |
ScreenWidthDp() / ScreenHeightDp() |
Screen size in dp. |
ScreenDensity() / ScreenDensityDpi() |
Density scale / DPI. |
ScreenRefreshRate() |
Refresh rate in Hz. |
IsLandscape() / IsPortrait() |
Current orientation checks. |
IsTablet() |
True for large-screen devices. |
HasCutout() |
True if there's a notch/camera cutout. |
KeyboardHeightPx() |
On-screen keyboard height (0 if hidden). |
GetSafeArea() |
Full safe-area JSON: insets, cutout, keyboard height. |
GetDisplayInfoJSON() |
All display info as JSON. |
System UI / Edge-to-Edge
| Block |
Description |
EdgeToEdge(enable) |
One-line edge-to-edge toggle. |
SetStatusBarColor(color, lightIcons) |
Status bar color + icon style. |
SetNavBarColor(color, lightIcons) |
Nav bar color + icon style. |
SetStatusBarTransparent(bool) / SetNavBarTransparent(bool) |
Transparent bars. |
HideStatusBar() / ShowStatusBar() |
Toggle status bar. |
HideNavBar() / ShowNavBar() |
Toggle nav bar. |
SetStatusBarLightIcons(bool) / SetNavBarLightIcons(bool) |
Icon style only. |
EnterImmersiveMode() / ExitImmersiveMode() |
Sticky full-screen mode. |
ShowSystemBars() / ResetSystemUI() |
Restore defaults. |
KeepScreenOn(bool) |
Prevent sleep (video/reader screens). |
Orientation
| Block |
Description |
SetOrientation(mode) |
PORTRAIT / LANDSCAPE / SENSOR / UNSPECIFIED. |
GetOrientation() |
Current orientation. |
Appearance & Configuration
| Block |
Description |
IsDarkMode() |
True if system dark mode is on. |
FontScale() |
System font scale factor. |
Language() / Country() |
Locale language/country codes. |
CurrentTimeZone() |
Time zone ID (e.g. Asia/Kolkata). |
ScreenSizeClass() |
SMALL / NORMAL / LARGE / XLARGE. |
SmallestWidthDp() |
Smallest-width dp for responsive layouts. |
KeyboardType() |
QWERTY / 12KEY / NONE. |
NavigationType() |
DPAD / TRACKBALL / WHEEL / NONE. |
ConfigurationChanged(...) — event |
Fires on rotation/dark-mode/font/locale change. |
Battery & Thermal
| Block |
Description |
BatteryLevel() |
Battery percentage (0-100). |
IsCharging() |
True if charging. |
ChargingType() |
AC / USB / WIRELESS / NONE. |
BatteryTemperature() |
Battery temp in °C. |
IsBatteryLow() |
True at 15% or below. |
IsPowerSaverOn() |
True if battery saver is on. |
GetBatteryInfoJSON() |
Full battery info as JSON. |
BatteryChanged(...) — event |
Fires on level/charging change. |
StartBatteryMonitor() / StopBatteryMonitor() |
Control the listener. |
GetThermalStatus() |
NONE → SHUTDOWN thermal scale. |
ThermalStatusChanged(...) — event |
Fires on thermal state change (Android 10+). |
StartThermalMonitor() / StopThermalMonitor() |
Control the listener. |
Hardware Capabilities
| Block |
Description |
HasFeature(feature) |
Check CAMERA, FLASH, VIBRATOR, BLUETOOTH, NFC, BIOMETRIC, WIFI, ACCELEROMETER, and more. |
Audio
| Block |
Description |
MusicVolume() / MusicMaxVolume() |
Current & max media volume. |
RingerMode() |
SILENT / VIBRATE / NORMAL. |
IsMusicActive() |
True if media is currently playing. |
AudioOutputType() |
BLUETOOTH / WIRED_HEADSET / SPEAKER / EARPIECE. |
SetVolume(stream, level) |
Set MUSIC/RING/ALARM/NOTIFICATION volume. |
IsHeadsetConnected() / IsBluetoothAudioConnected() / IsWiredHeadsetConnected() |
Output detection. |
GetAudioInfoJSON() |
All audio info as JSON. |
RequestAudioFocus(type) / AbandonAudioFocus() |
Audio focus control. |
AudioFocusChanged(...) — event |
Fires on focus change. |
Connectivity (privacy-safe)
| Block |
Description |
ConnectionType() |
WIFI / CELLULAR / ETHERNET / VPN / OTHER. |
IsConnected() |
True if internet is reachable. |
IsInternetValidated() |
True if the connection has real internet access (not just captive-portal linked). |
IsMeteredConnection() / IsRoaming() / IsAirplaneModeOn() |
Connection state checks. |
NetworkChanged(...) — event |
Fires when connectivity is gained/lost. |
StartNetworkMonitor() / StopNetworkMonitor() |
Control the listener. |
No SSID, BSSID, MAC address, or IP is ever read or exposed — connection type/state only.
Intents, Sharing & Clipboard
| Block |
Description |
OpenSettings(type) |
Jump to any system settings screen. |
OpenUrl(url) / CanOpenUrl(url) |
Open/check a URL. |
OpenIntent(action, data) / CanHandleIntent(action, data) |
Generic safe intent opener. |
Share(text, title) / ShareUrl(url) / CanShare() |
System share sheet. |
SetClipboard(text) / GetClipboard() / HasClipboardText() / ClearClipboard() |
Clipboard control. |
DialNumber(phone) |
Opens dialer pre-filled (no CALL_PHONE permission needed). |
ComposeEmail(to, subject, body) |
Opens an email app pre-filled. |
OpenMap(query) |
Opens a location/search in a maps app. |
Haptics
| Block |
Description |
Vibrate(ms) |
Vibrate for a duration. |
VibratePattern(pattern) |
Vibrate with a custom pattern. |
CancelVibration() |
Stop vibration. |
Haptic(type) |
Standard system feedback: CLICK / LONG_PRESS / CONFIRM / REJECT. |
Device State
| Block |
Description |
IsScreenOn() |
True if screen is on & interactive. |
IsEmulator() / IsPhysicalDevice() |
Emulator detection. |
IsDeveloperModeOn() |
True if Developer Options is enabled. |
HasSecureLockScreen() |
True if a PIN/pattern/biometric lock is set. |
IsDeviceIdle() |
True during Doze mode. |
GetUptime() |
Milliseconds since boot. |
Multi-Window / Picture-in-Picture
| Block |
Description |
IsMultiWindow() / IsPictureInPicture() |
Mode checks. |
CanUsePictureInPicture() |
Support check. |
EnterPictureInPicture() |
Attempt to enter PiP. |
SetPictureInPictureAspectRatio(w, h) |
Set PiP aspect ratio. |
Secure Window
| Block |
Description |
SetSecureWindow(bool) |
Block screenshots/screen recording. |
IsSecureWindow() |
Check current state. |
Storage (app-owned, no storage permission)
| Block |
Description |
AppDataSize() / AppCacheSize() |
This app's own data/cache size, in bytes. |
AvailableStorage() / TotalStorage() |
Free/total device storage, in bytes. |
IsStorageLow() |
True if free space is under 10% or 50MB. |
HasExternalStorage() |
True if removable storage is available. |
ClearAppCache() |
Clears this app's cache folder only. |
Locale & Time Formats
| Block |
Description |
CurrencyCode() |
Locale currency code (USD, INR, etc). |
DecimalSeparator() |
Locale decimal separator character. |
FullLocale() |
Full locale identifier (e.g. en_US). |
LocaleScript() |
Script (e.g. Latn). |
DateFormatPattern() / TimeFormatPattern() |
Locale-native short patterns. |
Is24HourFormat() |
True if 24-hour clock is enabled. |
Compatibility
| Block |
Description |
IsApiAtLeast(api) |
Check minimum API level. |
GetApiLevel() |
Current API level. |
Supports(feature) |
Feature support check (EDGE_TO_EDGE, BIOMETRIC, PIP, etc). |
Color Utilities
| Block |
Description |
IsColorLight(color) |
Perceptual light/dark check. |
GetContrastColor(color) |
Auto black/white contrast pick. |
HexToColor(hex) / ColorToHex(color) / ColorToHexWithAlpha(color) |
Hex ⇄ color conversion. |
IsValidHexColor(hex) |
Validate a hex string. |
Data Size Formatting 
| Block |
Description |
BytesToKB/MB/GB/TB(bytes) |
Convert bytes to larger units. |
KBToBytes/MBToBytes/GBToBytes(value) |
Convert back to bytes. |
FormatBytes(bytes) |
Auto-unit human string, e.g. 5242880 → "5.0 MB". |
Time & Duration Formatting 
| Block |
Description |
CurrentTimestamp() |
Current Unix time in ms. |
FormatDuration(ms) |
Friendly duration, e.g. "1d 1h". |
DurationToClock(ms) |
Timer format, e.g. "02:15:30". |
FormatTimestamp(ms, pattern) |
Custom date/time pattern formatting. |
TimeAgo(ms) |
Relative time, e.g. "3 days ago". |
Number Formatting 
| Block |
Description |
RoundTo(number, decimals) |
Round to N decimal places. |
FormatNumberWithCommas(number, decimals) |
e.g. 1234567.5 → "1,234,567.50". |
FormatPercent(fraction, decimals) |
e.g. 0.256 → "25.6%". |
Clamp(number, min, max) |
Clamp within a range. |
MapRange(value, inMin, inMax, outMin, outMax) |
Remap a value between ranges. |
Random & Unique IDs 
| Block |
Description |
RandomInt(min, max) / RandomDecimal(min, max) |
Random numbers. |
RandomString(length) |
Random alphanumeric string. |
GenerateUUID() |
Random UUID string. |
Diagnostics
| Block |
Description |
GetDiagnostics(section) |
JSON snippet for one section (APP, DEVICE, BATTERY, etc). |
GetDiagnosticsJSON() |
Full diagnostics as JSON. |
GetDiagnosticsText() |
Full diagnostics, human-readable — great for bug reports. |
CopyDiagnostics() |
Copies diagnostics text straight to clipboard. |
StopAllMonitors() |
Stops all active listeners in one call — wire to Screen.Closing. |
Permissions
None. SystemKit adds zero <uses-permission> entries to your manifest. It's built entirely on APIs that are freely accessible to any Android app.
Compatibility
Works from Android 5.0 (API 21) upward, with graceful "UNKNOWN" / false fallbacks on OS versions where a specific feature (e.g. thermal status, PiP) isn't available — so a single build safely spans old and new devices.
As always, drop questions or bug reports on this thread — happy to help! 