From ea629e45a7383459a691d11c2c03269b96484619 Mon Sep 17 00:00:00 2001 From: Raymond Yang Date: Mon, 3 Jul 2023 15:02:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=87=E6=B5=AE=E5=8B=95=E8=A6=96=E7=AA=97?= =?UTF-8?q?=E4=BB=A5=E5=96=AE=E4=BE=8B=E6=A8=A1=E5=BC=8F=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 + .../easywindowtest/FloatingWindowHelper.kt | 69 +++++++++++++ .../ray650128/easywindowtest/MainActivity.kt | 98 +++++++------------ .../com/ray650128/easywindowtest/MyApp.kt | 21 ++++ app/src/main/res/layout/activity_main.xml | 31 +++++- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 157 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/ray650128/easywindowtest/FloatingWindowHelper.kt create mode 100644 app/src/main/java/com/ray650128/easywindowtest/MyApp.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d77cd08..10e7148 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ diff --git a/app/src/main/java/com/ray650128/easywindowtest/FloatingWindowHelper.kt b/app/src/main/java/com/ray650128/easywindowtest/FloatingWindowHelper.kt new file mode 100644 index 0000000..585b68b --- /dev/null +++ b/app/src/main/java/com/ray650128/easywindowtest/FloatingWindowHelper.kt @@ -0,0 +1,69 @@ +package com.ray650128.easywindowtest + +import android.view.Gravity +import android.view.MotionEvent +import android.view.WindowManager +import com.hjq.window.EasyWindow + +object FloatingWindowHelper { + + private var _isShowing: Boolean = false + val isShowing: Boolean + get() = _isShowing + + private val window by lazy { + EasyWindow>(MyApp.instance).apply { + setContentView(R.layout.window_hint) + setGravity(Gravity.START or Gravity.TOP) + setYOffset(100) + setImageDrawable(android.R.id.icon, R.drawable.ic_chicken) + setOnTouchListener { window, view, event -> + var touch = false + when (event.action) { + MotionEvent.ACTION_DOWN -> { + window.setWindowFlags( + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + ) + window.update() + touch = true + } + + MotionEvent.ACTION_OUTSIDE -> { + window.setWindowFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + ) + window.update() + touch = false + } + + else -> {} + } + touch + } + } + } + + fun show() { + _isShowing = true + window.show() + } + + fun hide() { + _isShowing = false + window.cancel() + } + + fun setXOffset(value: Int) { + window.setXOffset(value) + window.update() + } + + fun setYOffset(value: Int) { + window.setYOffset(value) + window.update() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ray650128/easywindowtest/MainActivity.kt b/app/src/main/java/com/ray650128/easywindowtest/MainActivity.kt index d0ff28b..5fdc035 100644 --- a/app/src/main/java/com/ray650128/easywindowtest/MainActivity.kt +++ b/app/src/main/java/com/ray650128/easywindowtest/MainActivity.kt @@ -1,6 +1,7 @@ package com.ray650128.easywindowtest import android.app.Activity +import android.content.Context import android.content.Intent import android.net.Uri import androidx.appcompat.app.AppCompatActivity @@ -20,92 +21,63 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private val mContext: Context by lazy { this } + private val floatingWindowPermission = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_CANCELED) { - if (!Settings.canDrawOverlays(this)) { - binding.btnStep1.isEnabled = !Settings.canDrawOverlays(this) - binding.btnStep2.isEnabled = Settings.canDrawOverlays(this) - binding.btnStep3.isEnabled = isFloatWindowShowing + if (!Settings.canDrawOverlays(mContext)) { + binding.btnStep1.isEnabled = !Settings.canDrawOverlays(mContext) + binding.btnStep2.isEnabled = Settings.canDrawOverlays(mContext) + binding.btnStep3.isEnabled = FloatingWindowHelper.isShowing return@registerForActivityResult } showOverlayWindow() } } - private var isFloatWindowShowing = false - - private val window by lazy { - EasyWindow>(application).apply { - setContentView(R.layout.window_hint) - setGravity(Gravity.START or Gravity.TOP) - setYOffset(100) - setImageDrawable(android.R.id.icon, R.drawable.ic_chicken) - setOnTouchListener { window, view, event -> - var touch = false - when (event.action) { - MotionEvent.ACTION_DOWN -> { - window.setWindowFlags( - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or - WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or - WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - ) - window.update() - touch = true - } - - MotionEvent.ACTION_OUTSIDE -> { - window.setWindowFlags( - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or - WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or - WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - ) - window.update() - touch = false - } - - else -> {} - } - touch - } - } - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - binding.btnStep1.isEnabled = !Settings.canDrawOverlays(this) - binding.btnStep1.setOnClickListener { - val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) - intent.data = Uri.parse("package:$packageName") - floatingWindowPermission.launch(intent) - } + binding.apply { + btnStep1.setOnClickListener { + val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) + intent.data = Uri.parse("package:$packageName") + floatingWindowPermission.launch(intent) + } - binding.btnStep2.isEnabled = Settings.canDrawOverlays(this) - binding.btnStep2.setOnClickListener { - showOverlayWindow() - } + btnStep2.setOnClickListener { + showOverlayWindow() + } - binding.btnStep3.isEnabled = isFloatWindowShowing - binding.btnStep3.setOnClickListener { - hideOverlayWindow() + btnStep3.setOnClickListener { + hideOverlayWindow() + } + } + } + + override fun onResume() { + super.onResume() + + binding.apply { + btnStep1.isEnabled = !Settings.canDrawOverlays(mContext) + btnStep2.isEnabled = Settings.canDrawOverlays(mContext) && !FloatingWindowHelper.isShowing + btnStep3.isEnabled = FloatingWindowHelper.isShowing } } private fun showOverlayWindow() { - isFloatWindowShowing = true - binding.btnStep2.isEnabled = !isFloatWindowShowing - binding.btnStep3.isEnabled = isFloatWindowShowing - window.show() + FloatingWindowHelper.show() + binding.btnStep2.isEnabled = !FloatingWindowHelper.isShowing + binding.btnStep3.isEnabled = FloatingWindowHelper.isShowing } private fun hideOverlayWindow() { - isFloatWindowShowing = false - binding.btnStep2.isEnabled = !isFloatWindowShowing - binding.btnStep3.isEnabled = isFloatWindowShowing - window.cancel() + FloatingWindowHelper.hide() + binding.btnStep2.isEnabled = !FloatingWindowHelper.isShowing + binding.btnStep3.isEnabled = FloatingWindowHelper.isShowing } } \ No newline at end of file diff --git a/app/src/main/java/com/ray650128/easywindowtest/MyApp.kt b/app/src/main/java/com/ray650128/easywindowtest/MyApp.kt new file mode 100644 index 0000000..a70b293 --- /dev/null +++ b/app/src/main/java/com/ray650128/easywindowtest/MyApp.kt @@ -0,0 +1,21 @@ +package com.ray650128.easywindowtest + +import android.app.Application +import android.content.Context + +class MyApp : Application() { + + override fun onCreate() { + super.onCreate() + instance = this + } + + companion object { + private val TAG = MyApp::class.java.simpleName + + var instance: Application? = null + + val appContext: Context + get() = instance!!.applicationContext + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6df2c5d..a184b1c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,21 +6,39 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + +