Add delta sync
parent
2e67ab5cda
commit
c08d87777a
|
@ -217,15 +217,15 @@ import gallery.memories.databinding.ActivityMainBinding
|
||||||
fun storeTheme(color: String?, isDark: Boolean) {
|
fun storeTheme(color: String?, isDark: Boolean) {
|
||||||
if (color == null) return
|
if (color == null) return
|
||||||
getSharedPreferences(getString(R.string.preferences_key), 0).edit()
|
getSharedPreferences(getString(R.string.preferences_key), 0).edit()
|
||||||
.putString("themeColor", color)
|
.putString(getString(R.string.preferences_theme_color), color)
|
||||||
.putBoolean("themeDark", isDark)
|
.putBoolean(getString(R.string.preferences_theme_dark), isDark)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun restoreTheme() {
|
fun restoreTheme() {
|
||||||
val preferences = getSharedPreferences(getString(R.string.preferences_key), 0)
|
val preferences = getSharedPreferences(getString(R.string.preferences_key), 0)
|
||||||
val color = preferences.getString("themeColor", null)
|
val color = preferences.getString(getString(R.string.preferences_theme_color), null)
|
||||||
val isDark = preferences.getBoolean("themeDark", false)
|
val isDark = preferences.getBoolean(getString(R.string.preferences_theme_dark), false)
|
||||||
applyTheme(color, isDark)
|
applyTheme(color, isDark)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,9 @@ import java.net.URLDecoder
|
||||||
|
|
||||||
init {
|
init {
|
||||||
mDlService = DownloadService(mActivity)
|
mDlService = DownloadService(mActivity)
|
||||||
|
|
||||||
|
// Synchronize the database
|
||||||
|
mQuery.syncDeltaDb()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -16,12 +16,14 @@ import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.collection.ArraySet
|
import androidx.collection.ArraySet
|
||||||
import androidx.exifinterface.media.ExifInterface
|
import androidx.exifinterface.media.ExifInterface
|
||||||
|
import gallery.memories.R
|
||||||
import gallery.memories.mapper.Fields
|
import gallery.memories.mapper.Fields
|
||||||
import gallery.memories.mapper.SystemImage
|
import gallery.memories.mapper.SystemImage
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.time.Instant
|
||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
|
|
||||||
class TimelineQuery(private val mCtx: AppCompatActivity) {
|
class TimelineQuery(private val mCtx: AppCompatActivity) {
|
||||||
|
@ -40,9 +42,6 @@ class TimelineQuery(private val mCtx: AppCompatActivity) {
|
||||||
deleteCallback?.let { it(result) }
|
deleteCallback?.let { it(result) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove this in favor of a selective sync
|
|
||||||
fullSyncDb()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(JSONException::class)
|
@Throws(JSONException::class)
|
||||||
|
@ -216,16 +215,46 @@ class TimelineQuery(private val mCtx: AppCompatActivity) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fullSyncDb() {
|
private fun syncDb(startTime: Long) {
|
||||||
// Flag all images for removal
|
// Date modified is in seconds, not millis
|
||||||
mDb.execSQL("UPDATE images SET flag = 1")
|
val syncTime = Instant.now().toEpochMilli() / 1000;
|
||||||
|
|
||||||
|
// SystemImage query
|
||||||
|
var selection: String? = null
|
||||||
|
var selectionArgs: Array<String>? = null
|
||||||
|
|
||||||
|
// Query everything modified after startTime
|
||||||
|
if (startTime != 0L) {
|
||||||
|
selection = MediaStore.Images.Media.DATE_MODIFIED + " > ?"
|
||||||
|
selectionArgs = arrayOf(startTime.toString())
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate all images and videos from system store
|
// Iterate all images and videos from system store
|
||||||
val files =
|
val files =
|
||||||
SystemImage.query(mCtx, SystemImage.IMAGE_URI, null, null, null) +
|
SystemImage.query(mCtx, SystemImage.IMAGE_URI, selection, selectionArgs, null) +
|
||||||
SystemImage.query(mCtx, SystemImage.VIDEO_URI, null, null, null)
|
SystemImage.query(mCtx, SystemImage.VIDEO_URI, selection, selectionArgs, null)
|
||||||
files.forEach { insertItemDb(it) }
|
files.forEach { insertItemDb(it) }
|
||||||
|
|
||||||
|
// Store last sync time
|
||||||
|
mCtx.getSharedPreferences(mCtx.getString(R.string.preferences_key), 0).edit()
|
||||||
|
.putLong(mCtx.getString(R.string.preferences_last_sync_time), syncTime)
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun syncDeltaDb() {
|
||||||
|
// Get last sync time
|
||||||
|
val syncTime = mCtx.getSharedPreferences(mCtx.getString(R.string.preferences_key), 0)
|
||||||
|
.getLong(mCtx.getString(R.string.preferences_last_sync_time), 0L)
|
||||||
|
syncDb(syncTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun syncFullDb() {
|
||||||
|
// Flag all images for removal
|
||||||
|
mDb.execSQL("UPDATE images SET flag = 1")
|
||||||
|
|
||||||
|
// Sync all files, marking them in the process
|
||||||
|
syncDb(0L)
|
||||||
|
|
||||||
// Clean up stale files
|
// Clean up stale files
|
||||||
mDb.execSQL("DELETE FROM images WHERE flag = 1")
|
mDb.execSQL("DELETE FROM images WHERE flag = 1")
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,4 +3,7 @@
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
|
|
||||||
<string name="preferences_key">memories</string>
|
<string name="preferences_key">memories</string>
|
||||||
|
<string name="preferences_theme_color">themeColor</string>
|
||||||
|
<string name="preferences_theme_dark">themeDark</string>
|
||||||
|
<string name="preferences_last_sync_time">lastDbSyncTime</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue