diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 67dc4616..0191243f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -21,8 +21,8 @@ android {
applicationId = "com.sameerasw.essentials"
minSdk = 26
targetSdk = 36
- versionCode = 21
- versionName = "10.0"
+ versionCode = 22
+ versionName = "10.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
@@ -56,8 +56,8 @@ dependencies {
// Android 12+ SplashScreen API with backward compatibility attributes
implementation("androidx.core:core-splashscreen:1.0.1")
- // Force latest Material3 1.5.0-alpha10 for ToggleButton & ButtonGroup support
- implementation("androidx.compose.material3:material3:1.5.0-alpha10")
+ // Force latest Material3 1.5.0-alpha12 for ToggleButton & ButtonGroup support
+ implementation("androidx.compose.material3:material3:1.5.0-alpha12")
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
@@ -104,4 +104,8 @@ dependencies {
// SymSpell for word suggestions
implementation("com.darkrockstudios:symspellkt:3.4.0")
+
+ // Glance for Widgets
+ implementation("androidx.glance:glance-appwidget:1.1.0")
+ implementation("androidx.glance:glance-material3:1.1.0")
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0358cf2e..eff3fc25 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,10 +20,15 @@
+
+
+
+
@@ -248,6 +253,28 @@
android:resource="@xml/screen_off_widget_info" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt
index 6018a2a7..1015fff8 100644
--- a/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt
+++ b/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt
@@ -61,6 +61,7 @@ import com.sameerasw.essentials.ui.composables.configs.ButtonRemapSettingsUI
import com.sameerasw.essentials.ui.composables.configs.DynamicNightLightSettingsUI
import com.sameerasw.essentials.ui.composables.configs.SnoozeNotificationsSettingsUI
import com.sameerasw.essentials.ui.composables.configs.LocationReachedSettingsUI
+import com.sameerasw.essentials.ui.composables.configs.BatteriesSettingsUI
import com.sameerasw.essentials.viewmodels.CaffeinateViewModel
import com.sameerasw.essentials.viewmodels.MainViewModel
import com.sameerasw.essentials.viewmodels.StatusBarIconViewModel
@@ -597,6 +598,12 @@ class FeatureSettingsActivity : FragmentActivity() {
highlightSetting = highlightSetting
)
}
+ "Batteries" -> {
+ BatteriesSettingsUI(
+ viewModel = viewModel,
+ modifier = Modifier.padding(top = 16.dp)
+ )
+ }
// else -> default UI (optional cleanup)
}
}
diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt
index f00ca1b1..24f161ab 100644
--- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt
+++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt
@@ -107,6 +107,17 @@ class SettingsRepository(private val context: Context) {
const val KEY_KEYBOARD_PITCH_BLACK = "keyboard_pitch_black"
const val KEY_KEYBOARD_CLIPBOARD_ENABLED = "keyboard_clipboard_enabled"
+ // Essentials-AirSync Bridge
+ const val KEY_AIRSYNC_CONNECTION_ENABLED = "airsync_connection_enabled"
+ const val KEY_MAC_BATTERY_LEVEL = "mac_battery_level"
+ const val KEY_MAC_BATTERY_IS_CHARGING = "mac_battery_is_charging"
+ const val KEY_MAC_BATTERY_LAST_UPDATED = "mac_battery_last_updated"
+ const val KEY_AIRSYNC_MAC_CONNECTED = "airsync_mac_connected"
+
+ const val KEY_BLUETOOTH_DEVICES_BATTERY = "bluetooth_devices_battery"
+ const val KEY_SHOW_BLUETOOTH_DEVICES = "show_bluetooth_devices"
+ const val KEY_BATTERY_WIDGET_MAX_DEVICES = "battery_widget_max_devices"
+ const val KEY_BATTERY_WIDGET_BACKGROUND_ENABLED = "battery_widget_background_enabled"
}
// Observe changes
@@ -300,8 +311,8 @@ class SettingsRepository(private val context: Context) {
val wrapperMap = mutableMapOf>()
p.all.forEach { (key, value) ->
- // Skip app lists as requested
- if (key.endsWith("_selected_apps") || key == "freeze_auto_excluded_apps") {
+ // Skip app lists as requested, and stale data
+ if (key.endsWith("_selected_apps") || key == "freeze_auto_excluded_apps" || key.startsWith("mac_battery_") || key == "airsync_mac_connected") {
return@forEach
}
@@ -380,4 +391,28 @@ class SettingsRepository(private val context: Context) {
try { inputStream.close() } catch(e: Exception) {}
}
}
+
+ fun getBluetoothDevicesBattery(): List {
+ val json = prefs.getString(KEY_BLUETOOTH_DEVICES_BATTERY, null) ?: return emptyList()
+ val type = object : TypeToken>() {}.type
+ return try {
+ gson.fromJson(json, type) ?: emptyList()
+ } catch (e: Exception) {
+ emptyList()
+ }
+ }
+
+ fun saveBluetoothDevicesBattery(devices: List) {
+ val json = gson.toJson(devices)
+ putString(KEY_BLUETOOTH_DEVICES_BATTERY, json)
+ }
+
+ fun isBluetoothDevicesEnabled(): Boolean = getBoolean(KEY_SHOW_BLUETOOTH_DEVICES, false)
+ fun setBluetoothDevicesEnabled(enabled: Boolean) = putBoolean(KEY_SHOW_BLUETOOTH_DEVICES, enabled)
+
+ fun getBatteryWidgetMaxDevices(): Int = getInt(KEY_BATTERY_WIDGET_MAX_DEVICES, 8)
+ fun setBatteryWidgetMaxDevices(count: Int) = putInt(KEY_BATTERY_WIDGET_MAX_DEVICES, count)
+
+ fun isBatteryWidgetBackgroundEnabled(): Boolean = getBoolean(KEY_BATTERY_WIDGET_BACKGROUND_ENABLED, true)
+ fun setBatteryWidgetBackgroundEnabled(enabled: Boolean) = putBoolean(KEY_BATTERY_WIDGET_BACKGROUND_ENABLED, enabled)
}
diff --git a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt
index 2c99e1fe..10a235b2 100644
--- a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt
+++ b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt
@@ -509,6 +509,20 @@ object FeatureRegistry {
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
+ },
+
+ object : Feature(
+ id = "Batteries",
+ title = R.string.feat_batteries_title,
+ iconRes = R.drawable.rounded_battery_charging_60_24,
+ category = R.string.cat_tools,
+ description = R.string.feat_batteries_desc,
+ permissionKeys = listOf("BLUETOOTH_CONNECT", "BLUETOOTH_SCAN"),
+ showToggle = false,
+ hasMoreSettings = true
+ ) {
+ override fun isEnabled(viewModel: MainViewModel) = true
+ override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
}
)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt b/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt
index 8ade7d30..7a8d4501 100644
--- a/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt
+++ b/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt
@@ -42,6 +42,10 @@ fun initPermissionRegistry() {
PermissionRegistry.register("NOTIFICATION_LISTENER", R.string.feat_maps_power_saving_title)
PermissionRegistry.register("NOTIFICATION_LISTENER", R.string.feat_notification_lighting_title)
+ // Bluetooth permissions
+ PermissionRegistry.register("BLUETOOTH_CONNECT", R.string.feat_batteries_title)
+ PermissionRegistry.register("BLUETOOTH_SCAN", R.string.feat_batteries_title)
+
// Draw over other apps permission
PermissionRegistry.register("DRAW_OVER_OTHER_APPS", R.string.feat_notification_lighting_title)
diff --git a/app/src/main/java/com/sameerasw/essentials/services/NotificationListener.kt b/app/src/main/java/com/sameerasw/essentials/services/NotificationListener.kt
index 03df9ce8..0c1aab83 100644
--- a/app/src/main/java/com/sameerasw/essentials/services/NotificationListener.kt
+++ b/app/src/main/java/com/sameerasw/essentials/services/NotificationListener.kt
@@ -118,14 +118,14 @@ class NotificationListener : NotificationListenerService() {
val appSelected = isAppSelectedForNotificationLighting(sbn.packageName)
if (appSelected) {
val cornerRadius = try {
- prefs.getInt("edge_lighting_corner_radius", 20)
+ prefs.getFloat("edge_lighting_corner_radius", 20f)
} catch (e: ClassCastException) {
- prefs.getFloat("edge_lighting_corner_radius", 20f).toInt()
+ prefs.getInt("edge_lighting_corner_radius", 20).toFloat()
}
val strokeThickness = try {
- prefs.getInt("edge_lighting_stroke_thickness", 8)
+ prefs.getFloat("edge_lighting_stroke_thickness", 8f)
} catch (e: ClassCastException) {
- prefs.getFloat("edge_lighting_stroke_thickness", 8f).toInt()
+ prefs.getInt("edge_lighting_stroke_thickness", 8).toFloat()
}
val colorModeName = prefs.getString("edge_lighting_color_mode", NotificationLightingColorMode.SYSTEM.name)
val colorMode = NotificationLightingColorMode.valueOf(colorModeName ?: NotificationLightingColorMode.SYSTEM.name)
diff --git a/app/src/main/java/com/sameerasw/essentials/services/receivers/AirSyncBridgeReceiver.kt b/app/src/main/java/com/sameerasw/essentials/services/receivers/AirSyncBridgeReceiver.kt
new file mode 100644
index 00000000..792c0171
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/services/receivers/AirSyncBridgeReceiver.kt
@@ -0,0 +1,65 @@
+package com.sameerasw.essentials.services.receivers
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import com.sameerasw.essentials.data.repository.SettingsRepository
+import kotlinx.coroutines.launch
+
+class AirSyncBridgeReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ if (intent.action == "com.sameerasw.essentials.action.UPDATE_MAC_BATTERY") {
+ val pendingResult = goAsync()
+ val level = intent.getIntExtra("level", -1)
+ val isCharging = intent.getBooleanExtra("isCharging", false)
+ val lastUpdated = intent.getLongExtra("lastUpdated", System.currentTimeMillis())
+ val isConnected = intent.getBooleanExtra("isConnected", true)
+
+ android.util.Log.d("AirSyncBridge", "Received Mac status: level=$level, connected=$isConnected")
+
+ val repository = SettingsRepository(context)
+ if (repository.getBoolean(SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED)) {
+ repository.putInt(SettingsRepository.KEY_MAC_BATTERY_LEVEL, level)
+ repository.putBoolean(SettingsRepository.KEY_MAC_BATTERY_IS_CHARGING, isCharging)
+ repository.putLong(SettingsRepository.KEY_MAC_BATTERY_LAST_UPDATED, lastUpdated)
+ repository.putBoolean(SettingsRepository.KEY_AIRSYNC_MAC_CONNECTED, isConnected)
+
+ // Trigger widget update directly
+ val glanceAppWidgetManager = androidx.glance.appwidget.GlanceAppWidgetManager(context)
+ // Use IO dispatcher to avoid main thread jank/timeouts
+ kotlinx.coroutines.CoroutineScope(kotlinx.coroutines.Dispatchers.IO).launch {
+ try {
+ // Define keys matching BatteriesWidget
+ val KEY_AIRSYNC_ENABLED = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED)
+ val KEY_MAC_LEVEL = androidx.datastore.preferences.core.intPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_MAC_BATTERY_LEVEL)
+ val KEY_MAC_CONNECTED = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_AIRSYNC_MAC_CONNECTED)
+
+ val glanceIds = glanceAppWidgetManager.getGlanceIds(com.sameerasw.essentials.services.widgets.BatteriesWidget::class.java)
+
+ android.util.Log.d("AirSyncBridge", "Found ${glanceIds.size} widgets to update")
+
+ glanceIds.forEach { glanceId ->
+ androidx.glance.appwidget.state.updateAppWidgetState(context, glanceId) { prefs ->
+ prefs[KEY_AIRSYNC_ENABLED] = true
+ prefs[KEY_MAC_LEVEL] = level
+ prefs[KEY_MAC_CONNECTED] = isConnected
+ // Add charging state
+ val KEY_MAC_IS_CHARGING = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_MAC_BATTERY_IS_CHARGING)
+ prefs[KEY_MAC_IS_CHARGING] = isCharging
+ }
+
+ android.util.Log.d("AirSyncBridge", "Triggering update for glanceId: $glanceId")
+ com.sameerasw.essentials.services.widgets.BatteriesWidget().update(context, glanceId)
+ }
+ } catch (e: Exception) {
+ android.util.Log.e("AirSyncBridge", "Error updating widget", e)
+ } finally {
+ pendingResult.finish()
+ }
+ }
+ } else {
+ pendingResult.finish()
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidget.kt b/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidget.kt
new file mode 100644
index 00000000..a222f374
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidget.kt
@@ -0,0 +1,299 @@
+package com.sameerasw.essentials.services.widgets
+
+import android.content.Context
+import android.os.BatteryManager
+import androidx.glance.GlanceId
+import androidx.glance.GlanceModifier
+import androidx.glance.GlanceTheme
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.provideContent
+import androidx.glance.background
+import androidx.glance.layout.Alignment
+import androidx.glance.layout.Box
+import androidx.glance.layout.Column
+import androidx.glance.layout.Row
+import androidx.glance.layout.Spacer
+import androidx.glance.layout.fillMaxHeight
+import androidx.glance.layout.fillMaxSize
+import androidx.glance.layout.padding
+import androidx.glance.layout.width
+import androidx.glance.layout.height
+import androidx.glance.layout.fillMaxWidth
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.unit.dp
+import androidx.core.content.ContextCompat
+import androidx.core.graphics.ColorUtils
+import androidx.glance.Image
+import androidx.glance.ImageProvider
+import com.sameerasw.essentials.R
+
+class BatteriesWidget : GlanceAppWidget() {
+ override val sizeMode = androidx.glance.appwidget.SizeMode.Exact
+
+ override suspend fun provideGlance(context: Context, id: GlanceId) {
+ provideContent {
+ GlanceTheme {
+ val size = androidx.glance.LocalSize.current
+ val width = size.width
+ val height = size.height
+
+ // 1. Fetch Data
+ val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
+ val androidLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
+
+ val prefs = androidx.glance.currentState()
+
+ // Keys
+ val KEY_AIRSYNC_ENABLED = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED)
+ val KEY_MAC_LEVEL = androidx.datastore.preferences.core.intPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_MAC_BATTERY_LEVEL)
+ val KEY_MAC_CONNECTED = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_AIRSYNC_MAC_CONNECTED)
+ val KEY_SHOW_BLUETOOTH = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_SHOW_BLUETOOTH_DEVICES)
+ val KEY_BLUETOOTH_BATTERY = androidx.datastore.preferences.core.stringPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BLUETOOTH_DEVICES_BATTERY)
+
+ // State
+ val isAirSyncEnabled = prefs[KEY_AIRSYNC_ENABLED] ?: false
+ val macLevel = prefs[KEY_MAC_LEVEL] ?: -1
+ val isMacConnected = prefs[KEY_MAC_CONNECTED] ?: false
+ val isShowBluetoothEnabled = prefs[KEY_SHOW_BLUETOOTH] ?: false
+ val bluetoothJson = prefs[KEY_BLUETOOTH_BATTERY]
+
+ // Add key for Mac Charging
+ val KEY_MAC_IS_CHARGING = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_MAC_BATTERY_IS_CHARGING)
+ val macIsCharging = prefs[KEY_MAC_IS_CHARGING] ?: false
+
+ val KEY_MAX_DEVICES = androidx.datastore.preferences.core.intPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BATTERY_WIDGET_MAX_DEVICES)
+ val maxDevices = prefs[KEY_MAX_DEVICES] ?: 8
+
+ val KEY_BACKGROUND_ENABLED = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BATTERY_WIDGET_BACKGROUND_ENABLED)
+ val isBackgroundEnabled = prefs[KEY_BACKGROUND_ENABLED] ?: true
+
+ // Force recomposition when theme changes
+ val THEME_UPDATE_KEY = androidx.datastore.preferences.core.longPreferencesKey("theme_update_time")
+ val themeLastUpdated = prefs[THEME_UPDATE_KEY]
+
+ val showMac = isAirSyncEnabled && macLevel != -1 && isMacConnected
+ val hasBluetooth = isShowBluetoothEnabled && !bluetoothJson.isNullOrEmpty() && bluetoothJson != "[]"
+
+ // 2. Prepare List of Items to Display
+ val batteryItems = mutableListOf()
+
+ // Android Item
+ val isAndroidCharging = (batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS) == BatteryManager.BATTERY_STATUS_CHARGING)
+
+ val androidFinalStatusIcon = if (isAndroidCharging) R.drawable.rounded_flash_on_24
+ else if (androidLevel <= 15) R.drawable.rounded_battery_android_frame_alert_24
+ else null
+
+ batteryItems.add(
+ BatteryItemData(
+ level = androidLevel,
+ iconRes = R.drawable.rounded_mobile_24,
+ name = "Android",
+ statusIconRes = androidFinalStatusIcon
+ )
+ )
+
+ // Mac Item
+ if (showMac) {
+ val macStatusIcon = if (macIsCharging) R.drawable.rounded_flash_on_24
+ else if (macLevel <= 15) R.drawable.rounded_battery_android_frame_alert_24
+ else null
+ batteryItems.add(
+ BatteryItemData(
+ level = macLevel,
+ iconRes = R.drawable.rounded_laptop_mac_24,
+ name = "Mac",
+ statusIconRes = macStatusIcon
+ )
+ )
+ }
+
+ // Bluetooth Items
+ if (hasBluetooth) {
+ try {
+ val type = object : com.google.gson.reflect.TypeToken>() {}.type
+ val devices: List = com.google.gson.Gson().fromJson(bluetoothJson, type) ?: emptyList()
+
+ devices.forEach { device ->
+ val iconRes = when {
+ device.name.contains("watch", true) -> R.drawable.rounded_watch_24
+ device.name.contains("bud", true) ||
+ device.name.contains("pod", true) ||
+ device.name.contains("head", true) -> R.drawable.rounded_headphones_24
+ else -> R.drawable.rounded_bluetooth_24
+ }
+
+ // Bluetooth doesn't report charging usually, so just Low Battery check
+ val statusIcon = if (device.level <= 15) R.drawable.rounded_battery_android_frame_alert_24 else null
+
+ batteryItems.add(
+ BatteryItemData(
+ level = device.level,
+ iconRes = iconRes,
+ name = device.name,
+ statusIconRes = statusIcon
+ )
+ )
+ }
+ } catch (e: Exception) {
+ // ignore parsing error
+ }
+ }
+
+ val displayedItems = batteryItems.take(maxDevices)
+
+ // 3. Render
+ val context = androidx.glance.LocalContext.current
+ val systemConfig = android.content.res.Resources.getSystem().configuration
+
+ val forcedConfig = android.content.res.Configuration(context.resources.configuration)
+ forcedConfig.uiMode = systemConfig.uiMode
+
+ val configContext = context.createConfigurationContext(forcedConfig)
+
+ val basePrimary = GlanceTheme.colors.primary.getColor(configContext).toArgb()
+ val baseError = GlanceTheme.colors.error.getColor(configContext).toArgb()
+ val onSurface = GlanceTheme.colors.onSurface.getColor(configContext).toArgb()
+ val surfaceColor = GlanceTheme.colors.surface.getColor(configContext).toArgb()
+
+ val isNightMode = (systemConfig.uiMode and
+ android.content.res.Configuration.UI_MODE_NIGHT_MASK) ==
+ android.content.res.Configuration.UI_MODE_NIGHT_YES
+
+
+ val colors = ThemeColors(
+ primary = basePrimary,
+ error = baseError,
+ warning = android.graphics.Color.parseColor("#FFC107"),
+ track = ColorUtils.setAlphaComponent(onSurface, 30),
+ surface = surfaceColor,
+ iconTint = onSurface
+ )
+
+
+ val backgroundModifier = if (isBackgroundEnabled) {
+ GlanceModifier.background(GlanceTheme.colors.surface)
+ } else {
+ GlanceModifier.background(android.graphics.Color.TRANSPARENT)
+ }
+
+ if (displayedItems.size > 1) {
+ val isGridCapable = width >= 200.dp && height >= 140.dp
+
+ if (isGridCapable) {
+ // GRID / WRAPPING LAYOUT
+ val itemWidth = 72.dp
+ val columns = (width / itemWidth).toInt().coerceAtLeast(1)
+ val rows = displayedItems.chunked(columns)
+
+ Column(
+ modifier = GlanceModifier
+ .fillMaxSize()
+ .then(backgroundModifier)
+ .padding(8.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ rows.forEachIndexed { rowIndex, rowItems ->
+ Row(
+ modifier = GlanceModifier.fillMaxWidth().defaultWeight(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ rowItems.forEachIndexed { colIndex, item ->
+ BatteryItemBox(configContext, item, colors, modifier = GlanceModifier.defaultWeight().fillMaxHeight())
+ if (colIndex < rowItems.size - 1) {
+ Spacer(modifier = GlanceModifier.width(8.dp))
+ }
+ }
+ if (rowItems.size < columns) {
+ repeat(columns - rowItems.size) {
+ Spacer(modifier = GlanceModifier.defaultWeight().fillMaxHeight())
+ if (it < (columns - rowItems.size - 1)) Spacer(modifier = GlanceModifier.width(8.dp))
+ }
+ }
+ }
+ if (rowIndex < rows.size - 1) {
+ Spacer(modifier = GlanceModifier.height(8.dp))
+ }
+ }
+ }
+ } else {
+ // STANDARD SINGLE ROW LAYOUT
+ Row(
+ modifier = GlanceModifier
+ .fillMaxSize()
+ .then(backgroundModifier)
+ .padding(8.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ displayedItems.forEachIndexed { index, item ->
+ BatteryItemBox(configContext, item, colors, modifier = GlanceModifier.defaultWeight().fillMaxHeight())
+
+ if (index < displayedItems.size - 1) {
+ Spacer(modifier = GlanceModifier.width(8.dp))
+ }
+ }
+ }
+ }
+ } else {
+ // Single item layout (Big)
+ val item = displayedItems.firstOrNull() ?: BatteryItemData(androidLevel, R.drawable.rounded_mobile_24, "Android")
+
+ Box(
+ modifier = GlanceModifier
+ .fillMaxSize()
+ .then(backgroundModifier)
+ .padding(16.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ BatteryItemBox(configContext, item, colors, size = 512, modifier = GlanceModifier.fillMaxSize())
+ }
+ }
+ }
+ }
+ }
+
+ data class BatteryItemData(val level: Int, val iconRes: Int, val name: String, val statusIconRes: Int? = null)
+
+ data class ThemeColors(
+ val primary: Int,
+ val error: Int,
+ val warning: Int,
+ val track: Int,
+ val surface: Int,
+ val iconTint: Int
+ )
+
+ @androidx.compose.runtime.Composable
+ private fun BatteryItemBox(
+ context: Context,
+ item: BatteryItemData,
+ colors: ThemeColors,
+ size: Int = 300,
+ modifier: GlanceModifier = GlanceModifier
+ ) {
+ val ringColor = when {
+ item.level <= 10 -> colors.error
+ item.level < 20 -> colors.warning
+ else -> colors.primary
+ }
+
+ val icon = ContextCompat.getDrawable(context, item.iconRes)
+ val statusIcon = item.statusIconRes?.let { ContextCompat.getDrawable(context, it) }
+
+ val bitmap = com.sameerasw.essentials.utils.BatteryRingDrawer.drawBatteryWidget(
+ context, item.level, ringColor, colors.track, colors.iconTint, colors.surface, icon, statusIcon, size, size
+ )
+
+ Box(modifier = modifier, contentAlignment = Alignment.Center) {
+ Image(
+ provider = ImageProvider(bitmap),
+ contentDescription = "${item.name}: ${item.level}%",
+ modifier = GlanceModifier.fillMaxSize()
+ )
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidgetReceiver.kt b/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidgetReceiver.kt
new file mode 100644
index 00000000..fa840c98
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/services/widgets/BatteriesWidgetReceiver.kt
@@ -0,0 +1,98 @@
+package com.sameerasw.essentials.services.widgets
+
+import android.content.Context
+import android.content.Intent
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+import kotlinx.coroutines.launch
+
+class BatteriesWidgetReceiver : GlanceAppWidgetReceiver() {
+ override val glanceAppWidget: GlanceAppWidget = BatteriesWidget()
+
+ override fun onReceive(context: Context, intent: Intent) {
+ super.onReceive(context, intent)
+
+ // Always update widget on configuration changes (including theme changes)
+ if (intent.action == Intent.ACTION_CONFIGURATION_CHANGED) {
+ val glanceAppWidgetManager = androidx.glance.appwidget.GlanceAppWidgetManager(context)
+ kotlinx.coroutines.MainScope().launch {
+ try {
+ // Add a small delay to allow system theme colors to propagate
+ kotlinx.coroutines.delay(500)
+
+ val glanceIds = glanceAppWidgetManager.getGlanceIds(BatteriesWidget::class.java)
+ glanceIds.forEach { glanceId ->
+ // Update widget state with a timestamp to force re-render
+ androidx.glance.appwidget.state.updateAppWidgetState(context, glanceId) { prefs ->
+ val THEME_UPDATE_KEY = androidx.datastore.preferences.core.longPreferencesKey("theme_update_time")
+ prefs[THEME_UPDATE_KEY] = System.currentTimeMillis()
+ }
+ glanceAppWidget.update(context, glanceId)
+ }
+ } catch (e: Exception) {
+ android.util.Log.e("BatteriesWidget", "Error updating widget on config change", e)
+ }
+ }
+ return
+ }
+
+ if (intent.action == Intent.ACTION_POWER_CONNECTED ||
+ intent.action == Intent.ACTION_POWER_DISCONNECTED ||
+ intent.action == Intent.ACTION_BATTERY_LOW ||
+ intent.action == Intent.ACTION_BATTERY_OKAY ||
+ intent.action == "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED" ||
+ intent.action == android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED ||
+ intent.action == android.bluetooth.BluetoothDevice.ACTION_ACL_DISCONNECTED ||
+ intent.action == android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED ||
+ intent.action == android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE) {
+
+ // Trigger update
+ val glanceAppWidgetManager = androidx.glance.appwidget.GlanceAppWidgetManager(context)
+ kotlinx.coroutines.MainScope().launch {
+ // Check permissions first
+ val repository = com.sameerasw.essentials.data.repository.SettingsRepository(context)
+ val hasPerm = com.sameerasw.essentials.utils.PermissionUtils.hasBluetoothPermission(context)
+
+ val isEnabled = repository.isBluetoothDevicesEnabled()
+ val bluetoothDevices = if (isEnabled && hasPerm) {
+ com.sameerasw.essentials.utils.BluetoothBatteryUtils.getPairedDevicesBattery(context)
+ } else {
+ emptyList()
+ }
+
+
+ repository.saveBluetoothDevicesBattery(bluetoothDevices)
+
+ val maxDevices = repository.getBatteryWidgetMaxDevices()
+ val isBackgroundEnabled = repository.isBatteryWidgetBackgroundEnabled()
+
+ val devicesJson = com.google.gson.Gson().toJson(bluetoothDevices)
+
+ val glanceIds = glanceAppWidgetManager.getGlanceIds(BatteriesWidget::class.java)
+ glanceIds.forEach { glanceId ->
+ androidx.glance.appwidget.state.updateAppWidgetState(context, glanceId) { prefs ->
+ val KEY_SHOW = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_SHOW_BLUETOOTH_DEVICES)
+ val KEY_DATA = androidx.datastore.preferences.core.stringPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BLUETOOTH_DEVICES_BATTERY)
+ val KEY_MAX = androidx.datastore.preferences.core.intPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BATTERY_WIDGET_MAX_DEVICES)
+ val KEY_BG = androidx.datastore.preferences.core.booleanPreferencesKey(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_BATTERY_WIDGET_BACKGROUND_ENABLED)
+
+ prefs[KEY_SHOW] = isEnabled
+ prefs[KEY_DATA] = devicesJson
+ prefs[KEY_MAX] = maxDevices
+ prefs[KEY_BG] = isBackgroundEnabled
+ }
+ glanceAppWidget.update(context, glanceId)
+ }
+ }
+
+ try {
+ val requestIntent = Intent("com.sameerasw.airsync.action.REQUEST_MAC_BATTERY").apply {
+ setPackage("com.sameerasw.airsync")
+ }
+ context.sendBroadcast(requestIntent, "com.sameerasw.permission.ESSENTIALS_AIRSYNC_BRIDGE")
+ } catch (e: Exception) {
+ // Ignore if AirSync not installed/found
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteriesSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteriesSettingsUI.kt
new file mode 100644
index 00000000..27b69857
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteriesSettingsUI.kt
@@ -0,0 +1,196 @@
+package com.sameerasw.essentials.ui.composables.configs
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.ListItem
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import com.sameerasw.essentials.R
+import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer
+import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer
+import com.sameerasw.essentials.viewmodels.MainViewModel
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.mutableStateOf
+
+@OptIn(androidx.compose.material3.ExperimentalMaterial3ExpressiveApi::class)
+@Composable
+fun BatteriesSettingsUI(
+ viewModel: MainViewModel,
+ modifier: Modifier = Modifier
+) {
+ val context = LocalContext.current
+ val haptic = androidx.compose.ui.platform.LocalHapticFeedback.current
+ Column(
+ modifier = modifier.padding(16.dp),
+ horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally
+ ) {
+ RoundedCardContainer {
+ // AirSync Interaction
+ val isAirSyncInstalled = try {
+ context.packageManager.getPackageInfo("com.sameerasw.airsync", 0)
+ true
+ } catch (e: android.content.pm.PackageManager.NameNotFoundException) {
+ false
+ }
+
+ if (isAirSyncInstalled) {
+ ListItem(
+ leadingContent = {
+ androidx.compose.material3.Icon(
+ painter = androidx.compose.ui.res.painterResource(R.drawable.rounded_laptop_mac_24),
+ contentDescription = null
+ )
+ },
+ headlineContent = { Text(stringResource(R.string.connect_to_airsync)) },
+ supportingContent = { Text(stringResource(R.string.connect_to_airsync_summary)) },
+ trailingContent = {
+ androidx.compose.material3.Switch(
+ checked = viewModel.isAirSyncConnectionEnabled.value,
+ onCheckedChange = {
+ haptic.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.TextHandleMove)
+ viewModel.setAirSyncConnectionEnabled(it, context)
+ }
+ )
+ }
+ )
+ } else {
+ ListItem(
+ leadingContent = {
+ androidx.compose.material3.Icon(
+ painter = androidx.compose.ui.res.painterResource(R.drawable.rounded_laptop_mac_24),
+ contentDescription = null
+ )
+ },
+ headlineContent = { Text(stringResource(R.string.download_airsync)) },
+ supportingContent = { Text(stringResource(R.string.download_airsync_summary)) },
+ trailingContent = {
+ androidx.compose.material3.Button(
+ onClick = {
+ val intent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse("https://play.google.com/store/apps/details?id=com.sameerasw.airsync"))
+ intent.flags = android.content.Intent.FLAG_ACTIVITY_NEW_TASK
+ context.startActivity(intent)
+ }
+ ) {
+ Text("Download")
+ }
+ }
+ )
+ }
+
+ // Bluetooth Devices
+ val isBluetoothEnabled = viewModel.isBluetoothDevicesEnabled.value
+ val isPermissionGranted = viewModel.isBluetoothPermissionGranted.value
+
+ val launcher = androidx.activity.compose.rememberLauncherForActivityResult(
+ contract = androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions()
+ ) { permissions ->
+ val allGranted = permissions.values.all { it }
+ if (allGranted) {
+ viewModel.isBluetoothPermissionGranted.value = true
+ viewModel.setBluetoothDevicesEnabled(true, context)
+ }
+ }
+
+ ListItem(
+ leadingContent = {
+ androidx.compose.material3.Icon(
+ painter = androidx.compose.ui.res.painterResource(R.drawable.rounded_bluetooth_24),
+ contentDescription = null
+ )
+ },
+ headlineContent = { Text(stringResource(R.string.show_bluetooth_devices)) },
+ supportingContent = { Text(stringResource(R.string.show_bluetooth_devices_summary)) },
+ trailingContent = {
+ androidx.compose.material3.Switch(
+ checked = isBluetoothEnabled,
+ onCheckedChange = { enabled ->
+ haptic.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.TextHandleMove)
+ if (enabled) {
+ if (isPermissionGranted) {
+ viewModel.setBluetoothDevicesEnabled(true, context)
+ } else {
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
+ launcher.launch(
+ arrayOf(
+ android.Manifest.permission.BLUETOOTH_CONNECT,
+ android.Manifest.permission.BLUETOOTH_SCAN
+ )
+ )
+ } else {
+ viewModel.setBluetoothDevicesEnabled(true, context)
+ }
+ }
+ } else {
+ viewModel.setBluetoothDevicesEnabled(false, context)
+ }
+ }
+ )
+ }
+ )
+
+
+ // Limit Max Devices
+ ListItem(
+ leadingContent = {
+ androidx.compose.material3.Icon(
+ painter = androidx.compose.ui.res.painterResource(R.drawable.rounded_devices_24),
+ contentDescription = null
+ )
+ },
+ headlineContent = { Text(stringResource(R.string.limit_max_devices)) },
+ supportingContent = {
+ Column {
+ Text(stringResource(R.string.limit_max_devices_summary))
+ androidx.compose.material3.Slider(
+ value = viewModel.batteryWidgetMaxDevices.intValue.toFloat(),
+ onValueChange = {
+ val newInt = it.toInt()
+ if (newInt != viewModel.batteryWidgetMaxDevices.intValue) {
+ haptic.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.TextHandleMove)
+ viewModel.setBatteryWidgetMaxDevices(newInt, context)
+ }
+ },
+ valueRange = 1f..8f,
+ steps = 6
+ )
+ }
+ },
+ trailingContent = {
+ Text(
+ text = viewModel.batteryWidgetMaxDevices.intValue.toString(),
+ style = androidx.compose.material3.MaterialTheme.typography.bodyLarge
+ )
+ }
+ )
+
+ // Widget Background Toggle
+ ListItem(
+ leadingContent = {
+ androidx.compose.material3.Icon(
+ painter = androidx.compose.ui.res.painterResource(R.drawable.rounded_circles_24),
+ contentDescription = null
+ )
+ },
+ headlineContent = { Text(stringResource(R.string.widget_background_title)) },
+ supportingContent = { Text(stringResource(R.string.widget_background_summary)) },
+ trailingContent = {
+ androidx.compose.material3.Switch(
+ checked = viewModel.isBatteryWidgetBackgroundEnabled.value,
+ onCheckedChange = {
+ haptic.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.TextHandleMove)
+ viewModel.setBatteryWidgetBackgroundEnabled(it, context)
+ }
+ )
+ }
+ )
+ }
+ }
+}
diff --git a/app/src/main/java/com/sameerasw/essentials/utils/BatteryRingDrawer.kt b/app/src/main/java/com/sameerasw/essentials/utils/BatteryRingDrawer.kt
new file mode 100644
index 00000000..9a0591d2
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/utils/BatteryRingDrawer.kt
@@ -0,0 +1,167 @@
+package com.sameerasw.essentials.utils
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.RectF
+import android.graphics.drawable.Drawable
+import androidx.annotation.ColorInt
+import androidx.core.content.ContextCompat
+import androidx.core.graphics.drawable.toBitmap
+import com.sameerasw.essentials.R
+import kotlin.math.PI
+
+object BatteryRingDrawer {
+
+ fun drawBatteryWidget(
+ context: Context,
+ batteryLevel: Int,
+ @ColorInt ringColor: Int,
+ @ColorInt trackColor: Int,
+ @ColorInt iconTint: Int,
+ @ColorInt backgroundColor: Int,
+ deviceIcon: Drawable?,
+ statusIcon: Drawable?, // New parameter for charging/warning icon
+ width: Int,
+ height: Int
+ ): Bitmap {
+ val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+ val canvas = Canvas(bitmap)
+
+ val bgPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+ style = Paint.Style.FILL
+ color = backgroundColor
+ }
+ val centerX = width / 2f
+ val centerY = height / 2f
+
+ val strokeWidth = width * 0.11f
+ val padding = strokeWidth + (width * 0.05f)
+ val rect = RectF(
+ padding,
+ padding,
+ width - padding,
+ height - padding
+ )
+ val radius = rect.width() / 2f
+
+ val bubbleRadius = radius + (strokeWidth / 2f)
+
+ canvas.drawCircle(centerX, centerY, bubbleRadius, bgPaint)
+
+ // Config
+ val trackStrokeWidth = strokeWidth * 0.5f
+
+ val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+ style = Paint.Style.STROKE
+ strokeCap = Paint.Cap.ROUND
+ }
+
+ // Dynamic Gap: 60 degrees if status icon present, otherwise 0 (full circle)
+ val topGapDegrees = if (statusIcon != null) 60f else 0f
+
+ val capAngleDegrees = ((strokeWidth / 2f) / radius) * (180f / PI.toFloat())
+ val trackCapAngleDegrees = ((trackStrokeWidth / 2f) / radius) * (180f / PI.toFloat())
+
+ // Start drawing from: -90 (top) + half gap
+ val startAngle = -90f + (topGapDegrees / 2)
+ val totalAvailableSweep = 360f - topGapDegrees
+
+ val clampedLevel = batteryLevel.coerceIn(0, 100)
+
+ val progressSweepRaw = (clampedLevel / 100f) * totalAvailableSweep
+
+ // Visual Gap between segments
+ val segmentGapDegrees = 8f
+
+ // --- Draw Progress Arc ---
+ if (clampedLevel > 0) {
+ paint.strokeWidth = strokeWidth
+ paint.color = ringColor
+
+ val visualStart = startAngle
+ val visualEnd = if (clampedLevel >= 100) {
+ startAngle + totalAvailableSweep
+ } else {
+ (startAngle + progressSweepRaw - (segmentGapDegrees / 2)).coerceAtLeast(startAngle)
+ }
+
+ val visualSpan = visualEnd - visualStart
+
+ if (visualSpan > (capAngleDegrees * 2)) {
+ val drawStart = visualStart + capAngleDegrees
+ val drawSweep = (visualEnd - capAngleDegrees) - drawStart
+ if (drawSweep > 0) {
+ canvas.drawArc(rect, drawStart, drawSweep, false, paint)
+ }
+ } else {
+ if (visualSpan > 0) {
+ val center = visualStart + visualSpan/2
+ paint.style = Paint.Style.FILL
+ canvas.drawArc(rect, center, 0.1f, false, paint)
+ }
+ }
+ }
+
+ // --- Draw Track Arc (Filler) ---
+ if (clampedLevel < 100) {
+ paint.strokeWidth = trackStrokeWidth
+ paint.color = trackColor
+
+ val visualStart = (startAngle + progressSweepRaw + (segmentGapDegrees / 2))
+ .coerceAtMost(startAngle + totalAvailableSweep)
+
+ val visualEnd = startAngle + totalAvailableSweep
+
+ val visualSpan = visualEnd - visualStart
+ if (visualSpan > (trackCapAngleDegrees * 2)) {
+ val drawStart = visualStart + trackCapAngleDegrees
+ val drawSweep = (visualEnd - trackCapAngleDegrees) - drawStart
+ if (drawSweep > 0) {
+ canvas.drawArc(rect, drawStart, drawSweep, false, paint)
+ }
+ }
+ }
+
+ // --- Draw Status Icon (Top) if present ---
+ if (statusIcon != null) {
+ val smallIconRadius = strokeWidth * 1.3f
+ val centerX = width / 2f
+ val iconCenterY = rect.top
+
+ val smallIconPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+ style = Paint.Style.FILL
+ color = ringColor
+ }
+ // Bubble Background
+ canvas.drawCircle(centerX, iconCenterY, smallIconRadius, smallIconPaint)
+
+ val iconSize = (smallIconRadius * 1.5f).toInt()
+ val iconLeft = (centerX - iconSize / 2).toInt()
+ val iconTop = (iconCenterY - iconSize / 2).toInt()
+ statusIcon.setBounds(iconLeft, iconTop, iconLeft + iconSize, iconTop + iconSize)
+ statusIcon.setTint(backgroundColor)
+ statusIcon.draw(canvas)
+ }
+
+ // --- Draw Center Device Icon ---
+ val innerPadding = strokeWidth * 1.5f
+ deviceIcon?.let {
+ val availableWidth = (rect.width() - innerPadding * 2).toInt()
+ val availableHeight = (rect.height() - innerPadding * 2).toInt()
+ val iconBitmap = it.toBitmap(availableWidth, availableHeight)
+
+ val iconLeft = (width - iconBitmap.width) / 2f
+ val iconTop = (height - iconBitmap.height) / 2f
+
+ val iconPaint = Paint(Paint.ANTI_ALIAS_FLAG)
+ val colorFilter = android.graphics.PorterDuffColorFilter(iconTint, android.graphics.PorterDuff.Mode.SRC_IN)
+ iconPaint.colorFilter = colorFilter
+
+ canvas.drawBitmap(iconBitmap, iconLeft, iconTop, iconPaint)
+ }
+
+ return bitmap
+ }
+}
diff --git a/app/src/main/java/com/sameerasw/essentials/utils/BluetoothBatteryUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/BluetoothBatteryUtils.kt
new file mode 100644
index 00000000..392dde1c
--- /dev/null
+++ b/app/src/main/java/com/sameerasw/essentials/utils/BluetoothBatteryUtils.kt
@@ -0,0 +1,53 @@
+package com.sameerasw.essentials.utils
+
+import android.annotation.SuppressLint
+import android.bluetooth.BluetoothDevice
+import android.bluetooth.BluetoothManager
+import android.bluetooth.BluetoothProfile
+import android.content.Context
+import androidx.annotation.Keep
+
+object BluetoothBatteryUtils {
+
+ @Keep
+ data class BluetoothDeviceBattery(
+ val name: String,
+ val level: Int,
+ val address: String
+ )
+
+ @SuppressLint("MissingPermission")
+ fun getPairedDevicesBattery(context: Context): List {
+ val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+ val adapter = bluetoothManager?.adapter ?: return emptyList()
+
+ if (!adapter.isEnabled) return emptyList()
+
+ val devices = try {
+ adapter.bondedDevices
+ } catch (e: SecurityException) {
+ return emptyList()
+ }
+
+ val batteryList = mutableListOf()
+
+ devices.forEach { device ->
+ try {
+ // Method 1: Reflection on device.getBatteryLevel()
+ // This is a hidden API, widely supported on many devices.
+ // Returns -1 if not supported or not connected.
+ val method = device.javaClass.getMethod("getBatteryLevel")
+ val level = method.invoke(device) as Int
+
+ if (level != -1) {
+ val name = device.alias ?: device.name ?: "Unknown"
+ batteryList.add(BluetoothDeviceBattery(name, level, device.address))
+ }
+ } catch (e: Exception) {
+ // Reflection might fail or permission issues
+ }
+ }
+
+ return batteryList
+ }
+}
diff --git a/app/src/main/java/com/sameerasw/essentials/utils/PermissionUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/PermissionUtils.kt
index 98f4ed0d..83edafc4 100644
--- a/app/src/main/java/com/sameerasw/essentials/utils/PermissionUtils.kt
+++ b/app/src/main/java/com/sameerasw/essentials/utils/PermissionUtils.kt
@@ -151,4 +151,19 @@ object PermissionUtils {
fun canWriteSystemSettings(context: Context): Boolean {
return Settings.System.canWrite(context)
}
+
+ fun hasBluetoothPermission(context: Context): Boolean {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ androidx.core.content.ContextCompat.checkSelfPermission(
+ context,
+ android.Manifest.permission.BLUETOOTH_CONNECT
+ ) == android.content.pm.PackageManager.PERMISSION_GRANTED &&
+ androidx.core.content.ContextCompat.checkSelfPermission(
+ context,
+ android.Manifest.permission.BLUETOOTH_SCAN
+ ) == android.content.pm.PackageManager.PERMISSION_GRANTED
+ } else {
+ true
+ }
+ }
}
diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt
index 73321ae0..b6a05e12 100644
--- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt
+++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt
@@ -86,6 +86,9 @@ class MainViewModel : ViewModel() {
val isLocationPermissionGranted = mutableStateOf(false)
val isBackgroundLocationPermissionGranted = mutableStateOf(false)
val isFullScreenIntentPermissionGranted = mutableStateOf(false)
+ val isBluetoothPermissionGranted = mutableStateOf(false)
+
+ val isBluetoothDevicesEnabled = mutableStateOf(false)
@@ -144,6 +147,15 @@ class MainViewModel : ViewModel() {
val isKeyboardSelected = mutableStateOf(false)
val isWriteSettingsEnabled = mutableStateOf(false)
+ // AirSync Bridge
+ val isAirSyncConnectionEnabled = mutableStateOf(false)
+ val macBatteryLevel = mutableIntStateOf(-1)
+ val isMacBatteryCharging = mutableStateOf(false)
+ val macBatteryLastUpdated = mutableStateOf(0L)
+ val isMacConnected = mutableStateOf(false)
+ val batteryWidgetMaxDevices = mutableIntStateOf(8)
+ val isBatteryWidgetBackgroundEnabled = mutableStateOf(true)
+
private var lastUpdateCheckTime: Long = 0
private lateinit var settingsRepository: SettingsRepository
private lateinit var updateRepository: UpdateRepository
@@ -185,6 +197,12 @@ class MainViewModel : ViewModel() {
SettingsRepository.KEY_KEYBOARD_ALWAYS_DARK -> isKeyboardAlwaysDark.value = settingsRepository.getBoolean(key, false)
SettingsRepository.KEY_KEYBOARD_PITCH_BLACK -> isKeyboardPitchBlack.value = settingsRepository.getBoolean(key, false)
SettingsRepository.KEY_KEYBOARD_CLIPBOARD_ENABLED -> isKeyboardClipboardEnabled.value = settingsRepository.getBoolean(key, true)
+ SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED -> isAirSyncConnectionEnabled.value = settingsRepository.getBoolean(key)
+ SettingsRepository.KEY_MAC_BATTERY_LEVEL -> macBatteryLevel.intValue = settingsRepository.getInt(key, -1)
+ SettingsRepository.KEY_MAC_BATTERY_IS_CHARGING -> isMacBatteryCharging.value = settingsRepository.getBoolean(key, false)
+ SettingsRepository.KEY_MAC_BATTERY_LAST_UPDATED -> macBatteryLastUpdated.value = settingsRepository.getLong(key, 0L)
+ SettingsRepository.KEY_AIRSYNC_MAC_CONNECTED -> isMacConnected.value = settingsRepository.getBoolean(key, false)
+ SettingsRepository.KEY_BATTERY_WIDGET_MAX_DEVICES -> batteryWidgetMaxDevices.intValue = settingsRepository.getInt(key, 8)
}
}
@@ -215,6 +233,8 @@ class MainViewModel : ViewModel() {
isKeyboardSelected.value = PermissionUtils.isKeyboardSelected(context)
isWriteSettingsEnabled.value = PermissionUtils.canWriteSystemSettings(context)
+ isBluetoothPermissionGranted.value = PermissionUtils.hasBluetoothPermission(context)
+
isRootAvailable.value = com.sameerasw.essentials.utils.RootUtils.isRootAvailable()
isRootPermissionGranted.value = com.sameerasw.essentials.utils.RootUtils.isRootPermissionGranted()
@@ -304,6 +324,17 @@ class MainViewModel : ViewModel() {
isKeyboardPitchBlack.value = settingsRepository.getBoolean(SettingsRepository.KEY_KEYBOARD_PITCH_BLACK, false)
isKeyboardClipboardEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_KEYBOARD_CLIPBOARD_ENABLED, true)
+ isAirSyncConnectionEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED)
+ macBatteryLevel.intValue = settingsRepository.getInt(SettingsRepository.KEY_MAC_BATTERY_LEVEL, -1)
+ isMacBatteryCharging.value = settingsRepository.getBoolean(SettingsRepository.KEY_MAC_BATTERY_IS_CHARGING, false)
+ macBatteryLastUpdated.value = settingsRepository.getLong(SettingsRepository.KEY_MAC_BATTERY_LAST_UPDATED, 0L)
+ isMacConnected.value = settingsRepository.getBoolean(SettingsRepository.KEY_AIRSYNC_MAC_CONNECTED, false)
+
+ isBluetoothDevicesEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_SHOW_BLUETOOTH_DEVICES, false)
+ isBluetoothDevicesEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_SHOW_BLUETOOTH_DEVICES, false)
+ batteryWidgetMaxDevices.intValue = settingsRepository.getBatteryWidgetMaxDevices()
+ isBatteryWidgetBackgroundEnabled.value = settingsRepository.isBatteryWidgetBackgroundEnabled()
+
isScreenLockedSecurityEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_SCREEN_LOCKED_SECURITY_ENABLED)
isDeviceAdminEnabled.value = isDeviceAdminActive(context)
@@ -741,6 +772,48 @@ class MainViewModel : ViewModel() {
settingsRepository.putBoolean(SettingsRepository.KEY_KEYBOARD_CLIPBOARD_ENABLED, enabled)
}
+ fun setAirSyncConnectionEnabled(enabled: Boolean, context: Context) {
+ if (enabled) {
+ // Request permission if not granted, though it's signature level so should be automatic if signed correctly
+ // but we can check it
+ }
+ isAirSyncConnectionEnabled.value = enabled
+ settingsRepository.putBoolean(SettingsRepository.KEY_AIRSYNC_CONNECTION_ENABLED, enabled)
+ }
+
+ fun setBluetoothDevicesEnabled(enabled: Boolean, context: Context) {
+ isBluetoothDevicesEnabled.value = enabled
+ settingsRepository.setBluetoothDevicesEnabled(enabled)
+
+ // Trigger widget update to fetch data immediately
+ val intent = Intent(context, com.sameerasw.essentials.services.widgets.BatteriesWidgetReceiver::class.java).apply {
+ action = android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
+ }
+ context.sendBroadcast(intent)
+ }
+
+ fun setBatteryWidgetMaxDevices(count: Int, context: Context) {
+ batteryWidgetMaxDevices.intValue = count
+ settingsRepository.setBatteryWidgetMaxDevices(count)
+
+ // Trigger widget update
+ val intent = Intent(context, com.sameerasw.essentials.services.widgets.BatteriesWidgetReceiver::class.java).apply {
+ action = android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
+ }
+ context.sendBroadcast(intent)
+ }
+
+ fun setBatteryWidgetBackgroundEnabled(enabled: Boolean, context: Context) {
+ isBatteryWidgetBackgroundEnabled.value = enabled
+ settingsRepository.setBatteryWidgetBackgroundEnabled(enabled)
+
+ // Trigger widget update
+ val intent = Intent(context, com.sameerasw.essentials.services.widgets.BatteriesWidgetReceiver::class.java).apply {
+ action = android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
+ }
+ context.sendBroadcast(intent)
+ }
+
private fun isAccessibilityServiceEnabled(context: Context): Boolean {
@@ -777,6 +850,16 @@ class MainViewModel : ViewModel() {
}
}
+ fun requestBluetoothPermission(activity: androidx.activity.ComponentActivity) {
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
+ androidx.core.app.ActivityCompat.requestPermissions(
+ activity,
+ arrayOf(Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN),
+ 1005
+ )
+ }
+ }
+
fun requestNotificationPermission(activity: androidx.activity.ComponentActivity) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
androidx.core.app.ActivityCompat.requestPermissions(
diff --git a/app/src/main/res/drawable/rounded_battery_android_frame_bolt_24.xml b/app/src/main/res/drawable/rounded_battery_android_frame_bolt_24.xml
new file mode 100644
index 00000000..2d28b67b
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_battery_android_frame_bolt_24.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/rounded_flash_on_24.xml b/app/src/main/res/drawable/rounded_flash_on_24.xml
new file mode 100644
index 00000000..61ba59e5
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_flash_on_24.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/rounded_laptop_mac_24.xml b/app/src/main/res/drawable/rounded_laptop_mac_24.xml
new file mode 100644
index 00000000..b8c1fd91
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_laptop_mac_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/rounded_mobile_24.xml b/app/src/main/res/drawable/rounded_mobile_24.xml
new file mode 100644
index 00000000..8fb43901
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_mobile_24.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/rounded_watch_24.xml b/app/src/main/res/drawable/rounded_watch_24.xml
new file mode 100644
index 00000000..305c0ba6
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_watch_24.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ach/strings.xml b/app/src/main/res/values-ach/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-ach/strings.xml
+++ b/app/src/main/res/values-ach/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index d6b7016f..50ec600e 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -81,10 +81,10 @@
Abort with screen off
Timeout Presets
Select available durations for QS tile
- 5m
- 10m
- 30m
- 1h
+ 5min
+ 10min
+ 30min
+ 1std
∞
Starting in %1$ds…
%1$s remaining
@@ -270,6 +270,12 @@
Kachel in den Schnelleinstellungen zum Umschalten des Tonmodus
\'Wach bleiben\'-Kachel
Kachel in den Schnelleinstellungen zum Umschalten des Wachbleibens
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Auslöser-Automatisierung
Eine Aktion planen, die bei einer Beobachtung ausgelöst wird
@@ -389,6 +395,8 @@
Geschützte Einstellungen umschreiben
Benötigt für Statusleisten-Symbole und Sicherheit bei Bildschirmsperre
Benötigt, um das Nachtlicht zu aktivieren. Über ADB oder Root gewähren.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay-Berechtigung
Benötigt, um das Benachrichtigungslicht auf dem Bildschirm anzuzeigen
Geräteadministrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Suche nach Werkzeugen, Modifikationen und Anpassungen
Suche
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Reisealarm aktiv
- %1$s verbleibend
+ %1$s verbleibend (%2$d%%)
Reisefortschritt
Zeigt die Entfernung zum Zielort in Echtzeit an
Ziel in der Nähe
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 49850d64..2828ec5d 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -787,8 +801,8 @@
Required to wake your device upon arrival. Tap to grant.
%1$d m
%1$.1f km
- Travel alarm active
- %1$s remaining
+ Travel Alarm active
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 5ce97d95..21fea74e 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -44,7 +44,7 @@
Écran allumé
Volume Haut
Volume Bas
- Basculer la lampe-torche
+ Allumer/éteindre la lampe-torche
Jouer/mettre en pause le média
Prochain média
Média précédent
@@ -270,6 +270,12 @@
Bloc \"Réglages rapides\" pour changer le mode de sonnerie
Bloc \"rester allumé\"
Bloc \"Réglages rapides\" pour activer/désactiver le maintien de l\'écran allumé
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Déclencher une automatisation
Prévoir une action à déclencher lors d\'une observation
@@ -389,6 +395,8 @@
Modifier les paramètres de sécurité
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Permission de superposition
Required to display the notification lighting overlay on the screen
Administrateur de l\'appareil
@@ -402,8 +410,8 @@
Ensure the service is not killed by the system to save power.
Essentials
- Geler
- Gelée
+ Gel d\'applis
+ Gel d\'applis
DIY
Applications désactivées
Do It Yourself
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Rechercher
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination à proximité
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 020bc7f7..7b5279c5 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -271,6 +271,12 @@ Le app bloccate richiederanno l\'autenticazione all\'apertura. L\'app rimarrà s
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -390,6 +396,8 @@ Le app bloccate richiederanno l\'autenticazione all\'apertura. L\'app rimarrà s
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -413,6 +421,12 @@ Le app bloccate richiederanno l\'autenticazione all\'apertura. L\'app rimarrà s
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -789,7 +803,7 @@ Le app bloccate richiederanno l\'autenticazione all\'apertura. L\'app rimarrà s
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -824,4 +838,11 @@ Le app bloccate richiederanno l\'autenticazione all\'apertura. L\'app rimarrà s
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index fcb832b5..3fc26021 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -73,22 +73,22 @@
通知を発信
アプリに通知の表示を許可する
権限を付与
- Caffeinate Active
- Active
- Screen is being kept awake
- Ignore battery optimization
- Recommended for reliable service on some devices
- Abort with screen off
- Timeout Presets
- Select available durations for QS tile
- 5m
- 10m
- 30m
- 1h
- ∞
- Starting in %1$ds…
- %1$s remaining
- Persistent notification for Caffeinate
+ カフェイン 動作中
+ 動作中
+ 画面を起動したままにしています
+ バッテリーの最適化を無視
+ 一部のデバイスで信頼性の高いサービスが提供される場合に推奨されます
+ 画面をオフにして停止
+ タイムアウト時間
+ クイック設定タイルでオンにしたときの動作時間
+ 5分
+ 10分
+ 30分
+ 1時間
+ 無限
+ あと%1$dで開始します…
+ 残り%1$s
+ カフェインの永続的な通知
ダイナミックナイトモードを有効にする
ナイトモードを無効にするアプリ
@@ -166,10 +166,10 @@
アプリフリーズ
ライト点滅
スリープしない
- Essentials Keyboard
- English (US)
- Active
- Inactive
+ Essentials キーボード
+ English (US) 英語
+ 動作中
+ 停止中
NFC
オン
オフ
@@ -270,13 +270,19 @@
クイック設定タイルでサイレントモードを切り替える
スリープしないタイル
クイック設定タイルで充電中にスリープするかを切り替える
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
- Trigger Automation
- Schedule an action to trigger on an observation
- State Automation
- Schedule an action to execute based on the state of a condition in and out
- New Automation
- Edit Automation
+ トリガーオートメーション
+ トリガーされるアクションをスケジュールする
+ ステータスオートメーション
+ 条件の状態に基づいて実行するアクションをスケジュールする
+ 新規作成
+ オートメーションの編集
リンクアクション
リンクの処理を複数のアプリで行う
システム通知をスヌーズ
@@ -302,8 +308,8 @@
特定の通信世代でモバイルデータを非表示にします
全てのアイコンをリセット
ステータスバーアイコンの表示をデフォルトに戻す
- Abort Caffeinate with screen off
- Automatically turn off Caffeinate when manually locking the device
+ 画面をオフにしてカフェインを停止する
+ デバイスをロックしたあと、カフェインの動作を停止させる
ライトのスタイル
ストローク、グロー、スピナーなどに選択
角の半径
@@ -353,113 +359,121 @@
音量ボタンの機能を再設定する機能を使うか切り替える
リマップ触覚フィードバック
再設定されたボタンを押したときの感触フィードバック
- Flashlight toggle
+ フラッシュライト
フラッシュライトを音量ボタンで切り替える
- Enable Dynamic Night Light
- Master switch for dynamic night light
- Enable app lock
- Master toggle for app locking
- Select locked apps
- Choose which apps require authentication
- Pick apps to freeze
- Choose which apps can be frozen
- Freeze all apps
- Immediately freeze all picked apps
- Freeze when locked
- Freeze selected apps when device locks
- Freeze delay
- Delay before freezing after locking
+ ダイナミックナイトモードを有効にする
+ ダイナミックナイトモードを使うか切り替える
+ アプリロックを有効にする
+ アプリロックをするか切り替える
+ ロックするアプリを選択
+ 認証が必要なアプリを選択
+ フリーズさせるアプリを選択
+ フリーズできるアプリを選択
+ すべてのアプリをフリーズ
+ 選択したアプリ全てを直ちにフリーズする
+ 画面ロック時にフリーズ
+ デバイスがロックされたときに選択したアプリをフリーズする
+ タイミング
+ 画面をロックしてから何分後にアプリをロックするか
Shizuku
- Required for advanced commands. Install Shizuku from the Play Store.
- Install Shizuku
+ 高度なコマンドを実行するのに必要です。PlayストアからShizukuをインストールしてください。
+ Shizukuをインストール
Shizuku permission
- Required to run power-saving commands while maps is navigating.
- Root Access
- Permissions required for system actions using Root privileges.
- Notification Listener
- Required to detect when Maps is navigating.
- Required to detect new notifications
- Required to detect and snooze notifications
- Accessibility Service
- Required for App Lock, Screen off widget and other features to detect interactions
- Required to trigger notification lighting on new notifications
- Required to intercept hardware button events
- Needed to monitor foreground applications.
- Write Secure Settings
- Required for Statusbar icons and Screen Locked Security
- Needed to toggle Night Light. Grant via ADB or root.
- Overlay Permission
- Required to display the notification lighting overlay on the screen
- Device Administrator
- Required to hard-lock the device (disabling biometrics) on unauthorized access attempts
- Grant Permission
- Copy ADB
- Check
- Enable in Settings
- How to grant
- Battery Optimization
- Ensure the service is not killed by the system to save power.
+ マップパワーセービングモードを実行するのに必要です。
+ Rootアクセス
+ Root権限を使用したシステムアクションをするのに必要です。
+ 通知アクセス
+ マップがナビ中であることを検知するために必要です。
+ 新しい通知を検知するために必要
+ 通知を検知してスヌーズするために必要
+ アクセシビリティサービス
+ アプリロック、画面オフウィジェット、その他の機能でインタラクションを検知するために必要
+ 新しい通知を検知して通知ライトを動作させるために必要
+ ハードウェアボタンイベントをインターセプトするために必要
+ フォグラウンドアプリを検知するために必要です。
+ セキュア設定を書き込む
+ ステータスバーアイコンの編集とロック画面のセキュリティに必要
+ ナイトモードの切り替えに必要です。ADBまたはRoot権限で許可してください。
+ システム設定の変更
+ 明るさの自動調整やその他のシステム設定を切り替えるのに必要
+ 他のアプリの上に重ねて表示
+ 画面に通知ライトオーバーレイを表示するために必要
+ デバイス管理アプリ
+ 不正アクセスに対してデバイスをハードロック(生体認証の無効化)するのに必要
+ 権限を付与
+ コマンドをコピー
+ チェック
+ 設定で有効にする
+ 付与の方法
+ バッテリーの最適化を無視
+ バッテリー節約のためにシステムがアプリを強制終了しないようにしてください。
Essentials
- Freeze
- Frozen
+ フリーズ
+ フリーズ
DIY
- Disabled apps
- Do It Yourself
+ アプリを無効化
+ 自分で作る
- Keyboard Setup
- Enable in settings
- Switch to Essentials
- Keyboard is active and ready!
- Search for Tools, Mods and Tweaks
- Search
- Stop
- Search
+ キーボードセットアップ
+ 設定で有効にする
+ Essentialsに切り替える
+ キーボードは準備済みです!
+ 有効
+ 無効
+ 明るさの自動調整
+ 画面の明るさを自動調整するか切り替える
+ マップパワーセービング
+ マップパワーセービングモードを切り替える
+ ツール、Mod、微調整を検索
+ 検索
+ 停止
+ 検索
- Back
- Done
- Preview
- Help Guide
- Update Available
- Download
+ 戻る
+ 完了
+ プレビュー
+ ヘルプガイド
+ アップデートがあります
+ ダウンロード
- Do It Yourself
- Something experimental is brewing here. Stay tuned for automations and advanced mods.
- Coming Soon
- Trigger
- State
- Action
- In
- Out
- Automation
- Screen Off
- Screen On
- Device Unlock
- Charger Connected
- Charger Disconnected
- Charging
- Screen On
- Vibrate
- Show Notification
- Remove Notification
- Turn On Flashlight
- Turn Off Flashlight
- Toggle Flashlight
- Dim Wallpaper
- This action requires Shizuku or Root to adjust system wallpaper dimming.
- Select Trigger
- Select State
- Select Action
- In Action
- Out Action
- Cancel
- Save
- Edit
- Delete
- Enable
- Disable
- Automation Service
+ 自分で作る
+ 実験的な何かが進行中です。自動化や高度なMODについては、今後の発表をお楽しみに。
+ Comingsoon
+ トリガー
+ ステータス
+ アクション
+ イン
+ アウト
+ オートメーション
+ 画面オフ
+ 画面オン
+ ロック解除
+ 充電器を接続
+ 充電器を切断
+ 充電中
+ 画面点灯中
+ バイブレーション
+ 通知を表示
+ 通知を削除
+ フラッシュライトを点灯
+ フラッシュライトを消灯
+ フラッシュライトを切り替える
+ 暗い壁紙
+ このアクションでは、壁紙を暗くするために、ShizukuまたはRootが必要です。
+ トリガーを選択
+ ステータスを選択
+ アクションを選択
+ 条件と合うとき
+ 条件と合わないとき
+ キャンセル
+ 保存
+ 編集
+ 削除
+ 有効
+ 無効
+ オートメーションサービス
Automations Active
Monitoring system events for your automations
@@ -525,84 +539,84 @@
- alert
- - light
- - torch
+ - ライト
+ - トーチ
- - light
- - torch
- - pulse
- - notification
+ - ライト
+ - トーチ
+ - 点滅
+ - 通知
- - tile
- - qs
- - awake
+ - タイル
+ - クイック設定
+ - 起動
- - awake
- - developer
- - power
- - charge
+ - 起動
+ - 開発者
+ - 電源
+ - 充電
- - glow
- - notification
- - led
+ - グロー
+ - 通知
+ - LED
- - round
- - shape
- - edge
+ - 円
+ - シャープ
+ - エッジ
- - secure
- - privacy
- - biometric
- - face
- - fingerprint
+ - セキュア
+ - プライバシー
+ - 生体認証
+ - 顔
+ - 指紋
- - sound
- - accessibility
- - hear
+ - 音
+ - アクセシビリティ
+ - 聞く
- - stay
- - on
- - timeout
+ - 待つ
+ - オン
+ - タイムアウト
- - touch
- - wake
- - display
+ - タッチ
+ - 起動
+ - 画面
- - usb
- - file
- - transfer
- - mtp
+ - USB
+ - ファイル
+ - ファイル転送
+ - MTP
- - timer
- - wait
- - timeout
+ - タイマー
+ - 待機
+ - タイムアウト
- Always dark theme
- Pitch black theme
- Clipboard History
+ 常にダークテーマ
+ ブラックテーマにする
+ クリップボード履歴
- - list
- - picker
- - selection
+ - リスト
+ - ピッカー
+ - 選択
- - animation
- - visual
- - look
+ - アニメーション
+ - ビジュアル
+ - ロック
- - quiet
+ - 静かな
- ignore
- filter
@@ -683,53 +697,53 @@
Subtle
Double
Click
- Tick
+ ティック
- Turn Off
- Flashlight Brightness
+ オフにする
+ ライトの明るさ
- %1$s Settings
- Confirm identity to open settings
- Authentication Required
- Confirm your identity
- Unlock phone to change network settings
+ %1$s設定
+ 設定を開くには認証してください
+ 認証リクエスト
+ 本人確認
+ ネットワーク設定を変更するには、ロックを解除してください
- Developed by %1$s\nwith ❤\uFE0F from \uD83C\uDDF1\uD83C\uDDF0
- Website
- Contact
+ 制作者 %1$s\n with ❤\uFE0F from \uD83C\uDDF1\uD83C\uDDF0
+ ウェブサイト
+ お問い合わせ
Telegram
- Support
- Other Apps
+ サポート
+ その他のアプリ
AirSync
ZenZero
Canvas
Tasks
Zero
- Developer Avatar
+ 開発者のアバター
- Help & Guides
- Need more support? Reach out,
- Collapse
- Expand
- Support Group
- Email
- Send email
- No email app available
+ ヘルプ&ガイド
+ さらにサポートが必要ですか?
+ 崩壊
+ 拡大
+ サポートグループ
+ メール
+ メールを送る
+ メールアプリがありません
Step %1$d Image
- Accessibility, Notification and Overlay permissions
- You may get this access denied message if you try to grant sensitive permissions such as accessibility, notification listener or overlay permissions. To grant it, check the steps below.
- 1. Go to app info page of Essentials.
- 2. Open the 3-dot menu and select \'Allow restricted settings\'. You may have to authenticate with biometrics. Once done, Try to grant the permission again.
+ アクセシビリティ、通知、他のアプリの上に重ねて表示権限
+ アクセシビリティ、通知の読み取り、オーバーレイなどの機密性の高い権限を付与しようとすると、このアクセス拒否メッセージが表示されることがあります。付与するには以下の手順を確認してください。
+ 1. Essentialsのアプリ情報に移動する。
+ 2. 3点メニューを開き、「制限付き設定を許可」を選択します。生体認証が必要になる場合があります。完了したら、再度権限を付与してください。
Shizuku
- Shizuku is a powerful tool that allows apps to use system APIs directly with ADB or root permissions. It is required for features like Maps min mode, App Freezer. And willa ssist granting some permissions such as WRITE_SECURE_SETTINGS. \n\nBut the Play Store version of Shizuku might be outdated and will probably be unusable on recent Android versions so in that case, please get the latest version from the github or an up-to-date fork of it.
- Maps power saving mode
- This feature automatically triggers Google Maps power saving mode which is currently exclusive to the Pixel 10 series. A community member discovered that it is still usable on any Android device by launching the maps minMode activity with root privileges. \n\nAnd then, I had it automated with Tasker to automatically trigger when the screen turns off during a navigation session and then was able to achieve the same with just runtime Shizuku permissions. \n\nIt is intended to be shown over the AOD of Pixel 10 series so because of that, you may see an occasional message popping up on the display that it does not support landscape mode. That is not avoidable by the app and you can ignore.
- Silent sound mode
- You may have noticed that the silent mode also triggers DND. \n\nThis is due to how the Android implemented it as even if we use the same API to switch to vibrate mode, it for some reason turns on DND along with the silent mode and this is not avoidable at this moment. :(
- What is freeze?
- Pause and stay away from app distractions while saving a little bit of power preventing apps running in the background. Suitable for rarely used apps. \n\nNot recommended for any communication services as they will not notify you in an emergency unless you unfreeze them. \n\nHighly advised to not freeze system apps as they can lead to system instability. Proceed with caution, You were warned. \n\nInspired by Hail <3
- Are app lock and screen locked security actually secure?
+ Shizukuは、アプリがADBまたはRoot権限でシステムAPIを直接使用できるようにする強力なツールです。マップパワーセービングモード、アプリフリーズなどの機能に必要です。また、WRITE_SECURE_SETTINGSなどの一部の権限の付与を支援します。\n\nただし、Playストア版のShizukuは古く、最近のAndroidバージョンでは使用できない可能性があります。その場合は、GitHubまたは最新バージョンのフォークを入手してください。
+ マップパワーセービングモード
+ この機能は、現在Pixel 10シリーズ限定のGoogleマップ省電力モードを自動的に起動します。コミュニティメンバーが、Root権限でマップの minMode アクティビティを起動することで、どのAndroidデバイスでも使用できることを発見しました。\n\nその後、Taskerを使って自動化し、ナビゲーション中に画面がオフになったときに自動的に起動できるように設定し、ランタイムのShizuku権限だけで同じことを実現できました。\n\nPixel 10シリーズの常時表示ディスプレイ上に表示されていることを想定しているため、横向きモードをサポートしていないというメッセージがディスプレイに表示されている場合があります。これはアプリでは回避できないため、無視できます。
+ サイレントモード
+ サイレントモードでもDNDが起動することにお気づきかもしれません。\n\nこれはAndroidの実験方法によるもので、同じAPIを使用してバイブレーションモードに切り替えても、何らかの理由でサイレントモードと同時にDNDがオンになり、現時点では回避できません。:(
+ フリーズとは?
+ 一時停止してアプリを邪魔することなく、バックグラウンドでアプリが動作しないようにすることで、電力を少し節約できます。あまり使用しないアプリに適しています。\n\nSNSなどの通信サービスは、フリーズを解除しない限り、緊急時に通知されないため、推奨されません。\n\nシステムアプリをフリーズするとシステムが不安定になる可能性があるため、フリーズしないことを強くおすすめします。注意して操作してください。警告しましたからね!\n\nInspired by Hail <3
+ アプリロックとロック画面セキュリティは本当に安全ですか?
Absolutely not. \n\nAny 3rd party application can not 100% interfere with regular device interactions and even the app lock is only an overlay above selected apps to prevent interacting with them. There are workarounds and it is not foolproof. \n\nSame goes with the screen locked security feature which detects someone trying to interact with the network tiles which for some reason are still accessible for anyone on Pixels. So if they try hard enough they might still be able to change them and especially if you have a flight mode QS tile added, this app can not prevent interactions with it. \n\nThese features are made just as experiments for light usage and would never recommend as strong security and privacy solutions. \n\nSecure alternatives:\n - App lock: Private Space and Secure folder on Pixels and Samsung\n - Preventing mobile networks access: Make sure your theft protection and offline/ power off find my device settings are on. You may look into Graphene OS as well.
Statusbar icons
You may notice that even after resetting the statusbar icons, Some icons such as device rotation, wired headphone icons may stay visible. This is due to how the statubar blacklist is implemented in Android and how your OEM may have customized them. \nYou may need further adjustments. \n\nAlso not all icon visibility options may work as they depend on the OEM implementations and availability.
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index b5f2102e..8d28e05a 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-si/strings.xml
+++ b/app/src/main/res/values-si/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 8e2f74e7..2828ec5d 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -270,6 +270,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
Schedule an action to trigger on an observation
@@ -389,6 +395,8 @@
Write Secure Settings
Required for Statusbar icons and Screen Locked Security
Needed to toggle Night Light. Grant via ADB or root.
+ Modify System Settings
+ Required to toggle Adaptive Brightness and other system settings
Overlay Permission
Required to display the notification lighting overlay on the screen
Device Administrator
@@ -412,6 +420,12 @@
Enable in settings
Switch to Essentials
Keyboard is active and ready!
+ Enabled
+ Disabled
+ Adaptive Brightness
+ Toggle adaptive brightness
+ Maps Power Saving
+ Toggle maps power saving mode
Search for Tools, Mods and Tweaks
Search
Stop
@@ -788,7 +802,7 @@
%1$d m
%1$.1f km
Travel Alarm active
- %1$s remaining
+ %1$s remaining (%2$d%%)
Travel Progress
Shows real-time distance to destination
Destination Nearby
@@ -823,4 +837,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f2d59759..a23d06cd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -286,6 +286,12 @@
QS tile to toggle sound mode
Stay awake tile
QS tile to toggle stay awake
+ Show Bluetooth devices
+ Display battery level of connected Bluetooth devices
+ Limit max devices
+ Adjust max devices visible in widget
+ Widget background
+ Show widget background
Trigger Automation
@@ -893,4 +899,11 @@
Round
Flat
Inverse
+ Batteries
+ Monitor your device battery levels
+ Battery Status
+ Connect to AirSync
+ Display battery from your connected mac device in AirSync
+ Download AirSync App
+ Required for Mac battery sync
\ No newline at end of file
diff --git a/app/src/main/res/xml/batteries_widget_info.xml b/app/src/main/res/xml/batteries_widget_info.xml
new file mode 100644
index 00000000..936c457b
--- /dev/null
+++ b/app/src/main/res/xml/batteries_widget_info.xml
@@ -0,0 +1,9 @@
+
+