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)
 | |
| }
 |