package tech.kinc import android.app.NativeActivity import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.Message import android.os.Vibrator import android.os.VibrationEffect import android.os.Build import android.view.KeyEvent import android.view.View import android.view.WindowManager import android.view.inputmethod.InputMethodManager import kotlin.system.exitProcess class KincActivity: NativeActivity(), KeyEvent.Callback { companion object { var instance: KincActivity? = null @JvmStatic fun showKeyboard() { instance!!.inputManager!!.showSoftInput(instance!!.window.decorView, 0) } @JvmStatic fun hideKeyboard() { instance!!.inputManager!!.hideSoftInputFromWindow(instance!!.window.decorView.windowToken, 0) instance!!.delayedHideSystemUI() } @JvmStatic fun loadURL(url: String) { val i = Intent(Intent.ACTION_VIEW, Uri.parse(url)) instance!!.startActivity(i) } @JvmStatic fun getLanguage(): String { return java.util.Locale.getDefault().language } @JvmStatic fun vibrate(ms: Int) { val v: Vibrator = instance!!.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { v.vibrate(VibrationEffect.createOneShot(ms.toLong(), VibrationEffect.DEFAULT_AMPLITUDE)) } else { // deprecated in API 26 v.vibrate(ms.toLong()) } } @JvmStatic fun getRotation(): Int { val context: Context = instance!!.applicationContext val manager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager return manager.defaultDisplay.rotation } @JvmStatic fun getScreenDpi(): Int { val context: Context = instance!!.applicationContext val manager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager val metrics: android.util.DisplayMetrics = android.util.DisplayMetrics() manager.defaultDisplay.getMetrics(metrics) return metrics.xdpi.toInt() } @JvmStatic fun getRefreshRate(): Int { val context: Context = instance!!.applicationContext val manager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager return manager.defaultDisplay.refreshRate.toInt() } @JvmStatic fun getDisplayWidth(): Int { val context: Context = instance!!.applicationContext val manager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager val size: android.graphics.Point = android.graphics.Point() manager.defaultDisplay.getRealSize(size) return size.x } @JvmStatic fun getDisplayHeight(): Int { val context: Context = instance!!.applicationContext val manager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager val size: android.graphics.Point = android.graphics.Point() manager.defaultDisplay.getRealSize(size) return size.y } @JvmStatic fun stop() { instance!!.runOnUiThread { fun run() { instance!!.finish() exitProcess(0) } } } class MyHandler(private val kincActivity: KincActivity) : Handler() { override fun handleMessage(msg: Message) { kincActivity.hideSystemUI() } } } var inputManager: InputMethodManager? = null private var isDisabledStickyImmersiveMode = false private val hideSystemUIHandler = MyHandler(this) override fun onCreate(state: Bundle?) { super.onCreate(state) hideSystemUI() instance = this inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager isDisabledStickyImmersiveMode = try { val ai: ApplicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA) val bundle: Bundle = ai.metaData bundle.getBoolean("disableStickyImmersiveMode") } catch (e: PackageManager.NameNotFoundException) { false } catch (e: NullPointerException) { false } } private fun hideSystemUI() { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY } private fun delayedHideSystemUI() { hideSystemUIHandler.removeMessages(0) if (!isDisabledStickyImmersiveMode) { hideSystemUIHandler.sendEmptyMessageDelayed(0, 300) } } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { delayedHideSystemUI() } else { hideSystemUIHandler.removeMessages(0) } } override fun onKeyMultiple(keyCode: Int, count: Int, event: KeyEvent): Boolean { this.nativeKincKeyPress(event.characters) return false } private external fun nativeKincKeyPress(chars: String) }