Loading app/src/main/java/foundation/e/apps/MainActivity.kt +20 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -83,6 +85,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS return@setOnNavigationItemSelectedListener false } disableShiftingOfNabBarItems() initialiseUpdatesWorker() Loading @@ -97,7 +100,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } else { R.id.menu_home } setupLangReceiver() applicationManagerServiceConnection.bindService(this) } Loading Loading @@ -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") Loading app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt +41 −46 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity import foundation.e.apps.application.model.Application import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.PwasBasicData import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.categories.model.Category Loading @@ -18,15 +19,15 @@ import foundation.e.apps.utils.Error class HomePwaRequest { 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 = MainActivity.mActivity.showApplicationTypePreference() val url = Constants.BASE_URL + "apps?action=list_home&type=$appType" val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) val result = reader.readValue<HomeResult>(urlConnection.inputStream) val result = mapper.readValue(urlConnection.inputStream, Result::class.java) urlConnection.disconnect() callback.invoke(null, result) } catch (e: Exception) { Loading @@ -34,56 +35,50 @@ class HomePwaRequest { } } class HomeResult @JsonCreator constructor(@JsonProperty("home") private val home: PwasSubHomeResult) { data class Result(val success: Boolean, val home: Home) data class Home( @JsonProperty("headings") val headings: Map<String, String>?, @JsonProperty(BANNER_APPS_KEY) val bannerApps: List<BasicData>, @JsonProperty(POPULAR_APPS_KEY) val topUpdatedApps: List<BasicData>, @JsonProperty(POPULAR_GAMES_KEY) val topUpdatedGames: List<BasicData>, @JsonProperty(DISCOVER_KEY) val discover: List<BasicData> ) { companion object { private const val BANNER_APPS_KEY = "banner_apps" private const val POPULAR_APPS_KEY = "popular_apps" private const val POPULAR_GAMES_KEY = "popular_games" private const val DISCOVER_KEY = "discover" private val KEYS = setOf(POPULAR_APPS_KEY, POPULAR_GAMES_KEY, DISCOVER_KEY) } fun getBannerApps(applicationManager: ApplicationManager, context: Context): ArrayList<Application> { return ApplicationParser.PwaParseToApps(applicationManager, context, home.bannerApps) return ApplicationParser.parseToApps(applicationManager, context, bannerApps.toTypedArray()) } fun getApps(applicationManager: ApplicationManager, context: Context): LinkedHashMap<Category, ArrayList<Application>> { val apps = LinkedHashMap<Category, ArrayList<Application>>() for (pair in home.apps) { if(pair.value .isEmpty() ){ apps.remove(pair.key) }else { apps[pair.key] = ApplicationParser.PwaParseToApps(applicationManager, context, pair.value.toTypedArray()) KEYS.forEach { var heading = headings?.get(it) heading = heading ?: "" // Use default heading as empty to let it generate from the key itself. val parsedApps = when (it) { POPULAR_APPS_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedApps.toTypedArray()) POPULAR_GAMES_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedGames.toTypedArray()) DISCOVER_KEY -> ApplicationParser.parseToApps(applicationManager, context, discover.toTypedArray()) else -> throw IllegalArgumentException("Unrecognised key $it encountered") } apps[Category(it, heading)] = parsedApps } return apps } } class PwasSubHomeResult @JsonCreator constructor() { @JsonIgnore val apps = LinkedHashMap<Category, ArrayList<PwasBasicData>>() lateinit var bannerApps: Array<PwasBasicData> @JsonAnySetter fun append(key: String, value: Any) { val apps = value as ArrayList<*> val appsData = ArrayList<PwasBasicData>() 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<String>).toTypedArray(), data["created_on"] as String?) appsData.add(appData) } if (key == "banner_apps") { bannerApps = appsData.toTypedArray() } else { this.apps[Category(key)] = appsData } } } } app/src/main/java/foundation/e/apps/api/HomeRequest.kt +6 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ class HomeRequest { data class Result(val success: Boolean, val home: Home) data class Home( @JsonProperty("headings") val headings: Map<String, String>?, @JsonProperty(BANNER_APPS_KEY) val bannerApps: List<BasicData>, @JsonProperty(TOP_UPDATED_APPS_KEY) Loading @@ -80,15 +82,16 @@ class HomeRequest { POPULAR_GAMES_24_HOUR_KEY, DISCOVER_KEY) } fun getBannerApps(applicationManager: ApplicationManager, context: Context): ArrayList<Application> { return ApplicationParser.parseToApps(applicationManager, context, bannerApps.toTypedArray()) } fun getApps(applicationManager: ApplicationManager, context: Context): LinkedHashMap<Category, ArrayList<Application>> { val apps = LinkedHashMap<Category, ArrayList<Application>>() KEYS.forEach { var heading = headings?.get(it) heading = heading ?: "" // Use default heading as empty to let it generate from the key itself. val parsedApps = when (it) { TOP_UPDATED_APPS_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedApps.toTypedArray()) TOP_UPDATED_GAMES_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedGames.toTypedArray()) Loading @@ -97,11 +100,9 @@ class HomeRequest { DISCOVER_KEY -> ApplicationParser.parseToApps(applicationManager, context, discover.toTypedArray()) else -> throw IllegalArgumentException("Unrecognised key $it encountered") } apps[Category(it)] = parsedApps apps[Category(it, heading)] = parsedApps } return apps } } } app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt +27 −3 Original line number Diff line number Diff line Loading @@ -20,14 +20,16 @@ package foundation.e.apps.api import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.categories.model.Category import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error import java.io.Serializable class ListCategoriesRequest { companion object { private val reader = Common.getObjectMapper().readerFor(ListCategoriesResult::class.java) private val mapper = Common.getObjectMapper() } fun request(callback: (Error?, ListCategoriesResult?) -> Unit) { Loading @@ -35,15 +37,37 @@ class ListCategoriesRequest { var appType = mActivity.showApplicationTypePreference() val url = Constants.BASE_URL + "apps?action=list_cat&type=$appType" val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) val result = reader.readValue<ListCategoriesResult>(urlConnection.inputStream) val result = mapper.readValue(urlConnection.inputStream, ListCategoriesResult::class.java) urlConnection.disconnect() callback.invoke(null, result) } catch (e: Exception) { e.printStackTrace() callback.invoke(Error.findError(e), null) } } class ListCategoriesResult @JsonCreator constructor(@JsonProperty("apps") val appsCategories: Array<String>, @JsonProperty("games") val gamesCategories: Array<String>) @JsonProperty("games") val gamesCategories: Array<String>, @JsonProperty ("translations") val translations : Map <String,String>) : Serializable { fun appsParseResult(): ArrayList<Category> { val appCategories = ArrayList<Category>() appsCategories.forEach { id -> val translations = translations[id] appCategories.add(Category(id, translations!!)) } return appCategories } fun gameParseResult(): ArrayList<Category> { val gameCategories = ArrayList<Category>() gamesCategories.forEach { id -> val translations = translations[id] gameCategories.add(Category(id, translations!!)) } return gameCategories } } } app/src/main/java/foundation/e/apps/application/model/data/FullData.kt +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ constructor( val category: Category init { this.category = Category(categoryId) this.category = Category(categoryId, "") } @Suppress("unused") Loading Loading
app/src/main/java/foundation/e/apps/MainActivity.kt +20 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -83,6 +85,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS return@setOnNavigationItemSelectedListener false } disableShiftingOfNabBarItems() initialiseUpdatesWorker() Loading @@ -97,7 +100,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } else { R.id.menu_home } setupLangReceiver() applicationManagerServiceConnection.bindService(this) } Loading Loading @@ -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") Loading
app/src/main/java/foundation/e/apps/api/HomePwaRequest.kt +41 −46 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity import foundation.e.apps.application.model.Application import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.PwasBasicData import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.categories.model.Category Loading @@ -18,15 +19,15 @@ import foundation.e.apps.utils.Error class HomePwaRequest { 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 = MainActivity.mActivity.showApplicationTypePreference() val url = Constants.BASE_URL + "apps?action=list_home&type=$appType" val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) val result = reader.readValue<HomeResult>(urlConnection.inputStream) val result = mapper.readValue(urlConnection.inputStream, Result::class.java) urlConnection.disconnect() callback.invoke(null, result) } catch (e: Exception) { Loading @@ -34,56 +35,50 @@ class HomePwaRequest { } } class HomeResult @JsonCreator constructor(@JsonProperty("home") private val home: PwasSubHomeResult) { data class Result(val success: Boolean, val home: Home) data class Home( @JsonProperty("headings") val headings: Map<String, String>?, @JsonProperty(BANNER_APPS_KEY) val bannerApps: List<BasicData>, @JsonProperty(POPULAR_APPS_KEY) val topUpdatedApps: List<BasicData>, @JsonProperty(POPULAR_GAMES_KEY) val topUpdatedGames: List<BasicData>, @JsonProperty(DISCOVER_KEY) val discover: List<BasicData> ) { companion object { private const val BANNER_APPS_KEY = "banner_apps" private const val POPULAR_APPS_KEY = "popular_apps" private const val POPULAR_GAMES_KEY = "popular_games" private const val DISCOVER_KEY = "discover" private val KEYS = setOf(POPULAR_APPS_KEY, POPULAR_GAMES_KEY, DISCOVER_KEY) } fun getBannerApps(applicationManager: ApplicationManager, context: Context): ArrayList<Application> { return ApplicationParser.PwaParseToApps(applicationManager, context, home.bannerApps) return ApplicationParser.parseToApps(applicationManager, context, bannerApps.toTypedArray()) } fun getApps(applicationManager: ApplicationManager, context: Context): LinkedHashMap<Category, ArrayList<Application>> { val apps = LinkedHashMap<Category, ArrayList<Application>>() for (pair in home.apps) { if(pair.value .isEmpty() ){ apps.remove(pair.key) }else { apps[pair.key] = ApplicationParser.PwaParseToApps(applicationManager, context, pair.value.toTypedArray()) KEYS.forEach { var heading = headings?.get(it) heading = heading ?: "" // Use default heading as empty to let it generate from the key itself. val parsedApps = when (it) { POPULAR_APPS_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedApps.toTypedArray()) POPULAR_GAMES_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedGames.toTypedArray()) DISCOVER_KEY -> ApplicationParser.parseToApps(applicationManager, context, discover.toTypedArray()) else -> throw IllegalArgumentException("Unrecognised key $it encountered") } apps[Category(it, heading)] = parsedApps } return apps } } class PwasSubHomeResult @JsonCreator constructor() { @JsonIgnore val apps = LinkedHashMap<Category, ArrayList<PwasBasicData>>() lateinit var bannerApps: Array<PwasBasicData> @JsonAnySetter fun append(key: String, value: Any) { val apps = value as ArrayList<*> val appsData = ArrayList<PwasBasicData>() 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<String>).toTypedArray(), data["created_on"] as String?) appsData.add(appData) } if (key == "banner_apps") { bannerApps = appsData.toTypedArray() } else { this.apps[Category(key)] = appsData } } } }
app/src/main/java/foundation/e/apps/api/HomeRequest.kt +6 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ class HomeRequest { data class Result(val success: Boolean, val home: Home) data class Home( @JsonProperty("headings") val headings: Map<String, String>?, @JsonProperty(BANNER_APPS_KEY) val bannerApps: List<BasicData>, @JsonProperty(TOP_UPDATED_APPS_KEY) Loading @@ -80,15 +82,16 @@ class HomeRequest { POPULAR_GAMES_24_HOUR_KEY, DISCOVER_KEY) } fun getBannerApps(applicationManager: ApplicationManager, context: Context): ArrayList<Application> { return ApplicationParser.parseToApps(applicationManager, context, bannerApps.toTypedArray()) } fun getApps(applicationManager: ApplicationManager, context: Context): LinkedHashMap<Category, ArrayList<Application>> { val apps = LinkedHashMap<Category, ArrayList<Application>>() KEYS.forEach { var heading = headings?.get(it) heading = heading ?: "" // Use default heading as empty to let it generate from the key itself. val parsedApps = when (it) { TOP_UPDATED_APPS_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedApps.toTypedArray()) TOP_UPDATED_GAMES_KEY -> ApplicationParser.parseToApps(applicationManager, context, topUpdatedGames.toTypedArray()) Loading @@ -97,11 +100,9 @@ class HomeRequest { DISCOVER_KEY -> ApplicationParser.parseToApps(applicationManager, context, discover.toTypedArray()) else -> throw IllegalArgumentException("Unrecognised key $it encountered") } apps[Category(it)] = parsedApps apps[Category(it, heading)] = parsedApps } return apps } } }
app/src/main/java/foundation/e/apps/api/ListCategoriesRequest.kt +27 −3 Original line number Diff line number Diff line Loading @@ -20,14 +20,16 @@ package foundation.e.apps.api import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.categories.model.Category import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error import java.io.Serializable class ListCategoriesRequest { companion object { private val reader = Common.getObjectMapper().readerFor(ListCategoriesResult::class.java) private val mapper = Common.getObjectMapper() } fun request(callback: (Error?, ListCategoriesResult?) -> Unit) { Loading @@ -35,15 +37,37 @@ class ListCategoriesRequest { var appType = mActivity.showApplicationTypePreference() val url = Constants.BASE_URL + "apps?action=list_cat&type=$appType" val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) val result = reader.readValue<ListCategoriesResult>(urlConnection.inputStream) val result = mapper.readValue(urlConnection.inputStream, ListCategoriesResult::class.java) urlConnection.disconnect() callback.invoke(null, result) } catch (e: Exception) { e.printStackTrace() callback.invoke(Error.findError(e), null) } } class ListCategoriesResult @JsonCreator constructor(@JsonProperty("apps") val appsCategories: Array<String>, @JsonProperty("games") val gamesCategories: Array<String>) @JsonProperty("games") val gamesCategories: Array<String>, @JsonProperty ("translations") val translations : Map <String,String>) : Serializable { fun appsParseResult(): ArrayList<Category> { val appCategories = ArrayList<Category>() appsCategories.forEach { id -> val translations = translations[id] appCategories.add(Category(id, translations!!)) } return appCategories } fun gameParseResult(): ArrayList<Category> { val gameCategories = ArrayList<Category>() gamesCategories.forEach { id -> val translations = translations[id] gameCategories.add(Category(id, translations!!)) } return gameCategories } } }
app/src/main/java/foundation/e/apps/application/model/data/FullData.kt +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ constructor( val category: Category init { this.category = Category(categoryId) this.category = Category(categoryId, "") } @Suppress("unused") Loading