Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25c10350 authored by Arnau Vàzquez's avatar Arnau Vàzquez
Browse files

Merge branch 'issue-127' into 'master'

Support language translation

See merge request e/apps/apps!27
parents f03a44a6 3ae07c0e
Loading
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -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")
+41 −46
Original line number Diff line number Diff line
@@ -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
@@ -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) {
@@ -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
            }
        }
    }
}
+6 −5
Original line number Diff line number Diff line
@@ -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)
@@ -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())
@@ -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
        }

    }
}
+27 −3
Original line number Diff line number Diff line
@@ -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) {
@@ -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
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ constructor(
    val category: Category

    init {
        this.category = Category(categoryId)
        this.category = Category(categoryId, "")
    }

    @Suppress("unused")
Loading