From dbff6c11ac630d865ecc2b67480304f3b1673839 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 3 May 2021 17:01:48 +0530 Subject: [PATCH 01/34] Apps: SmallApplication*: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../application/SmallApplicationViewHolder.kt | 19 +++++++------------ .../common/SmallApplicationListAdapter.kt | 3 ++- .../layout/small_application_list_item.xml | 3 ++- 3 files changed, 11 insertions(+), 14 deletions(-) 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 7292b819d..00db46c85 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -22,12 +22,8 @@ import android.app.Activity import android.graphics.Bitmap import android.graphics.Color 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,25 +35,24 @@ 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() 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 fcf47b779..8f7a995e2 100644 --- a/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt +++ b/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt @@ -24,11 +24,12 @@ 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/res/layout/small_application_list_item.xml b/app/src/main/res/layout/small_application_list_item.xml index ffee746c0..d759d811d 100644 --- a/app/src/main/res/layout/small_application_list_item.xml +++ b/app/src/main/res/layout/small_application_list_item.xml @@ -74,6 +74,7 @@ + android:layout_below="@+id/simple_install_button_layout"/> -- GitLab From 7111f3a5a2de90bcff6abfecf81c8d82f583aca9 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 3 May 2021 17:48:15 +0530 Subject: [PATCH 02/34] Apps: category: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../categories/category/CategoryActivity.kt | 35 ++++++++++--------- app/src/main/res/layout/activity_category.xml | 1 + 2 files changed, 19 insertions(+), 17 deletions(-) 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 085b0907a..9418106cb 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,14 @@ 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.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 @@ -60,26 +57,30 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityCategoryBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_category) + setContentView(binding.root) getAccentColor() - 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 +103,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) @@ -166,7 +167,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() } } diff --git a/app/src/main/res/layout/activity_category.xml b/app/src/main/res/layout/activity_category.xml index 54f1af054..33096712a 100644 --- a/app/src/main/res/layout/activity_category.xml +++ b/app/src/main/res/layout/activity_category.xml @@ -57,6 +57,7 @@ Date: Mon, 3 May 2021 17:53:08 +0530 Subject: [PATCH 03/34] home: ImageCarouselAdapter: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../foundation/e/apps/home/ImageCarouselAdapter.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 ac5ebf7bb..dc84b854f 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 { -- GitLab From 296faf72497b5396375690e72de8b04939dac635 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 3 May 2021 18:03:21 +0530 Subject: [PATCH 04/34] apps: application: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../ApplicationDescriptionActivity.kt | 13 +++---- .../apps/application/ApplicationViewHolder.kt | 34 ++++++++----------- .../e/apps/common/ApplicationListAdapter.kt | 4 +-- .../main/res/layout/application_list_item.xml | 1 + 4 files changed, 25 insertions(+), 27 deletions(-) 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 2f627601d..fd2e99e28 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt @@ -21,25 +21,26 @@ 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) } } 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 08e6ff449..b5c61ed1b 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -23,10 +23,6 @@ import android.graphics.Bitmap import android.graphics.Color import android.view.Gravity import android.view.View -import android.widget.Button -import android.widget.ImageView -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 +34,37 @@ 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, 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) @@ -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) { @@ -129,7 +125,7 @@ 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 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 02892bfa6..40b13d1cb 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/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index 3387ff0de..679d71014 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -137,6 +137,7 @@ android:orientation="vertical"> Date: Mon, 3 May 2021 18:05:41 +0530 Subject: [PATCH 05/34] application: Screenshots*: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../e/apps/application/ScreenshotsActivity.kt | 12 +++++++----- .../apps/application/ScreenshotsCarouselAdapter.kt | 13 +++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) 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 8dc9714be..892950664 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 522f9a2c5..88e6f02ef 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 } -- GitLab From 7551050e8813792653e7212da26c20f2e461bcad Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 3 May 2021 19:08:02 +0530 Subject: [PATCH 06/34] home: HomeCategory*: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- app/src/main/java/foundation/e/apps/home/HomeCategory.kt | 9 ++++----- app/src/main/java/foundation/e/apps/home/HomeFragment.kt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) 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 0552454fd..68ab3e6ea 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 841d379b5..b67224075 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt @@ -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) -- GitLab From b1a8f68549b241bf778a77ef600c7ffc50d09fdf Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 10:44:49 +0530 Subject: [PATCH 07/34] application: ApplicationActivity: Migrate to viewBinding - Kotlin Android Extensions is deprecated - It has important advantages over using findViewById Ref: - [1]: https://developer.android.com/topic/libraries/view-binding/migration - [2]: https://developer.android.com/topic/libraries/view-binding#findviewbyid Signed-off-by: Aayush Gupta --- .../e/apps/application/ApplicationActivity.kt | 310 +++++++++--------- .../main/res/layout/activity_application.xml | 3 +- 2 files changed, 158 insertions(+), 155 deletions(-) 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 5f5a89f6d..d998dec80 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -57,6 +57,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,23 +67,22 @@ 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 @@ -91,10 +91,12 @@ class ApplicationActivity : 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) + binding.goodBorder.visibility = View.GONE + binding.neutralBorder.visibility = View.GONE val toolbar = findViewById(R.id.toolbar) @@ -103,7 +105,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) @@ -113,26 +115,26 @@ class ApplicationActivity : } getAccentColor() - app_install.setTextColor(Color.parseColor("#ffffff")) - app_install.setBackgroundColor(accentColorOS) - app_category.setTextColor(accentColorOS) - app_expand_description.setTextColor(accentColorOS) + binding.installButtonLayout.appInstall.setTextColor(Color.parseColor("#ffffff")) + binding.installButtonLayout.appInstall.setBackgroundColor(accentColorOS) + 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 +143,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 { @@ -217,42 +219,42 @@ 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) @@ -261,13 +263,13 @@ class ApplicationActivity : // 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 = builder } 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 +291,31 @@ 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 = builder setPrivacyRatingBorder(-1) } - app_privacy_container.setOnClickListener { + binding.appPrivacyContainer.setOnClickListener { val message = layoutInflater.inflate(R.layout.privacy_dialog_message, null) as TextView @@ -338,40 +340,40 @@ 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 = builder 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 +388,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 +434,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 +448,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 +481,7 @@ class ApplicationActivity : stateChanged(application.state) // Handle clicks on app install button - app_install.setOnClickListener { + binding.installButtonLayout.appInstall.setOnClickListener { onInstallButtonClick(fullData) } } else { @@ -492,8 +494,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 +504,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 +543,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 +590,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 +613,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 } } }) @@ -659,13 +661,13 @@ class ApplicationActivity : private fun setRatingBorder(rating: Float?) { when { rating!! >= 7f -> { - app_rating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) + 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) + 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 +675,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 +711,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 +729,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() } } } diff --git a/app/src/main/res/layout/activity_application.xml b/app/src/main/res/layout/activity_application.xml index f973d6d8f..af51a390c 100644 --- a/app/src/main/res/layout/activity_application.xml +++ b/app/src/main/res/layout/activity_application.xml @@ -214,7 +214,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 +224,7 @@ Date: Tue, 4 May 2021 10:47:45 +0530 Subject: [PATCH 08/34] app: gradle: Remove kotlin-android-extensions plugin dependency - It has been deprecated Ref: - [1]: https://android-developers.googleblog.com/2020/11/the-future-of-kotlin-android-extensions.html Signed-off-by: Aayush Gupta --- app/build.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7bbca8c76..54e773b2e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,6 @@ plugins { id 'com.android.application' id 'kotlin-android' - id 'kotlin-android-extensions' id 'kotlin-kapt' } @@ -48,9 +47,6 @@ android { lintConfig file("lint.xml") disable 'MissingTranslation' } - androidExtensions { - experimental = true - } aaptOptions { additionalParameters '-I', 'app/e-ui-sdk.jar' } -- GitLab From dba202b20fcfb0107f0f956bce1e6bb8b312743d Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 10:49:05 +0530 Subject: [PATCH 09/34] XAPK: ApksBean: Migrate to kotlin-parcelize plugin for Parcelable implementation Ref: - [1]: https://developer.android.com/kotlin/parcelize Signed-off-by: Aayush Gupta --- app/build.gradle | 1 + app/src/main/java/foundation/e/apps/XAPK/ApksBean.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 54e773b2e..ca4100563 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' + id 'kotlin-parcelize' } android { 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 c389394de..b880e71e4 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 -- GitLab From f1d21f7584c88c36b609eb04d4cc4a6a9dd1707b Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 11:23:44 +0530 Subject: [PATCH 10/34] Apps: Resolve compile-time warnings for shadowed variable names Signed-off-by: Aayush Gupta --- .../e/apps/application/ApplicationActivity.kt | 10 +++------- .../updates/model/OutdatedApplicationsFileReader.kt | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) 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 d998dec80..efc5bd2cc 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -261,11 +261,10 @@ class ApplicationActivity : } // Set the app rating - val builder = textColorChange(getText(R.string.not_available).toString()) if (basicData.ratings.rating != -1f) { binding.appRating.text = basicData.ratings.rating.toString() + "/5" } else { - binding.appRating.text = builder + binding.appRating.text = textColorChange(getText(R.string.not_available).toString()) } setRatingBorder(basicData.ratings.rating) @@ -305,14 +304,12 @@ class ApplicationActivity : } // Set the app privacy rating - val builder = textColorChange(getText(R.string.not_available).toString()) - if (fullData.getLastVersion()!!.privacyRating != null && fullData.getLastVersion()!!.privacyRating != -1) { binding.appPrivacyScore.text = fullData.getLastVersion()!!.privacyRating.toString() + "/10" setPrivacyRatingBorder(fullData.getLastVersion()!!.privacyRating!!) } else { - binding.appPrivacyScore.text = builder + binding.appPrivacyScore.text = textColorChange(getText(R.string.not_available).toString()) setPrivacyRatingBorder(-1) } binding.appPrivacyContainer.setOnClickListener { @@ -370,8 +367,7 @@ class ApplicationActivity : binding.appSize.visibility = View.GONE // Set app privacy rating - val builder = textColorChange(getText(R.string.not_available).toString()) - binding.appPrivacyScore.text = builder + binding.appPrivacyScore.text = textColorChange(getText(R.string.not_available).toString()) setPrivacyRatingBorder(-1) binding.appPrivacyContainer.setOnClickListener { val alertDialog = AlertDialog.Builder(this).create() 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 93c75430b..326c16658 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 @@ -45,8 +45,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() -- GitLab From d9107648ace379a0e9234624e307ecb344e743e7 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 13:53:57 +0530 Subject: [PATCH 11/34] settings: Switch to AlertDialog inplace of ProgressDialog - ProgressDialog has been deprecated Ref: [1]: https://developer.android.com/reference/android/app/ProgressDialog Signed-off-by: Aayush Gupta --- .../e/apps/settings/SettingsFragment.kt | 23 +++++------- app/src/main/res/layout/progress_dialog.xml | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/layout/progress_dialog.xml 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 e246d4742..a9db08cd9 100644 --- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt @@ -18,17 +18,15 @@ package foundation.e.apps.settings import android.annotation.SuppressLint -import android.app.ProgressDialog +import android.app.AlertDialog 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 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 @@ -98,8 +96,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } } - - private var working_dialog: ProgressDialog? = null + private lateinit var progressDialog: AlertDialog fun backToMainActivity() { showWorkingDialog() @@ -107,24 +104,22 @@ class SettingsFragment : PreferenceFragmentCompat() { 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() + activity?.recreate() } } worker.schedule(task, 1, TimeUnit.SECONDS) } private fun showWorkingDialog() { - working_dialog = ProgressDialog.show(context, "", "Applying Settings...", true) + progressDialog = AlertDialog.Builder(context) + .setView(R.layout.progress_dialog) + .create() + progressDialog.show() } private fun removeWorkingDialog() { - if (working_dialog != null) { - working_dialog!!.dismiss() - working_dialog = null + if (progressDialog.isShowing) { + progressDialog.dismiss() } } } diff --git a/app/src/main/res/layout/progress_dialog.xml b/app/src/main/res/layout/progress_dialog.xml new file mode 100644 index 000000000..4ff6aba8d --- /dev/null +++ b/app/src/main/res/layout/progress_dialog.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file -- GitLab From 897b3a101a2d9d9d8733fccc2abb8631c99b2ba2 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 14:24:16 +0530 Subject: [PATCH 12/34] application: FullData: Supress unchecked cast warning for ArrayList Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/application/model/data/FullData.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 eb352f707..2affc3fcf 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) { -- GitLab From 45391d8302fceb9a3b1b65d5f07a9783e7df4085 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 14:34:00 +0530 Subject: [PATCH 13/34] apps: GitlabDataRequest: Switch to parseReader inplace of JsonParser().parse() - JsonParser() has been deprecated Ref: - [1]: https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/JsonParser.html Signed-off-by: Aayush Gupta --- app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 7596e8b71..0c7ad9062 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() -- GitLab From 153f252828fc39125de497e44ea448778725877b Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 14:47:55 +0530 Subject: [PATCH 14/34] XAPK: FsUtils: Resolve type mismatch in exists() method Compile-time warning> Type mismatch: inferred type is String? but String was expected Signed-off-by: Aayush Gupta --- app/src/main/java/foundation/e/apps/XAPK/FsUtils.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 25fa0c379..41d84504c 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 { -- GitLab From ec43d623f01376b5bf267fd6bf0e43c76df352dd Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 15:55:49 +0530 Subject: [PATCH 15/34] Apps: Optimize imports Signed-off-by: Aayush Gupta --- app/src/main/java/foundation/e/apps/XAPK/AppFolder.kt | 1 - app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt | 1 - app/src/main/java/foundation/e/apps/XAPK/LocaleUtils.kt | 1 - app/src/main/java/foundation/e/apps/XAPK/UriUtils.kt | 1 - app/src/main/java/foundation/e/apps/XAPK/XApkInstallUtils.kt | 1 - .../java/foundation/e/apps/application/model/Installer.kt | 1 - .../java/foundation/e/apps/application/model/StateManager.kt | 2 -- .../foundation/e/apps/common/SmallApplicationListAdapter.kt | 1 - app/src/main/java/foundation/e/apps/home/HomeFragment.kt | 3 --- app/src/main/java/foundation/e/apps/search/SearchFragment.kt | 5 +++-- .../e/apps/updates/model/OutdatedApplicationsFileReader.kt | 1 - 11 files changed, 3 insertions(+), 15 deletions(-) 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 eb99f66e7..6429d0234 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/IntentUtils.kt b/app/src/main/java/foundation/e/apps/XAPK/IntentUtils.kt index 079b591af..7d1533d61 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 2b8abdea3..cd8eade7f 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 72b06b44a..85911b333 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 2b4e3805e..563a03c9f 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/application/model/Installer.kt b/app/src/main/java/foundation/e/apps/application/model/Installer.kt index 6ce65b5e8..432c0923f 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 b1d16b700..ae9801058 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 @@ -19,7 +19,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 +29,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()) 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 8f7a995e2..f65aa46de 100644 --- a/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt +++ b/app/src/main/java/foundation/e/apps/common/SmallApplicationListAdapter.kt @@ -21,7 +21,6 @@ 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 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 b67224075..a23d41583 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt @@ -28,9 +28,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 +36,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!! 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 d35024783..54f8e141f 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -26,7 +26,9 @@ 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 +46,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!! 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 326c16658..41e4039ed 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 -- GitLab From b4606998202a10ec139280faca6e3e5f397dc219 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 16:16:06 +0530 Subject: [PATCH 16/34] app: gradle: Optimize dependencies - Drop non-required dependencies - Add missing livedata dependency and disable null safe warning (should be resolved) Signed-off-by: Aayush Gupta --- app/build.gradle | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ca4100563..55ac73b87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,6 @@ android { versionName "1.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables.useSupportLibrary = true } signingConfigs { @@ -47,6 +46,7 @@ android { lintOptions { lintConfig file("lint.xml") disable 'MissingTranslation' + disable 'NullSafeMutableLiveData' } aaptOptions { additionalParameters '-I', 'app/e-ui-sdk.jar' @@ -78,21 +78,12 @@ 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" @@ -105,14 +96,10 @@ dependencies { // WorkManager implementation 'androidx.work:work-runtime: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" -- GitLab From bbe4b3985e78f22df722fd5c74026f7ab8cae793 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 17:06:06 +0530 Subject: [PATCH 17/34] settings: Rework MainActivity switching method - Now it provides better UX by switching seamlessly without any blinking animation or loading dialog Signed-off-by: Aayush Gupta --- .../e/apps/settings/SettingsFragment.kt | 34 ++++-------------- app/src/main/res/layout/progress_dialog.xml | 35 ------------------- 2 files changed, 7 insertions(+), 62 deletions(-) delete mode 100644 app/src/main/res/layout/progress_dialog.xml 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 a9db08cd9..9de06b140 100644 --- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt @@ -18,17 +18,15 @@ package foundation.e.apps.settings import android.annotation.SuppressLint -import android.app.AlertDialog 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 foundation.e.apps.MainActivity import foundation.e.apps.R import foundation.e.apps.updates.UpdatesManager -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit class SettingsFragment : PreferenceFragmentCompat() { @@ -96,30 +94,12 @@ class SettingsFragment : PreferenceFragmentCompat() { } } - private lateinit var progressDialog: AlertDialog - - fun backToMainActivity() { - showWorkingDialog() - val worker = Executors.newSingleThreadScheduledExecutor() - val task = Runnable { - run { - removeWorkingDialog() - activity?.recreate() - } - } - worker.schedule(task, 1, TimeUnit.SECONDS) - } - - private fun showWorkingDialog() { - progressDialog = AlertDialog.Builder(context) - .setView(R.layout.progress_dialog) - .create() - progressDialog.show() - } - - private fun removeWorkingDialog() { - if (progressDialog.isShowing) { - progressDialog.dismiss() + 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/res/layout/progress_dialog.xml b/app/src/main/res/layout/progress_dialog.xml deleted file mode 100644 index 4ff6aba8d..000000000 --- a/app/src/main/res/layout/progress_dialog.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - \ No newline at end of file -- GitLab From 1c7ccdff0d03de904b6c653f16fd552a876f9572 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 May 2021 17:57:55 +0530 Subject: [PATCH 18/34] application: Accept and set ratings as a parameter in SearchAppsBasicData Signed-off-by: Aayush Gupta --- .../e/apps/application/ApplicationViewHolder.kt | 11 +++++++++++ .../application/model/data/SearchAppsBasicData.kt | 1 + 2 files changed, 12 insertions(+) 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 b5c61ed1b..eb897694b 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -130,6 +130,17 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application application!!.SearchAppsloadIcon(this) title.text = application!!.searchAppsBasicData!!.name author.text = application!!.searchAppsBasicData!!.author + 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 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 42b234ac5..2786f4e34 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){ -- GitLab From 8a79fdf1806c64096fe80de8921aa4bcafe0f315 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 11:08:37 +0530 Subject: [PATCH 19/34] gradle: Bump gradle version to 4.2.0 Signed-off-by: Aayush Gupta --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 80fc339b6..7202392f7 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 203edccb4..59bada4ab 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 -- GitLab From 60e0862a0b06812db482c9bc5910c048b7875262 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 11:20:32 +0530 Subject: [PATCH 20/34] gradle: Switch to mavenCentral() inplace of jCenter() - jCenter() has been deprecated Ref: - [1]: https://developer.android.com/studio/build/jcenter-migration Signed-off-by: Aayush Gupta --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 7202392f7..b86e8e76f 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { ext.kotlin_version = '1.4.32' repositories { google() - jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:4.2.0' @@ -18,7 +18,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } } } -- GitLab From 32d59abbd42f247847241b5c9c1e9661abac8c41 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 11:31:49 +0530 Subject: [PATCH 21/34] Apps: Resolve lint errors for wrong overriding parameters Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/application/ApplicationActivity.kt | 4 ++-- .../e/apps/application/ApplicationDescriptionActivity.kt | 4 ++-- .../foundation/e/apps/categories/category/CategoryActivity.kt | 4 ++-- .../java/foundation/e/apps/settings/AppRequestActivity.kt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) 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 efc5bd2cc..86fff10d7 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -172,8 +172,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() } 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 fd2e99e28..1263dc315 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationDescriptionActivity.kt @@ -44,9 +44,9 @@ class ApplicationDescriptionActivity : AppCompatActivity() { } } - 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/categories/category/CategoryActivity.kt b/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt index 9418106cb..22f4033b8 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 @@ -154,8 +154,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() } 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 3dfdbfe57..3968e44b1 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() } -- GitLab From b739b75a73408b92b373375a1d25718ee6d79d7e Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 11:32:18 +0530 Subject: [PATCH 22/34] app: gradle: Bump compile and buildTools version to 30 Signed-off-by: Aayush Gupta --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 55ac73b87..ec94aa43a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ plugins { } android { - compileSdkVersion 29 - buildToolsVersion '29.0.2' + compileSdkVersion 30 + buildToolsVersion '30.0.3' defaultConfig { applicationId "foundation.e.apps" -- GitLab From 0f23a5a92adaffaa891c15818a11e4bce3357618 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 16:38:39 +0530 Subject: [PATCH 23/34] layout: Use CardView for app icon with proper corner radius Signed-off-by: Aayush Gupta --- .../main/res/layout/activity_application.xml | 17 +++++++++++--- .../main/res/layout/application_list_item.xml | 21 +++++++++++++---- .../layout/small_application_list_item.xml | 23 +++++++++++++------ 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/layout/activity_application.xml b/app/src/main/res/layout/activity_application.xml index af51a390c..fa320e26c 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"> + + + diff --git a/app/src/main/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index 679d71014..2f558fa34 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -21,19 +21,30 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" android:background="?android:selectableItemBackground" android:paddingStart="@dimen/layout_padding_medium" android:paddingTop="@dimen/layout_margin_medium" android:paddingEnd="@dimen/layout_padding_medium"> - + app:cardCornerRadius="12dp" + app:cardElevation="0dp"> + + + - - - + app:cardCornerRadius="12dp" + app:cardElevation="0dp"> + + + Date: Wed, 5 May 2021 17:40:34 +0530 Subject: [PATCH 24/34] application: ApplicationActivity: Correct loic for app rating color border - App rating is computed out of 5 not 10 Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/application/ApplicationActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 86fff10d7..6c1246141 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -656,10 +656,10 @@ class ApplicationActivity : private fun setRatingBorder(rating: Float?) { when { - rating!! >= 7f -> { + rating!! >= 3.5f -> { binding.appRating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cat_green_ellipse, 0) } - rating >= 4f -> { + rating >= 2.0f -> { binding.appRating.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_yellow_ellipse, 0) } else -> { -- GitLab From 47e1e51443f16e6a7e90962f8c5b3e2582ca1c12 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 May 2021 10:41:32 +0530 Subject: [PATCH 25/34] Apps: Refactor the accent color implementation Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/MainActivity.kt | 21 ++--- .../e/apps/application/ApplicationActivity.kt | 15 ++-- .../apps/application/ApplicationViewHolder.kt | 76 +++++++++---------- .../application/SmallApplicationViewHolder.kt | 45 +++++------ .../e/apps/application/model/Application.kt | 11 --- .../e/apps/categories/CategoriesFragment.kt | 18 +---- .../categories/category/CategoryActivity.kt | 14 +--- .../foundation/e/apps/home/HomeFragment.kt | 5 +- .../e/apps/search/SearchFragment.kt | 7 +- .../e/apps/updates/UpdatesFragment.kt | 4 +- .../java/foundation/e/apps/utils/Common.kt | 7 ++ app/src/main/res/layout/fragment_home.xml | 2 +- 12 files changed, 93 insertions(+), 132 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index 5691c9e3a..fb954a39e 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() @@ -129,7 +132,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS setupLangReceiver() applicationManagerServiceConnection.bindService(this) - getAccentColor(); bottom_navigation_view_color() openSearchFragment() } @@ -341,17 +343,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/application/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt index 6c1246141..3f2137cec 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 @@ -88,13 +90,15 @@ class ApplicationActivity : 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(binding.root) + + val accentColorOS = Common.getAccentColor(this) + binding.goodBorder.visibility = View.GONE binding.neutralBorder.visibility = View.GONE @@ -114,9 +118,10 @@ class ApplicationActivity : applicationManagerServiceConnection.bindService(this) } - getAccentColor() + // Set accent color binding.installButtonLayout.appInstall.setTextColor(Color.parseColor("#ffffff")) - binding.installButtonLayout.appInstall.setBackgroundColor(accentColorOS) + 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) @@ -746,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/ApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt index eb897694b..002de9c28 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -21,8 +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.view.animation.AlphaAnimation +import android.view.animation.Animation +import android.widget.RatingBar import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar @@ -42,7 +48,7 @@ import foundation.e.apps.utils.Error import foundation.e.apps.utils.Execute -class ApplicationViewHolder(private val activity: Activity, binding: ApplicationListItemBinding, accentColorOS: Int) : +class ApplicationViewHolder(private val activity: Activity, binding: ApplicationListItemBinding, private val accentColorOS: Int) : RecyclerView.ViewHolder(binding.root), ApplicationStateListener, Downloader.DownloadProgressCallback, @@ -62,7 +68,6 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application private var application: Application? = null private val applicationViewModel = ApplicationViewModel() private var downloader: Downloader? = null - var accentColorOS = accentColorOS; init { pwaSympol.visibility = View.GONE view.setOnClickListener { @@ -72,11 +77,6 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application } } - - installButton.setTextColor(Color.parseColor("#ffffff")) - if (0 != this.accentColorOS) { - installButton.setBackgroundColor(this.accentColorOS) - } installButton.setOnClickListener { if (application?.fullData != null && application!!.fullData!!.getLastVersion() == null) { @@ -107,7 +107,11 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application 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 { @@ -130,7 +134,11 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application 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 { @@ -158,50 +166,37 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application 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) } } @@ -215,12 +210,17 @@ class ApplicationViewHolder(private val activity: Activity, binding: Application @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/SmallApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt index 00db46c85..34f67517a 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -21,6 +21,9 @@ 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.animation.AlphaAnimation import android.view.animation.Animation @@ -57,6 +60,7 @@ class SmallApplicationViewHolder(private val activity: Activity, binding: SmallA private val applicationViewModel = ApplicationViewModel() private var downloader: Downloader? = null + private val accentColorOS = Common.getAccentColor(activity) init { view.setOnClickListener { @@ -108,47 +112,37 @@ class SmallApplicationViewHolder(private val activity: Activity, binding: SmallA 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) } } }) @@ -161,9 +155,6 @@ class SmallApplicationViewHolder(private val activity: Activity, binding: SmallA @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 beb5706bc..c01fa764d 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/categories/CategoriesFragment.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt index c73e0ba3b..b988fbc8b 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 22f4033b8..e1f0d545b 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 @@ -38,6 +38,7 @@ 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 @@ -53,14 +54,14 @@ 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(binding.root) - getAccentColor() + + val accentColorOS = Common.getAccentColor(this) val toolbar = binding.toolbar setSupportActionBar(toolbar) @@ -192,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/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt index a23d41583..92ff79394 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 @@ -72,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) 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 54f8e141f..3c2d0f137 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -20,6 +20,8 @@ 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 @@ -88,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) @@ -120,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/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt index b57fc9f1b..2704053a8 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/utils/Common.kt b/app/src/main/java/foundation/e/apps/utils/Common.kt index e0c3dbd5e..def81ecf2 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/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 0fd46a651..98bf947a6 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -41,7 +41,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/featured" - android:textColor="@color/colorAccent" + android:textColor="@android:color/black" android:textStyle="bold" android:paddingStart="@dimen/layout_padding_large" android:textSize="@dimen/text_size_large" -- GitLab From df3e2fefb14d26ee0ac86fa7db50c30d8609a9c5 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 6 May 2021 15:30:06 +0530 Subject: [PATCH 26/34] settings: SettingsFragment: Use val instead of var in required variables Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/settings/SettingsFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 9de06b140..5e65c5a80 100644 --- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt @@ -66,11 +66,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 -- GitLab From 9f199e54306bac495f94ddd3f6517a55f718fcbe Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 09:52:05 +0530 Subject: [PATCH 27/34] gradle: Switch to kotlin v1.5.0 stable release Ref: - [1]: https://kotlinlang.org/docs/whatsnew15.html Signed-off-by: Aayush Gupta --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b86e8e76f..9f8a976ac 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // 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() mavenCentral() -- GitLab From 4bcb3fddab1b01c338c37d3d75ab2caddc3538e0 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 10:07:46 +0530 Subject: [PATCH 28/34] Apps: Drop dependency on RoundedImageView - Use ImageView instead - Also fix class import in XAPK's InstallSplitApksActivity Signed-off-by: Aayush Gupta --- app/build.gradle | 3 --- .../e/apps/XAPK/InstallSplitApksActivity.kt | 2 +- app/src/main/res/layout/activity_application.xml | 16 ++++++++-------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ec94aa43a..b42052a7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -87,9 +87,6 @@ dependencies { // 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' 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 dd8c4926b..6eb73e4db 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/res/layout/activity_application.xml b/app/src/main/res/layout/activity_application.xml index fa320e26c..7401199dc 100644 --- a/app/src/main/res/layout/activity_application.xml +++ b/app/src/main/res/layout/activity_application.xml @@ -417,14 +417,14 @@ android:drawableRight="@drawable/app_border_good" tools:text="App rating" /> - + android:contentDescription="@string/app_rating_description" + android:ellipsize="end" /> - + android:contentDescription="@string/app_privacy_description" + android:ellipsize="end" /> Date: Mon, 10 May 2021 10:25:31 +0530 Subject: [PATCH 29/34] Apps: Switch to ktx dependency for WorkManager This allows us to write better kotlin-specific syntax as well as utilize CoroutineWorker to run tasks Ref: - [1]: https://developer.android.com/jetpack/androidx/releases/work - [2]: https://medium.com/androiddevelopers/workmanager-meets-kotlin-b9ad02f7405e Signed-off-by: Aayush Gupta --- app/build.gradle | 2 +- .../java/foundation/e/apps/updates/model/UpdatesWorker.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b42052a7e..d64025432 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ dependencies { 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' // Lifecycle def lifecycle_version = "2.3.1" 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 c9d40e091..29937fc44 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,7 +45,7 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : Worker(context val applicationManager = ApplicationManager() private var error: Error? = null - override fun doWork(): Result { + override suspend fun doWork(): Result { Log.i(TAG, "Checking for app updates") applicationManager.start(applicationContext) loadOutdatedApplications(applicationManager) -- GitLab From 0e745edaa566fe94452d86a06bc1b471634c65ef Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 10:32:36 +0530 Subject: [PATCH 30/34] updates: UpdatesWorker: Wrap doWork() in try and catch block - Take failures in account as well Signed-off-by: Aayush Gupta --- .../e/apps/updates/model/UpdatesWorker.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 29937fc44..fee4da104 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 @@ -46,11 +46,15 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : CoroutineWorke private var error: Error? = null override suspend 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() + 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() { -- GitLab From 887e10d3de73101c1310228c405997bc94f8312e Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 10:39:48 +0530 Subject: [PATCH 31/34] updates: UpdatesWorker: Simpfiy logic to check permission Signed-off-by: Aayush Gupta --- .../foundation/e/apps/updates/model/UpdatesWorker.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) 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 fee4da104..10073b412 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 @@ -100,7 +100,9 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : CoroutineWorke wifiOnly, isConnectedToUnmeteredNetwork) } - if (installAutomatically && canWriteStorage(applicationContext)) { + if (installAutomatically && + applicationContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + ) { if (wifiOnly) { if (isConnectedToUnmeteredNetwork) { applications.forEach { @@ -111,7 +113,6 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : CoroutineWorke Log.i(TAG, "Updating ${it.packageName}") it.buttonClicked(applicationContext, null) } - } } } else { @@ -132,10 +133,6 @@ class UpdatesWorker(context: Context, params: WorkerParameters) : CoroutineWorke } } - 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 -- GitLab From 2b783f2a981dd021ec9b1a6ab28603bddb15eb07 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 13:40:06 +0530 Subject: [PATCH 32/34] apps: Drop non-required logging for microg EN Signed-off-by: Aayush Gupta --- .../java/foundation/e/apps/application/model/StateManager.kt | 2 -- .../e/apps/updates/model/OutdatedApplicationsFileReader.kt | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) 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 ae9801058..678ade052 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,7 +18,6 @@ package foundation.e.apps.application.model import android.content.Context -import android.util.Log import foundation.e.apps.application.model.data.BasicData import foundation.e.apps.application.model.data.SearchAppsBasicData import foundation.e.apps.applicationmanager.ApplicationManager @@ -38,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/updates/model/OutdatedApplicationsFileReader.kt b/app/src/main/java/foundation/e/apps/updates/model/OutdatedApplicationsFileReader.kt index 41e4039ed..f137e3460 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 @@ -34,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) { -- GitLab From cdd0f0b0dc8abbc9798db6d844145f4f3e245209 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 15:37:16 +0530 Subject: [PATCH 33/34] updates: Refactor UpdatesManager logic This patch: - migrates UpdatesManager to use BroadcastReceiver to listen to BOOT_COMPLETED intent on which it calls the function to enqueueUniquePeriodicWork. - Handles null-cases better This approach is better as this ensures that function is not called everytime MainActivity is launched/recreated but only when device reboots. This also means on first boot after /e/ is installed, Apps will automatically schedule the updates check without user's interaction to it. Signed-off-by: Aayush Gupta --- app/src/main/AndroidManifest.xml | 7 +++ .../java/foundation/e/apps/MainActivity.kt | 9 ---- .../e/apps/settings/SettingsFragment.kt | 3 +- .../e/apps/updates/UpdatesManager.kt | 44 +++++++++---------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a88355f7..0bda10851 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 fb954a39e..2dc45b42f 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -117,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)) { @@ -170,12 +167,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } - private fun initialiseUpdatesWorker() { - UpdatesManager(applicationContext).startWorker() - - - } - override fun onServiceBind(applicationManager: ApplicationManager) { initialiseFragments(applicationManager) selectFragment(currentFragmentId, null) 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 5e65c5a80..55914e76a 100644 --- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt @@ -24,6 +24,7 @@ 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 @@ -42,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 } 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 058bec255..d27bedb1c 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") } } -- GitLab From b4a7693f01fa1dd95cd2697417163e802711ae30 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 May 2021 16:02:11 +0530 Subject: [PATCH 34/34] Apps: Bump to v1.3.0 - Resolves multiple issues - Performance optmiziations - Better null and type handling - Upstreamed required code Signed-off-by: Aayush Gupta --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d64025432..5fe2502f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { minSdkVersion 25 targetSdkVersion 29 versionCode 10 - versionName "1.2.0" + versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } -- GitLab