Skip to content

Instantly share code, notes, and snippets.

@Elbar
Last active November 26, 2020 05:28
Show Gist options
  • Save Elbar/bd803c89b4cce509a0e40698c694c5ab to your computer and use it in GitHub Desktop.
Save Elbar/bd803c89b4cce509a0e40698c694c5ab to your computer and use it in GitHub Desktop.
package me.sample
import android.animation.Animator
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import com.google.android.gms.common.GoogleApiAvailability
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
import com.google.android.gms.common.GooglePlayServicesRepairableException
import com.google.android.gms.security.ProviderInstaller
import com.treebo.internetavailabilitychecker.InternetAvailabilityChecker
import com.treebo.internetavailabilitychecker.InternetConnectivityListener
import kotlinx.android.synthetic.main.activity.*
import me.sample.core.*
import me.sample.core.account.AccountManager
import me.sample.model.Notification
import me.sample.model.NotificationData
import me.sample.pincode.PinCodeAction
import me.sample.pincode.PinCodeFragment
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.qualifier.named
import ru.terrakok.cicerone.NavigatorHolder
import ru.terrakok.cicerone.android.support.SupportAppNavigator
import timber.log.Timber
class AppActivity : AppCompatActivity(R.layout.activity), IAppActivity,
InternetConnectivityListener {
private val navigatorHolder: NavigatorHolder by inject(named(CR_APP_HOLDER))
override val currentFragment
get() = supportFragmentManager.findFragmentById(R.id.main_container)
private val navigator = SupportAppNavigator(this, R.id.main_container)
private val internetChecker = InternetAvailabilityChecker.getInstance()
override var notShowPinCode: Boolean = false
private val viewModel: AppViewModel by viewModel()
override val loadingDialog by lazy { LoadingDialog(this) }
private val accountManager: AccountManager by inject()
private val sharedPreferencesManager: SharedPreferencesManager by inject()
private var notification: Notification? = null
private var pinCodeDialog: PinCodeFragment? = null
private var finishedAnimation = false
private var init = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setBackgroundDrawableResource(R.color.colorPrimary)
startSplash()
viewModel.init.observe(this, Observer {
init = it
if (it) {
viewModel.start()
}
})
}
override fun onResume() {
super.onResume()
navigatorHolder.setNavigator(navigator)
internetChecker.addInternetConnectivityListener(this)
showPinCode()
}
override fun onPause() {
navigatorHolder.removeNavigator()
internetChecker.removeInternetConnectivityChangeListener(this)
accountManager.saveLastVisit()
super.onPause()
}
override fun onAttachFragment(fragment: Fragment) {
super.onAttachFragment(fragment)
(fragment as? BaseFragment)?.viewModel?.router = viewModel.appRouter
}
private fun startSplash() {
main_container.hide()
animationView.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(p0: Animator?) {}
override fun onAnimationEnd(p0: Animator?) {
if (init) {
finishedAnimation = true
accountManager.saveLastVisit(1)
showPinCode()
animationView.hide()
main_container.show()
} else {
animationView.playAnimation()
}
}
override fun onAnimationCancel(p0: Animator?) {}
override fun onAnimationStart(p0: Animator?) {}
})
}
private fun showPinCode() {
if (!finishedAnimation) return
if (accountManager.pinCode != null && !notShowPinCode && sharedPreferenceManager.isShowPinCode()) {
if (pinCodeDialog == null) {
pinCodeDialog = PinCodeFragment.newInstance({
pinCodeDialog = null
checkPush(intent)
}, {
pinCodeDialog = null
}, true, PinCodeAction.NONE)
(pinCodeDialog as DialogFragment).show(supportFragmentManager, "pinCode")
}
} else {
checkPush(intent)
}
notShowPinCode = false
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
if (item?.itemId == android.R.id.home) {
onBackPressed()
}
return super.onOptionsItemSelected(item)
}
override fun onInternetConnectivityChanged(isConnected: Boolean) {
val fm = supportFragmentManager
if (isConnected) {
val showedFragment =
fm.findFragmentByTag(NO_INTERNET_DIALOG) as? NoInternetDialogFragment ?: return
showedFragment.dismiss()
restartCurrentFragment(1000)
} else {
val tr = fm.beginTransaction()
val fragment = NoInternetDialogFragment()
fragment.onTryAgain = {
internetChecker.removeInternetConnectivityChangeListener(this)
internetChecker.addInternetConnectivityListener(this)
}
if (!finishedAnimation) {
fragment.show(tr, NO_INTERNET_DIALOG)
}
}
}
private fun restartCurrentFragment(delay: Long = 0) {
lifecycleScope.launchWhenResumed {
kotlinx.coroutines.delay(delay)
val cf = supportFragmentManager.fragments.firstOrNull() ?: return@launchWhenResumed
supportFragmentManager.beginTransaction().detach(cf).attach(cf)
.commitAllowingStateLoss()
}
}
companion object {
const val NO_INTERNET_DIALOG = "no_internet_dialog"
const val NOT_FOUND_DIALOG = "not_found_dialog"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment