List import files properly
This commit is contained in:
parent
b021dd7780
commit
c8377edf9d
5 changed files with 16 additions and 43 deletions
|
@ -13,7 +13,7 @@ interface PrefFileListProvider {
|
||||||
fun newExportFile(): File
|
fun newExportFile(): File
|
||||||
fun newExportCsvFile(): File
|
fun newExportCsvFile(): File
|
||||||
fun newCwfFile(filename: String, withDate: Boolean = true): File
|
fun newCwfFile(filename: String, withDate: Boolean = true): File
|
||||||
fun listPreferenceFiles(loadMetadata: Boolean = false): MutableList<PrefsFile>
|
fun listPreferenceFiles(): MutableList<PrefsFile>
|
||||||
fun listCustomWatchfaceFiles(): MutableList<CwfFile>
|
fun listCustomWatchfaceFiles(): MutableList<CwfFile>
|
||||||
fun checkMetadata(metadata: Map<PrefsMetadataKey, PrefMetadata>): Map<PrefsMetadataKey, PrefMetadata>
|
fun checkMetadata(metadata: Map<PrefsMetadataKey, PrefMetadata>): Map<PrefsMetadataKey, PrefMetadata>
|
||||||
fun formatExportedAgo(utcTime: String): String
|
fun formatExportedAgo(utcTime: String): String
|
||||||
|
|
|
@ -10,7 +10,6 @@ data class PrefsFile(
|
||||||
val name: String,
|
val name: String,
|
||||||
val file: File,
|
val file: File,
|
||||||
val baseDir: File,
|
val baseDir: File,
|
||||||
val dirKind: PrefsImportDir,
|
|
||||||
|
|
||||||
// metadata here is used only for list display
|
// metadata here is used only for list display
|
||||||
val metadata: @RawValue Map<PrefsMetadataKey, PrefMetadata>
|
val metadata: @RawValue Map<PrefsMetadataKey, PrefMetadata>
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
package app.aaps.core.interfaces.maintenance
|
|
||||||
|
|
||||||
enum class PrefsImportDir {
|
|
||||||
ROOT_DIR,
|
|
||||||
AAPS_DIR
|
|
||||||
}
|
|
|
@ -7,7 +7,6 @@ import app.aaps.core.interfaces.configuration.Config
|
||||||
import app.aaps.core.interfaces.maintenance.PrefFileListProvider
|
import app.aaps.core.interfaces.maintenance.PrefFileListProvider
|
||||||
import app.aaps.core.interfaces.maintenance.PrefMetadata
|
import app.aaps.core.interfaces.maintenance.PrefMetadata
|
||||||
import app.aaps.core.interfaces.maintenance.PrefsFile
|
import app.aaps.core.interfaces.maintenance.PrefsFile
|
||||||
import app.aaps.core.interfaces.maintenance.PrefsImportDir
|
|
||||||
import app.aaps.core.interfaces.maintenance.PrefsMetadataKey
|
import app.aaps.core.interfaces.maintenance.PrefsMetadataKey
|
||||||
import app.aaps.core.interfaces.resources.ResourceHelper
|
import app.aaps.core.interfaces.resources.ResourceHelper
|
||||||
import app.aaps.core.interfaces.rx.bus.RxBus
|
import app.aaps.core.interfaces.rx.bus.RxBus
|
||||||
|
@ -59,44 +58,29 @@ class PrefFileListProviderImpl @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function tries to list possible preference files from main SDCard root dir and AAPS/preferences dir
|
* This function tries to list possible preference files from AAPS/preferences dir
|
||||||
* and tries to do quick assessment for preferences format plausibility.
|
* and tries to do quick assessment for preferences format plausibility.
|
||||||
* It does NOT load full metadata or is 100% accurate - it tries to do QUICK detection, based on:
|
|
||||||
* - file name and extension
|
|
||||||
* - predicted file contents
|
|
||||||
*/
|
*/
|
||||||
override fun listPreferenceFiles(loadMetadata: Boolean): MutableList<PrefsFile> {
|
override fun listPreferenceFiles(): MutableList<PrefsFile> {
|
||||||
val prefFiles = mutableListOf<PrefsFile>()
|
val prefFiles = mutableListOf<PrefsFile>()
|
||||||
|
|
||||||
// searching rood dir for legacy files
|
|
||||||
path.walk().maxDepth(1).filter { it.isFile && (it.name.endsWith(".json") || it.name.contains("Preferences")) }.forEach {
|
|
||||||
val contents = storage.getFileContents(it)
|
|
||||||
val detectedNew = encryptedPrefsFormat.isPreferencesFile(it, contents)
|
|
||||||
if (detectedNew) {
|
|
||||||
prefFiles.add(PrefsFile(it.name, it, path, PrefsImportDir.ROOT_DIR, metadataFor(loadMetadata, contents)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// searching dedicated dir, only for new JSON format
|
// searching dedicated dir, only for new JSON format
|
||||||
aapsPath.walk().filter { it.isFile && it.name.endsWith(".json") }.forEach {
|
aapsPath.walk().filter { it.isFile && it.name.endsWith(".json") }.forEach {
|
||||||
val contents = storage.getFileContents(it)
|
val contents = storage.getFileContents(it)
|
||||||
if (encryptedPrefsFormat.isPreferencesFile(it, contents)) {
|
if (encryptedPrefsFormat.isPreferencesFile(it, contents)) {
|
||||||
prefFiles.add(PrefsFile(it.name, it, aapsPath, PrefsImportDir.AAPS_DIR, metadataFor(loadMetadata, contents)))
|
prefFiles.add(PrefsFile(it.name, it, aapsPath, metadataFor(contents)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we sort only if we have metadata to be used for that
|
val filtered = prefFiles
|
||||||
if (loadMetadata) {
|
|
||||||
prefFiles
|
|
||||||
.filter { it.metadata[PrefsMetadataKeyImpl.AAPS_FLAVOUR]?.status != null }
|
.filter { it.metadata[PrefsMetadataKeyImpl.AAPS_FLAVOUR]?.status != null }
|
||||||
|
.filter { (it.metadata[PrefsMetadataKeyImpl.AAPS_FLAVOUR]?.status as PrefsStatusImpl) != PrefsStatusImpl.ERROR }
|
||||||
.toMutableList()
|
.toMutableList()
|
||||||
.sortWith(
|
filtered.sortWith(
|
||||||
compareByDescending<PrefsFile> { it.metadata[PrefsMetadataKeyImpl.AAPS_FLAVOUR]?.status as PrefsStatusImpl }
|
compareByDescending<PrefsFile> { it.metadata[PrefsMetadataKeyImpl.AAPS_FLAVOUR]?.status as PrefsStatusImpl }
|
||||||
.thenByDescending { it.metadata[PrefsMetadataKeyImpl.CREATED_AT]?.value }
|
.thenByDescending { it.metadata[PrefsMetadataKeyImpl.CREATED_AT]?.value }
|
||||||
)
|
)
|
||||||
}
|
return filtered
|
||||||
|
|
||||||
return prefFiles
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun listCustomWatchfaceFiles(): MutableList<CwfFile> {
|
override fun listCustomWatchfaceFiles(): MutableList<CwfFile> {
|
||||||
|
@ -127,12 +111,8 @@ class PrefFileListProviderImpl @Inject constructor(
|
||||||
return customWatchfaceFiles
|
return customWatchfaceFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun metadataFor(loadMetadata: Boolean, contents: String): PrefMetadataMap {
|
private fun metadataFor(contents: String): PrefMetadataMap =
|
||||||
if (!loadMetadata) {
|
checkMetadata(encryptedPrefsFormat.loadMetadata(contents))
|
||||||
return mapOf()
|
|
||||||
}
|
|
||||||
return checkMetadata(encryptedPrefsFormat.loadMetadata(contents))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun ensureExportDirExists(): File {
|
override fun ensureExportDirExists(): File {
|
||||||
if (!aapsPath.exists()) {
|
if (!aapsPath.exists()) {
|
||||||
|
|
|
@ -39,7 +39,7 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() {
|
||||||
supportActionBar?.setDisplayShowTitleEnabled(true)
|
supportActionBar?.setDisplayShowTitleEnabled(true)
|
||||||
|
|
||||||
binding.recyclerview.layoutManager = LinearLayoutManager(this)
|
binding.recyclerview.layoutManager = LinearLayoutManager(this)
|
||||||
binding.recyclerview.adapter = RecyclerViewAdapter(prefFileListProvider.listPreferenceFiles(loadMetadata = true))
|
binding.recyclerview.adapter = RecyclerViewAdapter(prefFileListProvider.listPreferenceFiles())
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class RecyclerViewAdapter internal constructor(private var prefFileList: List<PrefsFile>) : RecyclerView.Adapter<RecyclerViewAdapter.PrefFileViewHolder>() {
|
inner class RecyclerViewAdapter internal constructor(private var prefFileList: List<PrefsFile>) : RecyclerView.Adapter<RecyclerViewAdapter.PrefFileViewHolder>() {
|
||||||
|
|
Loading…
Reference in a new issue