#638 widget: option to update on tap

This commit is contained in:
Thibault Deckers 2023-05-14 18:40:33 +02:00
parent 56b67c47db
commit 00346ebb31
8 changed files with 112 additions and 41 deletions

View file

@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
- option to set the Tags page as home - option to set the Tags page as home
- support for animated PNG - support for animated PNG
- Info: added day filter with item date - Info: added day filter with item date
- Widget: option to update image on tap
### Changed ### Changed

View file

@ -18,6 +18,7 @@ import deckers.thibault.aves.channel.AvesByteSendingMethodCodec
import deckers.thibault.aves.channel.calls.* import deckers.thibault.aves.channel.calls.*
import deckers.thibault.aves.channel.streams.ImageByteStreamHandler import deckers.thibault.aves.channel.streams.ImageByteStreamHandler
import deckers.thibault.aves.channel.streams.MediaStoreStreamHandler import deckers.thibault.aves.channel.streams.MediaStoreStreamHandler
import deckers.thibault.aves.model.FieldMap
import deckers.thibault.aves.utils.FlutterUtils import deckers.thibault.aves.utils.FlutterUtils
import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.LogUtils
import io.flutter.FlutterInjector import io.flutter.FlutterInjector
@ -40,11 +41,11 @@ class HomeWidgetProvider : AppWidgetProvider() {
val widgetInfo = appWidgetManager.getAppWidgetOptions(widgetId) val widgetInfo = appWidgetManager.getAppWidgetOptions(widgetId)
defaultScope.launch { defaultScope.launch {
val backgroundBytes = getBytes(context, widgetId, widgetInfo, drawEntryImage = false) val backgroundProps = getProps(context, widgetId, widgetInfo, drawEntryImage = false)
updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, backgroundBytes) updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, backgroundProps)
val imageBytes = getBytes(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = false) val imageProps = getProps(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = false)
updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, imageBytes) updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, imageProps)
} }
} }
} }
@ -59,8 +60,8 @@ class HomeWidgetProvider : AppWidgetProvider() {
} }
imageByteFetchJob = defaultScope.launch { imageByteFetchJob = defaultScope.launch {
delay(500) delay(500)
val imageBytes = getBytes(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = true) val imageProps = getProps(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = true)
updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, imageBytes) updateWidgetImage(context, appWidgetManager, widgetId, widgetInfo, imageProps)
} }
} }
@ -76,13 +77,13 @@ class HomeWidgetProvider : AppWidgetProvider() {
return Pair(widthPx, heightPx) return Pair(widthPx, heightPx)
} }
private suspend fun getBytes( private suspend fun getProps(
context: Context, context: Context,
widgetId: Int, widgetId: Int,
widgetInfo: Bundle, widgetInfo: Bundle,
drawEntryImage: Boolean, drawEntryImage: Boolean,
reuseEntry: Boolean = false, reuseEntry: Boolean = false,
): ByteArray? { ): FieldMap? {
val (widthPx, heightPx) = getWidgetSizePx(context, widgetInfo) val (widthPx, heightPx) = getWidgetSizePx(context, widgetInfo)
if (widthPx == 0 || heightPx == 0) return null if (widthPx == 0 || heightPx == 0) return null
@ -90,7 +91,7 @@ class HomeWidgetProvider : AppWidgetProvider() {
val messenger = flutterEngine!!.dartExecutor val messenger = flutterEngine!!.dartExecutor
val channel = MethodChannel(messenger, WIDGET_DRAW_CHANNEL) val channel = MethodChannel(messenger, WIDGET_DRAW_CHANNEL)
try { try {
val bytes = suspendCoroutine<Any?> { cont -> val props = suspendCoroutine<Any?> { cont ->
defaultScope.launch { defaultScope.launch {
FlutterUtils.runOnUiThread { FlutterUtils.runOnUiThread {
channel.invokeMethod("drawWidget", hashMapOf( channel.invokeMethod("drawWidget", hashMapOf(
@ -116,7 +117,8 @@ class HomeWidgetProvider : AppWidgetProvider() {
} }
} }
} }
if (bytes is ByteArray) return bytes @Suppress("unchecked_cast")
return props as FieldMap?
} catch (e: Exception) { } catch (e: Exception) {
Log.e(LOG_TAG, "failed to draw widget for widgetId=$widgetId widthPx=$widthPx heightPx=$heightPx", e) Log.e(LOG_TAG, "failed to draw widget for widgetId=$widgetId widthPx=$widthPx heightPx=$heightPx", e)
} }
@ -128,9 +130,16 @@ class HomeWidgetProvider : AppWidgetProvider() {
appWidgetManager: AppWidgetManager, appWidgetManager: AppWidgetManager,
widgetId: Int, widgetId: Int,
widgetInfo: Bundle, widgetInfo: Bundle,
bytes: ByteArray?, props: FieldMap?,
) { ) {
bytes ?: return props ?: return
val bytes = props["bytes"] as ByteArray?
val updateOnTap = props["updateOnTap"] as Boolean?
if (bytes == null || updateOnTap == null) {
Log.e(LOG_TAG, "missing arguments")
return
}
val (widthPx, heightPx) = getWidgetSizePx(context, widgetInfo) val (widthPx, heightPx) = getWidgetSizePx(context, widgetInfo)
if (widthPx == 0 || heightPx == 0) return if (widthPx == 0 || heightPx == 0) return
@ -139,24 +148,11 @@ class HomeWidgetProvider : AppWidgetProvider() {
val bitmap = Bitmap.createBitmap(widthPx, heightPx, Bitmap.Config.ARGB_8888) val bitmap = Bitmap.createBitmap(widthPx, heightPx, Bitmap.Config.ARGB_8888)
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bytes)) bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bytes))
// set a unique URI to prevent the intent (and its extras) from being shared by different widgets val pendingIntent = if (updateOnTap) buildUpdateIntent(context, widgetId) else buildOpenAppIntent(context, widgetId)
val intent = Intent(MainActivity.INTENT_ACTION_WIDGET_OPEN, Uri.parse("widget://$widgetId"), context, MainActivity::class.java)
.putExtra(MainActivity.EXTRA_KEY_WIDGET_ID, widgetId)
val activity = PendingIntent.getActivity(
context,
0,
intent,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
)
val views = RemoteViews(context.packageName, R.layout.app_widget).apply { val views = RemoteViews(context.packageName, R.layout.app_widget).apply {
setImageViewBitmap(R.id.widget_img, bitmap) setImageViewBitmap(R.id.widget_img, bitmap)
setOnClickPendingIntent(R.id.widget_img, activity) setOnClickPendingIntent(R.id.widget_img, pendingIntent)
} }
appWidgetManager.updateAppWidget(widgetId, views) appWidgetManager.updateAppWidget(widgetId, views)
@ -166,6 +162,39 @@ class HomeWidgetProvider : AppWidgetProvider() {
} }
} }
private fun buildUpdateIntent(context: Context, widgetId: Int): PendingIntent {
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, Uri.parse("widget://$widgetId"), context, HomeWidgetProvider::class.java)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(widgetId))
return PendingIntent.getBroadcast(
context,
0,
intent,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
)
}
private fun buildOpenAppIntent(context: Context, widgetId: Int): PendingIntent {
// set a unique URI to prevent the intent (and its extras) from being shared by different widgets
val intent = Intent(MainActivity.INTENT_ACTION_WIDGET_OPEN, Uri.parse("widget://$widgetId"), context, MainActivity::class.java)
.putExtra(MainActivity.EXTRA_KEY_WIDGET_ID, widgetId)
return PendingIntent.getActivity(
context,
0,
intent,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
)
}
companion object { companion object {
private val LOG_TAG = LogUtils.createTag<HomeWidgetProvider>() private val LOG_TAG = LogUtils.createTag<HomeWidgetProvider>()
private const val WIDGET_DART_ENTRYPOINT = "widgetMain" private const val WIDGET_DART_ENTRYPOINT = "widgetMain"

View file

@ -281,6 +281,7 @@
"widgetOpenPageHome": "Open home", "widgetOpenPageHome": "Open home",
"widgetOpenPageCollection": "Open collection", "widgetOpenPageCollection": "Open collection",
"widgetOpenPageViewer": "Open viewer", "widgetOpenPageViewer": "Open viewer",
"widgetTapUpdateWidget": "Update widget",
"storageVolumeDescriptionFallbackPrimary": "Internal storage", "storageVolumeDescriptionFallbackPrimary": "Internal storage",
"storageVolumeDescriptionFallbackNonPrimary": "SD card", "storageVolumeDescriptionFallbackNonPrimary": "SD card",

View file

@ -275,6 +275,8 @@ extension ExtraWidgetOpenPageView on WidgetOpenPage {
return context.l10n.widgetOpenPageCollection; return context.l10n.widgetOpenPageCollection;
case WidgetOpenPage.viewer: case WidgetOpenPage.viewer:
return context.l10n.widgetOpenPageViewer; return context.l10n.widgetOpenPageViewer;
case WidgetOpenPage.updateWidget:
return context.l10n.widgetTapUpdateWidget;
} }
} }
} }

View file

@ -34,7 +34,7 @@ void widgetMainCommon(AppFlavor flavor) async {
}); });
} }
Future<Uint8List> _drawWidget(dynamic args) async { Future<Map<String, dynamic>> _drawWidget(dynamic args) async {
final widgetId = args['widgetId'] as int; final widgetId = args['widgetId'] as int;
final widthPx = args['widthPx'] as int; final widthPx = args['widthPx'] as int;
final heightPx = args['heightPx'] as int; final heightPx = args['heightPx'] as int;
@ -47,12 +47,16 @@ Future<Uint8List> _drawWidget(dynamic args) async {
entry: entry, entry: entry,
devicePixelRatio: devicePixelRatio, devicePixelRatio: devicePixelRatio,
); );
return painter.drawWidget( final bytes = await painter.drawWidget(
widthPx: widthPx, widthPx: widthPx,
heightPx: heightPx, heightPx: heightPx,
outline: settings.getWidgetOutline(widgetId), outline: settings.getWidgetOutline(widgetId),
shape: settings.getWidgetShape(widgetId), shape: settings.getWidgetShape(widgetId),
); );
return {
'bytes': bytes,
'updateOnTap': settings.getWidgetOpenPage(widgetId) == WidgetOpenPage.updateWidget,
};
} }
Future<AvesEntry?> _getWidgetEntry(int widgetId, bool reuseEntry) async { Future<AvesEntry?> _getWidgetEntry(int widgetId, bool reuseEntry) async {

View file

@ -113,6 +113,7 @@ class _HomePageState extends State<HomePage> {
final page = settings.getWidgetOpenPage(widgetId); final page = settings.getWidgetOpenPage(widgetId);
switch (page) { switch (page) {
case WidgetOpenPage.home: case WidgetOpenPage.home:
case WidgetOpenPage.updateWidget:
break; break;
case WidgetOpenPage.collection: case WidgetOpenPage.collection:
_initialFilters = settings.getWidgetCollectionFilters(widgetId); _initialFilters = settings.getWidgetCollectionFilters(widgetId);

View file

@ -44,6 +44,6 @@ enum ViewerTransition { slide, parallax, fade, zoomIn, none }
enum WidgetDisplayedItem { random, mostRecent } enum WidgetDisplayedItem { random, mostRecent }
enum WidgetOpenPage { home, collection, viewer } enum WidgetOpenPage { home, collection, viewer, updateWidget }
enum WidgetShape { rrect, circle, heart } enum WidgetShape { rrect, circle, heart }

View file

@ -178,6 +178,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -765,6 +766,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -1245,6 +1247,7 @@
"maxBrightnessAlways", "maxBrightnessAlways",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"exportEntryDialogQuality", "exportEntryDialogQuality",
"settingsAskEverytime", "settingsAskEverytime",
"settingsVideoPlaybackTile", "settingsVideoPlaybackTile",
@ -1267,6 +1270,7 @@
"maxBrightnessAlways", "maxBrightnessAlways",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"exportEntryDialogQuality", "exportEntryDialogQuality",
"settingsAskEverytime", "settingsAskEverytime",
"settingsVideoPlaybackTile", "settingsVideoPlaybackTile",
@ -1284,7 +1288,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"es": [ "es": [
@ -1295,7 +1300,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"eu": [ "eu": [
@ -1306,7 +1312,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"fa": [ "fa": [
@ -1382,6 +1389,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"rootDirectoryDescription", "rootDirectoryDescription",
"otherDirectoryDescription", "otherDirectoryDescription",
"restrictedAccessDialogMessage", "restrictedAccessDialogMessage",
@ -1820,7 +1828,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"gl": [ "gl": [
@ -1891,6 +1900,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -2555,6 +2565,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -3199,6 +3210,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -3674,7 +3686,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"id": [ "id": [
@ -3685,7 +3698,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"it": [ "it": [
@ -3696,7 +3710,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"ja": [ "ja": [
@ -3722,6 +3737,7 @@
"subtitlePositionBottom", "subtitlePositionBottom",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"vaultBinUsageDialogMessage", "vaultBinUsageDialogMessage",
"exportEntryDialogQuality", "exportEntryDialogQuality",
"exportEntryDialogWriteMetadata", "exportEntryDialogWriteMetadata",
@ -3757,7 +3773,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"lt": [ "lt": [
@ -3791,6 +3808,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",
@ -4036,6 +4054,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -4521,6 +4540,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"patternDialogEnter", "patternDialogEnter",
"patternDialogConfirm", "patternDialogConfirm",
"exportEntryDialogQuality", "exportEntryDialogQuality",
@ -4567,6 +4587,7 @@
"vaultLockTypePattern", "vaultLockTypePattern",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",
@ -4653,6 +4674,7 @@
"videoResumptionModeAlways", "videoResumptionModeAlways",
"wallpaperTargetHome", "wallpaperTargetHome",
"wallpaperTargetHomeLock", "wallpaperTargetHomeLock",
"widgetTapUpdateWidget",
"setCoverDialogCustom", "setCoverDialogCustom",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
@ -5145,6 +5167,7 @@
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
"widgetTapUpdateWidget",
"storageVolumeDescriptionFallbackPrimary", "storageVolumeDescriptionFallbackPrimary",
"storageVolumeDescriptionFallbackNonPrimary", "storageVolumeDescriptionFallbackNonPrimary",
"rootDirectoryDescription", "rootDirectoryDescription",
@ -5570,7 +5593,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"pt": [ "pt": [
@ -5581,7 +5605,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"ro": [ "ro": [
@ -5597,6 +5622,7 @@
"maxBrightnessAlways", "maxBrightnessAlways",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"exportEntryDialogQuality", "exportEntryDialogQuality",
"settingsAskEverytime", "settingsAskEverytime",
"settingsVideoPlaybackTile", "settingsVideoPlaybackTile",
@ -5619,6 +5645,7 @@
"maxBrightnessAlways", "maxBrightnessAlways",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"exportEntryDialogQuality", "exportEntryDialogQuality",
"statePageTitle", "statePageTitle",
"stateEmpty", "stateEmpty",
@ -5668,6 +5695,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"otherDirectoryDescription", "otherDirectoryDescription",
"storageAccessDialogMessage", "storageAccessDialogMessage",
"restrictedAccessDialogMessage", "restrictedAccessDialogMessage",
@ -6121,6 +6149,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",
@ -6501,6 +6530,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",
@ -6547,7 +6577,8 @@
"editorTransformRotate", "editorTransformRotate",
"cropAspectRatioFree", "cropAspectRatioFree",
"cropAspectRatioOriginal", "cropAspectRatioOriginal",
"cropAspectRatioSquare" "cropAspectRatioSquare",
"widgetTapUpdateWidget"
], ],
"zh": [ "zh": [
@ -6575,6 +6606,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",
@ -6649,6 +6681,7 @@
"settingsVideoEnablePip", "settingsVideoEnablePip",
"videoResumptionModeNever", "videoResumptionModeNever",
"videoResumptionModeAlways", "videoResumptionModeAlways",
"widgetTapUpdateWidget",
"newVaultWarningDialogMessage", "newVaultWarningDialogMessage",
"newVaultDialogTitle", "newVaultDialogTitle",
"configureVaultDialogTitle", "configureVaultDialogTitle",