video stream clean code
parent
9f1631ba4c
commit
a020c9865b
@ -0,0 +1,234 @@
|
||||
package com.hmg.hmgDr.Service
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.graphics.PixelFormat
|
||||
import android.graphics.Point
|
||||
import android.os.Build
|
||||
import android.os.CountDownTimer
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import androidx.core.view.GestureDetectorCompat
|
||||
import com.hmg.hmgDr.R
|
||||
import com.hmg.hmgDr.util.ViewsUtil
|
||||
|
||||
abstract class BaseMovingFloatingWidget : Service() {
|
||||
|
||||
val szWindow = Point()
|
||||
lateinit var windowManagerParams: WindowManager.LayoutParams
|
||||
var mWindowManager: WindowManager? = null
|
||||
var floatingWidgetView: View? = null
|
||||
lateinit var floatingViewContainer: View
|
||||
|
||||
lateinit var mDetector: GestureDetectorCompat
|
||||
|
||||
private var xInitCord = 0
|
||||
private var yInitCord: Int = 0
|
||||
private var xInitMargin: Int = 0
|
||||
private var yInitMargin: Int = 0
|
||||
|
||||
/* Add Floating Widget View to Window Manager */
|
||||
open fun addFloatingWidgetView() {
|
||||
mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
||||
|
||||
//Init LayoutInflater
|
||||
val inflater = getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
//Inflate the removing view layout we created
|
||||
floatingWidgetView = inflater.inflate(R.layout.activity_video_call, null)
|
||||
|
||||
//Add the view to the window.
|
||||
windowManagerParams =
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_PHONE,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||
PixelFormat.TRANSLUCENT
|
||||
)
|
||||
} else {
|
||||
WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||
PixelFormat.TRANSLUCENT
|
||||
)
|
||||
}
|
||||
|
||||
//Specify the view position
|
||||
windowManagerParams.gravity = Gravity.TOP or Gravity.START
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
val dragListener: View.OnTouchListener = View.OnTouchListener { _, event ->
|
||||
mDetector.onTouchEvent(event)
|
||||
|
||||
//Get Floating widget view params
|
||||
val layoutParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
//get the touch location coordinates
|
||||
val x_cord = event.rawX.toInt()
|
||||
val y_cord = event.rawY.toInt()
|
||||
val x_cord_Destination: Int
|
||||
var y_cord_Destination: Int
|
||||
|
||||
when (event.action) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
xInitCord = x_cord
|
||||
yInitCord = y_cord
|
||||
|
||||
//remember the initial position.
|
||||
xInitMargin = layoutParams.x
|
||||
yInitMargin = layoutParams.y
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
//Get the difference between initial coordinate and current coordinate
|
||||
val x_diff: Int = x_cord - xInitCord
|
||||
val y_diff: Int = y_cord - yInitCord
|
||||
|
||||
y_cord_Destination = yInitMargin + y_diff
|
||||
val barHeight: Int = ViewsUtil.getStatusBarHeight(applicationContext)
|
||||
if (y_cord_Destination < 0) {
|
||||
y_cord_Destination = 0
|
||||
// y_cord_Destination =
|
||||
// -(szWindow.y - (videoCallContainer.height /*+ barHeight*/))
|
||||
// y_cord_Destination = -(szWindow.y / 2)
|
||||
} else if (y_cord_Destination + (floatingViewContainer.height + barHeight) > szWindow.y) {
|
||||
y_cord_Destination = szWindow.y - (floatingViewContainer.height + barHeight)
|
||||
// y_cord_Destination = (szWindow.y / 2)
|
||||
}
|
||||
layoutParams.y = y_cord_Destination
|
||||
|
||||
//reset position if user drags the floating view
|
||||
resetPosition(x_cord)
|
||||
}
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
val x_diff_move: Int = x_cord - xInitCord
|
||||
val y_diff_move: Int = y_cord - yInitCord
|
||||
x_cord_Destination = xInitMargin + x_diff_move
|
||||
y_cord_Destination = yInitMargin + y_diff_move
|
||||
|
||||
layoutParams.x = x_cord_Destination
|
||||
layoutParams.y = y_cord_Destination
|
||||
|
||||
//Update the layout with new X & Y coordinate
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, layoutParams)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/**
|
||||
* OnTouch actions
|
||||
*/
|
||||
class MyGestureListener(
|
||||
val onTabCall: () -> Unit,
|
||||
val miniCircleDoubleTap: () -> Unit
|
||||
) : GestureDetector.SimpleOnGestureListener() {
|
||||
|
||||
override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
|
||||
// onTabCall()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDoubleTap(e: MotionEvent?): Boolean {
|
||||
miniCircleDoubleTap()
|
||||
return super.onDoubleTap(e)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Reset position of Floating Widget view on dragging */
|
||||
fun resetPosition(x_cord_now: Int) {
|
||||
if (x_cord_now <= szWindow.x / 2) {
|
||||
moveToLeft(x_cord_now)
|
||||
} else {
|
||||
moveToRight(x_cord_now)
|
||||
}
|
||||
}
|
||||
|
||||
/* Method to move the Floating widget view to Left */
|
||||
private fun moveToLeft(current_x_cord: Int) {
|
||||
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
mParams.x =
|
||||
(szWindow.x - current_x_cord * current_x_cord - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
val x = szWindow.x - current_x_cord
|
||||
object : CountDownTimer(500, 5) {
|
||||
//get params of Floating Widget view
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
override fun onTick(t: Long) {
|
||||
val step = (500 - t) / 5
|
||||
// mParams.x = 0 - (current_x_cord * current_x_cord * step).toInt()
|
||||
mParams.x =
|
||||
(szWindow.x - current_x_cord * current_x_cord * step - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
mParams.x = -(szWindow.x - floatingViewContainer.width)
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
/* Method to move the Floating widget view to Right */
|
||||
private fun moveToRight(current_x_cord: Int) {
|
||||
object : CountDownTimer(500, 5) {
|
||||
//get params of Floating Widget view
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
override fun onTick(t: Long) {
|
||||
val step = (500 - t) / 5
|
||||
mParams.x =
|
||||
(szWindow.x + current_x_cord * current_x_cord * step - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
mParams.x = szWindow.x - floatingViewContainer.width
|
||||
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
/***
|
||||
* Utils
|
||||
*/
|
||||
|
||||
fun getWindowManagerDefaultDisplay() {
|
||||
val w = mWindowManager!!.defaultDisplay.width
|
||||
val h = mWindowManager!!.defaultDisplay.height
|
||||
szWindow[w] = h
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue