Loading app/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.2.0' implementation "androidx.datastore:datastore-preferences:1.0.0" implementation 'com.facebook.shimmer:shimmer:0.5.0' implementation 'androidx.core:core-google-shortcuts:1.0.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' testImplementation "com.google.truth:truth:1.1.3" testImplementation 'junit:junit:4.13.2' Loading app/src/main/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="foundation.e.pwaplayer.provider.READ_WRITE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> Loading app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +11 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import foundation.e.apps.utils.DataStoreModule import foundation.e.apps.utils.PreferenceManagerModule import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton Loading Loading @@ -194,8 +195,12 @@ class FusedAPIImpl @Inject constructor( getPWAAppsResponse(category) } response?.apps?.forEach { it.status = it.status = if (it.isFree) { pkgManagerModule.getPackageStatus(it.package_name, it.latest_version_code) } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } else { Loading @@ -213,6 +218,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } Loading @@ -225,6 +231,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } Loading Loading @@ -267,6 +274,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } fusedApp.type = if (fusedApp.is_pwa) Type.PWA else Type.NATIVE list.add(fusedApp) } return list Loading @@ -290,6 +298,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response ?: FusedApp() } Loading Loading @@ -503,6 +512,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE it.source = if (source.contentEquals(CleanAPKInterface.APP_SOURCE_FOSS)) "Open Source" else "PWA" list.add(it) Loading app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt +5 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package foundation.e.apps.api.fused.data import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type data class FusedApp( val _id: String = String(), Loading @@ -43,5 +44,8 @@ data class FusedApp( val shareUrl: String = String(), val appSize: String = String(), var source: String = String(), val isFree: Boolean = true val isFree: Boolean = true, val is_pwa: Boolean = false, val url: String = String(), var type: Type = Type.NATIVE ) app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +7 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Bundle import android.text.Html import android.util.Log import android.view.View import android.widget.ImageView import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels Loading Loading @@ -62,6 +63,8 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { private val applicationViewModel: ApplicationViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private var applicationIcon: ImageView? = null companion object { private const val PRIVACY_CALCULATION_SOURCE_CODE_URL = "https://doc.e.foundation/privacy_score" Loading Loading @@ -141,7 +144,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { mainActivityViewModel.authData.value?.let { data -> applicationViewModel.getApplication(data, fusedApp, args.origin) applicationViewModel.getApplication(data, fusedApp, args.origin, applicationIcon!!) } } } Loading @@ -153,7 +156,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { text = getString(R.string.install) setOnClickListener { mainActivityViewModel.authData.value?.let { data -> applicationViewModel.getApplication(data, fusedApp, args.origin) applicationViewModel.getApplication(data, fusedApp, args.origin, applicationIcon!!) } } } Loading Loading @@ -221,6 +224,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { // Title widgets binding.titleInclude.apply { applicationIcon = appIcon appName.text = it.name appAuthor.text = it.author categoryTitle.text = it.category Loading Loading @@ -323,6 +327,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { override fun onDestroyView() { super.onDestroyView() _binding = null applicationIcon = null } private fun shareApp(name: String, shareUrl: String): Intent { Loading Loading
app/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.2.0' implementation "androidx.datastore:datastore-preferences:1.0.0" implementation 'com.facebook.shimmer:shimmer:0.5.0' implementation 'androidx.core:core-google-shortcuts:1.0.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' testImplementation "com.google.truth:truth:1.1.3" testImplementation 'junit:junit:4.13.2' Loading
app/src/main/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="foundation.e.pwaplayer.provider.READ_WRITE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> Loading
app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +11 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import foundation.e.apps.utils.DataStoreModule import foundation.e.apps.utils.PreferenceManagerModule import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton Loading Loading @@ -194,8 +195,12 @@ class FusedAPIImpl @Inject constructor( getPWAAppsResponse(category) } response?.apps?.forEach { it.status = it.status = if (it.isFree) { pkgManagerModule.getPackageStatus(it.package_name, it.latest_version_code) } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } else { Loading @@ -213,6 +218,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } Loading @@ -225,6 +231,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response?.apps } Loading Loading @@ -267,6 +274,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } fusedApp.type = if (fusedApp.is_pwa) Type.PWA else Type.NATIVE list.add(fusedApp) } return list Loading @@ -290,6 +298,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE } return response ?: FusedApp() } Loading Loading @@ -503,6 +512,7 @@ class FusedAPIImpl @Inject constructor( } else { Status.BLOCKED } it.type = if (it.is_pwa) Type.PWA else Type.NATIVE it.source = if (source.contentEquals(CleanAPKInterface.APP_SOURCE_FOSS)) "Open Source" else "PWA" list.add(it) Loading
app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt +5 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package foundation.e.apps.api.fused.data import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type data class FusedApp( val _id: String = String(), Loading @@ -43,5 +44,8 @@ data class FusedApp( val shareUrl: String = String(), val appSize: String = String(), var source: String = String(), val isFree: Boolean = true val isFree: Boolean = true, val is_pwa: Boolean = false, val url: String = String(), var type: Type = Type.NATIVE )
app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +7 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Bundle import android.text.Html import android.util.Log import android.view.View import android.widget.ImageView import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels Loading Loading @@ -62,6 +63,8 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { private val applicationViewModel: ApplicationViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private var applicationIcon: ImageView? = null companion object { private const val PRIVACY_CALCULATION_SOURCE_CODE_URL = "https://doc.e.foundation/privacy_score" Loading Loading @@ -141,7 +144,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { mainActivityViewModel.authData.value?.let { data -> applicationViewModel.getApplication(data, fusedApp, args.origin) applicationViewModel.getApplication(data, fusedApp, args.origin, applicationIcon!!) } } } Loading @@ -153,7 +156,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { text = getString(R.string.install) setOnClickListener { mainActivityViewModel.authData.value?.let { data -> applicationViewModel.getApplication(data, fusedApp, args.origin) applicationViewModel.getApplication(data, fusedApp, args.origin, applicationIcon!!) } } } Loading Loading @@ -221,6 +224,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { // Title widgets binding.titleInclude.apply { applicationIcon = appIcon appName.text = it.name appAuthor.text = it.author categoryTitle.text = it.category Loading Loading @@ -323,6 +327,7 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { override fun onDestroyView() { super.onDestroyView() _binding = null applicationIcon = null } private fun shareApp(name: String, shareUrl: String): Intent { Loading