diff --git a/app/build.gradle b/app/build.gradle index 205ae282eeb1274a3b039bbd395c4b30c70c63a1..7bbca8c765f3681670e2679f5760de25e111671f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { minSdkVersion 25 targetSdkVersion 29 versionCode 10 - versionName "1.1.6" + versionName "1.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -41,6 +41,9 @@ android { signingConfig signingConfigs.config } } + buildFeatures { + viewBinding true + } lintOptions { lintConfig file("lint.xml") disable 'MissingTranslation' diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index fa79c552ec95c6d8d6483010815ce8c2e9a3d581..5691c9e3ab46283da7bea3e1cb1a43e3a68d6ecb 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -23,7 +23,6 @@ import android.annotation.SuppressLint import android.content.* import android.content.pm.PackageManager import android.content.res.ColorStateList -import android.database.Cursor import android.graphics.Color import android.os.Bundle import android.os.Handler @@ -44,6 +43,7 @@ import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback import foundation.e.apps.categories.CategoriesFragment +import foundation.e.apps.databinding.ActivityMainBinding import foundation.e.apps.home.HomeFragment import foundation.e.apps.search.SearchFragment import foundation.e.apps.settings.SettingsFragment @@ -52,13 +52,11 @@ 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 foundation.e.apps.utils.Constants.MICROG_SHARED_PREF -import foundation.e.apps.utils.PreferenceStorage -import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener, ApplicationManagerServiceConnectionCallback { + private lateinit var binding: ActivityMainBinding private var currentFragmentId = 0 private val homeFragment = HomeFragment() @@ -94,13 +92,15 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityMainBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + setContentView(binding.root) mActivity = this disableCategoryIfOpenSource() - bottom_navigation_view.setOnNavigationItemSelectedListener{ + binding.bottomNavigationView.setOnNavigationItemSelectedListener{ if (selectFragment(it.itemId,it)) { disableCategoryIfOpenSource() currentFragmentId = it.itemId @@ -163,8 +163,8 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS )) - bottom_navigation_view.setItemIconTintList(iconsColorStates) - bottom_navigation_view.setItemTextColor(textColorStates) + binding.bottomNavigationView.setItemIconTintList(iconsColorStates) + binding.bottomNavigationView.setItemTextColor(textColorStates) } @@ -266,7 +266,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } private fun showFragment(fragment: Fragment) { - bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true + binding.bottomNavigationView.menu.findItem(currentFragmentId).isChecked = true supportFragmentManager .beginTransaction() .replace(R.id.frame_layout, fragment) @@ -275,7 +275,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS @SuppressLint("RestrictedApi") private fun disableShiftingOfNabBarItems() { - val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView + val menuView = binding.bottomNavigationView.getChildAt(0) as BottomNavigationMenuView try { val mShiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode") mShiftingMode.isAccessible = true @@ -295,7 +295,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS private fun disableCategoryIfOpenSource(){ if(showApplicationTypePreference()=="open") { - bottom_navigation_view.menu.removeItem(R.id.menu_categories) + binding.bottomNavigationView.menu.removeItem(R.id.menu_categories) } } @@ -304,7 +304,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS 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/java/foundation/e/apps/categories/ApplicationsFragment.kt b/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt index 94aafebca3bbc40d28096cd08c6a862220658c40..860c226aeac1903dbe40acaf32ba13349d7d63d4 100644 --- a/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt +++ b/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt @@ -22,38 +22,46 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import foundation.e.apps.R import foundation.e.apps.categories.model.Category import foundation.e.apps.categories.viewmodel.CategoriesViewModel -import kotlinx.android.synthetic.main.error_layout.view.* -import kotlinx.android.synthetic.main.fragment_application_categories.view.* +import foundation.e.apps.databinding.FragmentApplicationCategoriesBinding class ApplicationsFragment() : Fragment() { + private var _binding: FragmentApplicationCategoriesBinding? = null + private val binding get() = _binding!! + private lateinit var categoriesViewModel: CategoriesViewModel var color:Int = 0; override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentApplicationCategoriesBinding.inflate(inflater, container, false) + categoriesViewModel = ViewModelProvider(this).get(CategoriesViewModel::class.java) - val view = inflater.inflate(R.layout.fragment_application_categories, container, false) - view.categories_list.layoutManager = LinearLayoutManager(context) + // Fragment variables + val categoriesList = binding.categoriesList + val progressBar = binding.progressBar + val errorContainer = binding.errorLayout.errorContainer + val errorResolve = binding.errorLayout.errorResolve + val errorDescription = binding.errorLayout.errorDescription + + categoriesList.layoutManager = LinearLayoutManager(context) color = requireArguments().getInt("color",0) - view.categories_list.visibility = View.GONE - view.progress_bar.visibility = View.VISIBLE - view.error_container.visibility = View.GONE - view.findViewById(R.id.error_resolve).setOnClickListener { - view.progress_bar.visibility = View.VISIBLE + categoriesList.visibility = View.GONE + progressBar.visibility = View.VISIBLE + errorContainer.visibility = View.GONE + errorResolve.setOnClickListener { + progressBar.visibility = View.VISIBLE categoriesViewModel.loadCategories(requireContext()) } - view.error_resolve.setTextColor(Color.parseColor("#ffffff")) - view.error_resolve.setBackgroundColor(color) + errorResolve.setTextColor(Color.parseColor("#ffffff")) + errorResolve.setBackgroundColor(color) // Bind to the list of applications categories categoriesViewModel.getApplicationsCategories().observe(viewLifecycleOwner, Observer { @@ -61,28 +69,34 @@ class ApplicationsFragment() : Fragment() { //Add New Category if (!it.any { Category -> Category.id == "system_apps" }) it.add(Category("system_apps")) - view.categories_list.adapter = context?.let { context -> CategoriesListAdapter(context, it, color) } - view.categories_list.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + categoriesList.adapter = context?.let { context -> CategoriesListAdapter(context, it, color) } + categoriesList.visibility = View.VISIBLE + progressBar.visibility = View.GONE } }) // Bind to the screen error categoriesViewModel.getScreenError().observe(viewLifecycleOwner, Observer { if (it != null) { - view.error_description.text = requireActivity().getString(it.description) - view.error_container.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + errorDescription.text = requireActivity().getString(it.description) + errorContainer.visibility = View.VISIBLE + progressBar.visibility = View.GONE } else { - view.error_container.visibility = View.GONE + errorContainer.visibility = View.GONE } }) if (categoriesViewModel.getApplicationsCategories().value!!.isEmpty()) { categoriesViewModel.loadCategories(requireContext()) } - return view + return binding.root } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + companion object{ fun newInstance(color:Int?) : ApplicationsFragment{ val applicationsFragment = ApplicationsFragment() 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 12a24893e3f3f928ce90867595ef25d67b006c27..c73e0ba3b2cbf05bb9c378f6d50574d1aff879f4 100644 --- a/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt +++ b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt @@ -24,18 +24,21 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.viewpager.widget.ViewPager import com.google.android.material.tabs.TabLayout import foundation.e.apps.R +import foundation.e.apps.databinding.FragmentCategoriesBinding class CategoriesFragment : Fragment() { + private var _binding: FragmentCategoriesBinding? = null + private val binding get() = _binding!! + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentCategoriesBinding.inflate(inflater, container, false) + // Fragment variables + val tabLayout = binding.tabLayout + val viewPager = binding.viewPager - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = inflater.inflate(R.layout.fragment_categories, container, false) - val tabLayout = view.findViewById(R.id.tab_layout) - val viewPager = view.findViewById(R.id.view_pager) var color = getAccentColor(requireActivity()); viewPager.adapter = CategoriesViewPagerAdapter(requireActivity().supportFragmentManager, tabLayout.tabCount, color) viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout)) @@ -57,7 +60,12 @@ class CategoriesFragment : Fragment() { } }) - return view + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null } /* diff --git a/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt index 8e58fb0b2f16b8d63320f25a7358e9745569e6b9..4e624f3bf60598282f2caa4457d8140919716b33 100644 --- a/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt +++ b/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt @@ -21,16 +21,12 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.RelativeLayout -import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView -import foundation.e.apps.R import foundation.e.apps.categories.category.CategoryActivity import foundation.e.apps.categories.model.Category +import foundation.e.apps.databinding.CategoryListItemBinding import foundation.e.apps.utils.Constants class CategoriesListAdapter(private val context: Context, private var categories: ArrayList, color: Int?) @@ -43,17 +39,20 @@ class CategoriesListAdapter(private val context: Context, private var categories } - class CategoryViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val categoryContainer: RelativeLayout = view.findViewById(R.id.category_container) - val categoryIcon: ImageView = view.findViewById(R.id.category_icon) - val categoryTitle: TextView = view.findViewById(R.id.category_title) + class CategoryViewHolder(binding: CategoryListItemBinding) : RecyclerView.ViewHolder(binding.root) { + val categoryContainer = binding.categoryContainer + val categoryIcon = binding.categoryIcon + val categoryTitle = binding.categoryTitle } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryViewHolder { - val categoryContainer = LayoutInflater.from(parent.context).inflate( - R.layout.category_list_item, - parent, false) - return CategoryViewHolder(categoryContainer) + return CategoryViewHolder( + CategoryListItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) } override fun getItemCount(): Int { diff --git a/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt b/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt index 6ee64105c02a88278a533979622cab26b5f71543..13a50534de62e2be43b1e5c5abb4c40ded4b27b6 100644 --- a/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt +++ b/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt @@ -22,62 +22,75 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import foundation.e.apps.R import foundation.e.apps.categories.viewmodel.CategoriesViewModel -import kotlinx.android.synthetic.main.error_layout.view.* -import kotlinx.android.synthetic.main.fragment_games_categories.view.* +import foundation.e.apps.databinding.FragmentGamesCategoriesBinding class GamesFragment() : Fragment() { + private var _binding: FragmentGamesCategoriesBinding? = null + private val binding get() = _binding!! + private lateinit var categoriesViewModel: CategoriesViewModel var color:Int = 0; override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentGamesCategoriesBinding.inflate(inflater, container, false) + categoriesViewModel = ViewModelProvider(this).get(CategoriesViewModel::class.java) - val view = inflater.inflate(R.layout.fragment_games_categories, container, false) - view.categories_list.layoutManager = LinearLayoutManager(context) + // Fragment variables + val categoriesList = binding.categoriesList + val progressBar = binding.progressBar + val errorContainer = binding.errorLayout.errorContainer + val errorResolve = binding.errorLayout.errorResolve + val errorDescription = binding.errorLayout.errorDescription + + categoriesList.layoutManager = LinearLayoutManager(context) color = requireArguments().getInt("color",0) - view.categories_list.visibility = View.GONE - view.progress_bar.visibility = View.VISIBLE - view.error_container.visibility = View.GONE - view.findViewById(R.id.error_resolve).setOnClickListener { - view.progress_bar.visibility = View.VISIBLE + categoriesList.visibility = View.GONE + progressBar.visibility = View.VISIBLE + errorContainer.visibility = View.GONE + errorResolve.setOnClickListener { + progressBar.visibility = View.VISIBLE categoriesViewModel.loadCategories(requireContext()) } - view.error_resolve.setTextColor(Color.parseColor("#ffffff")) - view.error_resolve.setBackgroundColor(color) + errorResolve.setTextColor(Color.parseColor("#ffffff")) + errorResolve.setBackgroundColor(color) // Bind to the list of games categories categoriesViewModel.getGamesCategories().observe(viewLifecycleOwner, Observer { if (it!!.isNotEmpty()) { - view.categories_list.adapter = context?.let { context -> CategoriesListAdapter(context, it, color) } - view.categories_list.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + categoriesList.adapter = context?.let { context -> CategoriesListAdapter(context, it, color) } + categoriesList.visibility = View.VISIBLE + progressBar.visibility = View.GONE } }) // Bind to the screen error categoriesViewModel.getScreenError().observe(viewLifecycleOwner, Observer { if (it != null) { - view.error_description.text = requireActivity().getString(it.description) - view.error_container.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + errorDescription.text = requireActivity().getString(it.description) + errorContainer.visibility = View.VISIBLE + progressBar.visibility = View.GONE } else { - view.error_container.visibility = View.GONE + errorContainer.visibility = View.GONE } }) if (categoriesViewModel.getGamesCategories().value!!.isEmpty()) { categoriesViewModel.loadCategories(requireContext()) } - return view + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null } companion object{ diff --git a/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt b/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt index 9313ad736ae5c4631e8aa1907acf5f9c812c3a67..9e45e30794b9852683856954704ef37e1846be95 100644 --- a/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt +++ b/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt @@ -21,57 +21,69 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import foundation.e.apps.R import foundation.e.apps.categories.viewmodel.CategoriesViewModel -import kotlinx.android.synthetic.main.error_layout.view.* -import kotlinx.android.synthetic.main.fragment_application_categories.view.* +import foundation.e.apps.databinding.FragmentApplicationCategoriesBinding class PwasFragment : Fragment() { + private var _binding: FragmentApplicationCategoriesBinding? = null + private val binding get() = _binding!! + private lateinit var categoriesViewModel: CategoriesViewModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentApplicationCategoriesBinding.inflate(inflater, container, false) + categoriesViewModel = ViewModelProvider(this).get(CategoriesViewModel::class.java) - val view = inflater.inflate(R.layout.fragment_application_categories, container, false) - view.categories_list.layoutManager = LinearLayoutManager(context) + // Fragment variables + val categoriesList = binding.categoriesList + val progressBar = binding.progressBar + val errorContainer = binding.errorLayout.errorContainer + val errorResolve = binding.errorLayout.errorResolve + val errorDescription = binding.errorLayout.errorDescription - view.categories_list.visibility = View.GONE - view.progress_bar.visibility = View.VISIBLE - view.error_container.visibility = View.GONE - view.findViewById(R.id.error_resolve).setOnClickListener { - view.progress_bar.visibility = View.VISIBLE + categoriesList.layoutManager = LinearLayoutManager(context) + + categoriesList.visibility = View.GONE + progressBar.visibility = View.VISIBLE + errorContainer.visibility = View.GONE + errorResolve.setOnClickListener { + progressBar.visibility = View.VISIBLE categoriesViewModel.loadCategories(requireContext()) } // Bind to the list of pwas categories categoriesViewModel.getPwasCategories().observe(viewLifecycleOwner, Observer { if (it!!.isNotEmpty()) { - view.categories_list.adapter = context?.let { context -> CategoriesListAdapter(context, it, null) } - view.categories_list.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + categoriesList.adapter = context?.let { context -> CategoriesListAdapter(context, it, null) } + categoriesList.visibility = View.VISIBLE + progressBar.visibility = View.GONE } }) // Bind to the screen error categoriesViewModel.getScreenError().observe(viewLifecycleOwner, Observer { if (it != null) { - view.error_description.text = requireActivity().getString(it.description) - view.error_container.visibility = View.VISIBLE - view.progress_bar.visibility = View.GONE + errorDescription.text = requireActivity().getString(it.description) + errorContainer.visibility = View.VISIBLE + progressBar.visibility = View.GONE } else { - view.error_container.visibility = View.GONE + errorContainer.visibility = View.GONE } }) if (categoriesViewModel.getPwasCategories().value!!.isEmpty()) { categoriesViewModel.loadCategories(requireContext()) } - return view + return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } 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 ec67ec1dd1499a8783f185751ad8bebb826b3a19..841d379b51cca13cc648664d5ab0fa9e6ed81b80 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt @@ -24,7 +24,6 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.ProgressBar -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -36,10 +35,14 @@ import foundation.e.apps.application.model.Application import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.categories.model.Category 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!! + private lateinit var homeViewModel: HomeViewModel private lateinit var imageCarousel: ViewPager private lateinit var divider: View @@ -54,24 +57,27 @@ class HomeFragment : Fragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentHomeBinding.inflate(inflater, container, false) + if (applicationManager == null) { return null } - val view = inflater.inflate(R.layout.fragment_home, container, false) - homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java) - imageCarousel = view.findViewById(R.id.image_carousel) - divider = view.findViewById(R.id.divider) - categoryList = view.findViewById(R.id.category_list) - progressBar = view.findViewById(R.id.progress_bar) - val errorContainer = view.findViewById(R.id.error_container) - val errorDescription = view.findViewById(R.id.error_description) - //set accent color to Error button (Retry ) - view.findViewById(R.id.error_resolve).setTextColor(Color.parseColor("#ffffff")) - view.findViewById(R.id.error_resolve).setBackgroundColor(accentColorOS) + // Fragment variables + imageCarousel = binding.imageCarousel + divider = binding.divider + categoryList = binding.categoryList + progressBar = binding.progressBar + val errorContainer = binding.errorLayout.errorContainer + val errorDescription = binding.errorLayout.errorDescription + val errorResolve = binding.errorLayout.errorResolve + + //set accent color to Error button (Retry ) + errorResolve.setTextColor(Color.parseColor("#ffffff")) + errorResolve.setBackgroundColor(accentColorOS) // Initialise UI elements homeViewModel.initialise(applicationManager!!) @@ -81,7 +87,7 @@ class HomeFragment : Fragment() { categoryList.visibility = View.GONE progressBar.visibility = View.VISIBLE errorContainer.visibility = View.GONE - view.findViewById(R.id.error_resolve).setOnClickListener { + errorResolve.setOnClickListener { progressBar.visibility = View.VISIBLE homeViewModel.loadCategories(requireContext()) } @@ -125,7 +131,7 @@ class HomeFragment : Fragment() { homeViewModel.getCategories().value!!.isEmpty()) { homeViewModel.loadCategories(requireContext()) } - return view + return binding.root } private fun setCustomScroller() { @@ -156,6 +162,11 @@ class HomeFragment : Fragment() { } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + fun decrementApplicationUses() { if (::homeViewModel.isInitialized) { homeViewModel.getCategories().value!!.forEach { 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 57b9212b0f660e2df96d3652a34c3dc4cef57744..d350247830fb57a066222d94a9d0d5de67edf59f 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -39,12 +39,16 @@ import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.common.ApplicationListAdapter +import foundation.e.apps.databinding.FragmentSearchBinding 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!! + private lateinit var searchViewModel: SearchViewModel private var focusView: View? = null private lateinit var searchView: SearchView @@ -62,30 +66,33 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentSearchBinding.inflate(inflater, container, false) + setHasOptionsMenu(true) if (applicationManager == null) { return null } - val view = inflater.inflate(R.layout.fragment_search, container, false) - searchViewModel = ViewModelProvider(this).get(SearchViewModel::class.java) - focusView = view.findViewById(R.id.view) - searchView = view.findViewById(R.id.search_view) - recyclerView = view.findViewById(R.id.app_list) - progressBar = view.findViewById(R.id.progress_bar) - splashContainer = view.findViewById(R.id.splash_container) - var error_resolve =view.findViewById(R.id.error_resolve) - val errorContainer = view.findViewById(R.id.error_container) - val errorDescription = view.findViewById(R.id.error_description) - val loadMoreContainer = view.findViewById(R.id.load_more_container) -//set accent color to Error button (Retry ) - error_resolve.setTextColor(Color.parseColor("#ffffff")) - error_resolve.setBackgroundColor(accentColorOS) - - - error_resolve.visibility=View.GONE + + // Fragment variables + focusView = binding.view + searchView = binding.searchView + recyclerView = binding.appList + progressBar = binding.progressBar + splashContainer = binding.searchSplashLayout.splashContainer + val errorResolve = binding.errorLayout.errorResolve + val errorContainer = binding.errorLayout.errorContainer + val errorDescription = binding.errorLayout.errorDescription + val loadMoreContainer = binding.loadMoreContainer + + //set accent color to Error button (Retry ) + errorResolve.setTextColor(Color.parseColor("#ffffff")) + errorResolve.setBackgroundColor(accentColorOS) + + + errorResolve.visibility=View.GONE searchViewModel.initialise(applicationManager!!) recyclerView.visibility = View.GONE progressBar.visibility = View.GONE @@ -96,7 +103,7 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On splashContainer.visibility = View.GONE } errorContainer.visibility = View.GONE - view.findViewById(R.id.error_resolve).setOnClickListener { + errorResolve.setOnClickListener { loadMoreContainer.visibility = View.GONE progressBar.visibility = View.VISIBLE onQueryTextSubmit(searchView.query.toString()) @@ -182,7 +189,7 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On configureCloseButton(searchView) - return view + return binding.root } private fun automaticSearchMicroG() { @@ -272,6 +279,11 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On super.onResume() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + fun decrementApplicationUses() { applicationList.forEach { it.decrementUses() 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 03b2ac10074ac49f6d23d6cddbb86a743bf60c58..3dfdbfe5765c0c17a5e6a3e6f15290f08ac78488 100644 --- a/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt +++ b/app/src/main/java/foundation/e/apps/settings/AppRequestActivity.kt @@ -23,65 +23,73 @@ import android.text.TextWatcher import android.view.MenuItem import android.view.View import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import foundation.e.apps.R +import foundation.e.apps.databinding.ActivityAppRequestBinding import foundation.e.apps.settings.viewmodel.AppRequestViewModel import foundation.e.apps.utils.Error -import kotlinx.android.synthetic.main.activity_app_request.* class AppRequestActivity : AppCompatActivity(), TextWatcher { + private lateinit var binding: ActivityAppRequestBinding private lateinit var viewModel: AppRequestViewModel override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityAppRequestBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_app_request) + setContentView(binding.root) // Initialise toolbar - val toolbar = findViewById(R.id.toolbar) + val toolbar = binding.toolbar setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) viewModel = ViewModelProvider(this).get(AppRequestViewModel::class.java) - progress_bar.visibility = View.GONE - app_request_error_text_view.visibility = View.GONE - package_name_edit_text.addTextChangedListener(this) - submit_button.setOnClickListener { - package_name_edit_text.visibility = View.GONE - submit_button.visibility = View.GONE - progress_bar.visibility = View.VISIBLE - app_request_error_text_view.visibility = View.GONE + + // Activity Variables + val progressBar = binding.progressBar + val appRequestErrorTextView = binding.appRequestErrorTextView + val packageNameEditText = binding.packageNameEditText + val submitButton = binding.submitButton + + progressBar.visibility = View.GONE + appRequestErrorTextView.visibility = View.GONE + packageNameEditText.addTextChangedListener(this) + submitButton.setOnClickListener { + packageNameEditText.visibility = View.GONE + submitButton.visibility = View.GONE + progressBar.visibility = View.VISIBLE + appRequestErrorTextView.visibility = View.GONE viewModel.onSubmit(this) } // Bind enabled state of submit button to value in view model viewModel.isSubmitButtonEnabled.observe(this, Observer { if (it != null) { - submit_button.isEnabled = it + submitButton.isEnabled = it } }) // Bind to the screen error viewModel.getScreenError().observe(this, Observer { if (it != null) { - progress_bar.visibility = View.GONE + progressBar.visibility = View.GONE if (it == Error.NO_ERROR) { - package_name_edit_text.setText("") - package_name_edit_text.visibility = View.VISIBLE - submit_button.visibility = View.VISIBLE - app_request_error_text_view.visibility = View.VISIBLE - app_request_error_text_view.text = + packageNameEditText.setText("") + packageNameEditText.visibility = View.VISIBLE + submitButton.visibility = View.VISIBLE + appRequestErrorTextView.visibility = View.VISIBLE + appRequestErrorTextView.text = getString(R.string.app_request_successful_text) - app_request_error_text_view.background = getDrawable(R.drawable.success_border) + appRequestErrorTextView.background = getDrawable(R.drawable.success_border) } else { - package_name_edit_text.visibility = View.VISIBLE - submit_button.visibility = View.VISIBLE - app_request_error_text_view.visibility = View.VISIBLE - app_request_error_text_view.text = getString(it.description) - app_request_error_text_view.background = getDrawable(R.drawable.error_border) + packageNameEditText.visibility = View.VISIBLE + submitButton.visibility = View.VISIBLE + appRequestErrorTextView.visibility = View.VISIBLE + appRequestErrorTextView.text = getString(it.description) + appRequestErrorTextView.background = getDrawable(R.drawable.error_border) } - scroll_view.scrollTo(0, 0) + binding.scrollView.scrollTo(0, 0) } }) } diff --git a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt index 227d12436060afcd4f36a985a3fc549964e4012d..b57fc9f1b92dc4709b8f908317f781cd3baf5502 100644 --- a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt @@ -25,30 +25,30 @@ import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.LinearLayout import android.widget.ProgressBar -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.application.model.State import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.common.ApplicationListAdapter +import foundation.e.apps.databinding.FragmentUpdatesBinding import foundation.e.apps.updates.viewmodel.UpdatesViewModel class UpdatesFragment() : Fragment() { + private var _binding: FragmentUpdatesBinding? = null + private val binding get() = _binding!! + private lateinit var updatesViewModel: UpdatesViewModel private var applicationManager: ApplicationManager? = null private lateinit var recyclerView: RecyclerView private var applicationList = ArrayList() var accentColorOS=0; - lateinit var progressBar2:ProgressBar + lateinit var reloadProgressBar: ProgressBar fun initialise(applicationManager: ApplicationManager, accentColorOS: Int) { this.applicationManager = applicationManager @@ -56,29 +56,31 @@ class UpdatesFragment() : Fragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = FragmentUpdatesBinding.inflate(inflater, container, false) + if (applicationManager == null) { return null } - val view = inflater.inflate(R.layout.fragment_updates, container, false) - updatesViewModel = ViewModelProvider(this).get(UpdatesViewModel::class.java) - recyclerView = view.findViewById(R.id.app_list) - progressBar2 = view.findViewById(R.id.progress_bar2) - val updateAll = view.findViewById