From 70c20d03bcc99cf3830910ab20ebf8d1edc15064 Mon Sep 17 00:00:00 2001 From: AgustinMDominguez Date: Thu, 21 Oct 2021 02:09:47 -0300 Subject: [PATCH 01/14] Refactor: Improve code with good practices --- .gitignore | 2 + .idea/deploymentTargetDropDown.xml | 17 --- .idea/misc.xml | 71 ----------- .../example/myapplication/AddressFragment.kt | 111 +++++++++--------- .../{UserConfig.kt => ConfigManager.kt} | 13 +- .../com/example/myapplication/DataProduct.kt | 2 +- .../com/example/myapplication/MainActivity.kt | 2 +- .../com/example/myapplication/MenuActivity.kt | 12 +- .../example/myapplication/ProfileFragment.kt | 11 +- app/src/main/res/layout/fragment_address.xml | 16 +-- 10 files changed, 83 insertions(+), 174 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml delete mode 100644 .idea/misc.xml rename app/src/main/java/com/example/myapplication/{UserConfig.kt => ConfigManager.kt} (71%) diff --git a/.gitignore b/.gitignore index db131dc..55198ab 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml +/.idea/deploymentTargetDropDown.xml +/.idea/misc.xml .DS_Store /build /captures diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index cd7efb5..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 4ee4436..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/AddressFragment.kt b/app/src/main/java/com/example/myapplication/AddressFragment.kt index 5887fe8..cb5823e 100644 --- a/app/src/main/java/com/example/myapplication/AddressFragment.kt +++ b/app/src/main/java/com/example/myapplication/AddressFragment.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.SharedPreferences import android.content.pm.PackageManager import android.location.Geocoder +import android.location.Location import android.location.LocationManager import android.os.Bundle import android.view.LayoutInflater @@ -15,37 +16,33 @@ import android.widget.Button import android.widget.ImageView import android.widget.TextView import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat.getSystemService import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import com.google.android.material.bottomsheet.BottomSheetDialogFragment import java.util.* -class AddressFragment : BottomSheetDialogFragment() { - - +class AddressFragment: BottomSheetDialogFragment() { private lateinit var imageButtonClose :ImageView private lateinit var buttonUpdateAddress : Button private lateinit var tvActualDirection:TextView private lateinit var tvOldDirection1 : TextView private lateinit var tvOldDirection2 : TextView - private var sharedPreferences: SharedPreferences? = null + private lateinit var sharedPreferences: SharedPreferences lateinit var mFusedLocationClient: FusedLocationProviderClient - private val PERMISSION_ID = 33 + private val permissionId = 33 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_address, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - sharedPreferences = this.activity?.getSharedPreferences("org.bedu.sharedpreferences", Context.MODE_PRIVATE) + sharedPreferences = ConfigManager.prefs(requireActivity()) mFusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()) imageButtonClose = view.findViewById(R.id.imageButtonClose) @@ -56,19 +53,14 @@ class AddressFragment : BottomSheetDialogFragment() { setSharedPreferencesAddress() - imageButtonClose.setOnClickListener { - dismiss() - } - buttonUpdateAddress.setOnClickListener { - getLocation() - } - + imageButtonClose.setOnClickListener { dismiss() } + buttonUpdateAddress.setOnClickListener { getLocation() } } private fun setSharedPreferencesAddress() { - tvActualDirection.text = sharedPreferences?.getString("USER_ACTUAL_ADDRESS","") - tvOldDirection1.text = sharedPreferences?.getString("USER_OLD_ADDRESS1","") - tvOldDirection2.text = sharedPreferences?.getString("USER_OLD_ADDRESS2","") + tvActualDirection.text = sharedPreferences.getString("USER_ACTUAL_ADDRESS","") + tvOldDirection1.text = sharedPreferences.getString("USER_OLD_ADDRESS1","") + tvOldDirection2.text = sharedPreferences.getString("USER_OLD_ADDRESS2","") } @@ -76,61 +68,68 @@ class AddressFragment : BottomSheetDialogFragment() { private fun getLocation() { if (checkPermissions()) { if (isLocationEnabled()) { - - mFusedLocationClient.lastLocation.addOnSuccessListener(requireActivity()) { location -> - - val geocoder = Geocoder(requireContext(), Locale.getDefault()) - val addresses = location?.latitude?.let { - geocoder.getFromLocation( - it?.toDouble(), - location?.longitude.toDouble(), - 1 - ) - } - val actualAddress = addresses?.get(0)?.getAddressLine(0) - if(tvActualDirection.text.toString() != actualAddress){ - tvOldDirection2.text = tvOldDirection1.text.toString() - tvOldDirection1.text = tvActualDirection.text.toString() - tvActualDirection.text = actualAddress - sharedPreferences?.edit() - ?.putString("USER_ACTUAL_ADDRESS",tvActualDirection.text.toString()) - ?.putString("USER_OLD_ADDRESS1",tvOldDirection1.text.toString()) - ?.putString("USER_OLD_ADDRESS2",tvOldDirection2.text.toString()) - ?.apply() - } - } + mFusedLocationClient + .lastLocation + .addOnSuccessListener(getLocationSuccessListener()) } - } else{ + } + else { requestPermissions() } } + private fun getLocationSuccessListener(): ((Location) -> Unit) { + return { location: Location -> + val geocoder = Geocoder(requireContext(), Locale.getDefault()) + val addresses = location.latitude.let { + geocoder.getFromLocation( + it.toDouble(), + location.longitude.toDouble(), + 1 + ) + } + val actualAddress = addresses?.get(0)?.getAddressLine(0) + if (tvActualDirection.text.toString() != actualAddress) { + tvOldDirection2.text = tvOldDirection1.text.toString() + tvOldDirection1.text = tvActualDirection.text.toString() + tvActualDirection.text = actualAddress + sharedPreferences.edit() + .putString("USER_ACTUAL_ADDRESS",tvActualDirection.text.toString()) + .putString("USER_OLD_ADDRESS1",tvOldDirection1.text.toString()) + .putString("USER_OLD_ADDRESS2",tvOldDirection2.text.toString()) + .apply() + } + } + } + private fun isLocationEnabled(): Boolean { - var locationManager: LocationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager - return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( - LocationManager.NETWORK_PROVIDER - ) + val locationManager: LocationManager = requireActivity() + .getSystemService(Context.LOCATION_SERVICE) as LocationManager + val isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) + val isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) + return isGpsEnabled || isNetworkEnabled } private fun requestPermissions() { ActivityCompat.requestPermissions( requireActivity(), - arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION), - PERMISSION_ID + arrayOf( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION + ), + permissionId ) } private fun checkPermissions(): Boolean { - if ( checkGranted(Manifest.permission.ACCESS_COARSE_LOCATION) && - checkGranted(Manifest.permission.ACCESS_COARSE_LOCATION) ){ - return true - } - return false + val isFineLocationGranted = checkGranted(Manifest.permission.ACCESS_FINE_LOCATION) + val isCoarseLocationGranted = checkGranted(Manifest.permission.ACCESS_COARSE_LOCATION) + return isFineLocationGranted || isCoarseLocationGranted } - private fun checkGranted(permission: String): Boolean{ - return ActivityCompat.checkSelfPermission(requireContext(), permission) == PackageManager.PERMISSION_GRANTED + private fun checkGranted(permission: String): Boolean { + val selfPermission = ActivityCompat.checkSelfPermission(requireContext(), permission) + return selfPermission == PackageManager.PERMISSION_GRANTED } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/UserConfig.kt b/app/src/main/java/com/example/myapplication/ConfigManager.kt similarity index 71% rename from app/src/main/java/com/example/myapplication/UserConfig.kt rename to app/src/main/java/com/example/myapplication/ConfigManager.kt index 1f3a86c..d7c3df5 100644 --- a/app/src/main/java/com/example/myapplication/UserConfig.kt +++ b/app/src/main/java/com/example/myapplication/ConfigManager.kt @@ -1,19 +1,28 @@ package com.example.myapplication +import android.app.Activity import android.content.Context +import android.content.SharedPreferences import androidx.preference.PreferenceManager -class UserConfig { +class ConfigManager { companion object { private const val IS_DARK_THEME_DEFAULT: Boolean = true - fun setTheme(context: Context, isDark: Boolean) { + private fun setTheme(context: Context, isDark: Boolean) { val userPreferences = PreferenceManager.getDefaultSharedPreferences(context) val darkThemePrefKey = context.getString((R.string.pref_key_DARK_THEME)) userPreferences.edit().putBoolean(darkThemePrefKey, isDark).apply() } + fun prefs(activity: Activity): SharedPreferences { + return activity.getSharedPreferences( + activity.getString(R.string.login_shared_preference_file), + Context.MODE_PRIVATE + ) + } + fun isDarkTheme(context: Context): Boolean { val userPrefs = PreferenceManager.getDefaultSharedPreferences(context) val darkThemePrefKey = context.getString((R.string.pref_key_DARK_THEME)) diff --git a/app/src/main/java/com/example/myapplication/DataProduct.kt b/app/src/main/java/com/example/myapplication/DataProduct.kt index a8b1bc9..e9baded 100644 --- a/app/src/main/java/com/example/myapplication/DataProduct.kt +++ b/app/src/main/java/com/example/myapplication/DataProduct.kt @@ -12,7 +12,7 @@ data class DataProduct( val category: String, val image: String, val rating: Rating -):Parcelable { +): Parcelable { constructor(parcel: Parcel) : this( parcel.readInt(), parcel.readString().toString(), diff --git a/app/src/main/java/com/example/myapplication/MainActivity.kt b/app/src/main/java/com/example/myapplication/MainActivity.kt index 882df3c..a352068 100644 --- a/app/src/main/java/com/example/myapplication/MainActivity.kt +++ b/app/src/main/java/com/example/myapplication/MainActivity.kt @@ -18,7 +18,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.setTheme(UserConfig.getThemeResourceId(this)) + this.setTheme(ConfigManager.getThemeResourceId(this)) val sharedPreferences = this.getSharedPreferences( getString(R.string.login_shared_preference_file), Context.MODE_PRIVATE diff --git a/app/src/main/java/com/example/myapplication/MenuActivity.kt b/app/src/main/java/com/example/myapplication/MenuActivity.kt index b719e70..54b8f08 100644 --- a/app/src/main/java/com/example/myapplication/MenuActivity.kt +++ b/app/src/main/java/com/example/myapplication/MenuActivity.kt @@ -2,12 +2,10 @@ package com.example.myapplication import android.animation.Animator import android.animation.AnimatorListenerAdapter -import android.content.Context import android.content.Intent import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View @@ -15,14 +13,6 @@ import android.widget.Toast import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import okhttp3.* -import okhttp3.internal.threadFactory -import org.json.JSONObject -import java.io.IOException class MenuActivity : AppCompatActivity() { private val helpUrl = "https://www.bedu.org/" @@ -31,7 +21,7 @@ class MenuActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.setTheme(UserConfig.getThemeResourceId(this)) + this.setTheme(ConfigManager.getThemeResourceId(this)) setContentView(R.layout.activity_menu) menuNavigationBottom = findViewById(R.id.bottomNavigationView) setupNavController() diff --git a/app/src/main/java/com/example/myapplication/ProfileFragment.kt b/app/src/main/java/com/example/myapplication/ProfileFragment.kt index 2fbe0cc..9d489da 100644 --- a/app/src/main/java/com/example/myapplication/ProfileFragment.kt +++ b/app/src/main/java/com/example/myapplication/ProfileFragment.kt @@ -40,9 +40,9 @@ class ProfileFragment : Fragment() { userImage = view.findViewById(R.id.user_shapeable_image) userEmail = view.findViewById(R.id.user_email) themeSwitch = view.findViewById(R.id.theme_switch) - themeSwitch.isChecked = UserConfig.isDarkTheme(requireContext()) + themeSwitch.isChecked = ConfigManager.isDarkTheme(requireContext()) themeSwitch.setOnCheckedChangeListener { _, _ -> - activity?.applicationContext?.let { UserConfig.switchTheme(it) } + activity?.applicationContext?.let { ConfigManager.switchTheme(it) } activity?.recreate() } @@ -90,13 +90,10 @@ class ProfileFragment : Fragment() { private fun getOptionsClickListener(): (String) -> Unit { return { when (it) { - "Mis direcciones" -> { + getString(R.string.my_address) -> { val addressFragment = AddressFragment() addressFragment.show(parentFragmentManager, "fragment") - } - - else -> { - } + } else -> {} } } } diff --git a/app/src/main/res/layout/fragment_address.xml b/app/src/main/res/layout/fragment_address.xml index ff2bc7d..dbde761 100644 --- a/app/src/main/res/layout/fragment_address.xml +++ b/app/src/main/res/layout/fragment_address.xml @@ -1,5 +1,6 @@ - @@ -53,7 +54,7 @@ android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textColor="@color/black" - android:textSize="23dp" + android:textSize="23sp" android:textStyle="normal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.441" @@ -77,7 +78,7 @@ android:text="@string/update" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textColor="@color/black" - android:textSize="18dp" + android:textSize="18sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.502" @@ -118,7 +119,7 @@ android:id="@+id/tvOldDirection1" android:layout_width="0dp" android:layout_height="wrap_content" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="normal" android:layout_marginTop="30dp" app:layout_constraintEnd_toStartOf="@+id/guideline7" @@ -129,7 +130,7 @@ android:id="@+id/tvOldDirection2" android:layout_width="0dp" android:layout_height="wrap_content" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="normal" android:layout_marginTop="30dp" android:layout_marginBottom="30dp" @@ -137,5 +138,4 @@ app:layout_constraintEnd_toStartOf="@+id/guideline7" app:layout_constraintStart_toStartOf="@+id/guideline8" app:layout_constraintTop_toBottomOf="@+id/tvOldDirection1" /> - \ No newline at end of file From 19b9446eff2eb09839087adaac1e1220d3b5007c Mon Sep 17 00:00:00 2001 From: AgustinMDominguez Date: Thu, 21 Oct 2021 02:40:07 -0300 Subject: [PATCH 02/14] Refactor APIService DataProduct DbProduct ProfileFragment and Rating --- .../com/example/myapplication/APIService.kt | 9 +++--- .../com/example/myapplication/DataProduct.kt | 4 +-- .../com/example/myapplication/DbProduct.kt | 4 +-- .../example/myapplication/ProfileFragment.kt | 28 ++++++++----------- .../java/com/example/myapplication/Rating.kt | 4 +-- 5 files changed, 19 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/example/myapplication/APIService.kt b/app/src/main/java/com/example/myapplication/APIService.kt index 418f6ef..18a3556 100644 --- a/app/src/main/java/com/example/myapplication/APIService.kt +++ b/app/src/main/java/com/example/myapplication/APIService.kt @@ -7,10 +7,7 @@ import retrofit2.http.* import retrofit2.http.PUT - - interface APIService { - @GET suspend fun getProducts(@Url url:String): Response> @@ -19,6 +16,8 @@ interface APIService { @FormUrlEncoded @POST("api/login") - suspend fun loginUser(@Field("email") email:String, - @Field("password")password:String):Response + suspend fun loginUser( + @Field("email") email:String, + @Field("password") password:String + ): Response } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/DataProduct.kt b/app/src/main/java/com/example/myapplication/DataProduct.kt index e9baded..d433c3e 100644 --- a/app/src/main/java/com/example/myapplication/DataProduct.kt +++ b/app/src/main/java/com/example/myapplication/DataProduct.kt @@ -24,9 +24,7 @@ data class DataProduct( ) { } - override fun describeContents(): Int { - TODO("Not yet implemented") - } + override fun describeContents(): Int = 0 override fun writeToParcel(parcel: Parcel, p1: Int) { parcel.writeInt(id) diff --git a/app/src/main/java/com/example/myapplication/DbProduct.kt b/app/src/main/java/com/example/myapplication/DbProduct.kt index c14761a..7b4c7d0 100644 --- a/app/src/main/java/com/example/myapplication/DbProduct.kt +++ b/app/src/main/java/com/example/myapplication/DbProduct.kt @@ -29,9 +29,7 @@ open class Product(): RealmObject(), Parcelable { amountAddedToCart = parcel.readInt() } - override fun describeContents(): Int { - TODO("Not yet implemented") - } + override fun describeContents(): Int = 0 override fun writeToParcel(parcel: Parcel, p1: Int) { parcel.writeInt(id ?: -1) diff --git a/app/src/main/java/com/example/myapplication/ProfileFragment.kt b/app/src/main/java/com/example/myapplication/ProfileFragment.kt index 9d489da..ae4f164 100644 --- a/app/src/main/java/com/example/myapplication/ProfileFragment.kt +++ b/app/src/main/java/com/example/myapplication/ProfileFragment.kt @@ -22,8 +22,7 @@ class ProfileFragment : Fragment() { private lateinit var userFirstName : TextView private lateinit var userImage : ShapeableImageView private lateinit var userEmail : TextView - private var sharedPreferences: SharedPreferences? = null - + private lateinit var sharedPreferences: SharedPreferences private lateinit var closeSession: Button override fun onCreateView( @@ -47,31 +46,28 @@ class ProfileFragment : Fragment() { } closeSession = view.findViewById(R.id.buttonCloseSession) + closeSession.setOnClickListener { closeSession() } recycler.adapter = OptionAdapter( getOptionsClickListener(), getProfileOptions()) recycler.layoutManager = LinearLayoutManager(activity) - sharedPreferences = - this.activity?.getSharedPreferences( - "org.bedu.sharedpreferences", - Context.MODE_PRIVATE - ) - - closeSession.setOnClickListener { closeSession() } + sharedPreferences = ConfigManager.prefs(requireActivity()) setUserData() - } private fun setUserData(){ - userFirstName.setText(sharedPreferences?.getString("USER_FIRST_NAME","Janet")) - userEmail.setText(sharedPreferences?.getString("USER_EMAIL","janet.weaver@reqres.in")) - Picasso.get().load(sharedPreferences?.getString("USER_AVATAR","https://reqres.in/img/faces/2-image.jpg")).into(userImage) + userFirstName.text = sharedPreferences.getString("USER_FIRST_NAME", "Janet") + userEmail.text = sharedPreferences.getString("USER_EMAIL", "janet.weaver@reqres.in") + Picasso.get().load( + sharedPreferences.getString( + "USER_AVATAR", + "https://reqres.in/img/faces/2-image.jpg" + ) + ).into(userImage) } private fun closeSession(){ - sharedPreferences?.edit() - ?.putBoolean("USER_ACCESS",false) - ?.apply() + sharedPreferences.edit().putBoolean("USER_ACCESS",false).apply() findNavController().navigate( R.id.action_profileFragment_to_mainActivity, null diff --git a/app/src/main/java/com/example/myapplication/Rating.kt b/app/src/main/java/com/example/myapplication/Rating.kt index c7f64d4..1538a9a 100644 --- a/app/src/main/java/com/example/myapplication/Rating.kt +++ b/app/src/main/java/com/example/myapplication/Rating.kt @@ -10,9 +10,7 @@ class Rating(val rate:Float,val count:Int) : Parcelable { ) { } - override fun describeContents(): Int { - TODO("Not yet implemented") - } + override fun describeContents(): Int = 0 override fun writeToParcel(parcel: Parcel, p1: Int) { parcel.writeFloat(rate) From 9d513622610151396bd829a0d7030bee8cc02a1f Mon Sep 17 00:00:00 2001 From: AgustinMDominguez Date: Thu, 21 Oct 2021 03:16:18 -0300 Subject: [PATCH 03/14] Refactor HomeFragment and RegisterFragment --- .../com/example/myapplication/HomeFragment.kt | 96 ++++++++---------- .../example/myapplication/RegisterFragment.kt | 98 +++++++------------ 2 files changed, 80 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/com/example/myapplication/HomeFragment.kt b/app/src/main/java/com/example/myapplication/HomeFragment.kt index 0394d3a..d9cad43 100644 --- a/app/src/main/java/com/example/myapplication/HomeFragment.kt +++ b/app/src/main/java/com/example/myapplication/HomeFragment.kt @@ -1,9 +1,6 @@ package com.example.myapplication -import android.content.Context -import android.content.SharedPreferences import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -22,35 +19,26 @@ import retrofit2.converter.gson.GsonConverterFactory class HomeFragment : Fragment() { - private lateinit var recycler: RecyclerView private lateinit var homeProgressBar: ProgressBar - private lateinit var sharedPreferences: SharedPreferences private val baseUrl = "https://fakestoreapi.com/" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - recycler = view.findViewById(R.id.productRecyclerView) homeProgressBar = view.findViewById(R.id.homeProgressBar) - sharedPreferences = requireActivity().getSharedPreferences( - getString(R.string.login_shared_preference_file), - Context.MODE_PRIVATE - ) getProducts(view) } private fun loadProductsSuccessfully(view:View, products : List){ - val clickListener: (Product, FragmentNavigator.Extras) -> Unit = { - product, extras -> + val clickListener: (Product, FragmentNavigator.Extras) -> Unit = { product, extras -> val action = HomeFragmentDirections.actionHomeFragmentToProductDetailFragment(product) Navigation.findNavController(view).navigate(action,extras) } @@ -60,6 +48,7 @@ class HomeFragment : Fragment() { homeProgressBar.visibility = View.INVISIBLE } + private fun getRetrofit():Retrofit{ return Retrofit.Builder() .baseUrl(baseUrl) @@ -67,52 +56,51 @@ class HomeFragment : Fragment() { .build() } - private fun fetchFromAPI() { - - } - - private fun getProducts(view: View){ - val isFetched: Boolean = sharedPreferences + private fun getProducts(view: View) { + val isFetched: Boolean = ConfigManager.prefs(requireActivity()) .getBoolean(getString(R.string.pref_is_database_fetched), false) if (isFetched) { loadProductsSuccessfully(view, ProductDatabase.fetchAllProducts()) } else { - CoroutineScope(Dispatchers.IO).launch { - val call = getRetrofit().create(APIService::class.java).getProducts("products") - val productsReceived = call.body() - activity?.runOnUiThread{ - if(call.isSuccessful) { - productsReceived?.forEach { - Log.v("MYDEBUG", it.toString()) - val amountAddedToCart = ProductDatabase - .fetchProduct(it.id) - ?.amountAddedToCart - ?: 0 - ProductDatabase.addProduct( - it.id, - it.title, - it.price, - it.description, - it.category, - it.image, - it.rating.count, - it.rating.rate, - amountAddedToCart - ) - } - sharedPreferences.edit().putBoolean( - getString(R.string.pref_is_database_fetched), - true - ).apply() - loadProductsSuccessfully(view, ProductDatabase.fetchAllProducts()) - } - else { - Toast.makeText( - requireContext(), - "Error al solicitar productos", - Toast.LENGTH_SHORT - ).show() + loadProductsFromAPI(view) + } + } + + private fun loadProductsFromAPI(view: View) { + CoroutineScope(Dispatchers.IO).launch { + val call = getRetrofit().create(APIService::class.java).getProducts("products") + val productsReceived = call.body() + activity?.runOnUiThread { + if(call.isSuccessful) { + productsReceived?.forEach { + val amountAddedToCart = ProductDatabase + .fetchProduct(it.id) + ?.amountAddedToCart + ?: 0 + ProductDatabase.addProduct( + it.id, + it.title, + it.price, + it.description, + it.category, + it.image, + it.rating.count, + it.rating.rate, + amountAddedToCart + ) } + ConfigManager.prefs(requireActivity()).edit().putBoolean( + getString(R.string.pref_is_database_fetched), + true + ).apply() + loadProductsSuccessfully(view, ProductDatabase.fetchAllProducts()) + } + else { + Toast.makeText( + requireContext(), + "Error al solicitar productos", + Toast.LENGTH_SHORT + ).show() } } } diff --git a/app/src/main/java/com/example/myapplication/RegisterFragment.kt b/app/src/main/java/com/example/myapplication/RegisterFragment.kt index 25cac81..4efab47 100644 --- a/app/src/main/java/com/example/myapplication/RegisterFragment.kt +++ b/app/src/main/java/com/example/myapplication/RegisterFragment.kt @@ -1,7 +1,5 @@ package com.example.myapplication -import android.content.Context -import android.content.SharedPreferences import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater @@ -16,17 +14,16 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout class RegisterFragment : Fragment() { - private lateinit var registerButton : MaterialButton - private lateinit var regFormUser : TextInputLayout - private lateinit var regFormEmail : TextInputLayout - private lateinit var regFormPhone : TextInputLayout - private lateinit var regFormPassword : TextInputLayout - private lateinit var nameInputText : TextInputEditText - private lateinit var emailInputText : TextInputEditText - private lateinit var phoneInputText : TextInputEditText - private lateinit var passwordInputText : TextInputEditText - private var sharedPreferences : SharedPreferences? = null - + private lateinit var registerButton: MaterialButton + private lateinit var regFormUser: TextInputLayout + private lateinit var regFormEmail: TextInputLayout + private lateinit var regFormPhone: TextInputLayout + private lateinit var regFormPassword: TextInputLayout + private lateinit var nameInputText: TextInputEditText + private lateinit var emailInputText: TextInputEditText + private lateinit var phoneInputText: TextInputEditText + private lateinit var passwordInputText: TextInputEditText + private lateinit var inputMap: Map private val isFormValid: () -> Boolean = { !(regFormUser.editText?.text.isNullOrEmpty() || @@ -39,7 +36,6 @@ class RegisterFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_register, container, false) } @@ -56,65 +52,47 @@ class RegisterFragment : Fragment() { phoneInputText = view.findViewById(R.id.phoneInputText) passwordInputText = view.findViewById(R.id.passwordInputText) - sharedPreferences = requireContext().getSharedPreferences( - getString(R.string.login_shared_preference_file), - Context.MODE_PRIVATE + inputMap = mapOf( + nameInputText to regFormUser, + emailInputText to regFormEmail, + phoneInputText to regFormPhone, + passwordInputText to regFormPassword ) - setTextChangeActions() - setClickListeners(view) - - } - - - private fun setTextChangeActions(){ - nameInputText.doOnTextChanged { text,_,_,_ -> - if(text!!.isNotEmpty()){ - regFormUser.error = null - } - } - emailInputText.doOnTextChanged { text,_,_,_ -> - if(text!!.isNotEmpty()){ - regFormEmail.error = null - } - } - phoneInputText.doOnTextChanged { text,_,_,_ -> - if(text!!.isNotEmpty()){ - regFormPhone.error = null - } - } - passwordInputText.doOnTextChanged { text,_,_,_ -> - if(text!!.isNotEmpty()){ - regFormPassword.error = null + for ((inputEditText, _) in inputMap) { + inputEditText.doOnTextChanged { text, _, _, _ -> + if (!text.isNullOrEmpty()) { inputEditText.error = null } } } + setClickListeners(view) } private fun setClickListeners(view: View){ registerButton.setOnClickListener { - if(isFormValid()) { - - sharedPreferences?.edit() - ?.putString("USER_EMAIL", emailInputText.text.toString()) - ?.putString("USER_PASSWORD", passwordInputText.text.toString()) - ?.apply() - + if (isFormValid()) { + ConfigManager.prefs(requireActivity()).edit() + .putString("USER_EMAIL", emailInputText.text.toString()) + .putString("USER_PASSWORD", passwordInputText.text.toString()) + .apply() val action = RegisterFragmentDirections.actionRegisterFragment2ToLoginFragment2() Navigation.findNavController(view).navigate(action) - - } else { - if(nameInputText.text.isNullOrEmpty()){regFormUser.error=getString(R.string.notice_incomplete_field)} - if(emailInputText.text.isNullOrEmpty()){regFormEmail.error=getString(R.string.notice_incomplete_field)} - if(phoneInputText.text.isNullOrEmpty()){regFormPhone.error=getString(R.string.notice_incomplete_field)} - if(passwordInputText.text.isNullOrEmpty()){regFormPassword.error=getString(R.string.notice_incomplete_field)} - - Snackbar.make(view, getString(R.string.notice_in_complete_fields), Snackbar.LENGTH_SHORT) + } + else { + for ((inputEditText, inputEditLayout) in inputMap) { + if (inputEditText.text.isNullOrEmpty()) { + inputEditLayout.error = getString(R.string.notice_incomplete_field) + } + } + + Snackbar.make( + view, + getString(R.string.notice_in_complete_fields), + Snackbar.LENGTH_SHORT + ) .setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_FADE) .setAction(getString(R.string.snack_bar_button)){}.show() } } } - - -} \ No newline at end of file +} From 6e1538104666b94bc1862b3a1e571064ad45c53a Mon Sep 17 00:00:00 2001 From: AgustinMDominguez Date: Thu, 21 Oct 2021 03:34:36 -0300 Subject: [PATCH 04/14] Refactor Logged in preferente into a LoginManager --- .../example/myapplication/LoginFragment.kt | 12 ++++++------ .../com/example/myapplication/LoginManager.kt | 19 +++++++++++++++++++ .../com/example/myapplication/MainActivity.kt | 13 +------------ .../example/myapplication/ProfileFragment.kt | 10 +--------- 4 files changed, 27 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/example/myapplication/LoginManager.kt diff --git a/app/src/main/java/com/example/myapplication/LoginFragment.kt b/app/src/main/java/com/example/myapplication/LoginFragment.kt index 3baa32e..d4b8319 100644 --- a/app/src/main/java/com/example/myapplication/LoginFragment.kt +++ b/app/src/main/java/com/example/myapplication/LoginFragment.kt @@ -171,7 +171,7 @@ class LoginFragment : Fragment() { activity?.runOnUiThread { if(call.isSuccessful) { - if(userReceived?.data?.email == userEmail) { + if (userReceived?.data?.email == userEmail) { savedSharedPreferencesUser(userReceived) } } @@ -185,10 +185,10 @@ class LoginFragment : Fragment() { private fun savedSharedPreferencesUser(user : User){ sharedPreferences.edit() - ?.putBoolean("USER_ACCESS", true) - ?.putString("USER_EMAIL", user.data.email) - ?.putString("USER_AVATAR", user.data.avatar) - ?.putString("USER_FIRST_NAME", user.data.first_name) - ?.apply() + .putString("USER_EMAIL", user.data.email) + .putString("USER_AVATAR", user.data.avatar) + .putString("USER_FIRST_NAME", user.data.first_name) + .apply() + LoginManager.logIn(requireActivity()) } } diff --git a/app/src/main/java/com/example/myapplication/LoginManager.kt b/app/src/main/java/com/example/myapplication/LoginManager.kt new file mode 100644 index 0000000..32cad4b --- /dev/null +++ b/app/src/main/java/com/example/myapplication/LoginManager.kt @@ -0,0 +1,19 @@ +package com.example.myapplication + +import android.app.Activity + +object LoginManager { + private const val LOGIN_KEY = "org.bedu.app.LoginManager.LOGIN_PREF_KEY" + + private fun setLogin(activity: Activity, loggedIn: Boolean) { + ConfigManager.prefs(activity).edit().putBoolean(LOGIN_KEY,loggedIn).apply() + } + + fun isLoggedIn(activity: Activity): Boolean { + return ConfigManager.prefs(activity).getBoolean(LOGIN_KEY, false) + } + + fun logIn(activity: Activity) = setLogin(activity, true) + + fun logOut(activity: Activity) = setLogin(activity, false) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/MainActivity.kt b/app/src/main/java/com/example/myapplication/MainActivity.kt index a352068..9539f1a 100644 --- a/app/src/main/java/com/example/myapplication/MainActivity.kt +++ b/app/src/main/java/com/example/myapplication/MainActivity.kt @@ -9,21 +9,10 @@ import io.realm.Realm import io.realm.RealmResults class MainActivity : AppCompatActivity() { - val realm: Realm = Realm.getDefaultInstance() - val products: RealmResults = realm.where(Product::class.java).findAll() - init { - Log.d("MYDEBUG","$products") - } - - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.setTheme(ConfigManager.getThemeResourceId(this)) - val sharedPreferences = this.getSharedPreferences( - getString(R.string.login_shared_preference_file), - Context.MODE_PRIVATE - ) - if(sharedPreferences.getBoolean("USER_ACCESS", false)) { + if (LoginManager.isLoggedIn(this)) { val intent = Intent(this, MenuActivity::class.java) startActivity(intent) } diff --git a/app/src/main/java/com/example/myapplication/ProfileFragment.kt b/app/src/main/java/com/example/myapplication/ProfileFragment.kt index ae4f164..2304fb9 100644 --- a/app/src/main/java/com/example/myapplication/ProfileFragment.kt +++ b/app/src/main/java/com/example/myapplication/ProfileFragment.kt @@ -46,7 +46,7 @@ class ProfileFragment : Fragment() { } closeSession = view.findViewById(R.id.buttonCloseSession) - closeSession.setOnClickListener { closeSession() } + closeSession.setOnClickListener { LoginManager.logOut(requireActivity()) } recycler.adapter = OptionAdapter( getOptionsClickListener(), getProfileOptions()) recycler.layoutManager = LinearLayoutManager(activity) @@ -66,14 +66,6 @@ class ProfileFragment : Fragment() { ).into(userImage) } - private fun closeSession(){ - sharedPreferences.edit().putBoolean("USER_ACCESS",false).apply() - findNavController().navigate( - R.id.action_profileFragment_to_mainActivity, - null - ) - } - private fun getProfileOptions():List