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

Commit d1ee5fce authored by Nihar Thakkar's avatar Nihar Thakkar
Browse files

Create error handling structure for icon and image loaders, show "N/A" for unavailable ratings

parent 34dcf918
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -168,10 +168,21 @@ class ApplicationActivity : AppCompatActivity(), ApplicationStateListener {
            startActivity(intent)
        }

        val decimalFormat = DecimalFormat("##.0")
        appRating.text = decimalFormat.format(basicData.score).toString()
        if (basicData.score != -1f) {
            appRating.text = basicData.score.toString()
        } else {
            appRating.text = getString(R.string.not_available)
        }
        if (basicData.score != -1f) {
            appPrivacyScore.text = fullData.privacyScore.toString()
        } else {
            appPrivacyScore.text = getString(R.string.not_available)
        }
        if (basicData.score != -1f) {
            appEnergyScore.text = fullData.energyScore.toString()
        } else {
            appEnergyScore.text = getString(R.string.not_available)
        }

        basicData.loadImagesAsyncly {
            showImages(it)
+5 −20
Original line number Diff line number Diff line
@@ -53,31 +53,16 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi
        title.text = app.basicData!!.name
        author.text = app.basicData!!.author
        ratingBar.rating = app.basicData!!.score
        val decimalFormat = DecimalFormat("##.0")
        rating.text = decimalFormat.format(app.basicData!!.score).toString()
        rating.setTextColor(findStarsColor(app.basicData!!.score))
        if (app.basicData!!.score != -1f) {
            rating.text = app.basicData!!.score.toString()
        } else {
            rating.text = activity.getString(R.string.not_available)
        }
        // TODO Use exodus rating from basic data
        //privacyScore.text = app.fullData!!.privacyScore.toString()
        //privacyScore.setTextColor(findPrivacyColor(app.fullData!!.privacyScore))
        stateChanged(app.state)
    }

    private fun findStarsColor(stars: Float): Int {
        return view.context.resources.getColor(when {
            stars >= 4.0f -> R.color.colorRatingGood
            stars >= 3.0f -> R.color.colorRatingNeutral
            else -> R.color.colorRatingBad
        })
    }

    private fun findPrivacyColor(privacyScore: Float): Int {
        return view.context.resources.getColor(when {
            privacyScore >= 7.0f -> R.color.colorRatingGood
            privacyScore >= 4.0f -> R.color.colorRatingNeutral
            else -> R.color.colorRatingBad
        })
    }

    override fun stateChanged(state: State) {
        Execute({}, {
            installButton.text = view.context.resources.getString(state.installButtonTextId)
+24 −5
Original line number Diff line number Diff line
@@ -4,10 +4,13 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory
import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonProperty
import io.eelo.appinstaller.utils.Constants
import io.eelo.appinstaller.utils.Constants.BASE_URL
import io.eelo.appinstaller.utils.Error
import io.eelo.appinstaller.utils.Execute
import io.eelo.appinstaller.utils.ImagesLoader
import java.net.URL
import javax.net.ssl.HttpsURLConnection

class BasicData @JsonCreator
constructor(@param:JsonProperty("package_name") val packageName: String,
@@ -46,10 +49,15 @@ constructor(@param:JsonProperty("package_name") val packageName: String,

    fun loadIconAsync(getter: (Bitmap) -> Unit) {
        if (icon == null) {
            var error: Error? = null
            Execute({
                loadIconSynced()
                error = loadIconSynced()
            }, {
                icon?.let { getter.invoke(it) }
                if (error == null) {
                    icon?.let {
                        getter.invoke(it)
                    }
                }
            })
        } else {
            getter.invoke(icon!!)
@@ -57,11 +65,22 @@ constructor(@param:JsonProperty("package_name") val packageName: String,
    }

    @Synchronized
    private fun loadIconSynced() {
    private fun loadIconSynced(): io.eelo.appinstaller.utils.Error? {
        if (icon == null) {
            try {
                val url = URL(BASE_URL + "media/" + iconUri)
            icon = BitmapFactory.decodeStream(url.openStream())
                val urlConnection = url.openConnection() as HttpsURLConnection
                urlConnection.requestMethod = Constants.REQUEST_METHOD
                urlConnection.connectTimeout = Constants.CONNECT_TIMEOUT
                urlConnection.readTimeout = Constants.READ_TIMEOUT
                icon = BitmapFactory.decodeStream(urlConnection.inputStream)
                urlConnection.disconnect()
            } catch (e: Exception) {
                e.printStackTrace()
                return io.eelo.appinstaller.utils.Error.UNKNOWN
            }
        }
        return null
    }

    fun updateLoadedImages(other: BasicData) {
+13 −2
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import android.os.AsyncTask
import java.net.URL
import java.util.concurrent.BlockingQueue
import java.util.concurrent.LinkedBlockingQueue
import javax.net.ssl.HttpsURLConnection

class ImagesLoader(private val imagesUri: Array<String>) {

@@ -54,8 +55,18 @@ class ImagesLoader(private val imagesUri: Array<String>) {

        override fun doInBackground(vararg params: BlockingQueue<Image>): Any? {
            val queue = params[0]
            try {
                val url = URL(Constants.BASE_URL + "media/" + uri)
            image = BitmapFactory.decodeStream(url.openStream())
                val urlConnection = url.openConnection() as HttpsURLConnection
                urlConnection.requestMethod = Constants.REQUEST_METHOD
                urlConnection.connectTimeout = Constants.CONNECT_TIMEOUT
                urlConnection.readTimeout = Constants.READ_TIMEOUT
                image = BitmapFactory.decodeStream(urlConnection.inputStream)
                urlConnection.disconnect()
            } catch (e: Exception) {
                e.printStackTrace()
                return null
            }
            queue.put(this)
            return null
        }