package com.sduduzog.slimlauncher import android.content.SharedPreferences import android.content.res.Resources import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController import androidx.navigation.Navigation.findNavController import com.sduduzog.slimlauncher.di.MainFragmentFactoryEntryPoint import com.sduduzog.slimlauncher.utils.BaseFragment import com.sduduzog.slimlauncher.utils.HomeWatcher import com.sduduzog.slimlauncher.utils.IPublisher import com.sduduzog.slimlauncher.utils.ISubscriber import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors @AndroidEntryPoint class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, HomeWatcher.OnHomePressedListener, IPublisher { private lateinit var settings: SharedPreferences private lateinit var navigator: NavController private lateinit var homeWatcher: HomeWatcher private val subscribers: MutableSet = mutableSetOf() override fun attachSubscriber(s: ISubscriber) { subscribers.add(s as BaseFragment) } override fun detachSubscriber(s: ISubscriber) { subscribers.remove(s as BaseFragment) } private fun dispatchBack() { for (s in subscribers) if (s.onBack()) return completeBackAction() } private fun dispatchHome() { for (s in subscribers) s.onHome() } override fun onCreate(savedInstanceState: Bundle?) { val entryPoint = EntryPointAccessors.fromActivity(this, MainFragmentFactoryEntryPoint::class.java) supportFragmentManager.fragmentFactory = entryPoint.getMainFragmentFactory() super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) settings = getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE) settings.registerOnSharedPreferenceChangeListener(this) navigator = findNavController(this, R.id.nav_host_fragment) homeWatcher = HomeWatcher(this) homeWatcher.setOnHomePressedListener(this) } override fun onResume() { super.onResume() overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) toggleStatusBar() } override fun onStart() { super.onStart() homeWatcher.startWatch() } override fun onStop() { super.onStop() homeWatcher.stopWatch() } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) toggleStatusBar() } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, s: String?) { if (s.equals(getString(R.string.prefs_settings_key_theme), true)) { recreate() } if (s.equals(getString(R.string.prefs_settings_key_toggle_status_bar), true)) { toggleStatusBar() } } override fun getTheme(): Resources.Theme { val theme = super.getTheme() settings = getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE) val active = settings.getInt(getString(R.string.prefs_settings_key_theme), 0) theme.applyStyle(resolveTheme(active), true) return theme } override fun onBackPressed() { dispatchBack() } override fun onHomePressed() { dispatchHome() navigator.popBackStack(R.id.homeFragment, false) } private fun showSystemUI() { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE) } private fun hideSystemUI() { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_FULLSCREEN) } private fun toggleStatusBar() { val isHidden = settings.getBoolean(getString(R.string.prefs_settings_key_toggle_status_bar), false) if (isHidden) { hideSystemUI() } else { showSystemUI() } } companion object { fun resolveTheme(i: Int): Int { return when (i) { 1 -> R.style.AppDarkTheme 2 -> R.style.AppGreyTheme 3 -> R.style.AppTealTheme 4 -> R.style.AppCandyTheme 5 -> R.style.AppPinkTheme else -> R.style.AppTheme } } } private fun completeBackAction() { super.onBackPressed() } }