From ff510d7ce0984c1fabd9377c50fed6b71a5fc63d Mon Sep 17 00:00:00 2001 From: X1nto Date: Mon, 29 Nov 2021 19:43:42 +0400 Subject: [PATCH] implement new remote data type --- app/proguard-rules.pro | 2 +- .../java/com/vanced/manager/di/APIModule.kt | 1 + .../com/vanced/manager/di/MapperModule.kt | 6 +- .../com/vanced/manager/di/NetworkModule.kt | 5 +- .../vanced/manager/di/PackageManagerModule.kt | 12 +-- .../com/vanced/manager/di/PreferenceModule.kt | 1 + .../com/vanced/manager/di/RepositoryModule.kt | 29 +++++--- .../com/vanced/manager/di/ServiceModule.kt | 31 +++++--- .../com/vanced/manager/di/ViewModelModule.kt | 31 +++++++- .../com/vanced/manager/domain/model/App.kt | 4 - .../com/vanced/manager/domain/model/Data.kt | 6 ++ .../com/vanced/manager/domain/model/Json.kt | 9 --- .../vanced/manager/domain/pkg/PkgManager.kt | 30 ++++---- .../com/vanced/manager/network/DataService.kt | 11 +++ .../com/vanced/manager/network/JsonService.kt | 11 --- .../vanced/manager/network/model/AppDto.kt | 5 +- .../manager/network/model/AppDtoMapper.kt | 74 +++++++++---------- .../vanced/manager/network/model/DataDto.kt | 13 ++++ .../manager/network/model/DataDtoMapper.kt | 26 +++++++ .../vanced/manager/network/model/JsonDto.kt | 11 --- .../manager/network/model/JsonDtoMapper.kt | 21 ------ .../vanced/manager/network/util/Constants.kt | 3 +- .../manager/repository/DataRepository.kt | 9 +++ .../manager/repository/JsonRepository.kt | 9 --- .../manager/repository/JsonRepositoryImpl.kt | 16 ---- .../manager/repository/MainRepository.kt | 14 ++++ .../manager/repository/MirrorRepository.kt | 14 ++++ .../vanced/manager/ui/screens/HomeLayout.kt | 8 +- .../manager/ui/viewmodel/MainViewModel.kt | 64 ++++++++-------- 29 files changed, 257 insertions(+), 219 deletions(-) create mode 100644 app/src/main/java/com/vanced/manager/domain/model/Data.kt delete mode 100644 app/src/main/java/com/vanced/manager/domain/model/Json.kt create mode 100644 app/src/main/java/com/vanced/manager/network/DataService.kt delete mode 100644 app/src/main/java/com/vanced/manager/network/JsonService.kt create mode 100644 app/src/main/java/com/vanced/manager/network/model/DataDto.kt create mode 100644 app/src/main/java/com/vanced/manager/network/model/DataDtoMapper.kt delete mode 100644 app/src/main/java/com/vanced/manager/network/model/JsonDto.kt delete mode 100644 app/src/main/java/com/vanced/manager/network/model/JsonDtoMapper.kt create mode 100644 app/src/main/java/com/vanced/manager/repository/DataRepository.kt delete mode 100644 app/src/main/java/com/vanced/manager/repository/JsonRepository.kt delete mode 100644 app/src/main/java/com/vanced/manager/repository/JsonRepositoryImpl.kt create mode 100644 app/src/main/java/com/vanced/manager/repository/MainRepository.kt create mode 100644 app/src/main/java/com/vanced/manager/repository/MirrorRepository.kt diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c9fae9e0..b9f5a5bf 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,7 +16,7 @@ *; } --keep class com.vanced.manager.network.model.JsonDto { +-keep class com.vanced.manager.network.model.DataDto { *; } diff --git a/app/src/main/java/com/vanced/manager/di/APIModule.kt b/app/src/main/java/com/vanced/manager/di/APIModule.kt index 04477c78..bddadd89 100644 --- a/app/src/main/java/com/vanced/manager/di/APIModule.kt +++ b/app/src/main/java/com/vanced/manager/di/APIModule.kt @@ -8,6 +8,7 @@ import okhttp3.OkHttpClient import org.koin.dsl.module import retrofit2.Retrofit +//TODO Add mirror support val apiModule = module { fun provideVancedAPI( diff --git a/app/src/main/java/com/vanced/manager/di/MapperModule.kt b/app/src/main/java/com/vanced/manager/di/MapperModule.kt index 2c0560bd..e6a8159c 100644 --- a/app/src/main/java/com/vanced/manager/di/MapperModule.kt +++ b/app/src/main/java/com/vanced/manager/di/MapperModule.kt @@ -3,7 +3,7 @@ package com.vanced.manager.di import android.content.Context import com.vanced.manager.domain.datasource.PackageInformationDataSource import com.vanced.manager.network.model.AppDtoMapper -import com.vanced.manager.network.model.JsonDtoMapper +import com.vanced.manager.network.model.DataDtoMapper import org.koin.dsl.module val mapperModule = module { @@ -15,9 +15,7 @@ val mapperModule = module { fun provideJsonMapper( appDtoMapper: AppDtoMapper - ): JsonDtoMapper = JsonDtoMapper( - appDtoMapper = appDtoMapper - ) + ) = DataDtoMapper(appDtoMapper) single { provideAppMapper(get(), get()) } single { provideJsonMapper(get()) } diff --git a/app/src/main/java/com/vanced/manager/di/NetworkModule.kt b/app/src/main/java/com/vanced/manager/di/NetworkModule.kt index 94a10c82..94a90107 100644 --- a/app/src/main/java/com/vanced/manager/di/NetworkModule.kt +++ b/app/src/main/java/com/vanced/manager/di/NetworkModule.kt @@ -5,9 +5,8 @@ import org.koin.dsl.module val networkModule = module { - fun provideOkHttpClient(): OkHttpClient { - return OkHttpClient() - } + fun provideOkHttpClient() = + OkHttpClient() single { provideOkHttpClient() } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/PackageManagerModule.kt b/app/src/main/java/com/vanced/manager/di/PackageManagerModule.kt index 4ea917b6..9c4170b2 100644 --- a/app/src/main/java/com/vanced/manager/di/PackageManagerModule.kt +++ b/app/src/main/java/com/vanced/manager/di/PackageManagerModule.kt @@ -11,19 +11,15 @@ val packageManagerModule = module { fun providePackageManager( context: Context - ): PkgManager { - return PkgManagerImpl( + ): PkgManager = + PkgManagerImpl( packageManager = context.packageManager ) - } fun providePackageInformationDataSource( pkgManager: PkgManager - ): PackageInformationDataSource { - return PackageInformationDataSourceImpl( - pkgManager = pkgManager - ) - } + ): PackageInformationDataSource = + PackageInformationDataSourceImpl(pkgManager) single { providePackageManager(get()) } single { providePackageInformationDataSource(get()) } diff --git a/app/src/main/java/com/vanced/manager/di/PreferenceModule.kt b/app/src/main/java/com/vanced/manager/di/PreferenceModule.kt index d43742ff..4c934494 100644 --- a/app/src/main/java/com/vanced/manager/di/PreferenceModule.kt +++ b/app/src/main/java/com/vanced/manager/di/PreferenceModule.kt @@ -4,6 +4,7 @@ import android.content.Context import org.koin.dsl.module val preferenceModule = module { + fun provideDatastore( context: Context ) = context.getSharedPreferences("manager_settings", Context.MODE_PRIVATE) diff --git a/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt b/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt index ec4773f8..fae09460 100644 --- a/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt +++ b/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt @@ -1,20 +1,25 @@ package com.vanced.manager.di -import com.vanced.manager.network.JsonService -import com.vanced.manager.network.model.JsonDtoMapper -import com.vanced.manager.repository.JsonRepository -import com.vanced.manager.repository.JsonRepositoryImpl +import com.vanced.manager.network.DataService +import com.vanced.manager.network.model.DataDtoMapper +import com.vanced.manager.repository.DataRepository +import com.vanced.manager.repository.MainRepository +import com.vanced.manager.repository.MirrorRepository +import org.koin.core.qualifier.named import org.koin.dsl.module val repositoryModule = module { - fun provideJsonRepository( - jsonService: JsonService, - jsonDtoMapper: JsonDtoMapper - ): JsonRepository = JsonRepositoryImpl( - jsonService, - jsonDtoMapper - ) + fun provideMainRepository( + dataService: DataService, + dataDtoMapper: DataDtoMapper + ) = MainRepository(dataService, dataDtoMapper) - single { provideJsonRepository(get(), get()) } + fun provideMirrorRepository( + dataService: DataService, + dataDtoMapper: DataDtoMapper + ) = MirrorRepository(dataService, dataDtoMapper) + + single { provideMainRepository(get(named("main")), get()) } + single { provideMirrorRepository(get(named("mirror")), get()) } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/ServiceModule.kt b/app/src/main/java/com/vanced/manager/di/ServiceModule.kt index 743a82aa..5da133f8 100644 --- a/app/src/main/java/com/vanced/manager/di/ServiceModule.kt +++ b/app/src/main/java/com/vanced/manager/di/ServiceModule.kt @@ -1,22 +1,35 @@ package com.vanced.manager.di import com.google.gson.GsonBuilder -import com.vanced.manager.network.JsonService +import com.vanced.manager.network.DataService import com.vanced.manager.network.util.BASE_GITHUB +import com.vanced.manager.network.util.BASE_MIRROR import okhttp3.OkHttpClient +import org.koin.core.qualifier.named import org.koin.dsl.module import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory val serviceModule = module { - fun provideRetrofitService(okHttpClient: OkHttpClient): JsonService = - Retrofit.Builder() - .baseUrl(BASE_GITHUB) - .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) - .client(okHttpClient) - .build() - .create(JsonService::class.java) + fun provideMainService( + okHttpClient: OkHttpClient + ) = Retrofit.Builder() + .baseUrl(BASE_GITHUB) + .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) + .client(okHttpClient) + .build() + .create(DataService::class.java) - single { provideRetrofitService(get()) } + fun provideMirrorService( + okHttpClient: OkHttpClient + ) = Retrofit.Builder() + .baseUrl(BASE_MIRROR) + .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) + .client(okHttpClient) + .build() + .create(DataService::class.java) + + single(named("main")) { provideMainService(get()) } + single(named("mirror")) { provideMirrorService(get()) } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt b/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt index 20f62c99..7e6a3f15 100644 --- a/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt +++ b/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt @@ -1,5 +1,15 @@ package com.vanced.manager.di +import android.app.Application +import com.vanced.manager.core.downloader.impl.MicrogDownloader +import com.vanced.manager.core.downloader.impl.MusicDownloader +import com.vanced.manager.core.downloader.impl.VancedDownloader +import com.vanced.manager.core.installer.impl.MicrogInstaller +import com.vanced.manager.core.installer.impl.MusicInstaller +import com.vanced.manager.core.installer.impl.VancedInstaller +import com.vanced.manager.repository.DataRepository +import com.vanced.manager.repository.MainRepository +import com.vanced.manager.repository.MirrorRepository import com.vanced.manager.ui.viewmodel.InstallViewModel import com.vanced.manager.ui.viewmodel.MainViewModel import org.koin.android.ext.koin.androidApplication @@ -7,6 +17,23 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val viewModelModule = module { - viewModel { MainViewModel(get(), androidApplication()) } - viewModel { InstallViewModel(get(), get(), get(), get(), get(), get()) } + + fun provideMainViewModel( + mainRepository: MainRepository, + mirrorRepository: MirrorRepository, + app: Application, + ) = MainViewModel(mainRepository, mirrorRepository, app) + + fun provideInstallViewModel( + vancedDownloader: VancedDownloader, + musicDownloader: MusicDownloader, + microgDownloader: MicrogDownloader, + + vancedInstaller: VancedInstaller, + musicInstaller: MusicInstaller, + microgInstaller: MicrogInstaller, + ) = InstallViewModel(vancedDownloader, musicDownloader, microgDownloader, vancedInstaller, musicInstaller, microgInstaller) + + viewModel { provideMainViewModel(get(), get(), androidApplication()) } + viewModel { provideInstallViewModel(get(), get(), get(), get(), get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/domain/model/App.kt b/app/src/main/java/com/vanced/manager/domain/model/App.kt index a93d7dc0..82db872e 100644 --- a/app/src/main/java/com/vanced/manager/domain/model/App.kt +++ b/app/src/main/java/com/vanced/manager/domain/model/App.kt @@ -6,13 +6,9 @@ data class App( val remoteVersionCode: Int, val installedVersion: String?, val installedVersionCode: Int?, - val installedVersionRoot: String?, - val installedVersionCodeRoot: Int?, val iconUrl: String?, val appStatus: AppStatus, - val appStatusRoot: AppStatus, val packageName: String, - val packageNameRoot: String?, val changelog: String, val url: String?, val versions: List?, diff --git a/app/src/main/java/com/vanced/manager/domain/model/Data.kt b/app/src/main/java/com/vanced/manager/domain/model/Data.kt new file mode 100644 index 00000000..89577d23 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/domain/model/Data.kt @@ -0,0 +1,6 @@ +package com.vanced.manager.domain.model + +data class Data( + val manager: App, + val apps: List, +) diff --git a/app/src/main/java/com/vanced/manager/domain/model/Json.kt b/app/src/main/java/com/vanced/manager/domain/model/Json.kt deleted file mode 100644 index ad1d20e1..00000000 --- a/app/src/main/java/com/vanced/manager/domain/model/Json.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.vanced.manager.domain.model - -data class Json( - val isMicrogBroken: Boolean, - val manager: App, - val vanced: App, - val music: App, - val microg: App -) diff --git a/app/src/main/java/com/vanced/manager/domain/pkg/PkgManager.kt b/app/src/main/java/com/vanced/manager/domain/pkg/PkgManager.kt index 3e01ad1b..885dceb3 100644 --- a/app/src/main/java/com/vanced/manager/domain/pkg/PkgManager.kt +++ b/app/src/main/java/com/vanced/manager/domain/pkg/PkgManager.kt @@ -25,23 +25,25 @@ class PkgManagerImpl( @SuppressLint("WrongConstant") @Suppress("DEPRECATION") @Throws(PackageManager.NameNotFoundException::class) - override suspend fun getVersionCode(packageName: String): Int { - return with(packageManager) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .longVersionCode - .and(MAJOR_IGNORE) - .toInt() - } else { - getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .versionCode - } + override suspend fun getVersionCode( + packageName: String + ) = with(packageManager) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) + .longVersionCode + .and(MAJOR_IGNORE) + .toInt() + } else { + getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) + .versionCode } } @SuppressLint("WrongConstant") @Throws(PackageManager.NameNotFoundException::class) - override suspend fun getVersionName(packageName: String): String = - packageManager.getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .versionName + override suspend fun getVersionName( + packageName: String + ): String = packageManager + .getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) + .versionName } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/DataService.kt b/app/src/main/java/com/vanced/manager/network/DataService.kt new file mode 100644 index 00000000..a18e5038 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/DataService.kt @@ -0,0 +1,11 @@ +package com.vanced.manager.network + +import com.vanced.manager.network.model.DataDto +import retrofit2.http.GET + +interface DataService { + + @GET("latest.json") + suspend fun get(): DataDto + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/JsonService.kt b/app/src/main/java/com/vanced/manager/network/JsonService.kt deleted file mode 100644 index 48a88363..00000000 --- a/app/src/main/java/com/vanced/manager/network/JsonService.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.vanced.manager.network - -import com.vanced.manager.network.model.JsonDto -import retrofit2.http.GET - -interface JsonService { - - @GET("latest.json") - suspend fun get(): JsonDto - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/model/AppDto.kt b/app/src/main/java/com/vanced/manager/network/model/AppDto.kt index ed504212..d1161ca6 100644 --- a/app/src/main/java/com/vanced/manager/network/model/AppDto.kt +++ b/app/src/main/java/com/vanced/manager/network/model/AppDto.kt @@ -5,11 +5,10 @@ import com.google.gson.annotations.SerializedName data class AppDto( @SerializedName("name") val name: String, @SerializedName("version") val version: String, - @SerializedName("versionCode") val versionCode: Int, + @SerializedName("version_code") val versionCode: Int, @SerializedName("changelog") val changelog: String, - @SerializedName("icon_url") val iconUrl: String? = null, + @SerializedName("icon_url") val iconUrl: String, @SerializedName("package_name") val packageName: String, - @SerializedName("package_name_root") val packageNameRoot: String? = null, @SerializedName("url") val url: String? = null, @SerializedName("versions") val versions: List? = null, @SerializedName("themes") val themes: List? = null, diff --git a/app/src/main/java/com/vanced/manager/network/model/AppDtoMapper.kt b/app/src/main/java/com/vanced/manager/network/model/AppDtoMapper.kt index 934e326e..fc310eec 100644 --- a/app/src/main/java/com/vanced/manager/network/model/AppDtoMapper.kt +++ b/app/src/main/java/com/vanced/manager/network/model/AppDtoMapper.kt @@ -17,8 +17,8 @@ import com.vanced.manager.network.util.VANCED_NAME import java.util.* class AppDtoMapper( - private val packageInformationDataSource: PackageInformationDataSource, - context: Context + private val pkgInfoDataSource: PackageInformationDataSource, + private val context: Context ) : EntityMapper { private val latestVersionRadioButton = @@ -27,46 +27,40 @@ class AppDtoMapper( key = "latest" ) - override suspend fun mapToModel(entity: AppDto): App = - with(entity) { - val localVersionCode = packageInformationDataSource.getVersionCode(packageName) - val localVersionCodeRoot = - packageInformationDataSource.getVersionCode(packageNameRoot ?: "") - val localVersionName = packageInformationDataSource.getVersionName(packageName) - val localVersionNameRoot = - packageInformationDataSource.getVersionName(packageNameRoot ?: "") - App( - name = name, - remoteVersion = version, - remoteVersionCode = versionCode, - installedVersion = localVersionName, - installedVersionCode = localVersionCode, - installedVersionRoot = localVersionNameRoot, - installedVersionCodeRoot = localVersionCodeRoot, - appStatus = compareVersionCodes(versionCode, localVersionCode), - appStatusRoot = compareVersionCodes(versionCode, localVersionCodeRoot), - packageName = packageName, - packageNameRoot = packageNameRoot, - iconUrl = iconUrl, - changelog = changelog, - url = url, - versions = versions, - themes = themes, - languages = languages, - installationOptions = getInstallationOptions(name, themes, versions, languages) - ) - } + override suspend fun mapToModel( + entity: AppDto + ) = with(entity) { + val localVersionCode = pkgInfoDataSource.getVersionCode(packageName) + App( + name = name, + remoteVersion = version, + remoteVersionCode = versionCode, + installedVersion = pkgInfoDataSource.getVersionName(packageName), + installedVersionCode = localVersionCode, + appStatus = compareVersionCodes(versionCode, localVersionCode), + packageName = packageName, + iconUrl = iconUrl, + changelog = changelog, + url = url, + versions = versions, + themes = themes, + languages = languages, + installationOptions = getInstallationOptions(name, themes, versions, languages) + ) + } - private fun compareVersionCodes(remote: Int?, local: Int?) = - if (local != null && remote != null) { - when { - remote > local -> AppStatus.Update - remote <= local -> AppStatus.Reinstall - else -> AppStatus.Install - } - } else { - AppStatus.Install + private fun compareVersionCodes( + remote: Int?, + local: Int? + ) = if (local != null && remote != null) { + when { + remote > local -> AppStatus.Update + remote <= local -> AppStatus.Reinstall + else -> AppStatus.Install } + } else { + AppStatus.Install + } private fun getInstallationOptions( appName: String, diff --git a/app/src/main/java/com/vanced/manager/network/model/DataDto.kt b/app/src/main/java/com/vanced/manager/network/model/DataDto.kt new file mode 100644 index 00000000..36a3242f --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/model/DataDto.kt @@ -0,0 +1,13 @@ +package com.vanced.manager.network.model + +import com.google.gson.annotations.SerializedName + +data class DataDto( + @SerializedName("manager") val manager: AppDto, + @SerializedName("apps") val apps: DataAppDto +) + +data class DataAppDto( + @SerializedName("nonroot") val nonroot: List, + @SerializedName("root") val root: List, +) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/model/DataDtoMapper.kt b/app/src/main/java/com/vanced/manager/network/model/DataDtoMapper.kt new file mode 100644 index 00000000..479b8cc6 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/model/DataDtoMapper.kt @@ -0,0 +1,26 @@ +package com.vanced.manager.network.model + +import com.vanced.manager.core.preferences.holder.managerVariantPref +import com.vanced.manager.domain.model.Data +import com.vanced.manager.domain.util.EntityMapper + +class DataDtoMapper( + private val appDtoMapper: AppDtoMapper +) : EntityMapper { + + override suspend fun mapToModel( + entity: DataDto + ) = with(entity) { + Data( + manager = appDtoMapper.mapToModel(manager), + apps = + if (managerVariantPref == "root") { + apps.root + } else { + apps.nonroot + }.map { appDto -> + appDtoMapper.mapToModel(appDto) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/model/JsonDto.kt b/app/src/main/java/com/vanced/manager/network/model/JsonDto.kt deleted file mode 100644 index b0b9f8d3..00000000 --- a/app/src/main/java/com/vanced/manager/network/model/JsonDto.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.vanced.manager.network.model - -import com.google.gson.annotations.SerializedName - -data class JsonDto( - @SerializedName("is_microg_broken") var isMicrogBroken: Boolean, - @SerializedName("manager") var manager: AppDto, - @SerializedName("vanced") var vanced: AppDto, - @SerializedName("music") var music: AppDto, - @SerializedName("microg") var microg: AppDto -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/model/JsonDtoMapper.kt b/app/src/main/java/com/vanced/manager/network/model/JsonDtoMapper.kt deleted file mode 100644 index 7d944164..00000000 --- a/app/src/main/java/com/vanced/manager/network/model/JsonDtoMapper.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.vanced.manager.network.model - -import com.vanced.manager.domain.model.Json -import com.vanced.manager.domain.util.EntityMapper - -class JsonDtoMapper( - private val appDtoMapper: AppDtoMapper -) : EntityMapper { - - override suspend fun mapToModel(entity: JsonDto): Json = - with(entity) { - Json( - isMicrogBroken = isMicrogBroken, - manager = appDtoMapper.mapToModel(manager), - vanced = appDtoMapper.mapToModel(vanced), - music = appDtoMapper.mapToModel(music), - microg = appDtoMapper.mapToModel(microg) - ) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/util/Constants.kt b/app/src/main/java/com/vanced/manager/network/util/Constants.kt index 7e791feb..71dafac8 100644 --- a/app/src/main/java/com/vanced/manager/network/util/Constants.kt +++ b/app/src/main/java/com/vanced/manager/network/util/Constants.kt @@ -1,7 +1,8 @@ package com.vanced.manager.network.util const val BASE = "https://api.vancedapp.com/api/v1/" -const val BASE_GITHUB = "https://x1nto.github.io/VancedFiles/" +const val BASE_MIRROR = "https://x1nto.github.io/VancedFiles/api/v2/" //TODO +const val BASE_GITHUB = "https://x1nto.github.io/VancedFiles/api/v2/" const val VANCED_NAME = "YouTube Vanced" const val MUSIC_NAME = "YouTube Vanced Music" diff --git a/app/src/main/java/com/vanced/manager/repository/DataRepository.kt b/app/src/main/java/com/vanced/manager/repository/DataRepository.kt new file mode 100644 index 00000000..3879b0a8 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/DataRepository.kt @@ -0,0 +1,9 @@ +package com.vanced.manager.repository + +import com.vanced.manager.domain.model.Data + +interface DataRepository { + + suspend fun fetch(): Data + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/JsonRepository.kt b/app/src/main/java/com/vanced/manager/repository/JsonRepository.kt deleted file mode 100644 index 8ae38e35..00000000 --- a/app/src/main/java/com/vanced/manager/repository/JsonRepository.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.vanced.manager.repository - -import com.vanced.manager.domain.model.Json - -interface JsonRepository { - - suspend fun fetch(): Json - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/JsonRepositoryImpl.kt b/app/src/main/java/com/vanced/manager/repository/JsonRepositoryImpl.kt deleted file mode 100644 index 7cbc27cb..00000000 --- a/app/src/main/java/com/vanced/manager/repository/JsonRepositoryImpl.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.vanced.manager.repository - -import com.vanced.manager.domain.model.Json -import com.vanced.manager.network.JsonService -import com.vanced.manager.network.model.JsonDtoMapper - -class JsonRepositoryImpl( - private val service: JsonService, - private val mapper: JsonDtoMapper -) : JsonRepository { - - override suspend fun fetch(): Json { - return mapper.mapToModel(service.get()) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/MainRepository.kt b/app/src/main/java/com/vanced/manager/repository/MainRepository.kt new file mode 100644 index 00000000..eab19bd7 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/MainRepository.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.repository + +import com.vanced.manager.network.DataService +import com.vanced.manager.network.model.DataDtoMapper + +class MainRepository( + private val mainService: DataService, + private val mapper: DataDtoMapper +) : DataRepository { + + override suspend fun fetch() = + mapper.mapToModel(mainService.get()) + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/MirrorRepository.kt b/app/src/main/java/com/vanced/manager/repository/MirrorRepository.kt new file mode 100644 index 00000000..5f0eb5ed --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/MirrorRepository.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.repository + +import com.vanced.manager.network.DataService +import com.vanced.manager.network.model.DataDtoMapper + +class MirrorRepository( + private val mirrorService: DataService, + private val mapper: DataDtoMapper +) : DataRepository { + + override suspend fun fetch() = + mapper.mapToModel(mirrorService.get()) + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/screens/HomeLayout.kt b/app/src/main/java/com/vanced/manager/ui/screens/HomeLayout.kt index 50bef3b6..e30900f9 100644 --- a/app/src/main/java/com/vanced/manager/ui/screens/HomeLayout.kt +++ b/app/src/main/java/com/vanced/manager/ui/screens/HomeLayout.kt @@ -30,7 +30,6 @@ import com.vanced.manager.ui.component.menu.ManagerDropdownMenuItem import com.vanced.manager.ui.component.text.ManagerText import com.vanced.manager.ui.component.topappbar.ManagerTopAppBar import com.vanced.manager.ui.resources.managerString -import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.Screen import com.vanced.manager.ui.viewmodel.MainViewModel import com.vanced.manager.ui.widget.app.AppCard @@ -145,7 +144,6 @@ fun HomeLayout( viewModel.launchApp( appName = app.name, appPackage = app.packageName, - appPackageRoot = app.packageNameRoot ) }, onAppInfoClick = { @@ -191,8 +189,7 @@ fun HomeLayout( } managerCategory(homeCategorySupportUs) { ScrollableItemRow( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), items = sponsors ) { sponsor -> ManagerLinkCard( @@ -204,8 +201,7 @@ fun HomeLayout( } managerCategory(homeCategorySocialMedia) { ScrollableItemRow( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), items = socialMedia ) { socialMedia -> ManagerLinkCard( diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt index 23d02760..7732618a 100644 --- a/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt +++ b/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt @@ -12,22 +12,25 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.vanced.manager.core.installer.util.uninstallPackage import com.vanced.manager.core.preferences.holder.managerVariantPref -import com.vanced.manager.core.preferences.holder.musicEnabled -import com.vanced.manager.core.preferences.holder.vancedEnabled import com.vanced.manager.domain.model.App import com.vanced.manager.network.util.MICROG_NAME import com.vanced.manager.network.util.MUSIC_NAME import com.vanced.manager.network.util.VANCED_NAME -import com.vanced.manager.repository.JsonRepository +import com.vanced.manager.repository.MainRepository +import com.vanced.manager.repository.MirrorRepository import kotlinx.coroutines.launch class MainViewModel( - private val repository: JsonRepository, + private val mainRepository: MainRepository, + private val mirrorRepository: MirrorRepository, private val app: Application ) : AndroidViewModel(app) { - private val isNonroot - get() = managerVariantPref == "nonroot" + private val isRoot + get() = managerVariantPref == "root" + + private val appCount: Int + get() = if (isRoot) 2 else 3 sealed class AppState { data class Fetching(val placeholderAppsCount: Int) : AppState() @@ -42,37 +45,19 @@ class MainViewModel( viewModelScope.launch { appState = AppState.Fetching(appCount) - try { - with(repository.fetch()) { - val apps = mutableListOf() - - apps.apply { - if (vancedEnabled) add(vanced) - if (musicEnabled) add(music) - if (isNonroot) add(microg) - } - - appState = AppState.Success(apps) - } - } catch (e: Exception) { - val error = "failed to fetch: \n${e.stackTraceToString()}" - appState = AppState.Error(error) - Log.d(TAG, error) - } + fetchData() } } fun launchApp( appName: String, appPackage: String, - appPackageRoot: String? ) { - val pkg = if (isNonroot) appPackage else appPackageRoot ?: appPackage val component = ComponentName( /* pkg = */ appPackage, /* cls = */ when (appName) { - VANCED_NAME -> "$pkg.HomeActivity" - MUSIC_NAME -> "$pkg.activities.MusicActivity" + VANCED_NAME -> "com.google.android.youtube.HomeActivity" + MUSIC_NAME -> "com.google.android.apps.youtube.music.activities.MusicActivity" MICROG_NAME -> "org.microg.gms.ui.SettingsActivity" else -> throw IllegalArgumentException("$appName is not a valid app") } @@ -98,16 +83,25 @@ class MainViewModel( uninstallPackage(appPackage, app) } - private val appCount: Int - get() { - var appsCount = 0 + private suspend fun fetchData( + fromMirror: Boolean = false + ) { + try { + val repository = if (fromMirror) mirrorRepository else mainRepository + with(repository.fetch()) { + appState = AppState.Success(apps) + } + } catch (e: Exception) { + if (!fromMirror) { + fetchData(true) + return + } - if (vancedEnabled) appsCount++ - if (musicEnabled) appsCount++ - if (isNonroot) appsCount++ - - return appsCount + val error = "failed to fetch: \n${e.stackTraceToString()}" + appState = AppState.Error(error) + Log.d(TAG, error) } + } companion object { const val TAG = "MainViewModel"