Loading app/src/main/java/foundation/e/apps/data/gplay/utils/GPlayHttpClient.kt +2 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ package foundation.e.apps.data.gplay.utils import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.network.IHttpClient import foundation.e.apps.data.login.AuthObject import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.MainScope Loading Loading @@ -88,7 +88,7 @@ class GPlayHttpClient @Inject constructor( override fun postAuth(url: String, body: ByteArray): PlayResponse { val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size) val headers = mapOf( "User-Agent" to CommonUtilsFunctions.getAppBuildInfo() "User-Agent" to SystemInfoProvider.getAppBuildInfo() ) val request = Request.Builder() .headers(headers.toHeaders()) Loading app/src/main/java/foundation/e/apps/install/pkg/PWAManagerModule.kt +34 −7 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import android.util.Base64 import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat Loading @@ -17,8 +16,11 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.fused.data.FusedApp import foundation.e.apps.data.fusedDownload.FusedDownloadRepository import foundation.e.apps.data.fusedDownload.models.FusedDownload import foundation.e.apps.utils.CommonUtilsFunctions import kotlinx.coroutines.delay import timber.log.Timber import java.io.ByteArrayOutputStream import java.io.IOException import java.net.URL import javax.inject.Inject import javax.inject.Singleton Loading @@ -26,7 +28,7 @@ import javax.inject.Singleton @OpenForTesting class PWAManagerModule @Inject constructor( @ApplicationContext private val context: Context, private val fusedDownloadRepository: FusedDownloadRepository private val fusedDownloadRepository: FusedDownloadRepository, ) { companion object { Loading Loading @@ -101,10 +103,15 @@ class PWAManagerModule @Inject constructor( fusedDownloadRepository.updateDownload(fusedDownload) // Get bitmap and byteArray for icon val base64AppIcon = CommonUtilsFunctions.getIconImageToBase64(fusedDownload.getAppIconUrl()) val iconByteArray = Base64.decode(base64AppIcon, Base64.DEFAULT) val iconBitmap = BitmapFactory.decodeByteArray(iconByteArray, 0, iconByteArray.size) val iconBitmap = getIconImageBitmap(fusedDownload.getAppIconUrl()) if (iconBitmap == null) { fusedDownload.status = Status.INSTALLATION_ISSUE fusedDownloadRepository.updateDownload(fusedDownload) return } val iconByteArray = iconBitmap.toByteArray() val values = ContentValues() values.apply { put(URL, fusedDownload.downloadURLList[0]) Loading @@ -119,7 +126,27 @@ class PWAManagerModule @Inject constructor( } } private suspend fun publishShortcut(fusedDownload: FusedDownload, bitmap: Bitmap, databaseID: Long) { fun getIconImageBitmap(url: String): Bitmap? { return try { val stream = URL(url).openStream() BitmapFactory.decodeStream(stream) } catch (e: IOException) { Timber.e(e) null } } fun Bitmap.toByteArray(): ByteArray { val byteArrayOS = ByteArrayOutputStream() this.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOS) return byteArrayOS.toByteArray() } private suspend fun publishShortcut( fusedDownload: FusedDownload, bitmap: Bitmap, databaseID: Long ) { // Update status fusedDownload.status = Status.INSTALLING fusedDownloadRepository.updateDownload(fusedDownload) Loading app/src/main/java/foundation/e/apps/ui/MainActivity.kt +2 −2 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment import foundation.e.apps.ui.purchase.AppPurchaseFragmentDirections import foundation.e.apps.ui.settings.SettingsFragment import foundation.e.apps.ui.setup.signin.SignInViewModel import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.flow.collectLatest Loading Loading @@ -134,7 +134,7 @@ class MainActivity : AppCompatActivity() { val email = otherPayload.toString() viewModel.uploadFaultyTokenToEcloud( email, CommonUtilsFunctions.getAppBuildInfo() SystemInfoProvider.getAppBuildInfo() ) } } Loading app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt +13 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package foundation.e.apps.ui.settings import android.content.ClipData import android.content.ClipboardManager import android.content.Intent import android.os.Bundle Loading Loading @@ -45,7 +46,7 @@ import foundation.e.apps.databinding.CustomPreferenceBinding import foundation.e.apps.install.updates.UpdatesWorkManager import foundation.e.apps.ui.MainActivity import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import timber.log.Timber import javax.inject.Inject Loading Loading @@ -109,14 +110,14 @@ class SettingsFragment : PreferenceFragmentCompat() { summary = BuildConfig.VERSION_NAME setOnLongClickListener { val osVersion = CommonUtilsFunctions.getSystemProperty("ro.lineage.version") val osVersion = SystemInfoProvider.getSystemProperty(SystemInfoProvider.KEY_LINEAGE_VERSION) val appVersionLabel = getString(R.string.app_version_label) var contents = "$appVersionLabel: $summary" if (!osVersion.isNullOrBlank()) { contents += "\n${context.getString(R.string.os_version)}: $osVersion" } CommonUtilsFunctions.copyTextToClipboard( copyTextToClipboard( clipboardManager, appVersionLabel, contents Loading Loading @@ -279,6 +280,15 @@ class SettingsFragment : PreferenceFragmentCompat() { } } private fun copyTextToClipboard( clipboard: ClipboardManager, label: String, text: String, ) { val clip = ClipData.newPlainText(label, text) clipboard.setPrimaryClip(clip) } override fun onDestroyView() { if (sourcesChangedFlag) { UpdatesDao.addItemsForUpdate(emptyList()) Loading app/src/main/java/foundation/e/apps/utils/CommonUtilsFunctions.kt→app/src/main/java/foundation/e/apps/utils/SystemInfoProvider.kt +3 −36 Original line number Diff line number Diff line Loading @@ -18,33 +18,13 @@ package foundation.e.apps.utils import android.annotation.SuppressLint import android.content.ClipData import android.content.ClipboardManager import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Build import android.util.Base64 import foundation.e.apps.BuildConfig import org.json.JSONObject import timber.log.Timber import java.io.ByteArrayOutputStream import java.net.URL object CommonUtilsFunctions { object SystemInfoProvider { /** * Copy anything to system clipboard. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5653 */ fun copyTextToClipboard( clipboard: ClipboardManager, label: String, text: String, ) { // https://developer.android.com/guide/topics/text/copy-paste#Copying val clip = ClipData.newPlainText(label, text) clipboard.setPrimaryClip(clip) } const val KEY_LINEAGE_VERSION = "ro.lineage.version" @SuppressLint("PrivateApi") fun getSystemProperty(key: String?): String? { Loading @@ -64,22 +44,9 @@ object CommonUtilsFunctions { put("version", BuildConfig.VERSION_NAME) put("device", Build.DEVICE) put("api", Build.VERSION.SDK_INT) put("os_version", getSystemProperty("ro.lineage.version")) put("os_version", getSystemProperty(KEY_LINEAGE_VERSION)) put("build_id", BuildConfig.BUILD_ID) } return descriptionJson.toString() } fun getIconImageToBase64(url: String): String? { return try { val stream = URL(url).openStream() val bitmap = BitmapFactory.decodeStream(stream) val byteArrayOS = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOS) Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT) } catch (e: Exception) { Timber.e(e) null } } } Loading
app/src/main/java/foundation/e/apps/data/gplay/utils/GPlayHttpClient.kt +2 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ package foundation.e.apps.data.gplay.utils import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.network.IHttpClient import foundation.e.apps.data.login.AuthObject import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.MainScope Loading Loading @@ -88,7 +88,7 @@ class GPlayHttpClient @Inject constructor( override fun postAuth(url: String, body: ByteArray): PlayResponse { val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size) val headers = mapOf( "User-Agent" to CommonUtilsFunctions.getAppBuildInfo() "User-Agent" to SystemInfoProvider.getAppBuildInfo() ) val request = Request.Builder() .headers(headers.toHeaders()) Loading
app/src/main/java/foundation/e/apps/install/pkg/PWAManagerModule.kt +34 −7 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import android.util.Base64 import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat Loading @@ -17,8 +16,11 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.fused.data.FusedApp import foundation.e.apps.data.fusedDownload.FusedDownloadRepository import foundation.e.apps.data.fusedDownload.models.FusedDownload import foundation.e.apps.utils.CommonUtilsFunctions import kotlinx.coroutines.delay import timber.log.Timber import java.io.ByteArrayOutputStream import java.io.IOException import java.net.URL import javax.inject.Inject import javax.inject.Singleton Loading @@ -26,7 +28,7 @@ import javax.inject.Singleton @OpenForTesting class PWAManagerModule @Inject constructor( @ApplicationContext private val context: Context, private val fusedDownloadRepository: FusedDownloadRepository private val fusedDownloadRepository: FusedDownloadRepository, ) { companion object { Loading Loading @@ -101,10 +103,15 @@ class PWAManagerModule @Inject constructor( fusedDownloadRepository.updateDownload(fusedDownload) // Get bitmap and byteArray for icon val base64AppIcon = CommonUtilsFunctions.getIconImageToBase64(fusedDownload.getAppIconUrl()) val iconByteArray = Base64.decode(base64AppIcon, Base64.DEFAULT) val iconBitmap = BitmapFactory.decodeByteArray(iconByteArray, 0, iconByteArray.size) val iconBitmap = getIconImageBitmap(fusedDownload.getAppIconUrl()) if (iconBitmap == null) { fusedDownload.status = Status.INSTALLATION_ISSUE fusedDownloadRepository.updateDownload(fusedDownload) return } val iconByteArray = iconBitmap.toByteArray() val values = ContentValues() values.apply { put(URL, fusedDownload.downloadURLList[0]) Loading @@ -119,7 +126,27 @@ class PWAManagerModule @Inject constructor( } } private suspend fun publishShortcut(fusedDownload: FusedDownload, bitmap: Bitmap, databaseID: Long) { fun getIconImageBitmap(url: String): Bitmap? { return try { val stream = URL(url).openStream() BitmapFactory.decodeStream(stream) } catch (e: IOException) { Timber.e(e) null } } fun Bitmap.toByteArray(): ByteArray { val byteArrayOS = ByteArrayOutputStream() this.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOS) return byteArrayOS.toByteArray() } private suspend fun publishShortcut( fusedDownload: FusedDownload, bitmap: Bitmap, databaseID: Long ) { // Update status fusedDownload.status = Status.INSTALLING fusedDownloadRepository.updateDownload(fusedDownload) Loading
app/src/main/java/foundation/e/apps/ui/MainActivity.kt +2 −2 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment import foundation.e.apps.ui.purchase.AppPurchaseFragmentDirections import foundation.e.apps.ui.settings.SettingsFragment import foundation.e.apps.ui.setup.signin.SignInViewModel import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.flow.collectLatest Loading Loading @@ -134,7 +134,7 @@ class MainActivity : AppCompatActivity() { val email = otherPayload.toString() viewModel.uploadFaultyTokenToEcloud( email, CommonUtilsFunctions.getAppBuildInfo() SystemInfoProvider.getAppBuildInfo() ) } } Loading
app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt +13 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package foundation.e.apps.ui.settings import android.content.ClipData import android.content.ClipboardManager import android.content.Intent import android.os.Bundle Loading Loading @@ -45,7 +46,7 @@ import foundation.e.apps.databinding.CustomPreferenceBinding import foundation.e.apps.install.updates.UpdatesWorkManager import foundation.e.apps.ui.MainActivity import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.utils.CommonUtilsFunctions import foundation.e.apps.utils.SystemInfoProvider import timber.log.Timber import javax.inject.Inject Loading Loading @@ -109,14 +110,14 @@ class SettingsFragment : PreferenceFragmentCompat() { summary = BuildConfig.VERSION_NAME setOnLongClickListener { val osVersion = CommonUtilsFunctions.getSystemProperty("ro.lineage.version") val osVersion = SystemInfoProvider.getSystemProperty(SystemInfoProvider.KEY_LINEAGE_VERSION) val appVersionLabel = getString(R.string.app_version_label) var contents = "$appVersionLabel: $summary" if (!osVersion.isNullOrBlank()) { contents += "\n${context.getString(R.string.os_version)}: $osVersion" } CommonUtilsFunctions.copyTextToClipboard( copyTextToClipboard( clipboardManager, appVersionLabel, contents Loading Loading @@ -279,6 +280,15 @@ class SettingsFragment : PreferenceFragmentCompat() { } } private fun copyTextToClipboard( clipboard: ClipboardManager, label: String, text: String, ) { val clip = ClipData.newPlainText(label, text) clipboard.setPrimaryClip(clip) } override fun onDestroyView() { if (sourcesChangedFlag) { UpdatesDao.addItemsForUpdate(emptyList()) Loading
app/src/main/java/foundation/e/apps/utils/CommonUtilsFunctions.kt→app/src/main/java/foundation/e/apps/utils/SystemInfoProvider.kt +3 −36 Original line number Diff line number Diff line Loading @@ -18,33 +18,13 @@ package foundation.e.apps.utils import android.annotation.SuppressLint import android.content.ClipData import android.content.ClipboardManager import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Build import android.util.Base64 import foundation.e.apps.BuildConfig import org.json.JSONObject import timber.log.Timber import java.io.ByteArrayOutputStream import java.net.URL object CommonUtilsFunctions { object SystemInfoProvider { /** * Copy anything to system clipboard. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5653 */ fun copyTextToClipboard( clipboard: ClipboardManager, label: String, text: String, ) { // https://developer.android.com/guide/topics/text/copy-paste#Copying val clip = ClipData.newPlainText(label, text) clipboard.setPrimaryClip(clip) } const val KEY_LINEAGE_VERSION = "ro.lineage.version" @SuppressLint("PrivateApi") fun getSystemProperty(key: String?): String? { Loading @@ -64,22 +44,9 @@ object CommonUtilsFunctions { put("version", BuildConfig.VERSION_NAME) put("device", Build.DEVICE) put("api", Build.VERSION.SDK_INT) put("os_version", getSystemProperty("ro.lineage.version")) put("os_version", getSystemProperty(KEY_LINEAGE_VERSION)) put("build_id", BuildConfig.BUILD_ID) } return descriptionJson.toString() } fun getIconImageToBase64(url: String): String? { return try { val stream = URL(url).openStream() val bitmap = BitmapFactory.decodeStream(stream) val byteArrayOS = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOS) Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT) } catch (e: Exception) { Timber.e(e) null } } }