166 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
| 
								 | 
							
								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)
							 | 
						||
| 
								 | 
							
								}
							 |