From a06b8f70398c016dbbb0a50e165e5ea9521f8bdf Mon Sep 17 00:00:00 2001 From: GeorgCantor Date: Mon, 5 Apr 2021 12:45:27 +0300 Subject: [PATCH 1/3] Reduce amount of code --- .../uamp/automotive/PinCodeSignInFragment.kt | 9 +--- .../uamp/automotive/QrCodeSignInFragment.kt | 47 ++++++------------- .../uamp/automotive/SettingsActivity.kt | 4 +- 3 files changed, 16 insertions(+), 44 deletions(-) diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/PinCodeSignInFragment.kt b/automotive/src/main/java/com/example/android/uamp/automotive/PinCodeSignInFragment.kt index a364610fc..d98ac612d 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/PinCodeSignInFragment.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/PinCodeSignInFragment.kt @@ -36,7 +36,7 @@ import androidx.lifecycle.ViewModelProvider *

This screen serves as a demo for UI best practices for PIN code sign in. Sign in implementation * will be app specific and is not included. */ -class PinCodeSignInFragment : Fragment() { +class PinCodeSignInFragment : Fragment(R.layout.pin_sign_in) { private lateinit var toolbar: Toolbar private lateinit var appIcon: ImageView @@ -45,13 +45,6 @@ class PinCodeSignInFragment : Fragment() { private lateinit var pinCodeContainer: ViewGroup private lateinit var footerTextView: TextView - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.pin_sign_in, container, false) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val context = requireContext() diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt index de93f185a..5a31ef212 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt @@ -18,15 +18,17 @@ package com.example.android.uamp.automotive import android.os.Bundle import android.text.method.LinkMovementMethod -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat.getDrawable import androidx.core.text.HtmlCompat import androidx.fragment.app.Fragment import com.bumptech.glide.Glide +import kotlinx.android.synthetic.main.qr_sign_in.app_icon +import kotlinx.android.synthetic.main.qr_sign_in.footer +import kotlinx.android.synthetic.main.qr_sign_in.primary_message +import kotlinx.android.synthetic.main.qr_sign_in.qr_code +import kotlinx.android.synthetic.main.qr_sign_in.secondary_message +import kotlinx.android.synthetic.main.qr_sign_in.toolbar /** * Fragment that is used to facilitate QR code sign-in. Users scan a QR code rendered by this @@ -35,47 +37,26 @@ import com.bumptech.glide.Glide *

This screen serves as a demo for UI best practices for QR code sign in. Sign in implementation * will be app specific and is not included. */ -class QrCodeSignInFragment : Fragment() { - - private lateinit var toolbar: Toolbar - private lateinit var appIcon: ImageView - private lateinit var primaryTextView: TextView - private lateinit var secondaryTextView: TextView - private lateinit var qrCode: ImageView - private lateinit var footerTextView: TextView - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.qr_sign_in, container, false) - } +class QrCodeSignInFragment : Fragment(R.layout.qr_sign_in) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val context = requireContext() - toolbar = view.findViewById(R.id.toolbar) - appIcon = view.findViewById(R.id.app_icon) - primaryTextView = view.findViewById(R.id.primary_message) - secondaryTextView = view.findViewById(R.id.secondary_message) - qrCode = view.findViewById(R.id.qr_code) - footerTextView = view.findViewById(R.id.footer) - toolbar.setNavigationOnClickListener { requireActivity().supportFragmentManager.popBackStack() } - appIcon.setImageDrawable(context.getDrawable(R.drawable.aural_logo)) - primaryTextView.text = getString(R.string.qr_sign_in_primary_text) - secondaryTextView.text = getString(R.string.qr_sign_in_secondary_text) + app_icon.setImageDrawable(getDrawable(requireContext(), R.drawable.aural_logo)) + primary_message.text = getString(R.string.qr_sign_in_primary_text) + secondary_message.text = getString(R.string.qr_sign_in_secondary_text) // Links in footer text should be clickable. - footerTextView.text = HtmlCompat.fromHtml( + footer.text = HtmlCompat.fromHtml( context.getString(R.string.sign_in_footer), HtmlCompat.FROM_HTML_MODE_LEGACY ) - footerTextView.movementMethod = LinkMovementMethod.getInstance() + footer.movementMethod = LinkMovementMethod.getInstance() setQrCode(getString(R.string.qr_code_url)) } @@ -86,6 +67,6 @@ class QrCodeSignInFragment : Fragment() { * @param code The QR code to display. */ private fun setQrCode(url: String) { - Glide.with(this).load(url).into(qrCode) + Glide.with(this).load(url).into(qr_code) } } diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt index 6d74507ae..5f59be0ce 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt @@ -18,20 +18,18 @@ package com.example.android.uamp.automotive import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar +import kotlinx.android.synthetic.main.activity_settings.toolbar /** * This class exposes application settings * for integration with MediaCenter in Android Automotive. */ class SettingsActivity : AppCompatActivity() { - private lateinit var toolbar: Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) - toolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) supportActionBar?.setHomeButtonEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true) From 5c39010df87774d71f34900f966dec12bca946ea Mon Sep 17 00:00:00 2001 From: GeorgCantor Date: Thu, 8 Apr 2021 17:45:24 +0300 Subject: [PATCH 2/3] Add ViewBinding to QrCodeSignInFragment, SettingsActivity --- automotive/build.gradle | 4 +++ .../uamp/automotive/QrCodeSignInFragment.kt | 30 +++++++++++-------- .../uamp/automotive/SettingsActivity.kt | 9 ++++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/automotive/build.gradle b/automotive/build.gradle index 83101b6e1..1156851d5 100644 --- a/automotive/build.gradle +++ b/automotive/build.gradle @@ -34,6 +34,10 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + buildFeatures { + viewBinding true + } + compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt index 5a31ef212..807c7e1eb 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt @@ -23,12 +23,7 @@ import androidx.core.content.ContextCompat.getDrawable import androidx.core.text.HtmlCompat import androidx.fragment.app.Fragment import com.bumptech.glide.Glide -import kotlinx.android.synthetic.main.qr_sign_in.app_icon -import kotlinx.android.synthetic.main.qr_sign_in.footer -import kotlinx.android.synthetic.main.qr_sign_in.primary_message -import kotlinx.android.synthetic.main.qr_sign_in.qr_code -import kotlinx.android.synthetic.main.qr_sign_in.secondary_message -import kotlinx.android.synthetic.main.qr_sign_in.toolbar +import com.example.android.uamp.automotive.databinding.QrSignInBinding /** * Fragment that is used to facilitate QR code sign-in. Users scan a QR code rendered by this @@ -39,34 +34,43 @@ import kotlinx.android.synthetic.main.qr_sign_in.toolbar */ class QrCodeSignInFragment : Fragment(R.layout.qr_sign_in) { + private var binding: QrSignInBinding? = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding = QrSignInBinding.bind(view) + val context = requireContext() - toolbar.setNavigationOnClickListener { + binding?.toolbar?.setNavigationOnClickListener { requireActivity().supportFragmentManager.popBackStack() } - app_icon.setImageDrawable(getDrawable(requireContext(), R.drawable.aural_logo)) - primary_message.text = getString(R.string.qr_sign_in_primary_text) - secondary_message.text = getString(R.string.qr_sign_in_secondary_text) + binding?.appIcon?.setImageDrawable(getDrawable(requireContext(), R.drawable.aural_logo)) + binding?.primaryMessage?.text = getString(R.string.qr_sign_in_primary_text) + binding?.secondaryMessage?.text = getString(R.string.qr_sign_in_secondary_text) // Links in footer text should be clickable. - footer.text = HtmlCompat.fromHtml( + binding?.footer?.text = HtmlCompat.fromHtml( context.getString(R.string.sign_in_footer), HtmlCompat.FROM_HTML_MODE_LEGACY ) - footer.movementMethod = LinkMovementMethod.getInstance() + binding?.footer?.movementMethod = LinkMovementMethod.getInstance() setQrCode(getString(R.string.qr_code_url)) } + override fun onDestroy() { + super.onDestroy() + binding = null + } + /** * Sets the QR code rendered on this sign in screen. * * @param code The QR code to display. */ private fun setQrCode(url: String) { - Glide.with(this).load(url).into(qr_code) + binding?.qrCode?.let { Glide.with(this).load(url).into(it) } } } diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt index 5f59be0ce..e4c280f37 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt @@ -18,7 +18,7 @@ package com.example.android.uamp.automotive import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import kotlinx.android.synthetic.main.activity_settings.toolbar +import com.example.android.uamp.automotive.databinding.ActivitySettingsBinding /** * This class exposes application settings @@ -26,11 +26,14 @@ import kotlinx.android.synthetic.main.activity_settings.toolbar */ class SettingsActivity : AppCompatActivity() { + private lateinit var binding: ActivitySettingsBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) + binding = ActivitySettingsBinding.inflate(layoutInflater) + setContentView(binding.root) - setSupportActionBar(toolbar) + setSupportActionBar(binding.toolbar) supportActionBar?.setHomeButtonEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true) From 0ff6dc28974dbbdde2aad5648cfe81d96a3b0402 Mon Sep 17 00:00:00 2001 From: GeorgCantor Date: Thu, 8 Apr 2021 19:18:47 +0300 Subject: [PATCH 3/3] Replace global variables with local ones --- .../uamp/automotive/QrCodeSignInFragment.kt | 36 +++++-------------- .../uamp/automotive/SettingsActivity.kt | 4 +-- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt index 807c7e1eb..df11cf1c1 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/QrCodeSignInFragment.kt @@ -34,43 +34,25 @@ import com.example.android.uamp.automotive.databinding.QrSignInBinding */ class QrCodeSignInFragment : Fragment(R.layout.qr_sign_in) { - private var binding: QrSignInBinding? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = QrSignInBinding.bind(view) - - val context = requireContext() + val binding = QrSignInBinding.bind(view) - binding?.toolbar?.setNavigationOnClickListener { + binding.toolbar.setNavigationOnClickListener { requireActivity().supportFragmentManager.popBackStack() } - binding?.appIcon?.setImageDrawable(getDrawable(requireContext(), R.drawable.aural_logo)) - binding?.primaryMessage?.text = getString(R.string.qr_sign_in_primary_text) - binding?.secondaryMessage?.text = getString(R.string.qr_sign_in_secondary_text) + binding.appIcon.setImageDrawable(getDrawable(requireContext(), R.drawable.aural_logo)) + binding.primaryMessage.text = getString(R.string.qr_sign_in_primary_text) + binding.secondaryMessage.text = getString(R.string.qr_sign_in_secondary_text) // Links in footer text should be clickable. - binding?.footer?.text = HtmlCompat.fromHtml( - context.getString(R.string.sign_in_footer), + binding.footer.text = HtmlCompat.fromHtml( + requireContext().getString(R.string.sign_in_footer), HtmlCompat.FROM_HTML_MODE_LEGACY ) - binding?.footer?.movementMethod = LinkMovementMethod.getInstance() - - setQrCode(getString(R.string.qr_code_url)) - } - - override fun onDestroy() { - super.onDestroy() - binding = null - } + binding.footer.movementMethod = LinkMovementMethod.getInstance() - /** - * Sets the QR code rendered on this sign in screen. - * - * @param code The QR code to display. - */ - private fun setQrCode(url: String) { - binding?.qrCode?.let { Glide.with(this).load(url).into(it) } + Glide.with(this).load(getString(R.string.qr_code_url)).into(binding.qrCode) } } diff --git a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt index e4c280f37..6c6a4c8ca 100644 --- a/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt +++ b/automotive/src/main/java/com/example/android/uamp/automotive/SettingsActivity.kt @@ -26,11 +26,9 @@ import com.example.android.uamp.automotive.databinding.ActivitySettingsBinding */ class SettingsActivity : AppCompatActivity() { - private lateinit var binding: ActivitySettingsBinding - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivitySettingsBinding.inflate(layoutInflater) + val binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar)