MainActivity.kt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package com.sduduzog.slimlauncher
  2. import android.content.SharedPreferences
  3. import android.content.pm.PackageManager
  4. import android.content.res.Resources
  5. import android.os.Bundle
  6. import androidx.appcompat.app.AppCompatActivity
  7. import androidx.lifecycle.ViewModelProviders
  8. import androidx.navigation.NavController
  9. import androidx.navigation.NavDestination
  10. import androidx.navigation.Navigation.findNavController
  11. import com.sduduzog.slimlauncher.ui.main.MainViewModel
  12. class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, NavController.OnDestinationChangedListener {
  13. // TODO: Hide and show status bar (possibly bottom nav too) in preferences
  14. // TODO: Click on date, opens calendar app
  15. // TODO: Support more devices, screen densities
  16. // TODO: Setup Wizard redesign to include,
  17. // TODO: Have different text sizes, and typefaces
  18. // TODO: Move some apps to bottom sheet.
  19. // TODO: Clickable apps while in preferences, intuitiveness
  20. // TODO: Lock screen on double tap
  21. private lateinit var settings: SharedPreferences
  22. private val label = "main_fragment"
  23. private lateinit var currentLabel: String
  24. private lateinit var viewModel: MainViewModel
  25. private lateinit var navigator: NavController
  26. var onBackPressedListener: OnBackPressedListener? = null
  27. var dispatcher: Subject = object : Subject() {
  28. var observers: MutableSet<Observer> = mutableSetOf()
  29. override fun attachObserver(o: Observer) {
  30. observers.add(o)
  31. }
  32. override fun detachObserver(o: Observer) {
  33. observers.remove(o)
  34. }
  35. override fun notifyObservers() {
  36. for (o in observers) {
  37. o.update("onBackPressed")
  38. }
  39. }
  40. }
  41. override fun onCreate(savedInstanceState: Bundle?) {
  42. super.onCreate(savedInstanceState)
  43. setContentView(R.layout.main_activity)
  44. settings = getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
  45. settings.registerOnSharedPreferenceChangeListener(this)
  46. navigator = findNavController(this, R.id.nav_host_fragment)
  47. // navigator.addOnNavigatedListener(this) : removed. a breaking change
  48. navigator.addOnDestinationChangedListener(this)
  49. viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
  50. }
  51. override fun onStart() {
  52. super.onStart()
  53. viewModel.refreshApps()
  54. }
  55. override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, s: String?) {
  56. if (s.equals(getString(R.string.prefs_settings_key_theme), true)) {
  57. recreate()
  58. }
  59. }
  60. override fun getTheme(): Resources.Theme {
  61. val theme = super.getTheme()
  62. settings = getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
  63. val active = settings.getInt(getString(R.string.prefs_settings_key_theme), 0)
  64. theme.applyStyle(resolveTheme(active), true)
  65. return theme
  66. }
  67. override fun onBackPressed() {
  68. dispatcher.notifyObservers()
  69. if (currentLabel != label)
  70. super.onBackPressed()
  71. else onBackPressedListener?.onBackPress()
  72. }
  73. /**
  74. * Make the activity aware of the current destination in our NavController.
  75. */
  76. override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
  77. currentLabel = destination.label.toString()
  78. }
  79. override fun onRequestPermissionsResult(requestCode: Int,
  80. permissions: Array<String>, grantResults: IntArray) {
  81. when (requestCode) {
  82. REQUEST_PHONE_CALL -> {
  83. // If request is cancelled, the result arrays are empty.
  84. if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  85. navigator.navigate(R.id.action_mainFragment_to_dialerFragment)
  86. } else {
  87. // Do nothing
  88. }
  89. return
  90. }
  91. }// other 'case' lines to check for other
  92. // permissions this app might request
  93. }
  94. companion object {
  95. fun resolveTheme(i: Int): Int {
  96. when (i) {
  97. 1 -> {
  98. return R.style.AppDarkTheme
  99. }
  100. 2 -> {
  101. return R.style.AppGreyTheme
  102. }
  103. 3 -> {
  104. return R.style.AppTealTheme
  105. }
  106. 4 -> {
  107. return R.style.AppCandyTheme
  108. }
  109. 5 -> {
  110. return R.style.AppPinkTheme
  111. }
  112. }
  113. return R.style.AppTheme
  114. }
  115. const val REQUEST_PHONE_CALL = 1
  116. }
  117. interface OnBackPressedListener {
  118. fun onBackPress()
  119. fun onBackPressed()
  120. }
  121. }