Last active
November 26, 2020 05:28
-
-
Save Elbar/bd803c89b4cce509a0e40698c694c5ab to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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