Loading app/build.gradle +10 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ plugins { } def versionMajor = 2 def versionMinor = 2 def versionMinor = 3 def versionPatch = 0 android { Loading Loading @@ -66,6 +66,12 @@ android { signingConfig signingConfigs.releaseStableConfig proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } applicationVariants.all { variant -> variant.outputs.all { output -> outputFileName = "AppLounge-${variant.versionName}-${variant.buildType.name}.apk" } } } buildFeatures { viewBinding true Loading Loading @@ -116,6 +122,9 @@ dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0" implementation "androidx.recyclerview:recyclerview:1.2.1" //logger implementation 'com.jakewharton.timber:timber:5.0.1' // Retrofit def retrofit_version = "2.9.0" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" Loading app/src/main/java/foundation/e/apps/AppLoungeApplication.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import foundation.e.apps.utils.modules.DataStoreModule import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import timber.log.Timber import timber.log.Timber.Forest.plant import java.util.concurrent.Executors import javax.inject.Inject Loading Loading @@ -60,6 +62,9 @@ class AppLoungeApplication : Application(), Configuration.Provider { dataStoreModule.saveTOCStatus(false, "") } } if (BuildConfig.DEBUG) { plant(Timber.DebugTree()) } } override fun getWorkManagerConfiguration() = Loading app/src/main/java/foundation/e/apps/MainActivity.kt +19 −19 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.os.Bundle import android.os.Environment import android.os.StatFs import android.os.storage.StorageManager import android.util.Log import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider Loading @@ -47,6 +46,7 @@ import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.modules.CommonUtilsModule import foundation.e.apps.utils.parentFragment.TimeoutFragment import kotlinx.coroutines.launch import timber.log.Timber import java.io.File import java.util.UUID Loading @@ -59,6 +59,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Timber.d(">>> onCreate") binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) Loading Loading @@ -91,32 +92,31 @@ class MainActivity : AppCompatActivity() { binding.noInternet.visibility = View.GONE binding.fragment.visibility = View.VISIBLE viewModel.userType.observe(this) { user -> // Watch and refresh authentication data if (viewModel.authDataJson.value == null) { viewModel.authDataJson.observe(this) { viewModel.handleAuthDataJson() } signInViewModel.authLiveData.observe(this) { viewModel.updateAuthData(it) } } } // Watch and refresh authentication data viewModel.authDataJson.observe(this) { viewModel.userType.observe(this) { user -> viewModel.handleAuthDataJson() } if (signInViewModel.authLiveData.value == null) { signInViewModel.authLiveData.observe(this) { viewModel.updateAuthData(it) } } viewModel.authValidity.observe(this) { viewModel.handleAuthValidity(it) { Log.d(TAG, "Timeout validating auth data!") Timber.d("Timeout validating auth data!") val lastFragment = navHostFragment.childFragmentManager.fragments[0] if (lastFragment is TimeoutFragment) { Log.d( TAG, "Displaying timeout from MainActivity on fragment: " + lastFragment::class.java.name ) Timber.d("Displaying timeout from MainActivity on fragment: " + lastFragment.javaClass.name) lastFragment.onTimeout() } } Loading Loading @@ -218,7 +218,7 @@ class MainActivity : AppCompatActivity() { } viewModel.updateAwaiting(it) InstallWorkManager.enqueueWork(it) Log.d(TAG, "===> onCreate: AWAITING ${it.name}") Timber.d("===> onCreate: AWAITING ${it.name}") } } Loading Loading @@ -273,7 +273,7 @@ class MainActivity : AppCompatActivity() { statsManager.getFreeBytes(StorageManager.UUID_DEFAULT) } } catch (e: Exception) { Log.e(TAG, "calculateAvailableDiskSpace: ${e.stackTraceToString()}") Timber.e("calculateAvailableDiskSpace: ${e.stackTraceToString()}") getAvailableInternalMemorySize() } } else { Loading app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +11 −11 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.graphics.Bitmap import android.os.Build import android.os.SystemClock import android.util.Base64 import android.util.Log import android.widget.ImageView import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog Loading Loading @@ -56,6 +55,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import ru.beryukhov.reactivenetwork.ReactiveNetwork import timber.log.Timber import java.io.ByteArrayOutputStream import javax.inject.Inject Loading Loading @@ -201,10 +201,10 @@ class MainActivityViewModel @Inject constructor( if (regenerateFunction != null) { dataStoreModule.userType.collect { user -> if (!user.isBlank() && User.valueOf(user) == User.ANONYMOUS) { Log.d(TAG, "Regenerating auth data for Anonymous user") Timber.d("Regenerating auth data for Anonymous user") regenerateFunction(user) } else { Log.d(TAG, "Ask Google user to log in again") Timber.d("Ask Google user to log in again") dataStoreModule.clearUserType() } } Loading Loading @@ -236,12 +236,12 @@ class MainActivityViewModel @Inject constructor( if (user == null || json == null) { return } Timber.d(">>> handleAuthDataJson: internet: ${internetConnection.value}") if (!isUserLoggedIn(user, json)) { generateAuthDataBasedOnUserType(user) } else if (isEligibleToValidateJson(json)) { } else if (isEligibleToValidateJson(json) && internetConnection.value == true) { validateAuthData() Log.d(TAG, ">>> Authentication data is available!") Timber.d(">>> Authentication data is available!") } } Loading @@ -251,7 +251,7 @@ class MainActivityViewModel @Inject constructor( private fun isEligibleToValidateJson(authDataJson: String?) = !authDataJson.isNullOrEmpty() && !userType.value.isNullOrEmpty() && !userType.value.contentEquals( User.UNAVAILABLE.name ) ) && authValidity.value != true fun handleAuthValidity(isValid: Boolean, handleTimeoOut: () -> Unit) { if (isGoogleLoginRunning) { Loading @@ -259,11 +259,11 @@ class MainActivityViewModel @Inject constructor( } isTokenValidationCompletedOnce = true if (isValid) { Log.d(TAG, "Authentication data is valid!") Timber.d("Authentication data is valid!") generateAuthData() return } Log.d(TAG, ">>> Authentication data validation failed!") Timber.d(">>> Authentication data validation failed!") destroyCredentials { user -> if (isTimeEligibleForTokenRefresh()) { generateAuthDataBasedOnUserType(user) Loading @@ -280,7 +280,7 @@ class MainActivityViewModel @Inject constructor( when (User.valueOf(user)) { User.ANONYMOUS -> { if (authDataJson.value.isNullOrEmpty() && !authRequestRunning) { Log.d(TAG, ">>> Fetching new authentication data") Timber.d(">>> Fetching new authentication data") setFirstTokenFetchTime() getAuthData() } Loading @@ -290,7 +290,7 @@ class MainActivityViewModel @Inject constructor( } User.GOOGLE -> { if (authData.value == null && !authRequestRunning) { Log.d(TAG, ">>> Fetching new authentication data") Timber.d(">>> Fetching new authentication data") setFirstTokenFetchTime() doFetchAuthData() } Loading app/src/main/java/foundation/e/apps/PrivacyInfoViewModel.kt +0 −5 Original line number Diff line number Diff line package foundation.e.apps import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData Loading Loading @@ -88,10 +87,6 @@ class PrivacyInfoViewModel @Inject constructor( val calculatePermissionsScore = calculatePermissionsScore( countAndroidPermissions(fusedApp) ) Log.d( "PrivacyInfoViewModel", "calculatePrivacyScore: ${fusedApp.name}: privacyScore: $calculateTrackersScore permissionScore: $calculatePermissionsScore noOfPermission: ${fusedApp.perms.size}" ) return calculateTrackersScore + calculatePermissionsScore } Loading Loading
app/build.gradle +10 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ plugins { } def versionMajor = 2 def versionMinor = 2 def versionMinor = 3 def versionPatch = 0 android { Loading Loading @@ -66,6 +66,12 @@ android { signingConfig signingConfigs.releaseStableConfig proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } applicationVariants.all { variant -> variant.outputs.all { output -> outputFileName = "AppLounge-${variant.versionName}-${variant.buildType.name}.apk" } } } buildFeatures { viewBinding true Loading Loading @@ -116,6 +122,9 @@ dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0" implementation "androidx.recyclerview:recyclerview:1.2.1" //logger implementation 'com.jakewharton.timber:timber:5.0.1' // Retrofit def retrofit_version = "2.9.0" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" Loading
app/src/main/java/foundation/e/apps/AppLoungeApplication.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import foundation.e.apps.utils.modules.DataStoreModule import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import timber.log.Timber import timber.log.Timber.Forest.plant import java.util.concurrent.Executors import javax.inject.Inject Loading Loading @@ -60,6 +62,9 @@ class AppLoungeApplication : Application(), Configuration.Provider { dataStoreModule.saveTOCStatus(false, "") } } if (BuildConfig.DEBUG) { plant(Timber.DebugTree()) } } override fun getWorkManagerConfiguration() = Loading
app/src/main/java/foundation/e/apps/MainActivity.kt +19 −19 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.os.Bundle import android.os.Environment import android.os.StatFs import android.os.storage.StorageManager import android.util.Log import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider Loading @@ -47,6 +46,7 @@ import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.modules.CommonUtilsModule import foundation.e.apps.utils.parentFragment.TimeoutFragment import kotlinx.coroutines.launch import timber.log.Timber import java.io.File import java.util.UUID Loading @@ -59,6 +59,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Timber.d(">>> onCreate") binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) Loading Loading @@ -91,32 +92,31 @@ class MainActivity : AppCompatActivity() { binding.noInternet.visibility = View.GONE binding.fragment.visibility = View.VISIBLE viewModel.userType.observe(this) { user -> // Watch and refresh authentication data if (viewModel.authDataJson.value == null) { viewModel.authDataJson.observe(this) { viewModel.handleAuthDataJson() } signInViewModel.authLiveData.observe(this) { viewModel.updateAuthData(it) } } } // Watch and refresh authentication data viewModel.authDataJson.observe(this) { viewModel.userType.observe(this) { user -> viewModel.handleAuthDataJson() } if (signInViewModel.authLiveData.value == null) { signInViewModel.authLiveData.observe(this) { viewModel.updateAuthData(it) } } viewModel.authValidity.observe(this) { viewModel.handleAuthValidity(it) { Log.d(TAG, "Timeout validating auth data!") Timber.d("Timeout validating auth data!") val lastFragment = navHostFragment.childFragmentManager.fragments[0] if (lastFragment is TimeoutFragment) { Log.d( TAG, "Displaying timeout from MainActivity on fragment: " + lastFragment::class.java.name ) Timber.d("Displaying timeout from MainActivity on fragment: " + lastFragment.javaClass.name) lastFragment.onTimeout() } } Loading Loading @@ -218,7 +218,7 @@ class MainActivity : AppCompatActivity() { } viewModel.updateAwaiting(it) InstallWorkManager.enqueueWork(it) Log.d(TAG, "===> onCreate: AWAITING ${it.name}") Timber.d("===> onCreate: AWAITING ${it.name}") } } Loading Loading @@ -273,7 +273,7 @@ class MainActivity : AppCompatActivity() { statsManager.getFreeBytes(StorageManager.UUID_DEFAULT) } } catch (e: Exception) { Log.e(TAG, "calculateAvailableDiskSpace: ${e.stackTraceToString()}") Timber.e("calculateAvailableDiskSpace: ${e.stackTraceToString()}") getAvailableInternalMemorySize() } } else { Loading
app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +11 −11 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.graphics.Bitmap import android.os.Build import android.os.SystemClock import android.util.Base64 import android.util.Log import android.widget.ImageView import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog Loading Loading @@ -56,6 +55,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import ru.beryukhov.reactivenetwork.ReactiveNetwork import timber.log.Timber import java.io.ByteArrayOutputStream import javax.inject.Inject Loading Loading @@ -201,10 +201,10 @@ class MainActivityViewModel @Inject constructor( if (regenerateFunction != null) { dataStoreModule.userType.collect { user -> if (!user.isBlank() && User.valueOf(user) == User.ANONYMOUS) { Log.d(TAG, "Regenerating auth data for Anonymous user") Timber.d("Regenerating auth data for Anonymous user") regenerateFunction(user) } else { Log.d(TAG, "Ask Google user to log in again") Timber.d("Ask Google user to log in again") dataStoreModule.clearUserType() } } Loading Loading @@ -236,12 +236,12 @@ class MainActivityViewModel @Inject constructor( if (user == null || json == null) { return } Timber.d(">>> handleAuthDataJson: internet: ${internetConnection.value}") if (!isUserLoggedIn(user, json)) { generateAuthDataBasedOnUserType(user) } else if (isEligibleToValidateJson(json)) { } else if (isEligibleToValidateJson(json) && internetConnection.value == true) { validateAuthData() Log.d(TAG, ">>> Authentication data is available!") Timber.d(">>> Authentication data is available!") } } Loading @@ -251,7 +251,7 @@ class MainActivityViewModel @Inject constructor( private fun isEligibleToValidateJson(authDataJson: String?) = !authDataJson.isNullOrEmpty() && !userType.value.isNullOrEmpty() && !userType.value.contentEquals( User.UNAVAILABLE.name ) ) && authValidity.value != true fun handleAuthValidity(isValid: Boolean, handleTimeoOut: () -> Unit) { if (isGoogleLoginRunning) { Loading @@ -259,11 +259,11 @@ class MainActivityViewModel @Inject constructor( } isTokenValidationCompletedOnce = true if (isValid) { Log.d(TAG, "Authentication data is valid!") Timber.d("Authentication data is valid!") generateAuthData() return } Log.d(TAG, ">>> Authentication data validation failed!") Timber.d(">>> Authentication data validation failed!") destroyCredentials { user -> if (isTimeEligibleForTokenRefresh()) { generateAuthDataBasedOnUserType(user) Loading @@ -280,7 +280,7 @@ class MainActivityViewModel @Inject constructor( when (User.valueOf(user)) { User.ANONYMOUS -> { if (authDataJson.value.isNullOrEmpty() && !authRequestRunning) { Log.d(TAG, ">>> Fetching new authentication data") Timber.d(">>> Fetching new authentication data") setFirstTokenFetchTime() getAuthData() } Loading @@ -290,7 +290,7 @@ class MainActivityViewModel @Inject constructor( } User.GOOGLE -> { if (authData.value == null && !authRequestRunning) { Log.d(TAG, ">>> Fetching new authentication data") Timber.d(">>> Fetching new authentication data") setFirstTokenFetchTime() doFetchAuthData() } Loading
app/src/main/java/foundation/e/apps/PrivacyInfoViewModel.kt +0 −5 Original line number Diff line number Diff line package foundation.e.apps import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData Loading Loading @@ -88,10 +87,6 @@ class PrivacyInfoViewModel @Inject constructor( val calculatePermissionsScore = calculatePermissionsScore( countAndroidPermissions(fusedApp) ) Log.d( "PrivacyInfoViewModel", "calculatePrivacyScore: ${fusedApp.name}: privacyScore: $calculateTrackersScore permissionScore: $calculatePermissionsScore noOfPermission: ${fusedApp.perms.size}" ) return calculateTrackersScore + calculatePermissionsScore } Loading