Loading app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +17 −12 Original line number Diff line number Diff line Loading @@ -260,18 +260,6 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { ).show(childFragmentManager, TAG) } if (it.ratings.privacyScore != -1.0) { val privacyScore = it.ratings.privacyScore.toInt().toString() appPrivacyScore.text = getString( R.string.privacy_rating_out_of, privacyScore ) appPrivacyScore.setCompoundDrawablesRelativeWithIntrinsicBounds( null, null, getPrivacyDrawable(privacyScore), null ) appPrivacyScore.compoundDrawablePadding = 15 } appPrivacyScoreLayout.setOnClickListener { ApplicationDialogFragment( R.drawable.ic_lock, Loading Loading @@ -347,11 +335,28 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { private fun fetchAppTracker() { applicationViewModel.fetchTrackerData().observe(viewLifecycleOwner) { updatePrivacyScore() binding.applicationLayout.visibility = View.VISIBLE binding.progressBar.visibility = View.GONE } } private fun updatePrivacyScore() { val privacyScore = applicationViewModel.getPrivacyScore() if (privacyScore != -1) { val appPrivacyScore = binding.ratingsInclude.appPrivacyScore appPrivacyScore.text = getString( R.string.privacy_rating_out_of, privacyScore.toString() ) appPrivacyScore.setCompoundDrawablesRelativeWithIntrinsicBounds( null, null, getPrivacyDrawable(privacyScore.toString()), null ) appPrivacyScore.compoundDrawablePadding = 15 } } override fun onDestroyView() { super.onDestroyView() _binding = null Loading app/src/main/java/foundation/e/apps/application/ApplicationViewModel.kt +25 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import foundation.e.apps.utils.enums.Status import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.ceil import kotlin.math.round @HiltViewModel class ApplicationViewModel @Inject constructor( Loading Loading @@ -118,4 +120,27 @@ class ApplicationViewModel @Inject constructor( } return "" } fun getPrivacyScore(): Int { fusedApp.value?.let { return calculatePrivacyScore(it) } return -1 } private fun calculatePrivacyScore(fusedApp: FusedApp): Int { return calculateTrackersScore(fusedApp.trackers.size) + calculatePermissionsScore(countAndroidPermissions(fusedApp)) } private fun countAndroidPermissions(fusedApp: FusedApp) = fusedApp.perms.filter { it.contains("android.permission") }.size private fun calculateTrackersScore(numberOfTrackers: Int): Int { return if (numberOfTrackers > 5) 0 else 9 - numberOfTrackers } private fun calculatePermissionsScore(numberOfPermission: Int): Int { return if (numberOfPermission > 9) 0 else round(0.2 * ceil((10 - numberOfPermission) / 2.0)).toInt() } } Loading
app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +17 −12 Original line number Diff line number Diff line Loading @@ -260,18 +260,6 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { ).show(childFragmentManager, TAG) } if (it.ratings.privacyScore != -1.0) { val privacyScore = it.ratings.privacyScore.toInt().toString() appPrivacyScore.text = getString( R.string.privacy_rating_out_of, privacyScore ) appPrivacyScore.setCompoundDrawablesRelativeWithIntrinsicBounds( null, null, getPrivacyDrawable(privacyScore), null ) appPrivacyScore.compoundDrawablePadding = 15 } appPrivacyScoreLayout.setOnClickListener { ApplicationDialogFragment( R.drawable.ic_lock, Loading Loading @@ -347,11 +335,28 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { private fun fetchAppTracker() { applicationViewModel.fetchTrackerData().observe(viewLifecycleOwner) { updatePrivacyScore() binding.applicationLayout.visibility = View.VISIBLE binding.progressBar.visibility = View.GONE } } private fun updatePrivacyScore() { val privacyScore = applicationViewModel.getPrivacyScore() if (privacyScore != -1) { val appPrivacyScore = binding.ratingsInclude.appPrivacyScore appPrivacyScore.text = getString( R.string.privacy_rating_out_of, privacyScore.toString() ) appPrivacyScore.setCompoundDrawablesRelativeWithIntrinsicBounds( null, null, getPrivacyDrawable(privacyScore.toString()), null ) appPrivacyScore.compoundDrawablePadding = 15 } } override fun onDestroyView() { super.onDestroyView() _binding = null Loading
app/src/main/java/foundation/e/apps/application/ApplicationViewModel.kt +25 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import foundation.e.apps.utils.enums.Status import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.ceil import kotlin.math.round @HiltViewModel class ApplicationViewModel @Inject constructor( Loading Loading @@ -118,4 +120,27 @@ class ApplicationViewModel @Inject constructor( } return "" } fun getPrivacyScore(): Int { fusedApp.value?.let { return calculatePrivacyScore(it) } return -1 } private fun calculatePrivacyScore(fusedApp: FusedApp): Int { return calculateTrackersScore(fusedApp.trackers.size) + calculatePermissionsScore(countAndroidPermissions(fusedApp)) } private fun countAndroidPermissions(fusedApp: FusedApp) = fusedApp.perms.filter { it.contains("android.permission") }.size private fun calculateTrackersScore(numberOfTrackers: Int): Int { return if (numberOfTrackers > 5) 0 else 9 - numberOfTrackers } private fun calculatePermissionsScore(numberOfPermission: Int): Int { return if (numberOfPermission > 9) 0 else round(0.2 * ceil((10 - numberOfPermission) / 2.0)).toInt() } }