diff --git a/app/build.gradle b/app/build.gradle index 276cc7866e76d312a5759144aa9ebd66eeb8dcf6..8d1a3626e4c03471e94fe54c992a8563c45337ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,9 +49,6 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' testImplementation 'junit:junit:4.12' - implementation files('libs/jackson-databind-2.9.7.jar') - implementation files('libs/jackson-annotations-2.9.7.jar') - implementation files('libs/jackson-core-2.9.7.jar') implementation group: 'commons-codec', name: 'commons-codec', version: '1.11' implementation 'org.bouncycastle:bcprov-jdk15on:1.60' implementation 'org.bouncycastle:bcpg-jdk15on:1.60' @@ -82,7 +79,11 @@ dependencies { implementation 'com.trello.rxlifecycle3:rxlifecycle-components-preference:3.1.0' implementation 'com.makeramen:roundedimageview:2.3.0' - implementation 'com.github.chrisbanes:PhotoView:2.3.0' - + // Jackson + implementation "com.fasterxml.jackson.core:jackson-core:2.11.1" + implementation "com.fasterxml.jackson.core:jackson-annotations:2.11.1" + implementation "com.fasterxml.jackson.core:jackson-databind:2.11.1" + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.11.1" + implementation 'com.github.chrisbanes:PhotoView:2.3.0' } diff --git a/app/libs/jackson-annotations-2.9.7.jar b/app/libs/jackson-annotations-2.9.7.jar deleted file mode 100644 index 46f56b264375f71a1200f1fcde159aa3e449ea7c..0000000000000000000000000000000000000000 Binary files a/app/libs/jackson-annotations-2.9.7.jar and /dev/null differ diff --git a/app/libs/jackson-core-2.9.7.jar b/app/libs/jackson-core-2.9.7.jar deleted file mode 100644 index fa46a7f6a20547f032575b4bfbdd22f127eb9054..0000000000000000000000000000000000000000 Binary files a/app/libs/jackson-core-2.9.7.jar and /dev/null differ diff --git a/app/libs/jackson-databind-2.9.7.jar b/app/libs/jackson-databind-2.9.7.jar deleted file mode 100644 index 76d50b4f27ada026cffd5a686a53101cf5d44f2b..0000000000000000000000000000000000000000 Binary files a/app/libs/jackson-databind-2.9.7.jar and /dev/null differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f1b424510da51fd82143bc74a0a801ae5a1e2fcd..2b35060199485e83e0dd160caccfd70a15fbf217 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,3 +19,17 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + +# Without these lines, jackson will fail to create any immutable/nonnull kotlin classes +-keep class kotlin.* { *; } +-keep class kotlin.Metadata { *; } +-dontwarn kotlin.** +-keepclassmembers class **$WhenMappings { + ; +} +-keepclassmembers class kotlin.Metadata { + public ; +} +-assumenosideeffects class kotlin.jvm.internal.Intrinsics { + static void checkParameterIsNotNull(java.lang.Object, java.lang.String); +} diff --git a/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt b/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt index 23998ff9d6f1eca48f5ab3248eaebfe309a1d6fe..fdff42546b9e5b921dd817509c3143e4b8ae37ce 100644 --- a/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt @@ -3,6 +3,7 @@ package foundation.e.apps.api import android.content.Context import com.fasterxml.jackson.annotation.JsonAnySetter import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity import foundation.e.apps.application.model.Application @@ -54,6 +55,7 @@ class HomePwaRequest { } class PwasSubHomeResult @JsonCreator constructor() { + @JsonIgnore val apps = LinkedHashMap>() lateinit var bannerApps: Array diff --git a/app/src/main/java/foundation/e/apps/api/HomeRequest.kt b/app/src/main/java/foundation/e/apps/api/HomeRequest.kt index a67026c6127302f204387e72dd89192e6cd5d921..35c34f86444d842ea4433c63c03712163257d91a 100644 --- a/app/src/main/java/foundation/e/apps/api/HomeRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/HomeRequest.kt @@ -18,8 +18,6 @@ package foundation.e.apps.api import android.content.Context -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.application.model.Application @@ -34,89 +32,76 @@ import foundation.e.apps.utils.Error class HomeRequest { companion object { - private val reader = Common.getObjectMapper().readerFor(HomeResult::class.java) + private val mapper = Common.getObjectMapper() } - fun request(callback: (Error?, HomeResult?) -> Unit) { + fun request(callback: (Error?, Result?) -> Unit) { try { - var appType =mActivity.showApplicationTypePreference() + val appType = mActivity.showApplicationTypePreference() val url = Constants.BASE_URL + "apps?action=list_home&source=$appType&type=$appType" val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) - val result = reader.readValue(urlConnection.inputStream) + val result = mapper.readValue(urlConnection.inputStream, Result::class.java) urlConnection.disconnect() callback.invoke(null, result) } catch (e: Exception) { + e.printStackTrace() callback.invoke(Error.findError(e), null) } } - class HomeResult @JsonCreator - constructor(@JsonProperty("home") private val home: SubHomeResult) { + + + data class Result(val success: Boolean, val home: Home) + + data class Home( + @JsonProperty(BANNER_APPS_KEY) + val bannerApps: List, + @JsonProperty(TOP_UPDATED_APPS_KEY) + val topUpdatedApps: List, + @JsonProperty(TOP_UPDATED_GAMES_KEY) + val topUpdatedGames: List, + @JsonProperty(POPULAR_APPS_24_HOUR_KEY) + val popularAppsIn24Hours: List, + @JsonProperty(POPULAR_GAMES_24_HOUR_KEY) + val popularGamesIn24Hours: List, + @JsonProperty(DISCOVER_KEY) + val discover: List + ) { + + companion object { + private const val BANNER_APPS_KEY = "banner_apps" + private const val TOP_UPDATED_APPS_KEY = "top_updated_apps" + private const val TOP_UPDATED_GAMES_KEY = "top_updated_games" + private const val POPULAR_APPS_24_HOUR_KEY = "popular_apps_in_last_24_hours" + private const val POPULAR_GAMES_24_HOUR_KEY = "popular_games_in_last_24_hours" + private const val DISCOVER_KEY = "discover" + private val KEYS = setOf(TOP_UPDATED_APPS_KEY, + TOP_UPDATED_GAMES_KEY, POPULAR_APPS_24_HOUR_KEY, + POPULAR_GAMES_24_HOUR_KEY, DISCOVER_KEY) + } + fun getBannerApps(applicationManager: ApplicationManager, context: Context): ArrayList { - return ApplicationParser.parseToApps(applicationManager, context, home.bannerApps) + return ApplicationParser.parseToApps(applicationManager, context, bannerApps.toTypedArray()) + } fun getApps(applicationManager: ApplicationManager, context: Context): LinkedHashMap> { val apps = LinkedHashMap>() - for (pair in home.apps) { - if(pair.value .isEmpty() ){ - apps.remove(pair.key) - }else { - - apps[pair.key] = ApplicationParser.parseToApps(applicationManager, context, pair.value.toTypedArray()) + KEYS.forEach { + val parsedApps = when (it) { + TOP_UPDATED_APPS_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedApps.toTypedArray()) + TOP_UPDATED_GAMES_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedGames.toTypedArray()) + POPULAR_APPS_24_HOUR_KEY -> ApplicationParser.parseToApps(applicationManager, context, popularAppsIn24Hours.toTypedArray()) + POPULAR_GAMES_24_HOUR_KEY -> ApplicationParser.parseToApps(applicationManager, context, popularGamesIn24Hours.toTypedArray()) + DISCOVER_KEY -> ApplicationParser.parseToApps(applicationManager, context, discover.toTypedArray()) + else -> throw IllegalArgumentException("Unrecognised key $it encountered") } + apps[Category(it)] = parsedApps + } return apps } } - - class SubHomeResult @JsonCreator constructor() { - val apps = LinkedHashMap>() - lateinit var bannerApps: Array - - @JsonAnySetter - fun append(key: String, value: Any) { - val apps = value as ArrayList<*> - val appsData = ArrayList() - apps.forEach { - val data = it as LinkedHashMap<*, *> - val appData = BasicData( - data["_id"] as String, - data["name"] as String, - data["package_name"] as String, - data["latest_version_number"].toString(), - data["latest_downloaded_version"].toString(), - data["x86_64_latest_downloaded_version"].toString(), - data["x86_64_latest_version_number"].toString(), - data["armeabi_latest_downloaded_version"].toString(), - data["armeabi_latest_version_number"].toString(), - data["arm64-v8a_latest_downloaded_version"].toString(), - data["arm64-v8a_latest_version_number"].toString(), - data["x86_latest_downloaded_version"].toString(), - data["x86_latest_version_number"].toString(), - data["armeabi-v7a_latest_downloaded_version"].toString(), - data["armeabi-v7a_latest_version_number"].toString(), - data["architectures"]as List as ArrayList, - data["author"] as String, - data["icon_image_path"] as String, - (data["other_images_path"] as List).toTypedArray(), - data["exodus_score"].toString().toFloat(), - BasicData.Ratings( - (data["ratings"] as LinkedHashMap) - ["usageQualityScore"]!!.toFloat(), - (data["ratings"] as LinkedHashMap) - ["privacyScore"]!!.toFloat()), - data["category"] as String, - data["is_pwa"]as Boolean) - appsData.add(appData) - } - if (key == "banner_apps") { - bannerApps = appsData.toTypedArray() - } else { - this.apps[Category(key)] = appsData - } - } - } } diff --git a/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt b/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt index 655a6082a55021081aa1e7c35d4c18807c44e76d..cfdb17afe5336edbccb5638dfb181c6af8f5ab4c 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt @@ -30,28 +30,35 @@ import foundation.e.apps.utils.ImagesLoader import java.net.URL import javax.net.ssl.HttpsURLConnection + class BasicData @JsonCreator constructor(@param:JsonProperty("_id") val id: String, @param:JsonProperty("name") val name: String, @param:JsonProperty("package_name") val packageName: String, - @param:JsonProperty("latest_version_number") var lastVersionNumber: String?, - @param:JsonProperty("latest_downloaded_version") val latestDownloadableUpdate: String?, - @param:JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String?, - @param:JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String?, - @param:JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String?, - @param:JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String?, - @param:JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String?, - @param:JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String?, - @param:JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String?, - @param:JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String?, - @param:JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String?, - @param:JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String?, + @param:JsonProperty("latest_version_number") var lastVersionNumber: String, + @param:JsonProperty("latest_version_code") var lastVersionCode: Long, + @param:JsonProperty("latest_downloaded_version") val latestDownloadableUpdate: String, + @param:JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String, + @param:JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String = "-1", + @param:JsonProperty("x86_64_latest_version_code") var x86_64_lastVersionCode: Long = -1, + @param:JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String, + @param:JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String = "-1", + @param:JsonProperty("armeabi_latest_version_code") var armeabi_lastVersionCode: Long = -1, + @param:JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String, + @param:JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String = "-1", + @param:JsonProperty("arm64-v8a_latest_version_code") var arm64_v8a_lastVersionCode: Long = -1, + @param:JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String, + @param:JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String = "-1", + @param:JsonProperty("x86_latest_version_code") var x86_lastVersionCode: Long = -1, + @param:JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String, + @param:JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String = "-1", + @param:JsonProperty("armeabi-v7a_latest_version_code") var armeabi_v7a_lastVersionCode: Long = -1, @param:JsonProperty("architectures") val apkArchitecture: ArrayList?, - @param:JsonProperty("author") val author: String?, + @param:JsonProperty("author") val author: String, @param:JsonProperty("icon_image_path") private val iconUri: String, @param:JsonProperty("other_images_path") val imagesUri: Array, @param:JsonProperty("exodus_score") val privacyRating: Float?, - @param:JsonProperty("ratings") val ratings: Ratings?, + @param:JsonProperty("ratings") val ratings: Ratings, @param:JsonProperty("category") val category: String, @param:JsonProperty("is_pwa") val is_pwa: Boolean){ @@ -61,7 +68,7 @@ constructor(@param:JsonProperty("_id") val id: String, fun loadImagesAsyncly(getter: (List) -> Unit) { if (images == null) { - Execute({ + Execute({ loadImagesSynced() }, { getter.invoke(images!!) @@ -133,52 +140,58 @@ constructor(@param:JsonProperty("_id") val id: String, fun getLastVersion(): String? { if(apkArchitecture!=null) { - //An ordered list of ABIs supported by this device. The most preferred ABI is the first element in the list. - val arch = android.os.Build.SUPPORTED_ABIS.toList() - when(arch[0]) { - "arm64-v8a" -> { - if (arm64_v8a_latest_latestDownloadableUpdate != "-1") - return arm64_v8a_lastVersionNumber // arm64 architecture - - else if (armeabi_v7a_latestDownloadableUpdate != "-1") - return armeabi_v7a_lastVersionNumber //armeabi_v7a - - else if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber //armeabi - - else lastVersionNumber - } + //An ordered list of ABIs supported by this device. The most preferred ABI is the first element in the list. + val arch = android.os.Build.SUPPORTED_ABIS.toList() + when(arch[0]) { + "arm64-v8a" -> { + return largestVersion(Pair(arm64_v8a_lastVersionNumber, arm64_v8a_lastVersionCode), + Pair(armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode), + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) + } - "armeabi-v7a" -> { - if (armeabi_v7a_latestDownloadableUpdate != "-1") - return armeabi_v7a_lastVersionNumber - else if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber - else lastVersionNumber //universal - } + "armeabi-v7a" -> { + return largestVersion( + Pair(armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode), + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) + } - "armeabi" -> { - if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber - else lastVersionNumber - } + "armeabi" -> { + return largestVersion( + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) + } - "x86-64" -> { - if(x86_64_latestDownloadableUpdate != "-1") - return x86_64_lastVersionNumber - else if(x86_latestDownloadableUpdate != "-1") - return x86_lastVersionNumber - else lastVersionNumber - } + "x86-64" -> { + return largestVersion( + Pair(x86_64_lastVersionNumber, x86_64_lastVersionCode), + Pair(x86_lastVersionNumber, x86_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) + } - "x86" -> { - if(x86_latestDownloadableUpdate != "-1") - return x86_lastVersionNumber - else lastVersionNumber - } + "x86" -> { + return largestVersion(Pair(x86_lastVersionNumber, x86_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } + } } return lastVersionNumber //universal } + + private fun largestVersion(vararg versions: Pair): String { + var largestVersion = versions[0] + versions.forEach { + val version = it + if (version.second > largestVersion.second) { + largestVersion = version + } + } + return largestVersion.first + } + + + + } diff --git a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt index 07e360d21067d3a0d16d327197b2d74b862bee8d..5134317f8484b1fcf6f063c4930510f15aa36f66 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt @@ -28,20 +28,26 @@ constructor( @JsonProperty("_id") id: String, @JsonProperty("name") name: String, @JsonProperty("package_name") packageName: String, - @JsonProperty("latest_version_number") latestVersionNumber: String?, - @JsonProperty("latest_downloaded_version") latestDownloadableUpdate: String?, - @JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String?, - @JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String?, - @JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String?, - @JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String?, - @JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String?, - @JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String?, - @JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String?, - @JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String?, - @JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String?, - @JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String?, + @JsonProperty("latest_version_number") latestVersionNumber: String, + @JsonProperty("latest_version_code") lastVersionCode: Long, + @JsonProperty("latest_downloaded_version") latestDownloadableUpdate: String, + @JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String = "-1", + @JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String = "-1", + @JsonProperty("x86_64_latest_version_code") var x86_64_lastVersionCode: Long = -1, + @JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String = "-1", + @JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String = "-1", + @JsonProperty("armeabi_latest_version_code") var armeabi_lastVersionCode: Long = -1, + @JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String = "-1", + @JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String = "-1", + @JsonProperty("arm64-v8a_latest_version_code") var arm64_v8a_lastVersionCode: Long = -1, + @JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String = "-1", + @JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String = "-1", + @JsonProperty("x86_latest_version_code") var x86_lastVersionCode: Long = -1, + @JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String = "-1", + @JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String = "-1", + @JsonProperty("armeabi-v7a_latest_version_code") var armeabi_v7a_lastVersionCode: Long = -1, @JsonProperty("architectures") val apkArchitecture: ArrayList?, - @JsonProperty("author") author: String?, + @JsonProperty("author") author: String, @JsonProperty("icon_image_path") iconUri: String, @JsonProperty("other_images_path") imagesUri: Array, @JsonProperty("category") categoryId: String, @@ -52,16 +58,16 @@ constructor( var basicData = if (ratings == null) { - BasicData(id, name,packageName, latestVersionNumber, latestDownloadableUpdate, - x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,armeabi_latestDownloadableUpdate, - armeabi_lastVersionNumber,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber, - x86_latestDownloadableUpdate,x86_lastVersionNumber,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,apkArchitecture, + BasicData(id, name,packageName, latestVersionNumber,lastVersionCode, latestDownloadableUpdate, + x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,x86_64_lastVersionCode,armeabi_latestDownloadableUpdate, + armeabi_lastVersionNumber,armeabi_lastVersionCode,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber,arm64_v8a_lastVersionCode, + x86_latestDownloadableUpdate,x86_lastVersionNumber,x86_lastVersionCode,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,armeabi_v7a_lastVersionCode,apkArchitecture, author,iconUri, imagesUri, null,BasicData.Ratings(-1f, -1f), categoryId,is_pwa) } else { - BasicData(id, name,packageName, latestVersionNumber, latestDownloadableUpdate, - x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,armeabi_latestDownloadableUpdate, - armeabi_lastVersionNumber,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber, - x86_latestDownloadableUpdate,x86_lastVersionNumber,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,apkArchitecture, + BasicData(id, name,packageName, latestVersionNumber,lastVersionCode, latestDownloadableUpdate, + x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,x86_64_lastVersionCode,armeabi_latestDownloadableUpdate, + armeabi_lastVersionNumber,armeabi_lastVersionCode,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber,arm64_v8a_lastVersionCode, + x86_latestDownloadableUpdate,x86_lastVersionNumber,x86_lastVersionCode,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,armeabi_v7a_lastVersionCode,apkArchitecture, author,iconUri, imagesUri, ratings.privacyRating, ratings, categoryId,is_pwa) } diff --git a/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt b/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt index 6ab3e39f286f53488bf50eb16593961df53e97cc..18723cb4f6e6d55ab466cbd17338b91921537489 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt @@ -2,8 +2,11 @@ package foundation.e.apps.application.model.data import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.util.Log +import androidx.core.content.res.ResourcesCompat import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty +import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error @@ -12,31 +15,38 @@ import java.net.URL import javax.net.ssl.HttpsURLConnection class SearchAppsBasicData@JsonCreator - constructor(@param:JsonProperty("_id") val id: String, - @param:JsonProperty("name") val name: String, - @param:JsonProperty("package_name") val packageName: String?, - @param:JsonProperty("latest_version_number") var lastVersionNumber: String?, - @param:JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String?, - @param:JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String?, - @param:JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String?, - @param:JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String?, - @param:JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String?, - @param:JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String?, - @param:JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String?, - @param:JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String?, - @param:JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String?, - @param:JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String?, - @param:JsonProperty("architectures") val apkArchitecture: ArrayList?, - @param:JsonProperty("is_pwa") val is_pwa: Boolean, - @param:JsonProperty("author") val author: String?, - @param:JsonProperty("is_web_app") val is_web_app: Boolean, - @param:JsonProperty("category") val category: String, - @param:JsonProperty("icon_image_path") val icon_uri: String, - @param:JsonProperty("other_images_path") val imagesUri: Array){ - - - private var icon: Bitmap? = null - private var images: List? = null +constructor(@param:JsonProperty("_id") val id: String, + @param:JsonProperty("name") val name: String, + @param:JsonProperty("package_name") val packageName: String?, + @param:JsonProperty("latest_version_number") var lastVersionNumber: String, + @param:JsonProperty("latest_version_code") var lastVersionCode: Long, + @param:JsonProperty("latest_downloaded_version") val latestDownloadableUpdate: String, + @param:JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String, + @param:JsonProperty("x86_64_latest_version_number") val x86_64_lastVersionNumber: String = "-1", + @param:JsonProperty("x86_64_latest_version_code") var x86_64_lastVersionCode: Long = -1, + @param:JsonProperty("armeabi_latest_downloaded_version") val armeabi_latestDownloadableUpdate: String, + @param:JsonProperty("armeabi_latest_version_number") val armeabi_lastVersionNumber: String = "-1", + @param:JsonProperty("armeabi_latest_version_code") var armeabi_lastVersionCode: Long = -1, + @param:JsonProperty("arm64-v8a_latest_downloaded_version") val arm64_v8a_latest_latestDownloadableUpdate: String, + @param:JsonProperty("arm64-v8a_latest_version_number") val arm64_v8a_lastVersionNumber: String = "-1", + @param:JsonProperty("arm64-v8a_latest_version_code") var arm64_v8a_lastVersionCode: Long = -1, + @param:JsonProperty("x86_latest_downloaded_version") val x86_latestDownloadableUpdate: String, + @param:JsonProperty("x86_latest_version_number") val x86_lastVersionNumber: String = "-1", + @param:JsonProperty("x86_latest_version_code") var x86_lastVersionCode: Long = -1, + @param:JsonProperty("armeabi-v7a_latest_downloaded_version") val armeabi_v7a_latestDownloadableUpdate: String, + @param:JsonProperty("armeabi-v7a_latest_version_number") val armeabi_v7a_lastVersionNumber: String = "-1", + @param:JsonProperty("armeabi-v7a_latest_version_code") var armeabi_v7a_lastVersionCode: Long = -1, + @param:JsonProperty("architectures") val apkArchitecture: ArrayList?, + @param:JsonProperty("is_pwa") val is_pwa: Boolean, + @param:JsonProperty("author") val author: String, + @param:JsonProperty("is_web_app") val is_web_app: Boolean, + @param:JsonProperty("category") val category: String, + @param:JsonProperty("icon_image_path") val icon_uri: String, + @param:JsonProperty("other_images_path") val imagesUri: Array){ + + + private var icon: Bitmap? = null + private var images: List? = null fun updateLoadedImages(other: SearchAppsBasicData) { @@ -93,48 +103,50 @@ class SearchAppsBasicData@JsonCreator val arch = android.os.Build.SUPPORTED_ABIS.toList() when(arch[0]) { "arm64-v8a" -> { - if (arm64_v8a_latest_latestDownloadableUpdate != "-1") - return arm64_v8a_lastVersionNumber // arm64 architecture - - else if (armeabi_v7a_latestDownloadableUpdate != "-1") - return armeabi_v7a_lastVersionNumber //armeabi_v7a - - else if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber //armeabi - - else lastVersionNumber + return largestVersion(Pair(arm64_v8a_lastVersionNumber, arm64_v8a_lastVersionCode), + Pair(armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode), + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } "armeabi-v7a" -> { - if (armeabi_v7a_latestDownloadableUpdate != "-1") - return armeabi_v7a_lastVersionNumber - else if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber - else lastVersionNumber //universal + return largestVersion( + Pair(armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode), + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } "armeabi" -> { - if (armeabi_latestDownloadableUpdate != "-1") - return armeabi_lastVersionNumber - else lastVersionNumber + return largestVersion( + Pair(armeabi_lastVersionNumber, armeabi_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } "x86-64" -> { - if(x86_64_latestDownloadableUpdate != "-1") - return x86_64_lastVersionNumber - else if(x86_latestDownloadableUpdate != "-1") - return x86_lastVersionNumber - else lastVersionNumber + return largestVersion( + Pair(x86_64_lastVersionNumber, x86_64_lastVersionCode), + Pair(x86_lastVersionNumber, x86_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } "x86" -> { - if(x86_latestDownloadableUpdate != "-1") - return x86_lastVersionNumber - else lastVersionNumber + return largestVersion(Pair(x86_lastVersionNumber, x86_lastVersionCode), + Pair(lastVersionNumber, lastVersionCode)) } } } return lastVersionNumber //universal } + + private fun largestVersion(vararg versions: Pair): String { + var largestVersion = versions[0] + versions.forEach { + val version = it + if (version.second > largestVersion.second) { + largestVersion = version + } + } + return largestVersion.first + } } \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/categories/model/Category.kt b/app/src/main/java/foundation/e/apps/categories/model/Category.kt index 4b265d472da4c3ea5771c0d6dbd8a9a554bed188..ebc7e8c3d5623f919d87ce0e5d5a695414fda4f2 100644 --- a/app/src/main/java/foundation/e/apps/categories/model/Category.kt +++ b/app/src/main/java/foundation/e/apps/categories/model/Category.kt @@ -20,7 +20,7 @@ package foundation.e.apps.categories.model import foundation.e.apps.R import java.io.Serializable -class Category(val id: String) : Serializable { +class Category(val id: String, val defaultTitle: String? = "") : Serializable { private val title: String private val iconResource: Int @@ -31,6 +31,8 @@ class Category(val id: String) : Serializable { } private fun getCategoryTitle(categoryId: String): String { + if(defaultTitle!!.isNotEmpty()) return defaultTitle.toString() + val title = categoryId.replace("_", " ") if (title.contains("game ")) { return title.removePrefix("game ").capitalize() diff --git a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt index a7b761d76dbae89119a740e08f73e661ca387eb1..3a92275a40e50689ce022f45e6e0dc9299778951 100644 --- a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt +++ b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt @@ -56,8 +56,9 @@ class ApplicationsLoader(private val homeModel: HomeModel) : AsyncTask when (applicationError) { null -> { - bannerApps = homeResult!!.getBannerApps(homeModel.getInstallManager(), context) - applications = loadApplications(homeResult, context) + homeResult!! + bannerApps = homeResult.home.getBannerApps(homeModel.getInstallManager(), context) + applications = loadApplications(homeResult.home, context) } else -> { error = applicationError @@ -77,13 +78,8 @@ class ApplicationsLoader(private val homeModel: HomeModel) : AsyncTask> { - val parsedApplications = result.getApps(homeModel.getInstallManager(), context) - val applications = LinkedHashMap>() - for (parsedApplication in parsedApplications) { - applications[parsedApplication.key] = parsedApplication.value - } - return applications + private fun loadApplications(home: HomeRequest.Home, context: Context): LinkedHashMap> { + return home.getApps(homeModel.getInstallManager(), context) } private fun pwaLoadApplications(result: HomePwaRequest.HomeResult, context: Context): LinkedHashMap> { diff --git a/app/src/main/java/foundation/e/apps/utils/Common.kt b/app/src/main/java/foundation/e/apps/utils/Common.kt index d9a3ddceca1557b62c14732a30d33bc5b17415f4..75bc0ef670a57632eee1a8fe410e7648eb5ba443 100644 --- a/app/src/main/java/foundation/e/apps/utils/Common.kt +++ b/app/src/main/java/foundation/e/apps/utils/Common.kt @@ -27,6 +27,8 @@ import java.net.URL import java.util.concurrent.Executors import javax.net.ssl.HttpsURLConnection import kotlin.math.roundToInt +import com.fasterxml.jackson.module.kotlin.registerKotlinModule + object Common { @@ -85,6 +87,7 @@ object Common { fun getObjectMapper(): ObjectMapper { val objectMapper = ObjectMapper() objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + objectMapper.registerKotlinModule() return objectMapper } } diff --git a/app/src/main/java/foundation/e/apps/utils/Constants.kt b/app/src/main/java/foundation/e/apps/utils/Constants.kt index 37bb03e0948d7aed18a090e7a09d7822b0466d16..c1aa6ca9e477024026c0730d8f87f35ac0eaf1e8 100644 --- a/app/src/main/java/foundation/e/apps/utils/Constants.kt +++ b/app/src/main/java/foundation/e/apps/utils/Constants.kt @@ -23,8 +23,8 @@ object Constants { const val BASE_URL = "https://api.cleanapk.org/v2/" const val DOWNLOAD_URL = "https://apk.cleanapk.org/" const val STORAGE_PERMISSION_REQUEST_CODE = 0 - const val CONNECT_TIMEOUT = 5000 // 5 seconds - const val READ_TIMEOUT = 10000 // 10 seconds + const val CONNECT_TIMEOUT = 30000 // 30 seconds + const val READ_TIMEOUT = 60000 // 60 seconds const val REQUEST_METHOD_GET = "GET" const val REQUEST_METHOD_POST = "POST"