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