diff --git a/app/build.gradle b/app/build.gradle index 7bbca8c765f3681670e2679f5760de25e111671f..5fe2502f28962ed434fdd64b1702be9528d75cbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,23 +1,22 @@ plugins { id 'com.android.application' id 'kotlin-android' - id 'kotlin-android-extensions' id 'kotlin-kapt' + id 'kotlin-parcelize' } android { - compileSdkVersion 29 - buildToolsVersion '29.0.2' + compileSdkVersion 30 + buildToolsVersion '30.0.3' defaultConfig { applicationId "foundation.e.apps" minSdkVersion 25 targetSdkVersion 29 versionCode 10 - versionName "1.2.0" + versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables.useSupportLibrary = true } signingConfigs { @@ -47,9 +46,7 @@ android { lintOptions { lintConfig file("lint.xml") disable 'MissingTranslation' - } - androidExtensions { - experimental = true + disable 'NullSafeMutableLiveData' } aaptOptions { additionalParameters '-I', 'app/e-ui-sdk.jar' @@ -81,41 +78,25 @@ dependencies { // Preference implementation "androidx.preference:preference-ktx:1.1.1" - // Lifecycle - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" - // Bouncy Castle implementation 'org.bouncycastle:bcpg-jdk15on:1.60' // GSON implementation 'com.google.code.gson:gson:2.8.6' - // EventBus - implementation 'org.greenrobot:eventbus:3.2.0' - - // Volley - implementation "com.android.volley:volley:1.2.0" - // PhotoView implementation "com.github.chrisbanes:PhotoView:2.3.0" - // RoundedImageView - implementation "com.makeramen:roundedimageview:2.3.0" - // RecyclerView implementation 'androidx.recyclerview:recyclerview:1.2.0' // WorkManager - implementation 'androidx.work:work-runtime:2.5.0' + implementation 'androidx.work:work-runtime-ktx:2.5.0' - // Android-Iconics - implementation 'com.mikepenz:iconics-core:3.1.0@aar' - implementation 'com.mikepenz:google-material-typeface:3.0.1.2.original@aar' - - // Vectordrawable - def vector_version = "1.1.0" - implementation "androidx.vectordrawable:vectordrawable:$vector_version" - implementation "androidx.vectordrawable:vectordrawable-animated:$vector_version" + // Lifecycle + def lifecycle_version = "2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" // Navigation component def nav_version = "2.3.5" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a88355f700bae2527c948ee88c7e9ba7747446a..0bda108518b046afe9506df9bc450f0e79911a50 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,13 @@ android:launchMode="singleInstance" android:theme="@style/AppTheme1" android:windowSoftInputMode="adjustResize" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index 5691c9e3ab46283da7bea3e1cb1a43e3a68d6ecb..2dc45b42f73a0e659759b10a90b0462eac231fde 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -52,7 +52,7 @@ import foundation.e.apps.updates.UpdatesManager import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Constants.CURRENTLY_SELECTED_FRAGMENT_KEY - +import kotlin.properties.Delegates class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener, ApplicationManagerServiceConnectionCallback { @@ -67,7 +67,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS private val codeRequestPermissions = 9527 var doubleBackToExitPressedOnce = false; private var isReceiverRegistered = false - var accentColorOS = 0 + private var accentColorOS by Delegates.notNull() init { instance = this @@ -96,6 +96,9 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS super.onCreate(savedInstanceState) setContentView(binding.root) + + accentColorOS = Common.getAccentColor(this) + mActivity = this disableCategoryIfOpenSource() @@ -114,9 +117,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS Common.updateMicroGStatus(this) - initialiseUpdatesWorker() - - // Show the home fragment by default currentFragmentId = if (savedInstanceState != null && savedInstanceState.containsKey(CURRENTLY_SELECTED_FRAGMENT_KEY)) { @@ -129,7 +129,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS setupLangReceiver() applicationManagerServiceConnection.bindService(this) - getAccentColor(); bottom_navigation_view_color() openSearchFragment() } @@ -168,12 +167,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } - private fun initialiseUpdatesWorker() { - UpdatesManager(applicationContext).startWorker() - - - } - override fun onServiceBind(applicationManager: ApplicationManager) { initialiseFragments(applicationManager) selectFragment(currentFragmentId, null) @@ -341,17 +334,4 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } }, 2000) } - - /* - * get Accent color from OS - * - * */ - private fun getAccentColor() { - - accentColorOS = this.getColor(R.color.colorAccent); - - - - } - } diff --git a/app/src/main/java/foundation/e/apps/XAPK/ApksBean.kt b/app/src/main/java/foundation/e/apps/XAPK/ApksBean.kt index c389394de58ea13456fe1eae96ef5c6c1e57b470..b880e71e40d7c6170cda0383b38124c86aea56f0 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/ApksBean.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/ApksBean.kt @@ -19,7 +19,7 @@ package foundation.e.apps.XAPK import android.annotation.SuppressLint import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @SuppressLint("ParcelCreator") @Parcelize diff --git a/app/src/main/java/foundation/e/apps/XAPK/AppFolder.kt b/app/src/main/java/foundation/e/apps/XAPK/AppFolder.kt index eb99f66e749eb8435884e2af88a2885a00850821..6429d023463ce124c7b0febcd166c4adb27b36a2 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/AppFolder.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/AppFolder.kt @@ -17,7 +17,6 @@ package foundation.e.apps.XAPK -import android.os.Environment import foundation.e.apps.BuildConfig import foundation.e.apps.MainActivity import java.io.File diff --git a/app/src/main/java/foundation/e/apps/XAPK/FsUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/FsUtils.kt index 25fa0c379dae3d3bc1bb1e797021e80204e1e791..41d84504c7a990b4a336b79295412ba2643dc208 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/FsUtils.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/FsUtils.kt @@ -18,7 +18,6 @@ package foundation.e.apps.XAPK import android.os.Environment -import android.text.TextUtils import foundation.e.apps.MainActivity import java.io.File @@ -37,7 +36,7 @@ object FsUtils { } fun exists(filePath: String?): Boolean { - return !TextUtils.isEmpty(filePath) && exists(File(filePath)) + return if (!filePath.isNullOrEmpty()) exists(File(filePath)) else false } fun exists(file: File?): Boolean { diff --git a/app/src/main/java/foundation/e/apps/XAPK/InstallSplitApksActivity.kt b/app/src/main/java/foundation/e/apps/XAPK/InstallSplitApksActivity.kt index dd8c4926be11c1c1e8cbe33041ab122dbccff5e9..6eb73e4db05ab684221ad21986d9c1973513fc88 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/InstallSplitApksActivity.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/InstallSplitApksActivity.kt @@ -26,7 +26,7 @@ import android.os.Build import android.os.Handler import android.os.Looper import androidx.annotation.RequiresApi -import com.makeramen.roundedimageview.BuildConfig +import foundation.e.apps.BuildConfig import java.io.File import java.io.FileInputStream import java.io.IOException diff --git a/app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt index 079b591af6b7ec8003a79681782e74769abf7bce..7d1533d61cdda8fa5917b790c8527c6ca1110ac5 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt @@ -19,7 +19,6 @@ package foundation.e.apps.XAPK import android.content.Context import android.content.Intent -import android.os.Build import java.io.File object IntentUtils { diff --git a/app/src/main/java/foundation/e/apps/XAPK/LocaleUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/LocaleUtils.kt index 2b8abdea318c89103afb2ae675b29f869db97474..cd8eade7f52225ef2dfb08e7c660ea4c10c2fc5d 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/LocaleUtils.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/LocaleUtils.kt @@ -17,7 +17,6 @@ package foundation.e.apps.XAPK -import android.os.Build import android.os.LocaleList import android.text.TextUtils import java.util.* diff --git a/app/src/main/java/foundation/e/apps/XAPK/UriUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/UriUtils.kt index 72b06b44a36a0ac270c8a3656bb44abb9bdb81fe..85911b33363b042216db940e533b75d1c85e9e68 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/UriUtils.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/UriUtils.kt @@ -19,7 +19,6 @@ package foundation.e.apps.XAPK import android.content.Context import android.net.Uri -import android.os.Build import androidx.core.content.FileProvider import foundation.e.apps.BuildConfig import java.io.File diff --git a/app/src/main/java/foundation/e/apps/XAPK/XApkInstallUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/XApkInstallUtils.kt index 2b4e3805e12862fdc98c1a64c9070c641defc7a9..563a03c9f63691db7c721ee3160a82cf46821a37 100644 --- a/app/src/main/java/foundation/e/apps/XAPK/XApkInstallUtils.kt +++ b/app/src/main/java/foundation/e/apps/XAPK/XApkInstallUtils.kt @@ -17,7 +17,6 @@ package foundation.e.apps.XAPK -import android.os.Build import android.os.Handler import android.os.Looper import androidx.annotation.MainThread diff --git a/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt b/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt index 7596e8b7166ff4cb86d522f92cc233fdedc4f274..0c7ad906236622a3884c8e5ce66b5c02d28c3403 100644 --- a/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt +++ b/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt @@ -19,7 +19,7 @@ package foundation.e.apps.api import android.content.Context import com.google.gson.Gson -import com.google.gson.JsonParser +import com.google.gson.JsonParser.parseReader import foundation.e.apps.application.model.Application import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.release.ReleaseData @@ -35,7 +35,7 @@ class GitlabDataRequest { val url = Constants.RELEASE_API + Constants.MICROG_ID + Constants.RELEASE_ENDPOINT val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET) val isr = InputStreamReader(urlConnection.inputStream) - val element = JsonParser().parse(isr) + val element = parseReader(isr) val releaseList: List = Gson().fromJson(element.toString(), Array::class.java).toList() diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt index 5f5a89f6d7334fabf78e58c1c820dc8f3f89f177..3f2137ceced1faa79d11c6a3daf080c586f411a4 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -24,6 +24,8 @@ import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.os.Bundle import android.os.CountDownTimer import android.text.Html @@ -57,6 +59,7 @@ import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback import foundation.e.apps.categories.category.CategoryActivity +import foundation.e.apps.databinding.ActivityApplicationBinding import foundation.e.apps.pwa.PwaInstaller import foundation.e.apps.utils.Common import foundation.e.apps.utils.Common.toMiB @@ -66,35 +69,38 @@ import foundation.e.apps.utils.Constants.APPLICATION_PACKAGE_NAME_KEY import foundation.e.apps.utils.Constants.SELECTED_APPLICATION_SCREENSHOT_KEY import foundation.e.apps.utils.Error import foundation.e.apps.utils.Execute -import kotlinx.android.synthetic.main.activity_application.* -import kotlinx.android.synthetic.main.install_button_layout.* import kotlin.math.roundToInt class ApplicationActivity : - AppCompatActivity(), - ApplicationStateListener, - ApplicationManagerServiceConnectionCallback, - Downloader.DownloadProgressCallback, - BasicData.IconLoaderCallback, - PwasBasicData.IconLoaderCallback { + AppCompatActivity(), + ApplicationStateListener, + ApplicationManagerServiceConnectionCallback, + Downloader.DownloadProgressCallback, + BasicData.IconLoaderCallback, + PwasBasicData.IconLoaderCallback { + private lateinit var binding: ActivityApplicationBinding private lateinit var applicationPackageName: String private lateinit var application: Application private val applicationManagerServiceConnection = - ApplicationManagerServiceConnection(this) + ApplicationManagerServiceConnection(this) private var imageWidth = 0 private var imageHeight = 0 private var imageMargin = 0 private var defaultElevation = 0f private val sharedPrefFile = "kotlinsharedpreference" - var accentColorOS = 0 override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityApplicationBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) - setContentView(R.layout.activity_application) - good_border.visibility = View.GONE - neutral_border.visibility = View.GONE + setContentView(binding.root) + + val accentColorOS = Common.getAccentColor(this) + + binding.goodBorder.visibility = View.GONE + binding.neutralBorder.visibility = View.GONE val toolbar = findViewById(R.id.toolbar) @@ -103,7 +109,7 @@ class ApplicationActivity : supportActionBar?.setDisplayShowTitleEnabled(false) sharedPreferences = this.getSharedPreferences(sharedPrefFile, Context.MODE_PRIVATE) - pwa_sympol.visibility = View.GONE + binding.pwaSympol.visibility = View.GONE initialiseDimensions() val applicationPackageName: String? = intent.getStringExtra(APPLICATION_PACKAGE_NAME_KEY) @@ -112,27 +118,28 @@ class ApplicationActivity : applicationManagerServiceConnection.bindService(this) } - getAccentColor() - app_install.setTextColor(Color.parseColor("#ffffff")) - app_install.setBackgroundColor(accentColorOS) - app_category.setTextColor(accentColorOS) - app_expand_description.setTextColor(accentColorOS) + // Set accent color + binding.installButtonLayout.appInstall.setTextColor(Color.parseColor("#ffffff")) + binding.installButtonLayout.appInstall.background.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) + binding.appDownloadProgress.progressDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) + binding.appCategory.setTextColor(accentColorOS) + binding.appExpandDescription.setTextColor(accentColorOS) } private fun initialiseElevation() { - if (scroll_view.scrollY == 0) { - toolbar.elevation = 0f + if (binding.scrollView.scrollY == 0) { + binding.toolbar.elevation = 0f } else { - toolbar.elevation = defaultElevation + binding.toolbar.elevation = defaultElevation } - scroll_view.setOnScrollChangeListener { view, _, _, _, _ -> + binding.scrollView.setOnScrollChangeListener { view, _, _, _, _ -> if (view.scrollY == 0) { - toolbar.elevation = 0f + binding.toolbar.elevation = 0f } else { - toolbar.elevation = defaultElevation + binding.toolbar.elevation = defaultElevation } } } @@ -141,28 +148,28 @@ class ApplicationActivity : application = applicationManager.findOrCreateApp(applicationPackageName) var error: Error? = null Execute({ - error = application.assertFullData(this) - }, { - if (error == null) { + error = application.assertFullData(this) + }, { + if (error == null) { - onApplicationInfoLoaded() - } else { - Snackbar.make(container, - getString(error!!.description), - Snackbar.LENGTH_LONG).show() - - // Close activity once snackbar has hidden - object : CountDownTimer(3500, 3500) { - override fun onTick(p0: Long) { - // Do nothing - } + onApplicationInfoLoaded() + } else { + Snackbar.make(binding.container, + getString(error!!.description), + Snackbar.LENGTH_LONG).show() + + // Close activity once snackbar has hidden + object : CountDownTimer(3500, 3500) { + override fun onTick(p0: Long) { + // Do nothing + } - override fun onFinish() { - finish() + override fun onFinish() { + finish() + } + }.start() } - }.start() - } - }) + }) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { @@ -170,8 +177,8 @@ class ApplicationActivity : return true } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when (item?.itemId) { + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { android.R.id.home -> { finish() } @@ -217,57 +224,56 @@ class ApplicationActivity : // Set the app title if (basicData.name.isNotEmpty()) { - app_title.text = basicData.name + binding.appTitle.text = basicData.name } else { - app_title.visibility = View.GONE + binding.appTitle.visibility = View.GONE } // Set the app author if (basicData.author.isNotEmpty()) { - app_author.text = basicData.author + binding.appAuthor.text = basicData.author } else { - app_author.visibility = View.GONE + binding.appAuthor.visibility = View.GONE } // Set the app category if (fullData.category.getTitle().isNotEmpty()) { - app_category.text = fullData.category.getTitle() - app_category.setOnClickListener { + binding.appCategory.text = fullData.category.getTitle() + binding.appCategory.setOnClickListener { startActivity(Intent(this, CategoryActivity::class.java).apply { putExtra(Constants.CATEGORY_KEY, fullData.category) }) } } else { - app_category.visibility = View.GONE + binding.appCategory.visibility = View.GONE } // Set the app description if (fullData.description.isNotEmpty()) { - app_description.text = fullData.description - app_description_container.isEnabled = true + binding.appDescription.text = fullData.description + binding.appDescriptionContainer.isEnabled = true } else { - app_description.text = getString(R.string.not_available_full) - app_description_container.isEnabled = false + binding.appDescription.text = getString(R.string.not_available_full) + binding.appDescriptionContainer.isEnabled = false } // Handle clicks on description - app_description_container.setOnClickListener { + binding.appDescriptionContainer.setOnClickListener { val intent = Intent(this, ApplicationDescriptionActivity::class.java) intent.putExtra(APPLICATION_DESCRIPTION_KEY, application.fullData!!.description) startActivity(intent) } // Set the app rating - val builder = textColorChange(getText(R.string.not_available).toString()) if (basicData.ratings.rating != -1f) { - app_rating.text = basicData.ratings.rating.toString() + "/5" + binding.appRating.text = basicData.ratings.rating.toString() + "/5" } else { - app_rating.text = builder + binding.appRating.text = textColorChange(getText(R.string.not_available).toString()) } setRatingBorder(basicData.ratings.rating) - app_rating_container.setOnClickListener { + binding.appRatingContainer.setOnClickListener { val alertDialog = AlertDialog.Builder(this).create() alertDialog.setIcon(R.drawable.ic_app_rating) @@ -289,31 +295,29 @@ class ApplicationActivity : //Set the app licence if (fullData.licence.isNotEmpty()) { - app_licence.text = fullData.licence + binding.appLicence.text = fullData.licence } else { - app_licence.text = getString(R.string.not_available) + binding.appLicence.text = getString(R.string.not_available) } if (fullData.getLastVersion() != null) { // Set app size if (fullData.getLastVersion()!!.fileSize.isNotEmpty()) { - app_size.text = fullData.getLastVersion()!!.fileSize + binding.appSize.text = fullData.getLastVersion()!!.fileSize } else { - app_size.visibility = View.GONE + binding.appSize.visibility = View.GONE } // Set the app privacy rating - val builder = textColorChange(getText(R.string.not_available).toString()) - if (fullData.getLastVersion()!!.privacyRating != null && - fullData.getLastVersion()!!.privacyRating != -1) { - app_privacy_score.text = fullData.getLastVersion()!!.privacyRating.toString() + "/10" + fullData.getLastVersion()!!.privacyRating != -1) { + binding.appPrivacyScore.text = fullData.getLastVersion()!!.privacyRating.toString() + "/10" setPrivacyRatingBorder(fullData.getLastVersion()!!.privacyRating!!) } else { - app_privacy_score.text = builder + binding.appPrivacyScore.text = textColorChange(getText(R.string.not_available).toString()) setPrivacyRatingBorder(-1) } - app_privacy_container.setOnClickListener { + binding.appPrivacyContainer.setOnClickListener { val message = layoutInflater.inflate(R.layout.privacy_dialog_message, null) as TextView @@ -338,40 +342,39 @@ class ApplicationActivity : // Set app version if (fullData.getLastVersion()!!.version.isNotEmpty()) { - app_version.text = fullData.getLastVersion()!!.version + binding.appVersion.text = fullData.getLastVersion()!!.version } else { - app_version.text = getString(R.string.not_available) + binding.appVersion.text = getString(R.string.not_available) } // Set app package name. if (fullData.packageName.isNotEmpty()) { - app_package_name.text = fullData.packageName + binding.appPackageName.text = fullData.packageName } else { - app_package_name.text = getString(R.string.not_available) + binding.appPackageName.text = getString(R.string.not_available) } // Set app update timestamp if (fullData.getLastVersion()!!.createdOn.isNotEmpty()) { - app_updated_on.text = getFormattedTimestamp(fullData.getLastVersion()!!.createdOn) + binding.appUpdatedOn.text = getFormattedTimestamp(fullData.getLastVersion()!!.createdOn) } else { - app_updated_on.text = getString(R.string.not_available) + binding.appUpdatedOn.text = getString(R.string.not_available) } // Set app minimum required Android version if (fullData.getLastVersion()!!.minAndroid.isNotEmpty()) { - app_min_android.text = - getFormattedMinSdkVersion(fullData.getLastVersion()!!.minAndroid) + binding.appMinAndroid.text = + getFormattedMinSdkVersion(fullData.getLastVersion()!!.minAndroid) } else { - app_min_android.text = getString(R.string.not_available) + binding.appMinAndroid.text = getString(R.string.not_available) } } else { // Set app size - app_size.visibility = View.GONE + binding.appSize.visibility = View.GONE // Set app privacy rating - val builder = textColorChange(getText(R.string.not_available).toString()) - app_privacy_score.text = builder + binding.appPrivacyScore.text = textColorChange(getText(R.string.not_available).toString()) setPrivacyRatingBorder(-1) - app_privacy_container.setOnClickListener { + binding.appPrivacyContainer.setOnClickListener { val alertDialog = AlertDialog.Builder(this).create() alertDialog.setIcon(R.drawable.ic_dialog_info) alertDialog.setTitle(R.string.app_privacy_score) @@ -386,23 +389,23 @@ class ApplicationActivity : } // Set app version - app_version.text = getString(R.string.not_available_full) + binding.appVersion.text = getString(R.string.not_available_full) // Set app update timestamp - app_updated_on.text = getString(R.string.not_available_full) + binding.appUpdatedOn.text = getString(R.string.not_available_full) // Set app minimum required Android version - app_min_android.text = getString(R.string.not_available_full) + binding.appMinAndroid.text = getString(R.string.not_available_full) } // Handle clicks on app permissions - app_permissions_container.setOnClickListener { + binding.appPermissionsContainer.setOnClickListener { val layout = layoutInflater.inflate(R.layout.custom_alert_dialog_layout, null) val message = layout.findViewById(R.id.message) val alertDialog = AlertDialog.Builder(this).create() alertDialog.setTitle(R.string.app_permissions_title) if (fullData.getLastVersion() != null && - fullData.getLastVersion()!!.exodusPermissions != null) { + fullData.getLastVersion()!!.exodusPermissions != null) { if (fullData.getLastVersion()!!.exodusPermissions!!.isNotEmpty()) { var rawMessage = "" var index = 0 @@ -432,7 +435,7 @@ class ApplicationActivity : } // Handle clicks on app trackers - app_trackers_container.setOnClickListener { + binding.appTrackersContainer.setOnClickListener { val layout = layoutInflater.inflate(R.layout.custom_alert_dialog_layout, null) val message = layout.findViewById(R.id.message) @@ -446,7 +449,7 @@ class ApplicationActivity : alertDialog.setTitle(R.string.app_trackers_title) if (fullData.getLastVersion() != null && - fullData.getLastVersion()!!.exodusTrackers != null) { + fullData.getLastVersion()!!.exodusTrackers != null) { if (fullData.getLastVersion()!!.exodusTrackers!!.isNotEmpty()) { var rawMessage = "" var index = 0 @@ -479,7 +482,7 @@ class ApplicationActivity : stateChanged(application.state) // Handle clicks on app install button - app_install.setOnClickListener { + binding.installButtonLayout.appInstall.setOnClickListener { onInstallButtonClick(fullData) } } else { @@ -492,8 +495,8 @@ class ApplicationActivity : private fun onPwaApplicationLoaded() { application.PwaloadIcon(this) - pwa_sympol.visibility = View.VISIBLE - Ratings.visibility = View.GONE + binding.pwaSympol.visibility = View.VISIBLE + binding.Ratings.visibility = View.GONE val pwasBasicData = application.pwabasicdata @@ -502,33 +505,33 @@ class ApplicationActivity : // Set the app title if (pwasBasicData!!.name.isNotEmpty()) { - app_title.text = pwasBasicData.name + binding.appTitle.text = pwasBasicData.name } else { - app_title.visibility = View.GONE + binding.appTitle.visibility = View.GONE } // Set the app description if (pwaFullData!!.description.isNotEmpty()) { - app_description.text = pwaFullData.description - app_description_container.isEnabled = true + binding.appDescription.text = pwaFullData.description + binding.appDescriptionContainer.isEnabled = true } else { - app_description.text = getString(R.string.not_available_full) - app_description_container.isEnabled = false + binding.appDescription.text = getString(R.string.not_available_full) + binding.appDescriptionContainer.isEnabled = false } if (pwaFullData.category.getTitle().isNotEmpty()) { - app_category.text = pwaFullData.category.getTitle() - app_category.setOnClickListener { + binding.appCategory.text = pwaFullData.category.getTitle() + binding.appCategory.setOnClickListener { startActivity(Intent(this, CategoryActivity::class.java).apply { putExtra(Constants.CATEGORY_KEY, pwaFullData.category) }) } } else { - app_category.visibility = View.GONE + binding.appCategory.visibility = View.GONE } // Handle clicks on description - app_description_container.setOnClickListener { + binding.appDescriptionContainer.setOnClickListener { val intent = Intent(this, ApplicationDescriptionActivity::class.java) intent.putExtra(APPLICATION_DESCRIPTION_KEY, application.pwaFullData!!.description) startActivity(intent) @@ -541,29 +544,29 @@ class ApplicationActivity : // Handle clicks on app permissions - exodus_info_container.visibility = View.GONE + binding.exodusInfoContainer.visibility = View.GONE //app_information details - app_information_title.visibility = View.GONE - app_version_layout.visibility = View.GONE - app_updated_on_layout.visibility = View.GONE - app_requires.visibility = View.GONE - app_licence_layout.visibility = View.GONE - app_package_name_layout.visibility =View.GONE + binding.appInformationTitle.visibility = View.GONE + binding.appVersionLayout.visibility = View.GONE + binding.appUpdatedOnLayout.visibility = View.GONE + binding.appRequires.visibility = View.GONE + binding.appLicenceLayout.visibility = View.GONE + binding.appPackageNameLayout.visibility =View.GONE application.addListener(this) stateChanged(application.state) // Handle clicks on app install button - app_install.setOnClickListener { + binding.installButtonLayout.appInstall.setOnClickListener { onPwaInstallButtonClick(pwaFullData) } } override fun onIconLoaded(application: Application, bitmap: Bitmap) { if (application == this.application) { - app_icon.setImageBitmap(bitmap) + binding.appIcon.setImageBitmap(bitmap) } } @@ -588,9 +591,9 @@ class ApplicationActivity : if (fullData.getLastVersion() == null) { - Snackbar.make(container, - getString(Error.APK_UNAVAILABLE.description), - Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.container, + getString(Error.APK_UNAVAILABLE.description), + Snackbar.LENGTH_LONG).show() return } @@ -611,46 +614,46 @@ class ApplicationActivity : @SuppressLint("SetTextI18n") override fun notifyDownloadProgress(count: Int, total: Int) { - app_download_mb.text = "${toMiB(count)}/${toMiB(total)} MiB" - app_download_percentage.text = - ((toMiB(count) / toMiB(total)) * 100).toInt().toString() + "%" - app_download_progress.max = total - app_download_progress.progress = count + binding.appDownloadMb.text = "${toMiB(count)}/${toMiB(total)} MiB" + binding.appDownloadPercentage.text = + ((toMiB(count) / toMiB(total)) * 100).toInt().toString() + "%" + binding.appDownloadProgress.max = total + binding.appDownloadProgress.progress = count } override fun anErrorHasOccurred(error: Error) { - Snackbar.make(container, - getString(error.description), - Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.container, + getString(error.description), + Snackbar.LENGTH_LONG).show() } override fun stateChanged(state: State) { Execute({}, { - app_install.text = resources.getString(state.installButtonTextId) + binding.installButtonLayout.appInstall.text = resources.getString(state.installButtonTextId) when (state) { State.INSTALLED -> { - app_install.isEnabled = - Common.appHasLaunchActivity(this, application.packageName) - app_size.visibility = View.VISIBLE - app_download_container.visibility = View.GONE + binding.installButtonLayout.appInstall.isEnabled = + Common.appHasLaunchActivity(this, application.packageName) + binding.appSize.visibility = View.VISIBLE + binding.appDownloadContainer.visibility = View.GONE } State.DOWNLOADING -> { - app_install.isEnabled = true - app_size.visibility = View.GONE - app_download_mb.text = getString(R.string.state_installing) - app_download_percentage.text = "" - app_download_progress.progress = 0 - app_download_container.visibility = View.VISIBLE + binding.installButtonLayout.appInstall.isEnabled = true + binding.appSize.visibility = View.GONE + binding.appDownloadMb.text = getString(R.string.state_installing) + binding.appDownloadPercentage.text = "" + binding.appDownloadProgress.progress = 0 + binding.appDownloadContainer.visibility = View.VISIBLE } State.INSTALLING -> { - app_install.isEnabled = false - app_size.visibility = View.VISIBLE - app_download_container.visibility = View.GONE + binding.installButtonLayout.appInstall.isEnabled = false + binding.appSize.visibility = View.VISIBLE + binding.appDownloadContainer.visibility = View.GONE } else -> { - app_install.isEnabled = true - app_size.visibility = View.VISIBLE - app_download_container.visibility = View.GONE + binding.installButtonLayout.appInstall.isEnabled = true + binding.appSize.visibility = View.VISIBLE + binding.appDownloadContainer.visibility = View.GONE } } }) @@ -658,14 +661,14 @@ class ApplicationActivity : private fun setRatingBorder(rating: Float?) { when { - rating!! >= 7f -> { - app_rating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) + rating!! >= 3.5f -> { + binding.appRating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) } - rating >= 4f -> { - app_rating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_yellow_ellipse, 0) + rating >= 2.0f -> { + binding.appRating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_yellow_ellipse, 0) } else -> { - app_rating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_red_ellipse, 0) + binding.appRating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_red_ellipse, 0) } } } @@ -673,34 +676,34 @@ class ApplicationActivity : private fun setPrivacyRatingBorder(rating: Int) { when { rating >= 7 -> { - app_privacy_score.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) + binding.appPrivacyScore.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) } rating >= 4 -> { - app_privacy_score.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_yellow_ellipse, 0) + binding.appPrivacyScore.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_yellow_ellipse, 0) } else -> { - app_privacy_score.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_red_ellipse, 0) + binding.appPrivacyScore.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_red_ellipse, 0) } } } private fun showImages(images: List) { - app_screenshots_progress_bar.visibility = View.GONE + binding.appScreenshotsProgressBar.visibility = View.GONE if (images.isEmpty()) { - app_screenshots_error.visibility = View.VISIBLE + binding.appScreenshotsError.visibility = View.VISIBLE return } else { - app_screenshots_error.visibility = View.GONE + binding.appScreenshotsError.visibility = View.GONE } - app_images_container.removeAllViews() + binding.appImagesContainer.removeAllViews() images.forEach { val imageView = ImageView(this) val layoutParams = - if (it.height < it.width) { - LinearLayout.LayoutParams((imageHeight * 1.78).toInt(), imageHeight) - } else { - LinearLayout.LayoutParams(imageWidth, imageHeight) - } + if (it.height < it.width) { + LinearLayout.LayoutParams((imageHeight * 1.78).toInt(), imageHeight) + } else { + LinearLayout.LayoutParams(imageWidth, imageHeight) + } layoutParams.leftMargin = imageMargin layoutParams.rightMargin = imageMargin imageView.layoutParams = layoutParams @@ -709,15 +712,15 @@ class ApplicationActivity : val outValue = TypedValue() theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true) imageView.foreground = getDrawable(outValue.resourceId) - app_images_container.addView(imageView) + binding.appImagesContainer.addView(imageView) imageView.setOnClickListener { _ -> val intent = Intent(this, ScreenshotsActivity::class.java) intent.putExtra(APPLICATION_PACKAGE_NAME_KEY, application.packageName) intent.putExtra(SELECTED_APPLICATION_SCREENSHOT_KEY, images.indexOf(it)) startActivity(intent) } - app_images_scroll_view.visibility = View.VISIBLE - app_images_container.visibility = View.VISIBLE + binding.appImagesScrollView.visibility = View.VISIBLE + binding.appImagesContainer.visibility = View.VISIBLE } } @@ -727,8 +730,8 @@ class ApplicationActivity : if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { application.buttonClicked(this, this) } else if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED) { - Snackbar.make(container, R.string.error_storage_permission_denied, - Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.container, R.string.error_storage_permission_denied, + Snackbar.LENGTH_LONG).show() } } } @@ -748,8 +751,4 @@ class ApplicationActivity : applicationManagerServiceConnection.unbindService(this) } } - - private fun getAccentColor() { - accentColorOS = this.getColor(R.color.colorAccent); - } } diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt index 2f627601d7690ad9e34d8ccdd63e3370098b9962..1263dc315c6f29c8f4108f67a5861a59b60caa01 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt @@ -21,31 +21,32 @@ import android.os.Bundle import android.text.util.Linkify import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar import foundation.e.apps.R +import foundation.e.apps.databinding.ActivityApplicationDescriptionBinding import foundation.e.apps.utils.Constants.APPLICATION_DESCRIPTION_KEY -import kotlinx.android.synthetic.main.activity_application_description.* class ApplicationDescriptionActivity : AppCompatActivity() { + private lateinit var binding: ActivityApplicationDescriptionBinding override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityApplicationDescriptionBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_application_description) + setContentView(binding.root) - val toolbar = findViewById(R.id.toolbar) + val toolbar = binding.toolbar setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setTitle(R.string.application_description_activity_title) if (intent != null) { - app_description.text = intent.getStringExtra(APPLICATION_DESCRIPTION_KEY) - Linkify.addLinks(app_description, Linkify.ALL) + binding.appDescription.text = intent.getStringExtra(APPLICATION_DESCRIPTION_KEY) + Linkify.addLinks(binding.appDescription, Linkify.ALL) } } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { + override fun onOptionsItemSelected(item: MenuItem): Boolean { when { - item?.itemId == android.R.id.home -> { + item.itemId == android.R.id.home -> { finish() } else -> { diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt index 08e6ff44989e50ad56d37da06d707abf71deeea7..002de9c28babc1275d285d1b3ca669557c70687b 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -21,12 +21,14 @@ import android.annotation.SuppressLint import android.app.Activity import android.graphics.Bitmap import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.GradientDrawable import android.view.Gravity import android.view.View -import android.widget.Button -import android.widget.ImageView +import android.view.animation.AlphaAnimation +import android.view.animation.Animation import android.widget.RatingBar -import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar @@ -38,37 +40,36 @@ import foundation.e.apps.application.model.State import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.PwasBasicData import foundation.e.apps.application.viewmodel.ApplicationViewModel +import foundation.e.apps.databinding.ApplicationListItemBinding import foundation.e.apps.utils.Common import foundation.e.apps.utils.Common.toMiB import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error import foundation.e.apps.utils.Execute -import kotlinx.android.synthetic.main.application_list_item.view.* -import kotlinx.android.synthetic.main.install_button_layout.view.* -class ApplicationViewHolder(private val activity: Activity, private val view: View, accentColorOS: Int) : - RecyclerView.ViewHolder(view), +class ApplicationViewHolder(private val activity: Activity, binding: ApplicationListItemBinding, private val accentColorOS: Int) : + RecyclerView.ViewHolder(binding.root), ApplicationStateListener, Downloader.DownloadProgressCallback, BasicData.IconLoaderCallback, PwasBasicData.IconLoaderCallback { - private val icon: ImageView = view.app_icon - private val title: TextView = view.app_title - private val pwa_icon: TextView = view.pwa_sympol - private val author: TextView = view.app_author - private val ratingBar: RatingBar = view.app_rating_bar - private val rating: TextView = view.app_rating - private val privacyScore: TextView = view.app_privacy_score - private var installButton: Button = view.app_install + private val view = binding.root + private val icon = binding.appIcon + private val title = binding.appTitle + private val pwaSympol = binding.pwaSympol + private val author = binding.appAuthor + private val ratingBar = binding.appRatingBar + private val rating = binding.appRating + private val privacyScore = binding.appPrivacyScore + private var installButton = binding.simpleInstallButtonLayout.appInstall private var application: Application? = null private val applicationViewModel = ApplicationViewModel() private var downloader: Downloader? = null - var accentColorOS = accentColorOS; init { - pwa_icon.visibility = View.GONE + pwaSympol.visibility = View.GONE view.setOnClickListener { if (application != null) { if (application!!.packageName != Constants.MICROG_PACKAGE) @@ -76,11 +77,6 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi } } - - installButton.setTextColor(Color.parseColor("#ffffff")) - if (0 != this.accentColorOS) { - installButton.setBackgroundColor(this.accentColorOS) - } installButton.setOnClickListener { if (application?.fullData != null && application!!.fullData!!.getLastVersion() == null) { @@ -100,7 +96,7 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi fun createApplicationView(app: Application) { - pwa_icon.visibility = View.GONE + pwaSympol.visibility = View.GONE this.application = app if (app.basicData != null) { @@ -111,7 +107,11 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi application!!.addListener(this) title.text = application!!.basicData!!.name author.text = application!!.basicData!!.author + + val drawable = ratingBar.progressDrawable + drawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) ratingBar.rating = application!!.basicData!!.ratings.rating!! + if (application!!.basicData!!.ratings.rating != -1f) { rating.text = application!!.basicData!!.ratings.rating.toString() } else { @@ -129,11 +129,26 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi application!!.addListener(this) if (application!!.searchAppsBasicData != null) { if (application!!.searchAppsBasicData!!.is_pwa) { - pwa_icon.visibility = View.VISIBLE + pwaSympol.visibility = View.VISIBLE } application!!.SearchAppsloadIcon(this) title.text = application!!.searchAppsBasicData!!.name author.text = application!!.searchAppsBasicData!!.author + + val drawable = ratingBar.progressDrawable + drawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) + ratingBar.rating = application!!.searchAppsBasicData!!.ratings.rating!! + + if (application!!.searchAppsBasicData!!.ratings.rating != -1f) { + rating.text = application!!.searchAppsBasicData!!.ratings.rating.toString() + } else { + rating.text = activity.getString(R.string.not_available) + } + if (application!!.searchAppsBasicData!!.ratings.privacyRating != null && application!!.searchAppsBasicData!!.ratings.privacyRating != -1f) { + privacyScore.text = application!!.searchAppsBasicData!!.ratings.privacyRating.toString() + } else { + privacyScore.text = activity.getString(R.string.not_available) + } } else { application!!.PwaloadIcon(this) title.text = application!!.pwabasicdata!!.name @@ -151,50 +166,37 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi override fun stateChanged(state: State) { Execute({}, { + installButton.setTextColor(accentColorOS) - installButton.text = activity.getString(state.installButtonTextId) + installButton.setBackgroundResource(R.drawable.app_installing_border_simple) + val drawable = installButton.background as GradientDrawable + drawable.setStroke(2, accentColorOS) + installButton.text = activity.getString(state.installButtonTextId) + installButton.clearAnimation() + installButton.clearFocus() when (state) { - State.NOT_DOWNLOADED -> { - if (0 != this.accentColorOS) { - installButton.setTextColor(this.accentColorOS) - } else { - - installButton.setTextColor(Color.parseColor("#0088ED")) - } - installButton.setBackgroundResource(R.drawable.app_install_border_simple) installButton.isEnabled = true } - + State.DOWNLOADING ->{ + installButton.isEnabled = true + installButton.background.clearColorFilter() + } State.INSTALLED -> { - installButton.isEnabled = Common.appHasLaunchActivity(activity, application!!.packageName) - if (0 != this.accentColorOS) { - installButton.setBackgroundColor(this.accentColorOS) - } else { - installButton.setBackgroundResource(R.drawable.app_install_border) - } installButton.setTextColor(Color.parseColor("#FAFAFA")) - + installButton.background.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) } State.INSTALLING -> { installButton.isEnabled = false + installingAnimation() } State.NOT_UPDATED -> { - installButton.setTextColor(Color.parseColor("#FAFAFA")) - if (0 != this.accentColorOS) { - installButton.setBackgroundColor(this.accentColorOS) - } else { - installButton.setBackgroundResource(R.drawable.app_install_border) - } - - installButton.isEnabled = true - } - else -> { - installButton.setTextColor(Color.parseColor("#0088ED")) installButton.isEnabled = true + installButton.setTextColor(Color.parseColor("#FAFAFA")) + installButton.background.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) } } @@ -208,12 +210,17 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi @SuppressLint("SetTextI18n") override fun notifyDownloadProgress(count: Int, total: Int) { - installButton.setGravity(Gravity.CENTER) installButton.text = ((toMiB(count) / toMiB(total)) * 100).toInt().toString() + "%" - installButton.setTextColor(Color.parseColor("#0088ED")) - installButton.setBackgroundResource(R.drawable.app_installing_border_simple) } + private fun installingAnimation() { + val anim = AlphaAnimation(0.0f, 1.0f) + anim.duration = 200 //You can manage the blinking time with this parameter + anim.startOffset = 20 + anim.repeatMode = Animation.REVERSE + anim.repeatCount = Animation.INFINITE + installButton.startAnimation(anim) + } override fun anErrorHasOccurred(error: Error) { Snackbar.make(activity.findViewById(R.id.container), activity.getString(error.description), diff --git a/app/src/main/java/foundation/e/apps/application/ScreenshotsActivity.kt b/app/src/main/java/foundation/e/apps/application/ScreenshotsActivity.kt index 8dc9714be228cb8e7f2c7f91990c2238385422db..8929506647dabf866c49cb1471059ead7d7fca4e 100644 --- a/app/src/main/java/foundation/e/apps/application/ScreenshotsActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ScreenshotsActivity.kt @@ -21,16 +21,17 @@ import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.viewpager.widget.ViewPager -import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback +import foundation.e.apps.databinding.ActivityScreenshotsBinding import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Constants.SELECTED_APPLICATION_SCREENSHOT_KEY -import kotlinx.android.synthetic.main.activity_screenshots.* class ScreenshotsActivity : AppCompatActivity(), ApplicationManagerServiceConnectionCallback { + private lateinit var binding: ActivityScreenshotsBinding + private val applicationManagerServiceConnection = ApplicationManagerServiceConnection(this) private lateinit var applicationPackageName: String @@ -40,8 +41,9 @@ class ScreenshotsActivity : AppCompatActivity(), ApplicationManagerServiceConnec private val last_selected_screenshot_key = "last_selected_screenshot" override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityScreenshotsBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_screenshots) + setContentView(binding.root) if (savedInstanceState != null && savedInstanceState.containsKey(last_selected_screenshot_key)) { @@ -72,7 +74,7 @@ class ScreenshotsActivity : AppCompatActivity(), ApplicationManagerServiceConnec val pwasBasicData =application.pwabasicdata if(pwasBasicData!=null) { - screenshotsCarousel = screenshots_carousel + screenshotsCarousel = binding.screenshotsCarousel screenshotsCarousel.visibility = View.GONE pwasBasicData.loadImagesAsyncly { @@ -84,7 +86,7 @@ class ScreenshotsActivity : AppCompatActivity(), ApplicationManagerServiceConnec } } else { - screenshotsCarousel = screenshots_carousel + screenshotsCarousel = binding.screenshotsCarousel screenshotsCarousel.visibility = View.GONE basicData!!.loadImagesAsyncly { diff --git a/app/src/main/java/foundation/e/apps/application/ScreenshotsCarouselAdapter.kt b/app/src/main/java/foundation/e/apps/application/ScreenshotsCarouselAdapter.kt index 522f9a2c50e2fa4efcd1513a837f900469da9682..88e6f02efc3b870f480a5c1b013965274d033de1 100644 --- a/app/src/main/java/foundation/e/apps/application/ScreenshotsCarouselAdapter.kt +++ b/app/src/main/java/foundation/e/apps/application/ScreenshotsCarouselAdapter.kt @@ -24,12 +24,9 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.viewpager.widget.PagerAdapter -import foundation.e.apps.R -import kotlinx.android.synthetic.main.screenshots_carousel_item.view.* +import foundation.e.apps.databinding.ScreenshotsCarouselItemBinding -class ScreenshotsCarouselAdapter(context: Context, private val screenshots: List) : PagerAdapter() { - - private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater +class ScreenshotsCarouselAdapter(private val context: Context, private val screenshots: List) : PagerAdapter() { override fun isViewFromObject(view: View, obj: Any): Boolean { return view == obj as LinearLayout @@ -40,10 +37,10 @@ class ScreenshotsCarouselAdapter(context: Context, private val screenshots: List } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val view = layoutInflater.inflate(R.layout.screenshots_carousel_item, container, false) - - view.photo_view.setImageBitmap(screenshots[position]) + val binding = ScreenshotsCarouselItemBinding.inflate(LayoutInflater.from(context), container, false) + val view = binding.root + binding.photoView.setImageBitmap(screenshots[position]) container.addView(view) return view } diff --git a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt index 7292b819dafd5a9cbde48dbefe9d269605aaeeb6..34f67517a823b1a93a87cc5167e804db78ed4b6a 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -21,13 +21,12 @@ import android.annotation.SuppressLint import android.app.Activity import android.graphics.Bitmap import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.GradientDrawable import android.view.Gravity -import android.view.View import android.view.animation.AlphaAnimation import android.view.animation.Animation -import android.widget.Button -import android.widget.ImageView -import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar @@ -39,29 +38,29 @@ import foundation.e.apps.application.model.State import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.PwasBasicData import foundation.e.apps.application.viewmodel.ApplicationViewModel +import foundation.e.apps.databinding.SmallApplicationListItemBinding import foundation.e.apps.utils.Common import foundation.e.apps.utils.Common.toMiB import foundation.e.apps.utils.Error import foundation.e.apps.utils.Execute -import kotlinx.android.synthetic.main.application_list_item.view.* -import kotlinx.android.synthetic.main.simple_install_button_layout.view.* -class SmallApplicationViewHolder(private val activity: Activity, private val view: View) : - RecyclerView.ViewHolder(view), +class SmallApplicationViewHolder(private val activity: Activity, binding: SmallApplicationListItemBinding) : + RecyclerView.ViewHolder(binding.root), ApplicationStateListener, Downloader.DownloadProgressCallback, BasicData.IconLoaderCallback, PwasBasicData.IconLoaderCallback{ - - private val icon: ImageView = view.app_icon - private val title: TextView = view.app_title - private val installButton: Button = view.app_install + private val view = binding.root + private val icon = binding.appIcon + private val title = binding.appTitle + private val installButton = binding.simpleInstallButtonLayout.appInstall private var application: Application? = null private val applicationViewModel = ApplicationViewModel() private var downloader: Downloader? = null + private val accentColorOS = Common.getAccentColor(activity) init { view.setOnClickListener { @@ -113,47 +112,37 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie override fun stateChanged(state: State) { Execute({}, { - installButton.setTextColor(Color.parseColor("#0088ED")) - installButton.setBackgroundResource(R.drawable.app_install_border_simple) + installButton.setTextColor(accentColorOS) + + installButton.setBackgroundResource(R.drawable.app_installing_border_simple) + val drawable = installButton.background as GradientDrawable + drawable.setStroke(2, accentColorOS) + installButton.text = activity.getString(state.installButtonTextId) installButton.clearAnimation() - installButton.clearFocus(); - var color = application?.getAccentColor(activity); + installButton.clearFocus() when (state) { State.NOT_DOWNLOADED ->{ - installButton.setBackgroundResource(R.drawable.app_install_border_simple) - if (color != null) { - - installButton.setTextColor(color) - }; installButton.isEnabled = true } - + State.DOWNLOADING ->{ + installButton.isEnabled = true + installButton.background.clearColorFilter() + } State.INSTALLED -> { installButton.isEnabled = Common.appHasLaunchActivity(activity, application!!.packageName) installButton.setTextColor(Color.parseColor("#FAFAFA")) - if (color != null) { - //installButton!!.setBackgroundResource(R.drawable.app_install_border) - installButton.setBackgroundColor(color) - }; + installButton.background.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) } State.INSTALLING -> { installButton.isEnabled = false - installButton.setBackgroundResource(R.drawable.app_install_border_simple) installingAnimation() } State.NOT_UPDATED -> { - installButton.setTextColor(Color.parseColor("#FAFAFA")) - // installButton!!.setBackgroundResource(R.drawable.app_install_border) - if (color != null) { - //installButton!!.setBackgroundResource(R.drawable.app_install_border) - installButton.setBackgroundColor(color) - }; - installButton.isEnabled = true - } - else -> { installButton.isEnabled = true + installButton.setTextColor(Color.parseColor("#FAFAFA")) + installButton.background.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) } } }) @@ -166,9 +155,6 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie @SuppressLint("SetTextI18n") override fun notifyDownloadProgress(count: Int, total: Int) { - installButton.setTextColor(Color.parseColor("#0088ED")) - installButton.setGravity(Gravity.CENTER) - installButton.setBackgroundResource(R.drawable.app_installing_border_simple) installButton.text = ((toMiB(count) / toMiB(total)) * 100).toInt().toString() + "%" } diff --git a/app/src/main/java/foundation/e/apps/application/model/Application.kt b/app/src/main/java/foundation/e/apps/application/model/Application.kt index beb5706bc730344d3e06a3e25171dc2f44f3a849..c01fa764d97746584230622908edb677e48b0d83 100644 --- a/app/src/main/java/foundation/e/apps/application/model/Application.kt +++ b/app/src/main/java/foundation/e/apps/application/model/Application.kt @@ -461,15 +461,4 @@ class Application(val packageName: String, private val applicationManager: Appli Pwaupdate(pwaFullData.pwabasicdata, context) pwaFullData.pwabasicdata = pwabasicdata!! } - - /* - * get Accent color from OS - * - */ - fun getAccentColor(context: Context): Int { - - val color = context.getColor(foundation.e.apps.R.color.colorAccent); - return color; - - } } diff --git a/app/src/main/java/foundation/e/apps/application/model/Installer.kt b/app/src/main/java/foundation/e/apps/application/model/Installer.kt index 6ce65b5e879ba0543e147e4a55de8096ef978a99..432c0923f041aa80434f97bccca73963cf9ca77f 100644 --- a/app/src/main/java/foundation/e/apps/application/model/Installer.kt +++ b/app/src/main/java/foundation/e/apps/application/model/Installer.kt @@ -27,7 +27,6 @@ import android.net.Uri import android.util.Log import androidx.core.content.ContextCompat import androidx.core.content.FileProvider -import foundation.e.apps.R import foundation.e.apps.XAPK.FsUtils.deleteFileOrDir import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Constants.MICROG_SHARED_PREF diff --git a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt index b1d16b7009caa441deb69e99098c03c4460e4603..678ade0527d2bb8896a52255963878e595a6af52 100644 --- a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt +++ b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt @@ -18,8 +18,6 @@ package foundation.e.apps.application.model import android.content.Context -import android.util.Log -import foundation.e.apps.R import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.SearchAppsBasicData import foundation.e.apps.applicationmanager.ApplicationManager @@ -30,7 +28,6 @@ import foundation.e.apps.utils.Error import foundation.e.apps.utils.PreferenceStorage import java.util.* - class StateManager(private val info: ApplicationInfo, private val app: Application, private val appManager: ApplicationManager) { private var listeners = Collections.synchronizedList(ArrayList()) @@ -40,7 +37,6 @@ class StateManager(private val info: ApplicationInfo, private val app: Applicati fun find(context: Context, basicData: BasicData) { if (basicData.name == Constants.MICROG) { Common.updateMicroGStatus(context) - Log.e("MicroGStatus", PreferenceStorage(context).getBoolean(MICROG_SHARED_PREF, false).toString()) val state = if (appManager.isInstalling(app) && !app.isInstalling) { State.DOWNLOADING } else if (appManager.isInstalling(app) && app.isInstalling) { diff --git a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt index eb352f707f2cd71c19f21ee0f307a0ad40c40050..2affc3fcfc37f5444c1f6b66392773d94e7b2657 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt @@ -90,7 +90,7 @@ constructor( this.category = Category(categoryId, "") } - @Suppress("unused") + @Suppress("unused", "UNCHECKED_CAST") @JsonAnySetter fun jsonCreator(name: String, value: Any) { if (name == basicData.latestDownloadableUpdate) { diff --git a/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt b/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt index 42b234ac530d81bbdc0d380e4cb8d2d4ad987251..2786f4e342efa98a8229d976ec55354da0785c2a 100644 --- a/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt +++ b/app/src/main/java/foundation/e/apps/application/model/data/SearchAppsBasicData.kt @@ -54,6 +54,7 @@ constructor(@param:JsonProperty("_id") val id: String, @param:JsonProperty("is_pwa") val is_pwa: Boolean, @param:JsonProperty("author") val author: String, @param:JsonProperty("is_web_app") val is_web_app: Boolean, + @param:JsonProperty("ratings") val ratings: BasicData.Ratings, @param:JsonProperty("category") val category: String, @param:JsonProperty("icon_image_path") val icon_uri: String, @param:JsonProperty("other_images_path") val imagesUri: Array){ diff --git a/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt index c73e0ba3b2cbf05bb9c378f6d50574d1aff879f4..b988fbc8b8dfddcd3aba2facf46de1b1b1d947bd 100644 --- a/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt +++ b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt @@ -17,7 +17,6 @@ package foundation.e.apps.categories -import android.content.Context import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater @@ -25,8 +24,8 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.google.android.material.tabs.TabLayout -import foundation.e.apps.R import foundation.e.apps.databinding.FragmentCategoriesBinding +import foundation.e.apps.utils.Common class CategoriesFragment : Fragment() { private var _binding: FragmentCategoriesBinding? = null @@ -39,7 +38,7 @@ class CategoriesFragment : Fragment() { val tabLayout = binding.tabLayout val viewPager = binding.viewPager - var color = getAccentColor(requireActivity()); + val color = Common.getAccentColor(requireContext()) viewPager.adapter = CategoriesViewPagerAdapter(requireActivity().supportFragmentManager, tabLayout.tabCount, color) viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout)) @@ -67,17 +66,4 @@ class CategoriesFragment : Fragment() { super.onDestroyView() _binding = null } - - /* - * get Accent color from OS - * - */ - fun getAccentColor(context: Context): Int { - - val color = context.getColor(R.color.colorAccent); - - - return color; - - } } diff --git a/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt b/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt index 085b0907ac93aca6bc7da9be14af67df86d3ad4b..e1f0d545bf8b7a888afb89842e5cbb5d4aa76ec5 100644 --- a/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt +++ b/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt @@ -22,12 +22,8 @@ import android.graphics.Color import android.os.Bundle import android.view.MenuItem import android.view.View -import android.widget.LinearLayout import android.widget.ProgressBar -import android.widget.RelativeLayout -import android.widget.TextView import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -41,13 +37,15 @@ import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionC import foundation.e.apps.categories.category.viewmodel.CategoryViewModel import foundation.e.apps.categories.model.Category import foundation.e.apps.common.ApplicationListAdapter +import foundation.e.apps.databinding.ActivityCategoryBinding +import foundation.e.apps.utils.Common import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Constants.CATEGORY_KEY -import kotlinx.android.synthetic.main.activity_category.* -import kotlinx.android.synthetic.main.error_layout.* class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectionCallback { + private lateinit var binding: ActivityCategoryBinding + private lateinit var category: Category private lateinit var categoryViewModel: CategoryViewModel private lateinit var recyclerView: RecyclerView @@ -56,30 +54,34 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio ApplicationManagerServiceConnection(this) private var applicationList = ArrayList() private var isLoadingMoreApplications = false - var accentColorOS=0; override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityCategoryBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_category) - getAccentColor() + setContentView(binding.root) + + val accentColorOS = Common.getAccentColor(this) - val toolbar = findViewById(R.id.toolbar) + val toolbar = binding.toolbar setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) category = intent.getSerializableExtra(CATEGORY_KEY) as Category supportActionBar?.title = category.getTitle() categoryViewModel = ViewModelProvider(this).get(CategoryViewModel::class.java) - recyclerView = findViewById(R.id.app_list) - val loadMoreContainer = findViewById(R.id.load_more_container) - progressBar = findViewById(R.id.progress_bar) - val errorContainer = findViewById(R.id.error_container) - val errorDescription = findViewById(R.id.error_description) + + // Activity variables + recyclerView = binding.appList + progressBar = binding.progressBar + val loadMoreContainer = binding.loadMoreContainer + val errorContainer = binding.errorLayout.errorContainer + val errorDescription = binding.errorLayout.errorDescription + val errorResolve = binding.errorLayout.errorResolve //set accent color to Error button (Retry ) - findViewById(R.id.error_resolve).setTextColor(Color.parseColor("#ffffff")) - findViewById(R.id.error_resolve).setBackgroundColor(accentColorOS) + errorResolve.setTextColor(Color.parseColor("#ffffff")) + errorResolve.setBackgroundColor(accentColorOS) // Initialise UI elements @@ -102,7 +104,7 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio }) progressBar.visibility = View.VISIBLE errorContainer.visibility = View.GONE - findViewById(R.id.error_resolve).setOnClickListener { + errorResolve.setOnClickListener { loadMoreContainer.visibility = View.GONE progressBar.visibility = View.VISIBLE categoryViewModel.loadApplications(this) @@ -153,8 +155,8 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio } } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when (item?.itemId) { + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { android.R.id.home -> finish() } @@ -166,7 +168,7 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == Constants.STORAGE_PERMISSION_REQUEST_CODE && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED) { - Snackbar.make(container, R.string.error_storage_permission_denied, + Snackbar.make(binding.container, R.string.error_storage_permission_denied, Snackbar.LENGTH_LONG).show() } } @@ -191,13 +193,4 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio } applicationManagerServiceConnection.unbindService(this) } - - /* - * get Accent color from OS - * - * */ - private fun getAccentColor() { - - accentColorOS = this.getColor(R.color.colorAccent); - } } diff --git a/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt b/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt index 02892bfa6a97e18e5de9b853546d4d72133327e5..40b13d1cbb1fcb58b58b5b997280a7e21d4e8bc7 100644 --- a/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt +++ b/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt @@ -21,16 +21,16 @@ import android.app.Activity import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import foundation.e.apps.R import foundation.e.apps.application.ApplicationViewHolder import foundation.e.apps.application.model.Application +import foundation.e.apps.databinding.ApplicationListItemBinding class ApplicationListAdapter(private val activity: Activity, private val applicationList: List, accentColorOS: Int) : RecyclerView.Adapter() { var accentColorOS=accentColorOS; override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApplicationViewHolder { - val listItemContainer = LayoutInflater.from(parent.context).inflate(R.layout.application_list_item, parent, false) + val listItemContainer = ApplicationListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) return ApplicationViewHolder(activity, listItemContainer, accentColorOS) } diff --git a/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt b/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt index fcf47b779b9709dfb283fa2eed801759e3289210..f65aa46de048b9b1538d0bd0f30519778f815eff 100644 --- a/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt +++ b/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt @@ -21,14 +21,14 @@ import android.app.Activity import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import foundation.e.apps.R import foundation.e.apps.application.SmallApplicationViewHolder import foundation.e.apps.application.model.Application +import foundation.e.apps.databinding.SmallApplicationListItemBinding class SmallApplicationListAdapter(private val activity: Activity, private val applicationList: List) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SmallApplicationViewHolder { - val listItemContainer = LayoutInflater.from(parent.context).inflate(R.layout.small_application_list_item, parent, false) + val listItemContainer = SmallApplicationListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) return SmallApplicationViewHolder(activity, listItemContainer) } diff --git a/app/src/main/java/foundation/e/apps/home/HomeCategory.kt b/app/src/main/java/foundation/e/apps/home/HomeCategory.kt index 0552454fd73098e0d49d11ca4b2e5a8363272078..68ab3e6eadce496a9bdfa5d7bdfdbcfcb38e01d2 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeCategory.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeCategory.kt @@ -18,16 +18,15 @@ package foundation.e.apps.home import android.content.Context -import android.view.View +import android.view.LayoutInflater import android.widget.LinearLayout -import foundation.e.apps.R import foundation.e.apps.categories.model.Category -import kotlinx.android.synthetic.main.home_category_list_item.view.* +import foundation.e.apps.databinding.HomeCategoryListItemBinding class HomeCategory(context: Context, category: Category) : LinearLayout(context) { + var binding = HomeCategoryListItemBinding.inflate(LayoutInflater.from(context), this, true) init { - View.inflate(context, R.layout.home_category_list_item, this) - category_title.text = category.getTitle() + binding.categoryTitle.text = category.getTitle() } } diff --git a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt index 841d379b51cca13cc648664d5ab0fa9e6ed81b80..92ff7939477ac4efd21b70550b9874b909bca20c 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt @@ -18,6 +18,8 @@ package foundation.e.apps.home import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -28,9 +30,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager -import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.categories.model.Category @@ -38,7 +38,6 @@ import foundation.e.apps.common.SmallApplicationListAdapter import foundation.e.apps.databinding.FragmentHomeBinding import foundation.e.apps.home.viewmodel.HomeViewModel - class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! @@ -75,7 +74,8 @@ class HomeFragment : Fragment() { val errorDescription = binding.errorLayout.errorDescription val errorResolve = binding.errorLayout.errorResolve - //set accent color to Error button (Retry ) + // Set accent color + progressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) errorResolve.setTextColor(Color.parseColor("#ffffff")) errorResolve.setBackgroundColor(accentColorOS) @@ -144,7 +144,7 @@ class HomeFragment : Fragment() { categoryList.removeAllViews() categories.forEach { val homeCategory = HomeCategory(requireContext(), it.key) - val applicationList = homeCategory.findViewById(R.id.application_list) + val applicationList = homeCategory.binding.applicationList applicationList.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) applicationList.adapter = SmallApplicationListAdapter(requireActivity(), it.value) categoryList.addView(homeCategory) diff --git a/app/src/main/java/foundation/e/apps/home/ImageCarouselAdapter.kt b/app/src/main/java/foundation/e/apps/home/ImageCarouselAdapter.kt index ac5ebf7bb4926ae2ebb51344be8b54f499c37272..dc84b854f4b98b070e35c785f573070b012ce024 100644 --- a/app/src/main/java/foundation/e/apps/home/ImageCarouselAdapter.kt +++ b/app/src/main/java/foundation/e/apps/home/ImageCarouselAdapter.kt @@ -29,13 +29,12 @@ import androidx.viewpager.widget.PagerAdapter import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.R import foundation.e.apps.application.viewmodel.ApplicationViewModel +import foundation.e.apps.databinding.ImageCarouselItemBinding import foundation.e.apps.home.model.BannerApplication -import kotlinx.android.synthetic.main.image_carousel_item.view.* -class ImageCarouselAdapter(context: Context, private val bannerApplications: ArrayList) : PagerAdapter() { +class ImageCarouselAdapter(private val context: Context, private val bannerApplications: ArrayList) : PagerAdapter() { - private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater private val applicationViewModel = ApplicationViewModel() override fun isViewFromObject(view: View, obj: Any): Boolean { @@ -47,8 +46,9 @@ class ImageCarouselAdapter(context: Context, private val bannerApplications: Arr } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val view = layoutInflater.inflate(R.layout.image_carousel_item, container, false) - val wideImage = view.image + val binding = ImageCarouselItemBinding.inflate(LayoutInflater.from(context), container, false) + val view = binding.root + val wideImage = binding.image val image = getRoundedCornerBitmap(bannerApplications[position].image,mActivity) wideImage.setImageBitmap(image) wideImage.setOnClickListener { diff --git a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt index d350247830fb57a066222d94a9d0d5de67edf59f..3c2d0f137f5c1e0990aa604be330685aef7387a1 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -20,13 +20,17 @@ package foundation.e.apps.search import android.app.Activity import android.database.MatrixCursor import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.os.Bundle import android.provider.BaseColumns import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager -import android.widget.* +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.ProgressBar import androidx.appcompat.widget.SearchView import androidx.cursoradapter.widget.CursorAdapter import androidx.cursoradapter.widget.SimpleCursorAdapter @@ -44,7 +48,6 @@ import foundation.e.apps.search.viewmodel.SearchViewModel import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Constants.SUGGESTION_KEY - class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.OnSuggestionListener { private var _binding: FragmentSearchBinding? = null private val binding get() = _binding!! @@ -87,7 +90,8 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On val errorDescription = binding.errorLayout.errorDescription val loadMoreContainer = binding.loadMoreContainer - //set accent color to Error button (Retry ) + // Set accent color + progressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) errorResolve.setTextColor(Color.parseColor("#ffffff")) errorResolve.setBackgroundColor(accentColorOS) @@ -119,7 +123,7 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On // Initialise recycler view recyclerView.setHasFixedSize(true) recyclerView.layoutManager = LinearLayoutManager(context) - recyclerView.adapter = ApplicationListAdapter(requireActivity(), applicationList, 0) + recyclerView.adapter = ApplicationListAdapter(requireActivity(), applicationList, accentColorOS) loadMoreContainer.visibility = View.GONE recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { diff --git a/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt b/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt index 3dfdbfe5765c0c17a5e6a3e6f15290f08ac78488..3968e44b10318f9cc1da0929ad84410ebefd6938 100644 --- a/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt +++ b/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt @@ -94,8 +94,8 @@ class AppRequestActivity : AppCompatActivity(), TextWatcher { }) } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when (item?.itemId) { + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { android.R.id.home -> finish() } diff --git a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt index e246d47426984350223ae4f54d355f44b62d1bd9..55914e76ae0429959d607bbd86989af5ba1415dd 100644 --- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt @@ -18,19 +18,16 @@ package foundation.e.apps.settings import android.annotation.SuppressLint -import android.app.ProgressDialog import android.content.Intent import android.os.Bundle import androidx.preference.CheckBoxPreference import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.work.ExistingPeriodicWorkPolicy import foundation.e.apps.MainActivity import foundation.e.apps.R import foundation.e.apps.updates.UpdatesManager -import foundation.e.apps.utils.PreferenceStorage -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit class SettingsFragment : PreferenceFragmentCompat() { @@ -46,7 +43,7 @@ class SettingsFragment : PreferenceFragmentCompat() { val updateCheckInterval = preferenceManager.findPreference(getString(R.string.pref_update_interval_key)) as ListPreference updateCheckInterval.setOnPreferenceChangeListener { _, newValue -> - UpdatesManager(requireActivity().applicationContext).replaceWorker(newValue.toString().toInt()) + context?.let { UpdatesManager().enqueueWork(it, newValue.toString().toLong(), ExistingPeriodicWorkPolicy.REPLACE) } true } @@ -70,11 +67,11 @@ class SettingsFragment : PreferenceFragmentCompat() { } //Show all apps when checked - var x = preferenceManager.findPreference(getString(R.string.Show_all_apps)) as RadioButtonPreference + val x = preferenceManager.findPreference(getString(R.string.Show_all_apps)) as RadioButtonPreference //Show only open-source apps when checked - var y = preferenceManager.findPreference(getString(R.string.show_only_open_source_apps_key)) as RadioButtonPreference + val y = preferenceManager.findPreference(getString(R.string.show_only_open_source_apps_key)) as RadioButtonPreference //Show only pwas when checked - var z = preferenceManager.findPreference(getString(R.string.show_only_pwa_apps_key)) as RadioButtonPreference + val z = preferenceManager.findPreference(getString(R.string.show_only_pwa_apps_key)) as RadioButtonPreference x.setOnPreferenceChangeListener { _, _ -> y.isChecked = false @@ -98,33 +95,12 @@ class SettingsFragment : PreferenceFragmentCompat() { } } - - private var working_dialog: ProgressDialog? = null - - fun backToMainActivity() { - showWorkingDialog() - val worker = Executors.newSingleThreadScheduledExecutor() - val task = Runnable { - run { - removeWorkingDialog() - val intent = Intent(activity, MainActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK - Intent.FLAG_ACTIVITY_NEW_TASK - startActivity(intent) - requireActivity().finish() - } - } - worker.schedule(task, 1, TimeUnit.SECONDS) - } - - private fun showWorkingDialog() { - working_dialog = ProgressDialog.show(context, "", "Applying Settings...", true) - } - - private fun removeWorkingDialog() { - if (working_dialog != null) { - working_dialog!!.dismiss() - working_dialog = null + private fun backToMainActivity() { + Intent(context, MainActivity::class.java).also { + activity?.finish() + activity?.overridePendingTransition(0, 0); + startActivity(it) + activity?.overridePendingTransition(0, 0); } } } diff --git a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt index b57fc9f1b92dc4709b8f908317f781cd3baf5502..2704053a885078b7dce624254fa84d737305b202 100644 --- a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt @@ -75,8 +75,8 @@ class UpdatesFragment() : Fragment() { val errorResolve = binding.errorLayout.errorResolve updateAll.setTextColor(accentColorOS) - progressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.MULTIPLY) - reloadProgressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.MULTIPLY) + progressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) + reloadProgressBar.indeterminateDrawable.colorFilter = PorterDuffColorFilter(accentColorOS, PorterDuff.Mode.SRC_IN) //set accent color to Error button (Retry ) errorResolve.setTextColor(Color.parseColor("#ffffff")) diff --git a/app/src/main/java/foundation/e/apps/updates/UpdatesManager.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesManager.kt index 058bec255af2e0e9e408fb180397acccead9d7d0..d27bedb1c992103ccdcd436f864465d144898a1c 100644 --- a/app/src/main/java/foundation/e/apps/updates/UpdatesManager.kt +++ b/app/src/main/java/foundation/e/apps/updates/UpdatesManager.kt @@ -17,7 +17,9 @@ package foundation.e.apps.updates +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent import android.util.Log import androidx.preference.PreferenceManager import androidx.work.* @@ -26,17 +28,19 @@ import foundation.e.apps.updates.model.UpdatesWorker import foundation.e.apps.utils.Constants import java.util.concurrent.TimeUnit -class UpdatesManager(private val applicationContext: Context) { +class UpdatesManager: BroadcastReceiver() { private val TAG = "UpdatesManager" - private var automaticUpdateInterval: Int - init { - val preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext) - automaticUpdateInterval = + override fun onReceive(context: Context?, intent: Intent?) { + if (context != null && intent?.action == Intent.ACTION_BOOT_COMPLETED) { + val preferences = PreferenceManager.getDefaultSharedPreferences(context) + val interval = preferences.getString( - applicationContext.getString(R.string.pref_update_interval_key), - applicationContext.getString(R.string.preference_update_interval_default))!! - .toInt() + context.getString(R.string.pref_update_interval_key), + context.getString(R.string.preference_update_interval_default))!! + .toLong() + enqueueWork(context, interval, ExistingPeriodicWorkPolicy.KEEP) + } } private fun getWorkerConstraints() = Constraints.Builder().apply { @@ -44,25 +48,19 @@ class UpdatesManager(private val applicationContext: Context) { setRequiredNetworkType(NetworkType.CONNECTED) }.build() - private fun getPeriodicWorkRequest() = PeriodicWorkRequest.Builder( + private fun getPeriodicWorkRequest(interval: Long): PeriodicWorkRequest { + return PeriodicWorkRequest.Builder( UpdatesWorker::class.java, - automaticUpdateInterval.toLong(), + interval, TimeUnit.HOURS).apply { - setConstraints(getWorkerConstraints()) - }.build() - - fun startWorker() { - Log.i(TAG, "UpdatesWorker interval: ${automaticUpdateInterval.toLong()} hours") - WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(Constants.UPDATES_WORK_NAME, - ExistingPeriodicWorkPolicy.KEEP, getPeriodicWorkRequest()) - Log.i(TAG, "UpdatesWorker started") + setConstraints(getWorkerConstraints()) + }.build() } - fun replaceWorker(automaticUpdateInterval: Int) { - this.automaticUpdateInterval = automaticUpdateInterval - Log.i(TAG, "UpdatesWorker interval: ${automaticUpdateInterval.toLong()} hours") - WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(Constants.UPDATES_WORK_NAME, - ExistingPeriodicWorkPolicy.REPLACE, getPeriodicWorkRequest()) + fun enqueueWork(context: Context, interval: Long, existingPeriodicWorkPolicy: ExistingPeriodicWorkPolicy) { + Log.i(TAG, "UpdatesWorker interval: $interval hours") + WorkManager.getInstance(context).enqueueUniquePeriodicWork(Constants.UPDATES_WORK_NAME, + existingPeriodicWorkPolicy, getPeriodicWorkRequest(interval)) Log.i(TAG, "UpdatesWorker started") } } diff --git a/app/src/main/java/foundation/e/apps/updates/model/OutdatedApplicationsFileReader.kt b/app/src/main/java/foundation/e/apps/updates/model/OutdatedApplicationsFileReader.kt index 93c75430b7e57279e59546454017b37af64e8ce9..f137e346063bd7a37461e51836caa648136670d5 100644 --- a/app/src/main/java/foundation/e/apps/updates/model/OutdatedApplicationsFileReader.kt +++ b/app/src/main/java/foundation/e/apps/updates/model/OutdatedApplicationsFileReader.kt @@ -20,7 +20,6 @@ package foundation.e.apps.updates.model import android.content.Context import android.content.pm.PackageManager import android.os.AsyncTask -import foundation.e.apps.R import foundation.e.apps.api.GitlabDataRequest import foundation.e.apps.application.model.Application import foundation.e.apps.application.model.State @@ -35,8 +34,7 @@ class OutdatedApplicationsFileReader(private val packageManager: PackageManager, AsyncTask>() { override fun doInBackground(vararg context: Context): ArrayList { val applications = ArrayList() - val application: Application? = loadMicroGVersion(context[0])[0] - println("versionname::-"+ application?.basicData!!.lastVersionNumber) + val application: Application = loadMicroGVersion(context[0])[0] if (PreferenceStorage(context[0]) .getBoolean(MICROG_SHARED_PREF, false) && application.state == State.NOT_UPDATED) { @@ -45,8 +43,8 @@ class OutdatedApplicationsFileReader(private val packageManager: PackageManager, try { val installedApplications = getInstalledApplications() installedApplications.forEach { packageName -> - val application = applicationManager.findOrCreateApp(packageName) - verifyApplication(application, applications, context) + val app = applicationManager.findOrCreateApp(packageName) + verifyApplication(app, applications, context) } } catch (exception: Exception) { exception.printStackTrace() diff --git a/app/src/main/java/foundation/e/apps/updates/model/UpdatesWorker.kt b/app/src/main/java/foundation/e/apps/updates/model/UpdatesWorker.kt index c9d40e091b3e487264b9d4aaf5ba02b3e9b71959..10073b412d17167eba32267bdcd2d17ba14459b6 100644 --- a/app/src/main/java/foundation/e/apps/updates/model/UpdatesWorker.kt +++ b/app/src/main/java/foundation/e/apps/updates/model/UpdatesWorker.kt @@ -25,7 +25,7 @@ import android.net.NetworkCapabilities import android.os.AsyncTask import android.util.Log import androidx.preference.PreferenceManager -import androidx.work.Worker +import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import foundation.e.apps.R import foundation.e.apps.application.model.Application @@ -35,7 +35,7 @@ import foundation.e.apps.updates.UpdatesNotifier import foundation.e.apps.utils.Constants import foundation.e.apps.utils.Error -class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context, params), +class UpdatesWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params), UpdatesWorkerInterface { private val TAG = "UpdatesWorker" private val blocker = Object() @@ -45,12 +45,16 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context val applicationManager = ApplicationManager() private var error: Error? = null - override fun doWork(): Result { - Log.i(TAG, "Checking for app updates") - applicationManager.start(applicationContext) - loadOutdatedApplications(applicationManager) - Log.i(TAG, "Ids of apps with pending updates written to file") - return Result.success() + override suspend fun doWork(): Result { + return try { + Log.i(TAG, "Checking for app updates") + applicationManager.start(applicationContext) + loadOutdatedApplications(applicationManager) + Log.i(TAG, "Ids of apps with pending updates written to file") + Result.success() + } catch (error: Throwable) { + Result.failure() + } } private fun loadPreferences() { @@ -96,7 +100,9 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context wifiOnly, isConnectedToUnmeteredNetwork) } - if (installAutomatically && canWriteStorage(applicationContext)) { + if (installAutomatically && + applicationContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + ) { if (wifiOnly) { if (isConnectedToUnmeteredNetwork) { applications.forEach { @@ -107,7 +113,6 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context Log.i(TAG, "Updating ${it.packageName}") it.buttonClicked(applicationContext, null) } - } } } else { @@ -128,10 +133,6 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context } } - private fun canWriteStorage(context: Context) = !(android.os.Build.VERSION.SDK_INT >= 23 && - context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != - PackageManager.PERMISSION_GRANTED) - /* * Checks if the device is connected to a metered connection or not * @param context current Context diff --git a/app/src/main/java/foundation/e/apps/utils/Common.kt b/app/src/main/java/foundation/e/apps/utils/Common.kt index e0c3dbd5e2fd0fc8bfa9cb6cfdb4c03fae1eb023..def81ecf2360acd1e41c829d8065d8ee70adb5fd 100644 --- a/app/src/main/java/foundation/e/apps/utils/Common.kt +++ b/app/src/main/java/foundation/e/apps/utils/Common.kt @@ -143,6 +143,13 @@ object Common { PreferenceStorage(context).save(MICROG_SHARED_PREF, true) } } + + /** + * Returns system default accent color + */ + fun getAccentColor(context: Context): Int { + return context.getColor(foundation.e.apps.R.color.colorAccent) + } } class keyDeserializer : KeyDeserializer() { diff --git a/app/src/main/res/layout/activity_application.xml b/app/src/main/res/layout/activity_application.xml index f973d6d8f3f0f1220d8f59beeaabe532afe91447..7401199dc145bb3a9db216da049748fcb22e8177 100644 --- a/app/src/main/res/layout/activity_application.xml +++ b/app/src/main/res/layout/activity_application.xml @@ -59,13 +59,24 @@ android:paddingStart="@dimen/layout_padding_large" android:paddingEnd="@dimen/layout_padding_large"> - + app:cardCornerRadius="12dp" + app:cardElevation="0dp"> + + + @@ -214,7 +225,7 @@ android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_marginStart="@dimen/layout_margin_medium" - android:layout_toStartOf="@id/app_install" + android:layout_toStartOf="@id/install_button_layout" android:ellipsize="end" android:gravity="center" android:maxLines="1" @@ -224,6 +235,7 @@ - + android:contentDescription="@string/app_rating_description" + android:ellipsize="end" /> - + android:contentDescription="@string/app_privacy_description" + android:ellipsize="end" /> - + app:cardCornerRadius="12dp" + app:cardElevation="0dp"> + + + - - - + app:cardCornerRadius="12dp" + app:cardElevation="0dp"> + + + + android:layout_below="@+id/simple_install_button_layout"/> diff --git a/build.gradle b/build.gradle index 80fc339b681fea02dba74815f03810350aeea5f6..9f8a976ac6774d441a1be53ca61f926c57a5f73d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.32' + ext.kotlin_version = '1.5.0' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' + classpath 'com.android.tools.build:gradle:4.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -18,7 +18,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 203edccb4ba47762175a317ad5de6785ea783ae4..59bada4ab8fe18d9db2f178a69c8ff03e58967ec 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip