diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index daa989f1133bcb849fbb7d23d364c0bc38292abe..508c47af8941dbd8a0d8322ed11f6c90b8a210bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ + - + + @@ -86,7 +90,8 @@ - + @@ -100,8 +105,10 @@ + diff --git a/app/src/main/java/foundation/e/apps/data/DownloadManager.kt b/app/src/main/java/foundation/e/apps/data/DownloadManager.kt index 37461b80ef85f46aec82168e946618c8d31c443b..1d54cdf9d85cc05ee26ef7319b4ef406f4968e59 100644 --- a/app/src/main/java/foundation/e/apps/data/DownloadManager.kt +++ b/app/src/main/java/foundation/e/apps/data/DownloadManager.kt @@ -20,6 +20,7 @@ package foundation.e.apps.data import android.app.DownloadManager import android.content.Context import android.net.Uri +import android.os.Environment import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.OpenForTesting import foundation.e.apps.R @@ -47,9 +48,8 @@ class DownloadManager @Inject constructor( ) { private val downloadsMaps = HashMap() - companion object { - const val EXTERNAL_STORAGE_TEMP_CACHE_DIR = "/sdcard/Download/AppLounge/SplitInstallApks" - } + private val SDCARD_PATH = Environment.getExternalStorageDirectory().absolutePath + val EXTERNAL_STORAGE_TEMP_CACHE_DIR = "$SDCARD_PATH/Download/AppLounge/SplitInstallApks" fun downloadFileInCache( url: String, diff --git a/app/src/main/java/foundation/e/apps/data/JobResult.kt b/app/src/main/java/foundation/e/apps/data/JobResult.kt deleted file mode 100644 index b085c503133fde7e2cae03101e5a35ad43bfc38d..0000000000000000000000000000000000000000 --- a/app/src/main/java/foundation/e/apps/data/JobResult.kt +++ /dev/null @@ -1,78 +0,0 @@ -package foundation.e.apps.data - -import foundation.e.apps.data.enums.ResultStatus - -/** - * Currently defunct, not being used anywhere. - * Prototype to merge API request and also get rid of Pair, Triple for timeout related cases. - */ -open class JobResult private constructor(val status: ResultStatus) { - - /* - * Classes for returning multiple data from a function along with a status - * in the form of ResultStatus. - * Use the static overloaded create methods (in companion object) to for easy creation. - * - * If needed to just pass a single data element with status for API requests, - * see the static methods success(), error(), loading() (in companion object). - */ - class of1 (val data1: A, status: ResultStatus) : JobResult(status) - class of2 (val data1: A, val data2: B, status: ResultStatus) : JobResult(status) - class of3 (val data1: A, val data2: B, val data3: C, status: ResultStatus) : JobResult(status) - - var message = "" - - /* - * This is the primary data, mainly for API requests which might send null data. - * Other data (type B, C ...) are secondary/optional data. - * - * For non-null return type, directly use of1, of2, of3 ... classes - * and directly access data1, data2, data3 ... - */ - val data: T? get() = when (this) { - is of1 -> this.data1 - is of2 -> this.data1 - is of3 -> this.data1 - else -> null - } - - fun isSuccess(): Boolean { - return status == ResultStatus.OK - } - - companion object { - fun create(data1: A, status: ResultStatus, message: String? = null): of1 { - return of1(data1, status).apply { - message?.let { this.message = message } - } - } - fun create(data1: A, data2: B, status: ResultStatus, message: String? = null): of2 { - return of2(data1, data2, status).apply { - message?.let { this.message = message } - } - } - fun create(data1: A, data2: B, data3: C, status: ResultStatus, message: String? = null): of3 { - return of3(data1, data2, data3, status).apply { - message?.let { this.message = message } - } - } - - /* - * Methods for API - */ - fun success(data: T): JobResult { - return of1(data, ResultStatus.OK) - } - fun error(message: String, data: T? = null): JobResult { - val result = if (data == null) JobResult(ResultStatus.UNKNOWN) - else of1(data, ResultStatus.UNKNOWN) - return result.apply { - this.message = message - } - } - /*fun loading(data: T?): JobResult { - return if (data == null) JobResult(ResultStatus.LOADING) - else JobResult.of1(data, ResultStatus.LOADING) - }*/ - } -} diff --git a/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt b/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt index 7b46568dcb00b158e79c9b2c1be594f8435e0621..43a505137c32b44c1c88c655cf7a8c55faf04e19 100644 --- a/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt +++ b/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt @@ -19,7 +19,6 @@ package foundation.e.apps.data.cleanapk import android.os.Build -import android.util.Log import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.google.gson.Gson @@ -46,6 +45,7 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.jackson.JacksonConverterFactory import retrofit2.converter.moshi.MoshiConverterFactory +import timber.log.Timber import java.net.ConnectException import java.util.Locale import javax.inject.Named @@ -193,7 +193,7 @@ object RetrofitModule { e: Exception, chain: Interceptor.Chain ): Response { - Log.e("Retrofit", "buildErrorResponse: ${e.localizedMessage}") + Timber.e("buildErrorResponse: ${e.localizedMessage}") return Response.Builder() .code(999) .message(e.localizedMessage ?: "Unknown error") diff --git a/app/src/main/java/foundation/e/apps/install/pkg/InstallerService.kt b/app/src/main/java/foundation/e/apps/install/pkg/InstallerService.kt index 9c99665ea425110f00e31fa76caf5ddb86bfe3af..180e089389a0eb1f9f76a3125af8d87abc5179f4 100644 --- a/app/src/main/java/foundation/e/apps/install/pkg/InstallerService.kt +++ b/app/src/main/java/foundation/e/apps/install/pkg/InstallerService.kt @@ -21,9 +21,7 @@ package foundation.e.apps.install.pkg import android.app.Service import android.content.Intent import android.content.pm.PackageInstaller -import android.os.Build import android.os.IBinder -import androidx.annotation.RequiresApi import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.data.enums.Status import foundation.e.apps.data.faultyApps.FaultyAppRepository @@ -55,7 +53,6 @@ class InstallerService : Service() { const val INSTALL_FAILED_UPDATE_INCOMPATIBLE = "INSTALL_FAILED_UPDATE_INCOMPATIBLE" } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -69) var packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME) diff --git a/app/src/main/java/foundation/e/apps/install/updates/UpdatesNotifier.kt b/app/src/main/java/foundation/e/apps/install/updates/UpdatesNotifier.kt index e03ec3c7d714eea0a7503a9aba017d551888c1f3..1d1f422581f19840594c56c2927f5920368f9524 100644 --- a/app/src/main/java/foundation/e/apps/install/updates/UpdatesNotifier.kt +++ b/app/src/main/java/foundation/e/apps/install/updates/UpdatesNotifier.kt @@ -17,13 +17,16 @@ package foundation.e.apps.install.updates +import android.Manifest import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.os.Build +import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import foundation.e.apps.R @@ -100,7 +103,7 @@ object UpdatesNotifier { flags = Intent.FLAG_ACTIVITY_CLEAR_TASK putExtra(UPDATES_NOTIFICATION_CLICK_EXTRA, true) } - return PendingIntent.getActivity(context, 0, intent, 0) + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) } private fun createNotificationChannel(context: Context) { @@ -126,6 +129,11 @@ object UpdatesNotifier { ) { with(NotificationManagerCompat.from(context)) { createNotificationChannel(context) + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED + ) { + return + } notify( UPDATES_NOTIFICATION_ID, getNotification( @@ -146,6 +154,11 @@ object UpdatesNotifier { ) { with(NotificationManagerCompat.from(context)) { createNotificationChannel(context) + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED + ) { + return + } notify( UPDATES_NOTIFICATION_ID, getNotification( diff --git a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorkManager.kt b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorkManager.kt index 895ebf020a91ede3810c7e84d5a814f52275af0e..fa41365edc1f4379d44ce68aa7fb68a0db1c4803 100644 --- a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorkManager.kt +++ b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorkManager.kt @@ -18,7 +18,6 @@ package foundation.e.apps.install.updates import android.content.Context -import android.util.Log import androidx.work.Constraints import androidx.work.Data import androidx.work.ExistingPeriodicWorkPolicy @@ -27,6 +26,7 @@ import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest import androidx.work.WorkManager +import timber.log.Timber import java.util.concurrent.TimeUnit object UpdatesWorkManager { @@ -72,11 +72,11 @@ object UpdatesWorkManager { interval: Long, existingPeriodicWorkPolicy: ExistingPeriodicWorkPolicy ) { - Log.i(TAG, "UpdatesWorker interval: $interval hours") + Timber.i("UpdatesWorker interval: $interval hours") WorkManager.getInstance(context).enqueueUniquePeriodicWork( UPDATES_WORK_NAME, existingPeriodicWorkPolicy, buildPeriodicWorkRequest(interval) ) - Log.i(TAG, "UpdatesWorker started") + Timber.i("UpdatesWorker started") } } diff --git a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt index 07ccbacc0f45444a6ccd6d81427bf02be8971d8a..9b025d371477a258d3fbcbf1534d7535dee6c5ab 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt @@ -389,7 +389,8 @@ class MainActivityViewModel @Inject constructor( } } - private fun ProducerScope.sendInternetStatus(connectivityManager: ConnectivityManager) { + // protected to avoid SyntheticAccessor + protected fun ProducerScope.sendInternetStatus(connectivityManager: ConnectivityManager) { val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt index c7c565403d2c6fcf25d34a5d0739804b49813f57..b6d4ae0cee7c4aab77303eefc7ca1318f86f6065 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt @@ -742,7 +742,7 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { val progressPercentage = ((progressResult.second / progressResult.first.toDouble()) * 100f).toInt() binding.downloadInclude.appInstallPB.progress = progressPercentage - binding.downloadInclude.percentage.text = "$progressPercentage%" + binding.downloadInclude.percentage.text = String.format("%d%%", progressPercentage) binding.downloadInclude.downloadedSize.text = downloadedSize } diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt index 3d607d1374b9166c43c6becf194d99e5ea076c1c..0b0eb3ef8bd74be53e7207393ecf6728cc2a684d 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt @@ -56,7 +56,8 @@ class ApplicationListFragment : TimeoutFragment(R.layout.fragment_application_list), FusedAPIInterface { - private val args: ApplicationListFragmentArgs by navArgs() + // protected to avoid SyntheticAccessor + protected val args: ApplicationListFragmentArgs by navArgs() @Inject lateinit var pkgManagerModule: PkgManagerModule @@ -64,7 +65,8 @@ class ApplicationListFragment : @Inject lateinit var pwaManagerModule: PWAManagerModule - private val viewModel: ApplicationListViewModel by viewModels() + // protected to avoid SyntheticAccessor + protected val viewModel: ApplicationListViewModel by viewModels() private val privacyInfoViewModel: PrivacyInfoViewModel by viewModels() private val appInfoFetchViewModel: AppInfoFetchViewModel by viewModels() override val mainActivityViewModel: MainActivityViewModel by activityViewModels() @@ -325,7 +327,7 @@ class ApplicationListFragment : ) viewHolder?.let { (viewHolder as ApplicationListRVAdapter.ViewHolder).binding.installButton.text = - "$progress%" + String.format("%d%%", progress) } } } diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt index a552ad664e29c993089a64d3df70ef71a85f0d00..12bd1aa3c5ad60feba81d0b54de7adb8431a5e50 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt @@ -17,7 +17,6 @@ package foundation.e.apps.ui.applicationlist -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -173,7 +172,7 @@ class ApplicationListRVAdapter( placeholder(shimmerDrawable) } } - else -> Log.wtf(TAG, "${searchApp.package_name} is from an unknown origin") + else -> Timber.wtf("${searchApp.package_name} is from an unknown origin") } } diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt index e77176ba2d62ca9c7db617a3bc8d459a9ee8c5f8..8ee45a413241f1ee2dd16e7cfa4cf54ebe7d49c1 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt @@ -252,7 +252,7 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), FusedAPIInterface ) childViewHolder?.let { (childViewHolder as HomeChildRVAdapter.ViewHolder).binding.installButton.text = - "$progress%" + String.format("%d%%", progress) } } } diff --git a/app/src/main/java/foundation/e/apps/ui/purchase/AppPurchaseFragment.kt b/app/src/main/java/foundation/e/apps/ui/purchase/AppPurchaseFragment.kt index f9688f226cd209f96b17fa9b4e5c09bbd4c6545e..6582eb4b7c2e36ce2a59c23abb4f4a30365af6f4 100644 --- a/app/src/main/java/foundation/e/apps/ui/purchase/AppPurchaseFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/purchase/AppPurchaseFragment.kt @@ -1,5 +1,6 @@ package foundation.e.apps.ui.purchase +import android.annotation.SuppressLint import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -48,6 +49,7 @@ class AppPurchaseFragment : Fragment() { setupWebView(url) } + @SuppressLint("SetJavaScriptEnabled") private fun setupWebView(url: String) { val cookieManager = CookieManager.getInstance() cookieManager.removeAllCookies(null) @@ -73,7 +75,7 @@ class AppPurchaseFragment : Fragment() { allowContentAccess = true databaseEnabled = true domStorageEnabled = true - javaScriptEnabled = true + javaScriptEnabled = true // Google Play page is tested to not work otherwise cacheMode = WebSettings.LOAD_DEFAULT } loadUrl(url) diff --git a/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt index f97ec131c017f16ee46d8d7178f3946cf35386ff..397853ee6adbc7e235694d756eaf7b127c9f8984 100644 --- a/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt @@ -318,7 +318,7 @@ class SearchFragment : ) viewHolder?.let { (viewHolder as ApplicationListRVAdapter.ViewHolder).binding.installButton.text = - "$progress%" + String.format("%d%%", progress) } } } diff --git a/app/src/main/java/foundation/e/apps/ui/settings/RadioButtonPreference.kt b/app/src/main/java/foundation/e/apps/ui/settings/RadioButtonPreference.kt deleted file mode 100644 index 0dcc41d4287936f5895b37153e6124aaf184d6bd..0000000000000000000000000000000000000000 --- a/app/src/main/java/foundation/e/apps/ui/settings/RadioButtonPreference.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.apps.ui.settings - -import android.content.Context -import android.util.AttributeSet -import androidx.preference.CheckBoxPreference -import foundation.e.apps.R - -class RadioButtonPreference : CheckBoxPreference { - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - setView() - } - - constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs) { - setView() - } - - private fun setView() { - widgetLayoutResource = R.layout.preference_widget_radiobutton - } - - override fun onClick() { - if (this.isChecked) - return - - super.onClick() - } -} diff --git a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt index 5aeda3fb17fd04b65586494469d170850598fa48..dd927f2d9ad4eeab0050e7b8ca38cdf251616b12 100644 --- a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt +++ b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt @@ -48,6 +48,10 @@ class LocaleChangedBroadcastReceiver : BroadcastReceiver() { private val TAG = LocaleChangedBroadcastReceiver::class.java.simpleName override fun onReceive(context: Context, intent: Intent) { + if (intent.action != Intent.ACTION_LOCALE_CHANGED) { + // security measure so that only the android system can call the receiver + return + } GlobalScope.launch { try { val authDataJson = dataStoreModule.getAuthDataSync() diff --git a/app/src/main/java/foundation/e/apps/ui/setup/signin/google/GoogleSignInFragment.kt b/app/src/main/java/foundation/e/apps/ui/setup/signin/google/GoogleSignInFragment.kt index e6602264287d2e03fc37b2c1d80ca511f02ec30f..8dc3081b306bee1790d961c2a2ed725765f8cf13 100644 --- a/app/src/main/java/foundation/e/apps/ui/setup/signin/google/GoogleSignInFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/setup/signin/google/GoogleSignInFragment.kt @@ -41,7 +41,8 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { private var _binding: FragmentGoogleSigninBinding? = null private val binding get() = _binding!! - private val viewModel: LoginViewModel by lazy { + // protected to avoid SyntheticAccessor + protected val viewModel: LoginViewModel by lazy { ViewModelProvider(requireActivity())[LoginViewModel::class.java] } diff --git a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt index 4baf3adbf0b29ca84019abecae076428d41cb1f6..017dbfd4a4407bc3d5f986bf0a341372888e0a03 100644 --- a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt @@ -361,7 +361,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), FusedAPIInte ) viewHolder?.let { (viewHolder as ApplicationListRVAdapter.ViewHolder).binding.installButton.text = - "$progress%" + String.format("%d%%", progress) } } } diff --git a/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.png b/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.png deleted file mode 100644 index c25efd652b98caad1531cbb839bb662e1d5184f3..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.webp b/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..f00559347d821824b459679338d8306897f4aacb Binary files /dev/null and b/app/src/main/res/drawable-hdpi/app_lounge_notification_icon.webp differ diff --git a/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.png b/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.png deleted file mode 100644 index 00fb90e9f8e3d9c864fcaef766083de89d111a52..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.webp b/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..463b6c6b889bab93055ee63c01c458fa26754620 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/app_lounge_notification_icon.webp differ diff --git a/app/src/main/res/drawable-nodpi/ic_app_updated_on.xml b/app/src/main/res/drawable-nodpi/ic_app_updated_on.xml deleted file mode 100644 index 5a1af8b80a1780071b33c94d3a938f2a98ac0f49..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable-nodpi/ic_app_updated_on.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.png b/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.png deleted file mode 100644 index 060ad9d64a38c7044cc807f722460c1639c50c5f..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.webp b/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..186ced7f3be8d849dcb44ed031d5ea7dc388b374 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/app_lounge_notification_icon.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.png b/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.png deleted file mode 100644 index 8fbe5ca4b6e1cf57e5b350f3b63e4f14a228d72e..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.webp b/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..6ec33fbb9ca4c5280379e491acfc42150fe81d19 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/app_lounge_notification_icon.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.png b/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.png deleted file mode 100644 index 9a58e72b5a02a1f635e11acba5dc6e2942eb9610..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.webp b/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4aabf50016dedd07ccbe47408853203ce03befa Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/app_lounge_notification_icon.webp differ diff --git a/app/src/main/res/drawable/ic_app_updated_on.xml b/app/src/main/res/drawable/ic_app_updated_on.xml new file mode 100644 index 0000000000000000000000000000000000000000..52dab93abaf723b2cda821e679ba04bfb9f04766 --- /dev/null +++ b/app/src/main/res/drawable/ic_app_updated_on.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_cat_family.xml b/app/src/main/res/drawable/ic_cat_family.xml index 56499beb09efbc5b04846889fd957cd72f2da8ae..7f46134ac406bea1ff6fb26f25c036abb1676a0f 100644 --- a/app/src/main/res/drawable/ic_cat_family.xml +++ b/app/src/main/res/drawable/ic_cat_family.xml @@ -17,11 +17,11 @@ --> + android:width="24dp" + android:height="32dp" + android:viewportWidth="32.0" + android:viewportHeight="32.0"> + android:pathData="M16,10c3.68,0 6.67,-2.24 6.67,-5S19.68,0 16,0s-6.67,2.24 -6.67,5 2.98,5 6.67,5zM27.3,13.51l3.57,-1.88c1.21,-0.63 1.5,-1.88 0.65,-2.79 -0.84,-0.91 -2.51,-1.13 -3.72,-0.49l-3.57,1.88c-4.91,2.58 -11.57,2.58 -16.48,0l-3.57,-1.88c-1.21,-0.64 -2.88,-0.41 -3.72,0.49 -0.85,0.91 -0.56,2.15 0.65,2.79l3.57,1.88c1.45,0.76 3.02,1.34 4.63,1.78v2.51c-0.78,0.35 -1.33,0.96 -1.33,1.69v1.17c0,0.39 0.19,0.74 0.47,1.06L5.25,24.75c-0.76,0.71 -0.78,1.72 -0.05,2.45l4,4c0.53,0.52 1.33,0.8 2.13,0.8 0.56,0 1.12,-0.13 1.6,-0.4 1.18,-0.66 1.42,-1.92 0.53,-2.8l-2.76,-2.76 1.52,-1.43c0.94,0.56 2.1,0.89 3.32,0.89h0.92c1.22,0 2.38,-0.32 3.32,-0.89l1.52,1.43 -2.76,2.76c-0.88,0.88 -0.65,2.14 0.53,2.8 0.48,0.27 1.04,0.4 1.6,0.4 0.82,0 1.61,-0.28 2.13,-0.8l4,-4c0.73,-0.73 0.71,-1.74 -0.05,-2.45l-3.22,-3.02c0.28,-0.32 0.47,-0.68 0.47,-1.06L24.02,19.5c0,-0.73 -0.55,-1.34 -1.33,-1.69v-2.51c1.61,-0.44 3.17,-1.02 4.62,-1.78zM21.33,20.67l-2.99,2.24c-0.5,0.38 -1.18,0.59 -1.88,0.59h-0.92c-0.71,0 -1.38,-0.21 -1.88,-0.59L10.67,20.67L10.67,19.5h10.67v1.17z"/> diff --git a/app/src/main/res/drawable/ic_cat_news.xml b/app/src/main/res/drawable/ic_cat_news.xml index 0b9c85f876d2e8958be4a187707268322a65b1dd..b2358ba80c3996d8c1900f5f3ca1023c2b19bc92 100644 --- a/app/src/main/res/drawable/ic_cat_news.xml +++ b/app/src/main/res/drawable/ic_cat_news.xml @@ -17,11 +17,11 @@ --> + android:width="32dp" + android:height="28dp" + android:viewportWidth="32.0" + android:viewportHeight="32.0"> + android:pathData="M30.67,4L6.22,4c-1.16,0 -2.15,0.84 -2.51,2L1.33,6c-0.74,0 -1.33,0.67 -1.33,1.5v17c0,1.93 1.39,3.5 3.11,3.5h27.56c0.74,0 1.33,-0.67 1.33,-1.5L32,5.5c0,-0.83 -0.6,-1.5 -1.33,-1.5zM2.67,24.5L2.67,9h0.89v15.5c0,0.28 -0.2,0.5 -0.44,0.5s-0.44,-0.22 -0.44,-0.5zM29.33,25L6.19,25c0.02,-0.16 0.03,-0.33 0.03,-0.5L6.22,7h23.11v18zM9.56,17.5h7.56c0.37,0 0.67,-0.34 0.67,-0.75v-6c0,-0.41 -0.3,-0.75 -0.67,-0.75L9.56,10c-0.37,0 -0.67,0.34 -0.67,0.75v6c0,0.41 0.3,0.75 0.67,0.75zM11.11,12.5h4.44v2.5h-4.44v-2.5zM8.89,21.25v-1.5c0,-0.41 0.3,-0.75 0.67,-0.75h7.56c0.37,0 0.67,0.34 0.67,0.75v1.5c0,0.41 -0.3,0.75 -0.67,0.75L9.56,22c-0.37,0 -0.67,-0.34 -0.67,-0.75zM19.56,21.25v-1.5c0,-0.41 0.3,-0.75 0.67,-0.75h5.78c0.37,0 0.67,0.34 0.67,0.75v1.5c0,0.41 -0.3,0.75 -0.67,0.75L20.22,22c-0.37,0 -0.67,-0.34 -0.67,-0.75zM19.56,12.25v-1.5c0,-0.41 0.3,-0.75 0.67,-0.75h5.78c0.37,0 0.67,0.34 0.67,0.75v1.5c0,0.41 -0.3,0.75 -0.67,0.75L20.22,13c-0.37,0 -0.67,-0.34 -0.67,-0.75zM19.56,16.75v-1.5c0,-0.41 0.3,-0.75 0.67,-0.75h5.78c0.37,0 0.67,0.34 0.67,0.75v1.5c0,0.41 -0.3,0.75 -0.67,0.75L20.22,17.5c-0.37,0 -0.67,-0.34 -0.67,-0.75z"/> diff --git a/app/src/main/res/drawable/ic_cat_travel.xml b/app/src/main/res/drawable/ic_cat_travel.xml index d6537df430fafaf65b94a50203a9b9a330fcce1e..6e557fd4c87d82d47ccfbc68fdc6d3dde389d9a4 100644 --- a/app/src/main/res/drawable/ic_cat_travel.xml +++ b/app/src/main/res/drawable/ic_cat_travel.xml @@ -17,11 +17,11 @@ --> + android:width="28dp" + android:height="32dp" + android:viewportWidth="32.0" + android:viewportHeight="32.0"> + android:pathData="M20,20.5c0,-1.38 1.28,-2.5 2.86,-2.5s2.86,1.12 2.86,2.5 -1.28,2.5 -2.86,2.5 -2.86,-1.12 -2.86,-2.5zM9.14,23c1.58,0 2.86,-1.12 2.86,-2.5s-1.28,-2.5 -2.86,-2.5 -2.86,1.12 -2.86,2.5 1.28,2.5 2.86,2.5zM32,6.86v14.29c0,3.07 -3.12,5.66 -7.08,6.54l4.2,3.67c0.27,0.24 0.08,0.64 -0.3,0.64h-3.46a0.86,0.75 0,0 1,-0.61 -0.22L20.43,28L11.57,28l-4.32,3.78A0.86,0.75 0,0 1,6.64 32L3.18,32c-0.38,0 -0.57,-0.4 -0.3,-0.64l4.2,-3.67C3.13,26.81 0,24.23 0,21.14L0,6.86C0,2.87 5.07,0 9.88,0h12.24C26.99,0 32,2.87 32,6.86zM3.63,6h24.75c-0.73,-1.63 -3.43,-3 -6.26,-3L9.88,3c-2.78,0 -5.5,1.35 -6.25,3zM3.43,14h10.86v-5L3.43,9v5zM28.57,17L3.43,17v4.14C3.43,23.41 7.14,25 9.88,25h12.24C24.82,25 28.57,23.43 28.57,21.14L28.57,17zM28.57,9L17.71,9v5h10.86v-5z"/> diff --git a/app/src/main/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index bf6f7ef8c8670d687ed374648ca85d1bfcfe6518..9223c9c56c9f6448aa7cb12ccd9125362bafba12 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -93,6 +93,7 @@ android:layout_height="wrap_content" android:src="@drawable/ic_star" android:layout_marginBottom="1dp" + android:contentDescription="@string/rating" app:layout_constraintBottom_toBottomOf="@+id/app_icon_card" app:layout_constraintLeft_toLeftOf="@+id/app_author"/> @@ -167,6 +168,7 @@ diff --git a/app/src/main/res/layout/categories_list_item.xml b/app/src/main/res/layout/categories_list_item.xml index 7e8daca7cf982f584b0ddf83cf104debfd2abaf4..489415ba6a1cfb1a262f9d2c549ea0c6343a758c 100644 --- a/app/src/main/res/layout/categories_list_item.xml +++ b/app/src/main/res/layout/categories_list_item.xml @@ -69,6 +69,7 @@ android:textAllCaps="false" android:textColor="#626262" android:textSize="15sp" + android:textIsSelectable="false" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/custom_preference.xml b/app/src/main/res/layout/custom_preference.xml index 2ebf0bbbdbb6672b2b105174efde4b9aac19adf6..0f9bb16e2abf0bab5c947db7064f5b35055c30a9 100644 --- a/app/src/main/res/layout/custom_preference.xml +++ b/app/src/main/res/layout/custom_preference.xml @@ -83,6 +83,7 @@ android:layout_marginStart="18dp" android:textColor="?android:textColorPrimary" android:textSize="15sp" + android:textIsSelectable="false" app:layout_constraintStart_toEndOf="@id/avatar" app:layout_constraintTop_toTopOf="@id/avatar" app:layout_constraintBottom_toTopOf="@id/email" @@ -96,6 +97,7 @@ android:layout_marginTop="5dp" android:textColor="?android:textColorSecondary" android:textSize="13sp" + android:textIsSelectable="false" app:layout_constraintBottom_toBottomOf="@id/avatar" app:layout_constraintStart_toEndOf="@id/avatar" app:layout_constraintTop_toBottomOf="@id/accountType" /> diff --git a/app/src/main/res/layout/fragment_application.xml b/app/src/main/res/layout/fragment_application.xml index 1d45a7483a180492e09da4c9175c3d445550c05b..e88df680a592c3cc0c8aa7e41a2115792c6d4710 100644 --- a/app/src/main/res/layout/fragment_application.xml +++ b/app/src/main/res/layout/fragment_application.xml @@ -50,128 +50,118 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - - - - + android:layout_height="40dp" + android:visibility="gone" + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + android:layout_marginTop="20dp" + app:cardElevation="8dp"> - - + + - - - - + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:gravity="center_vertical" + android:textColor="@android:color/white" + app:drawableLeftCompat="@drawable/ic_warning_white" + android:drawablePadding="15dp" + android:text="@string/this_app_may_not_work_properly" /> - - - + - + + - - - -