From 8c104ce12ffdc5ce6bbf51ad8105e76fb9824bb6 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 23 Nov 2024 17:26:20 +0700 Subject: [PATCH] Download: Save and show download datetime Signed-off-by: Aayush Gupta --- .../aurora/store/data/room/AuroraDatabase.kt | 2 +- .../aurora/store/data/room/MigrationHelper.kt | 26 +++++++--- .../com/aurora/store/data/room/RoomModule.kt | 4 +- .../store/data/room/download/Download.kt | 8 +++- .../view/ui/downloads/DownloadFragment.kt | 47 +++++++++++++------ 5 files changed, 60 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/aurora/store/data/room/AuroraDatabase.kt b/app/src/main/java/com/aurora/store/data/room/AuroraDatabase.kt index d8eb164e5..2a7a94e3a 100644 --- a/app/src/main/java/com/aurora/store/data/room/AuroraDatabase.kt +++ b/app/src/main/java/com/aurora/store/data/room/AuroraDatabase.kt @@ -13,7 +13,7 @@ import com.aurora.store.data.room.update.UpdateDao @Database( entities = [Download::class, Favourite::class, Update::class], - version = 4, + version = 5, exportSchema = false ) @TypeConverters(DownloadConverter::class) diff --git a/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt b/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt index 580d3bb62..0f2ed0b8c 100644 --- a/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt +++ b/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt @@ -10,17 +10,14 @@ import androidx.sqlite.db.SupportSQLiteDatabase */ object MigrationHelper { - // ADD ALL NEW MIGRATION STEPS HERE TOO - val MIGRATION_1_4 = object : Migration(1, 4) { - override fun migrate(db: SupportSQLiteDatabase) { - migrateFrom3To4(db) - } - } - val MIGRATION_3_4 = object : Migration(3, 4) { override fun migrate(db: SupportSQLiteDatabase) = migrateFrom3To4(db) } + val MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(db: SupportSQLiteDatabase) = migrateFrom4To5(db) + } + private const val TAG = "MigrationHelper" /** @@ -39,4 +36,19 @@ object MigrationHelper { database.endTransaction() } } + + /** + * Add downloadedAt column to download table for showing installation/update date of apps. + */ + private fun migrateFrom4To5(database: SupportSQLiteDatabase) { + database.beginTransaction() + try { + database.execSQL("ALTER TABLE `download` ADD COLUMN downloadedAt INTEGER NOT NULL DEFAULT 0") + database.setTransactionSuccessful() + } catch (exception: Exception) { + Log.e(TAG, "Failed while migrating from database version 4 to 5", exception) + } finally { + database.endTransaction() + } + } } diff --git a/app/src/main/java/com/aurora/store/data/room/RoomModule.kt b/app/src/main/java/com/aurora/store/data/room/RoomModule.kt index 42c6f9fa1..2e557ea84 100644 --- a/app/src/main/java/com/aurora/store/data/room/RoomModule.kt +++ b/app/src/main/java/com/aurora/store/data/room/RoomModule.kt @@ -2,8 +2,8 @@ package com.aurora.store.data.room import android.content.Context import androidx.room.Room -import com.aurora.store.data.room.MigrationHelper.MIGRATION_1_4 import com.aurora.store.data.room.MigrationHelper.MIGRATION_3_4 +import com.aurora.store.data.room.MigrationHelper.MIGRATION_4_5 import com.aurora.store.data.room.download.DownloadConverter import com.aurora.store.data.room.download.DownloadDao import com.aurora.store.data.room.favourite.FavouriteDao @@ -28,7 +28,7 @@ object RoomModule { downloadConverter: DownloadConverter ): AuroraDatabase { return Room.databaseBuilder(context, AuroraDatabase::class.java, DATABASE) - .addMigrations(MIGRATION_3_4, MIGRATION_1_4) + .addMigrations(MIGRATION_3_4, MIGRATION_4_5) .addTypeConverter(downloadConverter) .build() } diff --git a/app/src/main/java/com/aurora/store/data/room/download/Download.kt b/app/src/main/java/com/aurora/store/data/room/download/Download.kt index 151793060..4bf120518 100644 --- a/app/src/main/java/com/aurora/store/data/room/download/Download.kt +++ b/app/src/main/java/com/aurora/store/data/room/download/Download.kt @@ -8,6 +8,7 @@ import com.aurora.gplayapi.data.models.File import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.room.update.Update import kotlinx.parcelize.Parcelize +import java.util.Date @Parcelize @Entity(tableName = "download") @@ -29,6 +30,7 @@ data class Download( var fileList: List, val sharedLibs: List, val targetSdk: Int = 1, + val downloadedAt: Long = 0 ) : Parcelable { val isFinished get() = downloadStatus in DownloadStatus.finished val isRunning get() = downloadStatus in DownloadStatus.running @@ -52,7 +54,8 @@ data class Download( 0, app.fileList.filterNot { it.url.isBlank() }, app.dependencies.dependentLibraries.map { SharedLib.fromApp(it) }, - app.targetSdk + app.targetSdk, + Date().time ) } @@ -74,7 +77,8 @@ data class Download( 0, update.fileList, update.sharedLibs, - update.targetSdk + update.targetSdk, + Date().time ) } } diff --git a/app/src/main/java/com/aurora/store/view/ui/downloads/DownloadFragment.kt b/app/src/main/java/com/aurora/store/view/ui/downloads/DownloadFragment.kt index f518686b7..146242f74 100644 --- a/app/src/main/java/com/aurora/store/view/ui/downloads/DownloadFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/downloads/DownloadFragment.kt @@ -20,6 +20,7 @@ package com.aurora.store.view.ui.downloads import android.os.Bundle +import android.text.format.DateUtils import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope @@ -31,12 +32,14 @@ import com.aurora.store.data.helper.DownloadHelper import com.aurora.store.data.room.download.Download import com.aurora.store.databinding.FragmentDownloadBinding import com.aurora.store.view.epoxy.views.DownloadViewModel_ +import com.aurora.store.view.epoxy.views.TextDividerViewModel_ import com.aurora.store.view.epoxy.views.app.NoAppViewModel_ import com.aurora.store.view.ui.commons.BaseFragment import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import java.util.Date import javax.inject.Inject @AndroidEntryPoint @@ -98,23 +101,37 @@ class DownloadFragment : BaseFragment() { .message(getString(R.string.download_none)) ) } else { - downloads.forEach { + downloads.groupBy { + DateUtils.getRelativeTimeSpanString( + it.downloadedAt, + Date().time, + DateUtils.DAY_IN_MILLIS + ).toString() + }.forEach { (date, downloadList) -> add( - DownloadViewModel_() - .id(it.packageName) - .download(it) - .click { _ -> - if (it.packageName == requireContext().packageName) { - requireContext().browse(GITLAB_URL) - } else { - openDetailsFragment(it.packageName) - } - } - .longClick { _ -> - openDownloadMenuSheet(it.packageName) - true - } + TextDividerViewModel_() + .id(date) + .title(date) ) + + downloadList.forEach { + add( + DownloadViewModel_() + .id(it.packageName) + .download(it) + .click { _ -> + if (it.packageName == requireContext().packageName) { + requireContext().browse(GITLAB_URL) + } else { + openDetailsFragment(it.packageName) + } + } + .longClick { _ -> + openDownloadMenuSheet(it.packageName) + true + } + ) + } } } }