From e183b70a50700c1a1c9da1597bf79efd53cff71a Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Mon, 20 Jul 2020 14:24:54 +0530 Subject: [PATCH 1/5] Support language translation --- app/src/main/AndroidManifest.xml | 1 + .../java/foundation/e/apps/MainActivity.kt | 23 ++- .../foundation/e/apps/api/HomePwaRequest.kt | 62 +++++--- .../java/foundation/e/apps/api/HomeRequest.kt | 105 ++++++++----- .../e/apps/api/ListCategoriesRequest.kt | 76 +++++++++- .../e/apps/application/model/HomeTitle.kt | 26 ++++ .../e/apps/application/model/data/FullData.kt | 2 +- .../application/model/data/PwaFullData.kt | 2 +- .../category/model/CategorieTitle.kt | 85 +++++++++++ .../apps/categories/model/CategoriesModel.kt | 4 +- .../e/apps/categories/model/Category.kt | 141 +++++++++++++++++- .../java/foundation/e/apps/utils/Common.kt | 42 ++++++ .../java/foundation/e/apps/utils/Constants.kt | 2 +- .../main/res/layout/activity_application.xml | 15 +- .../main/res/layout/application_list_item.xml | 2 +- .../main/res/layout/install_button_layout.xml | 18 +-- .../layout/simple_install_button_layout.xml | 8 +- 17 files changed, 523 insertions(+), 91 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/application/model/HomeTitle.kt create mode 100644 app/src/main/java/foundation/e/apps/categories/category/model/CategorieTitle.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a6718172..198565ac2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ android:supportsRtl="true" android:largeHeap="true" android:launchMode="singleTask" + android:configChanges="layoutDirection|locale" android:theme="@style/AppTheme"> diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index 9774b8bb4..5aadf6ec0 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -18,8 +18,9 @@ package foundation.e.apps //import androidx.fragment.app.ListFragment + import android.annotation.SuppressLint -import android.content.SharedPreferences +import android.content.* import android.content.pm.PackageManager import android.os.Bundle import android.os.Handler @@ -27,6 +28,7 @@ import android.preference.PreferenceManager import android.view.MenuItem import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.google.android.material.bottomnavigation.BottomNavigationItemView import com.google.android.material.bottomnavigation.BottomNavigationMenuView @@ -83,6 +85,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS return@setOnNavigationItemSelectedListener false } + disableShiftingOfNabBarItems() initialiseUpdatesWorker() @@ -97,7 +100,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } else { R.id.menu_home } - + setupLangReceiver() applicationManagerServiceConnection.bindService(this) } @@ -172,13 +175,27 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } return false } + private var mLangReceiver: BroadcastReceiver? = null + protected fun setupLangReceiver(): BroadcastReceiver? { + if (mLangReceiver == null) { + mLangReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + finish() +// selectFragment(currentFragmentId,null) + } + } + val filter = IntentFilter(Intent.ACTION_LOCALE_CHANGED) + registerReceiver(mLangReceiver, filter) + } + return mLangReceiver + } private fun showFragment(fragment: Fragment) { bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true supportFragmentManager .beginTransaction() .replace(R.id.frame_layout, fragment) - .commit() + .commitAllowingStateLoss(); } @SuppressLint("RestrictedApi") 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 23998ff9d..267ae583e 100644 --- a/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt @@ -56,32 +56,60 @@ class HomePwaRequest { class PwasSubHomeResult @JsonCreator constructor() { val apps = LinkedHashMap>() lateinit var bannerApps: Array + var titles: PwaAppsTitle? = null; + @JsonAnySetter fun append(key: String, value: Any) { - val apps = value as ArrayList<*> val appsData = ArrayList() - apps.forEach { - val data = it as LinkedHashMap<*, *> - val appData = PwasBasicData( - data["_id"] as String, - data["name"] as String, - data["description"] as String?, - data["is_pwa"] as Boolean, - data["is_web_app"] as Boolean, - data["has_https"] as Boolean, - data["url"] as String?, - data["category"] as String, - data["icon_image_path"] as String, - (data["other_images_path"]as List).toTypedArray(), - data["created_on"] as String?) - appsData.add(appData) + if (key == "headings") { + val data = value as LinkedHashMap<*, *> + titles= PwaAppsTitle(data["popular_apps"] as String, + data["popular_games"] as String, + data["banner_apps"] as String, + data["discover"] as String) + } + else{ + val apps = value as ArrayList<*> + apps.forEach { + val data = it as LinkedHashMap<*, *> + val appData = PwasBasicData( + data["_id"] as String, + data["name"] as String, + data["description"] as String?, + data["is_pwa"] as Boolean, + data["is_web_app"] as Boolean, + data["has_https"] as Boolean, + data["url"] as String?, + data["category"] as String, + data["icon_image_path"] as String, + (data["other_images_path"]as List).toTypedArray(), + data["created_on"] as String?) + appsData.add(appData) + } } if (key == "banner_apps") { bannerApps = appsData.toTypedArray() } else { - this.apps[Category(key)] = appsData + if(titles!=null){ + val popular_apps= titles!!.popular_apps + val popular_games= titles!!.popular_games + val discover =titles!!.discover + when (key){ + "popular_apps" -> + this.apps[Category(popular_apps, null)] = appsData + "popular_games" -> + this.apps[Category(popular_games, null)] = appsData + "discover" -> + this.apps[Category(discover, null)] = appsData + } + } } } } + + class PwaAppsTitle(val popular_apps: String, + val popular_games: String, + val banner_apps: String, + val discover: String) } \ No newline at end of file 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 a67026c61..714dad715 100644 --- a/app/src/main/java/foundation/e/apps/api/HomeRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/HomeRequest.kt @@ -23,6 +23,7 @@ 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 +import foundation.e.apps.application.model.HomeTitle import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.categories.model.Category @@ -30,6 +31,7 @@ import foundation.e.apps.utils.ApplicationParser import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error +import java.io.Serializable class HomeRequest { @@ -72,50 +74,81 @@ class HomeRequest { } - class SubHomeResult @JsonCreator constructor() { + class SubHomeResult @JsonCreator constructor() :Serializable{ val apps = LinkedHashMap>() lateinit var bannerApps: Array + var titles: HomeTitle? = null; + var appsData = ArrayList() @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 == "headings") { + val data = value as LinkedHashMap<*, *> + titles= HomeTitle(data["popular_apps_in_last_24_hours"] as String, + data["popular_games_in_last_24_hours"] as String, + data["banner_apps"] as String, + data["discover"] as String, + data["top_updated_apps"] as String, + data["top_updated_games"] as String) + } else { + val apps = value as ArrayList<*> + 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 + }else{ + if(titles!=null){ + val top_updated_apps= titles!!.top_updated_apps + val top_updated_games= titles!!.top_updated_games + val discover =titles!!.discover + val popular_games_in_last_24_hours =titles!!.popular_games_in_last_24_hours + val popular_apps_in_last_24_hours = titles!!.popular_apps_in_last_24_hours + when (key){ + "top_updated_apps" -> + this.apps[Category(top_updated_apps, null)] = appsData + "top_updated_games" -> + this.apps[Category(top_updated_games, null)] = appsData + "discover" -> + this.apps[Category(discover, null)] = appsData + "popular_games_in_last_24_hours" -> + this.apps[Category(popular_games_in_last_24_hours, null)] = appsData + "popular_apps_in_last_24_hours" -> + this.apps[Category(popular_apps_in_last_24_hours, null)] = appsData + } + } } } } diff --git a/app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt b/app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt index 82f6427ad..90b44cfee 100644 --- a/app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt @@ -17,12 +17,15 @@ package foundation.e.apps.api +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.categories.category.model.CategorieTitle import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error +import java.io.Serializable class ListCategoriesRequest { @@ -45,5 +48,76 @@ class ListCategoriesRequest { class ListCategoriesResult @JsonCreator constructor(@JsonProperty("apps") val appsCategories: Array, - @JsonProperty("games") val gamesCategories: Array) + @JsonProperty("games") val gamesCategories: Array) : Serializable { + + + var categorieTitle: CategorieTitle? = null; + @Suppress("unused") + @JsonAnySetter + fun jsonCreator(key: String, value: Any) { + if (key == "translations") { + val result = value as LinkedHashMap<*, *> + categorieTitle = CategorieTitle(result["art_and_design"] as String?, + result["auto_and_vehicles"] as String?, + result["beauty"] as String?, + (result["books_and_reference"] as String?), + result["business"] as String?, + result["comics"] as String?, + result["communication"] as String?, + result["connectivity"] as String?, + result["dating"] as String?, + result["development"] as String?, + result["education"] as String?, + result["entertainment"] as String?, + result["events"] as String?, + result["finance"] as String?, + result["food_and_drink"] as String?, + result["game_action"] as String?, + result["game_adventure"] as String?, + result["game_arcade"] as String?, + result["game_board"] as String?, + result["game_card"] as String?, + result["game_casino"] as String?, + result["game_casual"] as String?, + result["game_educational"] as String?, + result["game_music"] as String?, + result["game_open_games"] as String?, + result["game_puzzle"] as String?, + result["game_racing"] as String?, + result["game_role_playing"] as String?, + result["game_simulation"] as String?, + result["game_sports"] as String?, + result["game_strategy"] as String?, + result["game_trivia"] as String?, + result["game_word"] as String?, + result["graphics"] as String?, + result["health_and_fitness"] as String?, + result["house_and_home"] as String?, + result["internet"] as String?, + result["libraries_and_demo"] as String?, + result["lifestyle"] as String?, + result["maps_and_navigation"] as String?, + result["medical"] as String?, + result["music_and_audio"] as String?, + result["news_and_magazines"] as String?, + result["parenting"] as String?, + result["personalization"] as String?, + result["photography"] as String?, + result["productivity"] as String?, + result["reference"] as String?, + result["security"] as String?, + result["shopping"] as String?, + result["social"] as String?, + result["sports"] as String?, + result["system"] as String?, + result["tools"] as String?, + result["travel_and_local"] as String?, + result["video_players"] as String?, + result["weather"] as String?, + result["web_games"] as String?) + } + + } + + } } diff --git a/app/src/main/java/foundation/e/apps/application/model/HomeTitle.kt b/app/src/main/java/foundation/e/apps/application/model/HomeTitle.kt new file mode 100644 index 000000000..0119c2dc5 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/application/model/HomeTitle.kt @@ -0,0 +1,26 @@ +/* + Copyright (C) 2019 e Foundation + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +package foundation.e.apps.application.model + +class HomeTitle(val popular_apps_in_last_24_hours: String, + val popular_games_in_last_24_hours: String, + val banner_apps: String, + val discover: String, + val top_updated_apps: String, + val top_updated_games: String) + 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 07e360d21..7841fbd57 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 @@ -80,7 +80,7 @@ constructor( val category: Category init { - this.category = Category(categoryId) + this.category = Category(categoryId, null) } @Suppress("unused") diff --git a/app/src/main/java/foundation/e/apps/application/model/data/PwaFullData.kt b/app/src/main/java/foundation/e/apps/application/model/data/PwaFullData.kt index 8d12bafce..3bd9f8929 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/PwaFullData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/PwaFullData.kt @@ -25,7 +25,7 @@ constructor( val category: Category init { - this.category = Category(categoryId) + this.category = Category(categoryId, null) } } diff --git a/app/src/main/java/foundation/e/apps/categories/category/model/CategorieTitle.kt b/app/src/main/java/foundation/e/apps/categories/category/model/CategorieTitle.kt new file mode 100644 index 000000000..8f096d466 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/categories/category/model/CategorieTitle.kt @@ -0,0 +1,85 @@ +/* + Copyright (C) 2019 e Foundation + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +package foundation.e.apps.categories.category.model + +import java.io.Serializable + +class CategorieTitle(val art_and_design: String?, + val auto_and_vehicles: String?, + val beauty: String?, + val books_and_reference: String?, + val business: String?, + val comics: String?, + val communication: String?, + val connectivity: String?, + val dating: String?, + val development: String?, + val education: String?, + val entertainment: String?, + val events: String?, + val finance: String?, + val food_and_drink: String?, + val game_action: String?, + val game_adventure: String?, + val game_arcade: String?, + val game_board: String?, + val game_card: String?, + val game_casino: String?, + val game_casual: String?, + val game_educational: String?, + val game_music: String?, + val game_open_games: String?, + val game_puzzle: String?, + val game_racing: String?, + val game_role_playing: String?, + val game_simulation: String?, + val game_sports: String?, + val game_strategy: String?, + val game_trivia: String?, + val game_word: String?, + val graphics: String?, + val health_and_fitness: String?, + val house_and_home: String?, + val internet: String?, + val libraries_and_demo: String?, + val lifestyle: String?, + val maps_and_navigation: String?, + val medical: String?, + val music_and_audio: String?, + val news_and_magazines: String?, + val parenting: String?, + val personalization: String?, + val photography: String?, + val productivity: String?, + val reference: String?, + val security: String?, + val shopping: String?, + val social: String?, + val sports: String?, + val system: String?, + val tools: String?, + val travel_and_local: String?, + val video_players: String?, + val weather: String?, + val web_games: String?):Serializable { + + val x= art_and_design + +} + + diff --git a/app/src/main/java/foundation/e/apps/categories/model/CategoriesModel.kt b/app/src/main/java/foundation/e/apps/categories/model/CategoriesModel.kt index 3db6abed3..1d05f3107 100644 --- a/app/src/main/java/foundation/e/apps/categories/model/CategoriesModel.kt +++ b/app/src/main/java/foundation/e/apps/categories/model/CategoriesModel.kt @@ -72,10 +72,10 @@ class CategoriesModel : CategoriesModelInterface { val appsCategories = ArrayList() val gamesCategories = ArrayList() result.appsCategories.forEach { id -> - appsCategories.add(Category(id)) + appsCategories.add(Category(id,result)) } result.gamesCategories.forEach { id -> - gamesCategories.add(Category(id)) + gamesCategories.add(Category(id,result)) } applicationsCategoriesList.value = appsCategories gamesCategoriesList.value = gamesCategories 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 6451143f1..47903b737 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 @@ -18,9 +18,10 @@ package foundation.e.apps.categories.model import foundation.e.apps.R +import foundation.e.apps.api.ListCategoriesRequest.ListCategoriesResult import java.io.Serializable -class Category(val id: String) : Serializable { +class Category(val id: String, val result: ListCategoriesResult?) : Serializable { private val title: String private val iconResource: Int @@ -31,13 +32,14 @@ class Category(val id: String) : Serializable { } private fun getCategoryTitle(categoryId: String): String { - val title = categoryId.replace("_", " ") - if (title.contains("game ")) { - return title.removePrefix("game ").capitalize() - }else if(title.contains("pwa ")){ - return title.removePrefix("pwa ").capitalize() + if(result!=null){ + val tit = catTitle(categoryId) + return tit.capitalize() + } + else{ + val title = categoryId.replace("_", " ") + return title.capitalize() } - return title.capitalize() } private fun getCategoryIconResource(categoryId: String): Int { @@ -182,4 +184,127 @@ class Category(val id: String) : Serializable { fun getIconResource(): Int { return iconResource } -} + + fun catTitle(id: String): String { + when (id){ + "art_and_design" -> + return result!!.categorieTitle!!.art_and_design!! + "auto_and_vehicles" -> + return result!!.categorieTitle!!.auto_and_vehicles!! + "beauty" -> + return result!!.categorieTitle!!.beauty!! + "books_and_reference" -> + return result!!.categorieTitle!!.books_and_reference!! + "business" -> + return result!!.categorieTitle!!.business!! + "comics" -> + return result!!.categorieTitle!!.comics!! + "communication" -> + return result!!.categorieTitle!!.communication!! + "connectivity" -> + return result!!.categorieTitle!!.connectivity!! + "dating" -> + return result!!.categorieTitle!!.dating!! + "development" -> + return result!!.categorieTitle!!.development!! + "education" -> + return result!!.categorieTitle!!.education!! + "entertainment" -> + return result!!.categorieTitle!!.entertainment!! + "events" -> + return result!!.categorieTitle!!.events!! + "finance" -> + return result!!.categorieTitle!!.finance!! + "food_and_drink" -> + return result!!.categorieTitle!!.food_and_drink!! + "game_action" -> + return result!!.categorieTitle!!.game_action!! + "game_adventure" -> + return result!!.categorieTitle!!.game_adventure!! + "game_arcade" -> + return result!!.categorieTitle!!.game_arcade!! + "game_board" -> + return result!!.categorieTitle!!.game_board!! + "game_card" -> + return result!!.categorieTitle!!.game_card!! + "game_casino" -> + return result!!.categorieTitle!!.game_casino!! + "game_casual" -> + return result!!.categorieTitle!!.game_casual!! + "game_educational" -> + return result!!.categorieTitle!!.game_educational!! + "game_music" -> + return result!!.categorieTitle!!.game_music!! + "game_open_games" -> + return result!!.categorieTitle!!.game_open_games!!!! + "game_puzzle" -> + return result!!.categorieTitle!!.game_puzzle!! + "game_racing" -> + return result!!.categorieTitle!!.game_racing!! + "game_role_playing" -> + return result!!.categorieTitle!!.game_role_playing!! + "game_simulation" -> + return result!!.categorieTitle!!.game_simulation!! + "game_sports" -> + return result!!.categorieTitle!!.game_sports!! + "game_strategy" -> + return result!!.categorieTitle!!.game_strategy!! + "game_trivia" -> + return result!!.categorieTitle!!.game_trivia!! + "game_word" -> + return result!!.categorieTitle!!.game_word!! + "graphics" -> + return result!!.categorieTitle!!.graphics!! + "health_and_fitness" -> + return result!!.categorieTitle!!.health_and_fitness!! + "house_and_home" -> + return result!!.categorieTitle!!.house_and_home!! + "internet" -> + return result!!.categorieTitle!!.internet!! + "libraries_and_demo" -> + return result!!.categorieTitle!!.libraries_and_demo!! + "lifestyle" -> + return result!!.categorieTitle!!.lifestyle!! + "maps_and_navigation" -> + return result!!.categorieTitle!!.maps_and_navigation!! + "medical" -> + return result!!.categorieTitle!!.medical!! + "music_and_audio" -> + return result!!.categorieTitle!!.music_and_audio!! + "news_and_magazines" -> + return result!!.categorieTitle!!.news_and_magazines!! + "parenting" -> + return result!!.categorieTitle!!.parenting!! + "personalization" -> + return result!!.categorieTitle!!.personalization!! + "photography" -> + return result!!.categorieTitle!!.photography!! + "productivity" -> + return result!!.categorieTitle!!.productivity!! + "reference" -> + return result!!.categorieTitle!!.reference!! + "security" -> + return result!!.categorieTitle!!.security!! + "shopping" -> + return result!!.categorieTitle!!.shopping!! + "social" -> + return result!!.categorieTitle!!.social!! + "sports" -> + return result!!.categorieTitle!!.sports!! + "system" -> + return result!!.categorieTitle!!.system!! + "tools" -> + return result!!.categorieTitle!!.tools!! + "travel_and_local" -> + return result!!.categorieTitle!!.travel_and_local!! + "video_players" -> + return result!!.categorieTitle!!.video_players!! + "weather" -> + return result!!.categorieTitle!!.weather!! + "web_games" -> + return result!!.categorieTitle!!.web_games!! + } + return "" + } + } + 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 d9a3ddcec..4360bfe62 100644 --- a/app/src/main/java/foundation/e/apps/utils/Common.kt +++ b/app/src/main/java/foundation/e/apps/utils/Common.kt @@ -21,9 +21,18 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.net.ConnectivityManager +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.core.os.LocaleListCompat +import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.KeyDeserializer import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.module.SimpleModule +import foundation.e.apps.categories.model.Category import java.net.URL +import java.nio.file.Paths +import java.util.* import java.util.concurrent.Executors import javax.net.ssl.HttpsURLConnection import kotlin.math.roundToInt @@ -44,7 +53,9 @@ object Common { } fun createConnection(url: String, requestMethod: String): HttpsURLConnection { + val preferredLanguage =getAcceptedLanguageHeaderValue() val connection = URL(url).openConnection() as HttpsURLConnection + connection.setRequestProperty("Accept-Language", preferredLanguage) connection.requestMethod = requestMethod connection.connectTimeout = Constants.CONNECT_TIMEOUT connection.readTimeout = Constants.READ_TIMEOUT @@ -84,7 +95,38 @@ object Common { fun getObjectMapper(): ObjectMapper { val objectMapper = ObjectMapper() + var simpleModule = SimpleModule() + simpleModule.addKeyDeserializer(Category::class.java,keyDeserializer()) + objectMapper.registerModule(simpleModule); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) return objectMapper } + + fun getAcceptedLanguageHeaderValue(): String { + var weight = 1.0F + return getPreferredLocaleList() + .map { it.toLanguageTag() } + .reduce { accumulator, languageTag -> + weight -= 0.1F + "$accumulator,$languageTag;q=$weight" + } + } + + fun getPreferredLocaleList(): List { + val adjustedLocaleListCompat = LocaleListCompat.getAdjustedDefault() + val preferredLocaleList = mutableListOf() + for (index in 0 until adjustedLocaleListCompat.size()) { + preferredLocaleList.add(adjustedLocaleListCompat.get(index)) + } + return preferredLocaleList + } +} + +class keyDeserializer : KeyDeserializer() { + @RequiresApi(Build.VERSION_CODES.O) + override fun deserializeKey(p0: String?, p1: DeserializationContext?): Any? { + return Paths.get(p0) + } + + } 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 37bb03e09..849a00394 100644 --- a/app/src/main/java/foundation/e/apps/utils/Constants.kt +++ b/app/src/main/java/foundation/e/apps/utils/Constants.kt @@ -20,7 +20,7 @@ package foundation.e.apps.utils object Constants { // Global - const val BASE_URL = "https://api.cleanapk.org/v2/" + const val BASE_URL = "https://api.test.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 diff --git a/app/src/main/res/layout/activity_application.xml b/app/src/main/res/layout/activity_application.xml index b1082d71a..ffb4bb42e 100644 --- a/app/src/main/res/layout/activity_application.xml +++ b/app/src/main/res/layout/activity_application.xml @@ -150,7 +150,7 @@ @@ -211,11 +211,12 @@ @@ -226,12 +227,13 @@ android:layout_width="@dimen/install_button_width3" android:layout_height="@dimen/install_button_height" android:layout_alignParentEnd="true" + android:ellipsize="end" + android:layout_centerVertical="true" android:layout_marginStart="@dimen/layout_margin_medium2" - android:layout_marginTop="@dimen/layout_margin_small" - layout="@layout/install_button_layout" + layout="@layout/install_button_layout" /> + - /> @@ -828,3 +830,4 @@ app:layout_constraintBottom_toBottomOf="parent" /> + diff --git a/app/src/main/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index 29b84855c..b19722d8f 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -137,7 +137,7 @@ android:orientation="vertical"> . --> -