package cn.sinata.xldutils.activity
|
|
import android.content.BroadcastReceiver
|
import android.content.Context
|
import android.content.Intent
|
import android.content.IntentFilter
|
import android.content.pm.ActivityInfo
|
import android.os.Build
|
import android.os.Bundle
|
import android.view.MotionEvent
|
import android.view.View
|
import android.view.Window
|
import android.view.inputmethod.InputMethodManager
|
import android.widget.EditText
|
import androidx.activity.OnBackPressedCallback
|
import androidx.appcompat.app.AppCompatActivity
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import cn.sinata.xldutils.R
|
import cn.sinata.xldutils.rxutils.RequestHelper
|
import cn.sinata.xldutils.utils.LanguageUtil
|
import cn.sinata.xldutils.utils.myToast
|
import cn.sinata.xldutils.widget.ProgressDialog
|
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.Disposable
|
import org.jetbrains.anko.AnkoLogger
|
|
/**
|
* 基础activity,包含设置默认强制竖屏显示,广播方式实现关闭全部继承自该activity,并注册了关闭广播的子类
|
*
|
*/
|
abstract class BaseActivity : AppCompatActivity(), AnkoLogger, RequestHelper {
|
|
private lateinit var ACTION_CLOSE_ALL: String
|
private val compositeDisposable = CompositeDisposable()
|
|
//改用lazy初始,第一次使用时才会初始化
|
private val dialog: ProgressDialog by lazy {
|
ProgressDialog(this, R.style.Theme_ProgressDialog)
|
}
|
|
|
private var isCanSop = true
|
|
fun setShowSOP(showSop: Boolean) {
|
isCanSop = showSop
|
}
|
|
override fun attachBaseContext(newBase: Context?) {
|
val language = LanguageUtil.getLanguage()
|
super.attachBaseContext(LanguageUtil.attachBaseContext(newBase, language, ""))
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
//设置竖屏显示
|
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
} else {
|
if (isCanSop) {
|
//设置竖屏显示
|
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
}
|
}
|
ACTION_CLOSE_ALL = "cn.sinata.base.%s.all.close".format(packageName)
|
System.err.println(ACTION_CLOSE_ALL)
|
LocalBroadcastManager.getInstance(this).registerReceiver(
|
closeSelfBroadcastReceiver,
|
IntentFilter(ACTION_CLOSE_ALL)
|
)
|
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
override fun handleOnBackPressed() {
|
onBackPressHandle()
|
}
|
})
|
}
|
|
protected open fun onBackPressHandle() {
|
finish()
|
}
|
override fun onRequestPermissionsResult(
|
requestCode: Int,
|
permissions: Array<out String>,
|
grantResults: IntArray
|
) {
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
}
|
|
protected open fun closeAll() {
|
val intent = Intent(ACTION_CLOSE_ALL)
|
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
|
// android.os.Process.killProcess(android.os.Process.myPid())
|
// exitProcess(0)
|
}
|
|
protected var isTouchHide = true
|
|
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
if (isTouchHide) {
|
if (ev.action == MotionEvent.ACTION_DOWN) {
|
val v = currentFocus
|
if (isShouldHideInput(v, ev)) {
|
hideInputMethod()
|
}
|
return super.dispatchTouchEvent(ev)
|
}
|
// 必不可少,否则所有的组件都不会有TouchEvent了
|
return if (window.superDispatchTouchEvent(ev)) {
|
true
|
} else onTouchEvent(ev)
|
} else {
|
return super.dispatchTouchEvent(ev)
|
}
|
}
|
|
/**
|
* 是否注册关闭全部的广播
|
*/
|
protected fun isRegisterCloseBroadReceiver(): Boolean {
|
return true
|
}
|
|
/**
|
* 是否点击键盘以外的位置
|
*
|
* @param v
|
* @param event
|
* @return
|
*/
|
fun isShouldHideInput(v: View?, event: MotionEvent): Boolean {
|
if (v != null && v is EditText) {
|
val leftTop = intArrayOf(0, 0)
|
v.getLocationInWindow(leftTop)
|
val left = leftTop[0]
|
val top = leftTop[1]
|
val bottom = top + v.height
|
val right = left + v.width
|
return !(event.x > left && event.x < right
|
&& event.y > top && event.y < bottom)
|
}
|
return false
|
}
|
|
/**
|
* 隐藏软键盘
|
*
|
* @param activity
|
*/
|
fun hideInputMethod() {
|
(getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
|
.hideSoftInputFromWindow(
|
this.currentFocus!!.windowToken,
|
InputMethodManager.HIDE_NOT_ALWAYS
|
)
|
}
|
|
override fun onDestroy() {
|
super.onDestroy()
|
LocalBroadcastManager.getInstance(this).unregisterReceiver(closeSelfBroadcastReceiver)
|
if (!compositeDisposable.isDisposed) {
|
compositeDisposable.dispose()
|
}
|
dismissDialog()
|
}
|
|
fun showDialog(msg: String = "加载中...", canCancel: Boolean = true) {
|
if (!canCancel) {
|
dialog.setOnCancelListener {
|
if (this.finishWhenCancelDialog()) {
|
finish()
|
}
|
}
|
} else {
|
//这里设置如果是可以取消的监听器置null了。可以自己在页面上重新设置想要的操作。这里不知道具体需求。
|
dialog.setOnCancelListener(null)
|
}
|
dialog.setCanceledOnTouchOutside(canCancel)
|
dialog.setMessage(msg)
|
if (!dialog.isShowing) {
|
dialog.show()
|
}
|
}
|
|
open fun dismissDialog() {
|
if (dialog.isShowing) {
|
dialog.dismiss()
|
}
|
}
|
|
/**
|
* 是否在取消progressDialog的时候关闭页面
|
*/
|
protected open fun finishWhenCancelDialog() = true
|
|
override fun onRequestFinish() {
|
dismissDialog()
|
}
|
|
override fun onBindHelper(disposable: Disposable) {
|
compositeDisposable.add(disposable)
|
}
|
|
override fun errorToast(msg: String?) {
|
myToast(msg.toString())
|
}
|
|
open fun gotoLogin() {}
|
|
private val closeSelfBroadcastReceiver = object : BroadcastReceiver() {
|
override fun onReceive(p0: Context?, p1: Intent?) {
|
finish()
|
}
|
}
|
}
|