stock-news-app / app / src / main / java / edu / utap / stocknewsapp / MainActivity.kt
MainActivity.kt
Raw
package edu.utap.stocknewsapp

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.activity.viewModels
import androidx.navigation.NavController
import com.firebase.ui.auth.FirebaseAuthUIActivityResultContract
import edu.utap.stocknewsapp.databinding.ActivityMainBinding
import edu.utap.stocknewsapp.ui.MainViewModel
import edu.utap.stocknewsapp.firebase.AuthInit

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding
    private val viewModel: MainViewModel by viewModels()

    enum class FragmentTitle
    {
        NEWS,
        FAVORITE,
        SETTING
    }
    private fun initBottomNavigationEnabler() {
        viewModel.observeFragTitle().observe(this)
        {
            when (viewModel.observeFragTitle().value)
            {
                FragmentTitle.NEWS ->
                {
                    binding.newsBut.isClickable = false
                    binding.favBut.isClickable = true
                    binding.accountBut.isClickable = true
                }
                FragmentTitle.FAVORITE ->
                {
                    binding.newsBut.isClickable = true
                    binding.favBut.isClickable = false
                    binding.accountBut.isClickable = true
                }
                else ->
                {
                    binding.newsBut.isClickable = true
                    binding.favBut.isClickable = true
                    binding.accountBut.isClickable = false
                }
            }
        }
    }
    private fun initBottomButtonListener(navController: NavController) {
        viewModel.observeSignIn().observe(this) {
            when (viewModel.observeSignIn().value) {
                true -> {
                    binding.newsBut.isClickable = true
                    binding.favBut.isClickable = true
                    binding.newsBut.setOnClickListener {
                        navController.popBackStack()
                        navController.navigate(R.id.NewsFragment)
                        viewModel.setFragTitle(FragmentTitle.NEWS)
                    }
                    binding.favBut.setOnClickListener {
                        navController.popBackStack()
                        navController.navigate(R.id.FavoriteFragment)
                        viewModel.setFragTitle(FragmentTitle.FAVORITE)
                    }
                }
                else -> {
                    binding.newsBut.isClickable = false
                    binding.favBut.isClickable = false
                    binding.newsBut.setOnClickListener {
                        Toast.makeText(this,
                            "Please log in to read news", Toast.LENGTH_SHORT
                        ).show()
                    }
                    binding.favBut.setOnClickListener {
                        Toast.makeText(this,
                            "Please log in to edit watchlist", Toast.LENGTH_SHORT
                        ).show()
                    }
                }
            }
        }
        binding.accountBut.setOnClickListener {
            navController.popBackStack()
            navController.navigate(R.id.AccountFragment)
            viewModel.setFragTitle(FragmentTitle.SETTING)
        }
    }

    private fun initNewsUpdateObserver() {
        viewModel.observeUserMeta().observe(this) {
            viewModel.loadUserMeta()
        }
    }

    // An Android nightmare
    // https://stackoverflow.com/questions/1109022/close-hide-the-android-soft-keyboard
    // https://stackoverflow.com/questions/7789514/how-to-get-activitys-windowtoken-without-view
    fun hideKeyboard() {
        val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(window.decorView.rootView.windowToken, 0)
    }

    //See: https://developer.android.com/training/basics/intents/result
    private val signInLauncher =
        registerForActivityResult(FirebaseAuthUIActivityResultContract()) {
            if (it.resultCode == RESULT_OK) {
                viewModel.setIsLoggedIn(true)
                viewModel.loadUserInfo()
            } else {
                viewModel.setIsLoggedIn(false)
                val navController = findNavController(R.id.nav_host_fragment_content_main)
                navController.navigate(R.id.AccountFragment)
            }
        }

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setSupportActionBar(binding.toolbar)
            supportActionBar?.setDisplayHomeAsUpEnabled(false)

        val navController = findNavController(R.id.nav_host_fragment_content_main)
        appBarConfiguration = AppBarConfiguration(navController.graph)
        setupActionBarWithNavController(navController, appBarConfiguration)
        initBottomNavigationEnabler()
        initBottomButtonListener(navController)
        initNewsUpdateObserver()
        viewModel.fetchQuote()
        AuthInit(viewModel, signInLauncher)
    }
}

    /*
    TODO: For next release, adding Setting menu button to switch between
        Standard and Dark Modes
    override fun onCreateOptionsMenu(menu: Menu): Boolean
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }
    override fun onOptionsItemSelected(item: MenuItem): Boolean
    {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
    */