From 52bf463b6a275a8494f9dec8e895eaecae284cea Mon Sep 17 00:00:00 2001 From: Philoul Date: Mon, 11 Sep 2023 22:37:34 +0200 Subject: [PATCH] Wear CWF put default watchfaces within assets folder --- .../rx/weardata/CustomWatchfaceFormat.kt | 5 ++- .../info/nightscout/rx/weardata/EventData.kt | 3 +- .../maintenance/ImportExportPrefs.kt | 2 +- .../maintenance/PrefFileListProvider.kt | 2 +- .../src/main/assets/Default Watchface.zip | Bin 0 -> 40248 bytes .../maintenance/ImportExportPrefsImpl.kt | 4 +-- .../maintenance/PrefFileListProviderImpl.kt | 31 ++++++++++++++---- .../CustomWatchfaceImportListActivity.kt | 4 ++- .../plugins/general/wear/WearFragment.kt | 1 - .../wear/activities/CwfInfosActivity.kt | 4 ++- .../wear/wearintegration/DataHandlerMobile.kt | 3 +- 11 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 plugins/configuration/src/main/assets/Default Watchface.zip diff --git a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/CustomWatchfaceFormat.kt b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/CustomWatchfaceFormat.kt index 010c9ca095..15ec1802d5 100644 --- a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/CustomWatchfaceFormat.kt +++ b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/CustomWatchfaceFormat.kt @@ -265,13 +265,12 @@ class ZipWatchfaceFormat { const val CWF_EXTENTION = ".zip" const val CWF_JSON_FILE = "CustomWatchface.json" - fun loadCustomWatchface(cwfFile: File, authorization: Boolean): CwfData? { + fun loadCustomWatchface(zipInputStream: ZipInputStream, zipName: String, authorization: Boolean): CwfData? { var json = JSONObject() var metadata: CwfMetadataMap = mutableMapOf() val resDatas: CwfResDataMap = mutableMapOf() try { - val zipInputStream = ZipInputStream(cwfFile.inputStream()) var zipEntry: ZipEntry? = zipInputStream.nextEntry while (zipEntry != null) { val entryName = zipEntry.name @@ -289,7 +288,7 @@ class ZipWatchfaceFormat { val jsonString = byteArrayOutputStream.toByteArray().toString(Charsets.UTF_8) json = JSONObject(jsonString) metadata = loadMetadata(json) - metadata[CwfMetadataKey.CWF_FILENAME] = cwfFile.name + metadata[CwfMetadataKey.CWF_FILENAME] = zipName.substringBeforeLast(".") metadata[CwfMetadataKey.CWF_AUTHORIZATION] = authorization.toString() } else { val cwfResFileMap = ResFileMap.fromFileName(entryName) diff --git a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt index 81a292aa12..b7b09742e9 100644 --- a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt +++ b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt @@ -159,7 +159,8 @@ sealed class EventData : Event() { @Serializable data class ActionGetCustomWatchface( val customWatchface: ActionSetCustomWatchface, - val exportFile: Boolean = false + val exportFile: Boolean = false, + val withDate: Boolean = true ) : EventData() @Serializable diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/ImportExportPrefs.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/ImportExportPrefs.kt index 129ca50447..c3d7ffdbca 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/ImportExportPrefs.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/ImportExportPrefs.kt @@ -11,7 +11,7 @@ interface ImportExportPrefs { fun importSharedPreferences(fragment: Fragment) fun importCustomWatchface(activity: FragmentActivity) fun importCustomWatchface(fragment: Fragment) - fun exportCustomWatchface(customWatchface: CwfData) + fun exportCustomWatchface(customWatchface: CwfData, withDate: Boolean = true) fun prefsFileExists(): Boolean fun verifyStoragePermissions(fragment: Fragment, onGranted: Runnable) fun exportSharedPreferences(f: Fragment) diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/PrefFileListProvider.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/PrefFileListProvider.kt index 5b97972d99..e8f78dfb6f 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/PrefFileListProvider.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/maintenance/PrefFileListProvider.kt @@ -11,7 +11,7 @@ interface PrefFileListProvider { fun ensureExtraDirExists(): File fun newExportFile(): File fun newExportCsvFile(): File - fun newCwfFile(filename: String): File + fun newCwfFile(filename: String, withDate: Boolean = true): File fun listPreferenceFiles(loadMetadata: Boolean = false): MutableList fun listCustomWatchfaceFiles(): MutableList fun checkMetadata(metadata: Map): Map diff --git a/plugins/configuration/src/main/assets/Default Watchface.zip b/plugins/configuration/src/main/assets/Default Watchface.zip new file mode 100644 index 0000000000000000000000000000000000000000..a75db9f747c58a23a781bd390339c2cdea5b3c6d GIT binary patch literal 40248 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 BY_$LY literal 0 HcmV?d00001 diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/ImportExportPrefsImpl.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/ImportExportPrefsImpl.kt index 40b289404f..e3aae49ae9 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/ImportExportPrefsImpl.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/ImportExportPrefsImpl.kt @@ -315,9 +315,9 @@ class ImportExportPrefsImpl @Inject constructor( } } - override fun exportCustomWatchface(customWatchface: CwfData) { + override fun exportCustomWatchface(customWatchface: CwfData, withDate: Boolean) { prefFileList.ensureExportDirExists() - val newFile = prefFileList.newCwfFile(customWatchface.metadata[CwfMetadataKey.CWF_FILENAME] ?:"") + val newFile = prefFileList.newCwfFile(customWatchface.metadata[CwfMetadataKey.CWF_FILENAME] ?:"", withDate) ZipWatchfaceFormat.saveCustomWatchface(newFile, customWatchface) } diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/PrefFileListProviderImpl.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/PrefFileListProviderImpl.kt index 93e23dee1b..ebef240c4b 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/PrefFileListProviderImpl.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/PrefFileListProviderImpl.kt @@ -17,7 +17,9 @@ import info.nightscout.interfaces.maintenance.PrefsMetadataKey import info.nightscout.interfaces.maintenance.PrefsStatus import info.nightscout.interfaces.storage.Storage import info.nightscout.interfaces.versionChecker.VersionCheckerUtils +import info.nightscout.rx.bus.RxBus import info.nightscout.rx.weardata.CwfData +import info.nightscout.rx.weardata.EventData import info.nightscout.rx.weardata.ZipWatchfaceFormat import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP @@ -27,6 +29,7 @@ import org.joda.time.Hours import org.joda.time.LocalDateTime import org.joda.time.format.DateTimeFormat import java.io.File +import java.util.zip.ZipInputStream import javax.inject.Inject import kotlin.math.abs @@ -40,7 +43,8 @@ class PrefFileListProviderImpl @Inject constructor( private val storage: Storage, private val versionCheckerUtils: VersionCheckerUtils, private val sp: SP, - context: Context + private val context: Context, + private val rxBus: RxBus ) : PrefFileListProvider { private val path = File(Environment.getExternalStorageDirectory().toString()) @@ -96,13 +100,28 @@ class PrefFileListProviderImpl @Inject constructor( override fun listCustomWatchfaceFiles(): MutableList { val customWatchfaceFiles = mutableListOf() val customAwtchfaceAuthorization = sp.getBoolean(info.nightscout.core.utils.R.string.key_wear_custom_watchface_autorization, false) - // searching dedicated dir, only for new CWF format exportsPath.walk().filter { it.isFile && it.name.endsWith(ZipWatchfaceFormat.CWF_EXTENTION) }.forEach { file -> - // Here loadCustomWatchface will unzip, check and load CustomWatchface - ZipWatchfaceFormat.loadCustomWatchface(file, customAwtchfaceAuthorization)?.also { customWatchface -> + ZipWatchfaceFormat.loadCustomWatchface(ZipInputStream(file.inputStream()), file.name, customAwtchfaceAuthorization)?.also { customWatchface -> customWatchfaceFiles.add(customWatchface) } } + if (customWatchfaceFiles.isEmpty()) { + try { + val assetFiles = context.assets.list("") ?: arrayOf() + for (assetFileName in assetFiles) { + if (assetFileName.endsWith(ZipWatchfaceFormat.CWF_EXTENTION)) { + val assetInputStream = context.assets.open(assetFileName) + ZipWatchfaceFormat.loadCustomWatchface(ZipInputStream(assetInputStream), assetFileName, customAwtchfaceAuthorization)?.also { customWatchface -> + customWatchfaceFiles.add(customWatchface) + rxBus.send(EventData.ActionGetCustomWatchface(EventData.ActionSetCustomWatchface(customWatchface), exportFile = true, withDate = false)) + } + assetInputStream.close() + } + } + } catch (e: Exception) { + // Handle any exceptions that may occur while accessing assets + } + } return customWatchfaceFiles } @@ -148,9 +167,9 @@ class PrefFileListProviderImpl @Inject constructor( return File(exportsPath, timeLocal + "_UserEntry.csv") } - override fun newCwfFile(filename: String): File { + override fun newCwfFile(filename: String, withDate: Boolean): File { val timeLocal = LocalDateTime.now().toString(DateTimeFormat.forPattern("yyyy-MM-dd'_'HHmmss")) - return File(exportsPath, "${filename}_$timeLocal${ZipWatchfaceFormat.CWF_EXTENTION}") + return if (withDate) File(exportsPath, "${filename}_$timeLocal${ZipWatchfaceFormat.CWF_EXTENTION}") else File(exportsPath,"${filename}${ZipWatchfaceFormat.CWF_EXTENTION}") } // check metadata for known issues, change their status and add info with explanations diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/CustomWatchfaceImportListActivity.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/CustomWatchfaceImportListActivity.kt index d8bc43c362..6a4bbc8b2a 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/CustomWatchfaceImportListActivity.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/CustomWatchfaceImportListActivity.kt @@ -27,6 +27,7 @@ import info.nightscout.rx.weardata.CwfMetadataKey.CWF_NAME import info.nightscout.rx.weardata.CwfMetadataKey.CWF_VERSION import info.nightscout.rx.weardata.CwfMetadataMap import info.nightscout.rx.weardata.EventData +import info.nightscout.rx.weardata.ZipWatchfaceFormat import info.nightscout.shared.extensions.toVisibility import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP @@ -91,7 +92,8 @@ class CustomWatchfaceImportListActivity: TranslatedDaggerAppCompatActivity() { val metadata = customWatchfaceFile.metadata val drawable = customWatchfaceFile.resDatas[ResFileMap.CUSTOM_WATCHFACE.fileName]?.toDrawable(resources) with(holder.customWatchfaceImportListItemBinding) { - filelistName.text = rh.gs(info.nightscout.shared.R.string.metadata_wear_import_filename, metadata[CWF_FILENAME]) + val fileName = metadata[CWF_FILENAME]?.let { "$it${ZipWatchfaceFormat.CWF_EXTENTION}"} ?:"" + filelistName.text = rh.gs(info.nightscout.shared.R.string.metadata_wear_import_filename, fileName) filelistName.tag = customWatchfaceFile customWatchface.setImageDrawable(drawable) customName.text = rh.gs(CWF_NAME.label, metadata[CWF_NAME]) diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/WearFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/WearFragment.kt index e9aa8f6987..354d3026e2 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/WearFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/WearFragment.kt @@ -91,7 +91,6 @@ class WearFragment : DaggerFragment() { }, fabricPrivacy::logException) if (wearPlugin.savedCustomWatchface == null) rxBus.send(EventMobileToWear(EventData.ActionrequestCustomWatchface(false))) - //EventMobileDataToWear updateGui() } diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/activities/CwfInfosActivity.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/activities/CwfInfosActivity.kt index ce414654ee..8b60d77a12 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/activities/CwfInfosActivity.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/activities/CwfInfosActivity.kt @@ -26,6 +26,7 @@ import info.nightscout.rx.weardata.CwfMetadataMap import info.nightscout.rx.weardata.JsonKeyValues import info.nightscout.rx.weardata.JsonKeys import info.nightscout.rx.weardata.ViewKeys +import info.nightscout.rx.weardata.ZipWatchfaceFormat import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP import io.reactivex.rxjava3.disposables.CompositeDisposable @@ -92,7 +93,8 @@ class CwfInfosActivity : TranslatedDaggerAppCompatActivity() { metadata[CwfMetadataKey.CWF_AUTHOR_VERSION]?.let { authorVersion -> title = "${metadata[CwfMetadataKey.CWF_NAME]} ($authorVersion)" } - binding.filelistName.text = rh.gs(CwfMetadataKey.CWF_FILENAME.label, metadata[CwfMetadataKey.CWF_FILENAME] ?: "") + val fileName = metadata[CwfMetadataKey.CWF_FILENAME]?.let { "$it${ZipWatchfaceFormat.CWF_EXTENTION}"} ?:"" + binding.filelistName.text = rh.gs(CwfMetadataKey.CWF_FILENAME.label, fileName) binding.author.text = rh.gs(CwfMetadataKey.CWF_AUTHOR.label, metadata[CwfMetadataKey.CWF_AUTHOR] ?: "") binding.createdAt.text = rh.gs(CwfMetadataKey.CWF_CREATED_AT.label, metadata[CwfMetadataKey.CWF_CREATED_AT] ?: "") binding.cwfVersion.text = rh.gs(CwfMetadataKey.CWF_VERSION.label, metadata[CwfMetadataKey.CWF_VERSION] ?: "") diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/wearintegration/DataHandlerMobile.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/wearintegration/DataHandlerMobile.kt index c461fbab26..2f9e46f04b 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/wear/wearintegration/DataHandlerMobile.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/wear/wearintegration/DataHandlerMobile.kt @@ -1266,8 +1266,7 @@ class DataHandlerMobile @Inject constructor( aapsLogger.debug(LTag.WEAR, "Custom Watchface received from ${command.sourceNodeId}: ${customWatchface.customWatchfaceData.json}") rxBus.send(EventWearUpdateGui(customWatchface.customWatchfaceData, command.exportFile)) if (command.exportFile) - importExportPrefs.exportCustomWatchface(customWatchface.customWatchfaceData) - + importExportPrefs.exportCustomWatchface(customWatchface.customWatchfaceData, command.withDate) } }