From 0b275512266c456a6dc59d0ceec10aa184b0b108 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 15 Jul 2022 12:54:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=84=E8=AE=BA=E9=83=A8=E5=88=86=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E6=97=B6=E7=A6=81=E7=94=A8=E6=98=9F=E6=98=9F=E7=82=B9?= =?UTF-8?q?=E5=87=BB=20=E6=B7=BB=E5=8A=A0=E5=85=A8=E7=A8=8B=E6=A6=82?= =?UTF-8?q?=E8=A7=88=20=E6=B7=BB=E5=8A=A0=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/AndroidManifest.xml | 3 + .../taxi/passenger/mulprocess/ICallback.aidl | 10 + .../mulprocess/ILeftMenuService.aidl | 6 + .../taxi/passenger/mulprocess/EmptyService.kt | 22 +++ .../mulprocess/OrderServiceImpl.java | 10 + .../presenter/BaseTaxiPassengerPresenter.java | 4 +- .../ui/TaxiPassengerBaseFragment.java | 7 +- .../passenger/ui/leftmenu/LeftMenuOpen.kt | 48 +++++ .../ui/leftmenu/OverlayLeftViewUtils.kt | 38 +++- .../ui/video/FloatingDistanceInfoUtils.kt | 118 ++++++++++++ .../taxi/passenger/ui/video/FullVideoUtils.kt | 4 +- .../taxi/passenger/ui/video/VideoActivity.kt | 52 ++++- .../taxi/passenger/utils/PermissionUtil.java | 25 +++ .../taxi_p_window_float_distance_info.xml | 182 ++++++++++++++++++ .../core/utilcode/util/ProcessUtils.java | 2 +- 15 files changed, 515 insertions(+), 16 deletions(-) create mode 100644 OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ICallback.aidl create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/EmptyService.kt create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml diff --git a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml index a328e9ddba..84947cad22 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + + = RemoteCallbackList() + fun setValue( windowView: View, wl: WindowManager.LayoutParams?, @@ -177,6 +182,49 @@ object LeftMenuOpen { orderService?.transmissionIndex(index) } + fun registerCallbackHost(cb:ICallback?){ + if (orderService == null) { + registerC() + } + cb?.let { + icallbacks?.register(it) + } + } + + fun unregisterCallbackHost(cb:ICallback?){ + cb?.let { + icallbacks?.unregister(it) + } + } + + + fun registerCallback(cb:ICallback?){ + if (orderService == null) { + registerC() + } + cb?.let { + orderService?.registerCallback(it) + } + } + + fun unregisterCallback(cb:ICallback?){ + cb?.let { + orderService?.unRegisterCallback(it) + } + } + + fun callCallBack(meters: Long,timeInSecond: Long,speed:Float){ + val len = icallbacks.beginBroadcast() + for (i in 0 until len) { + try { + icallbacks.getBroadcastItem(i).onResult(meters,timeInSecond,speed) + } catch (e: RemoteException) { + e.printStackTrace() + } + } + icallbacks.finishBroadcast() + } + /** * 主进程、video进程都得调用 * 主进程在显示是主动调用 diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt index 899ac3bb38..d760d25a84 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt @@ -14,9 +14,10 @@ import android.view.animation.LinearInterpolator import android.widget.ListView import androidx.appcompat.widget.AppCompatImageView import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.* import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel +import com.mogo.och.taxi.passenger.mulprocess.EmptyService import com.mogo.och.taxi.passenger.ui.video.VideoActivity import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -77,7 +78,7 @@ object OverlayLeftViewUtils { layoutParams(ani,view, isOpen) // 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除 - dismissOverlayView() + dismissOverlayView(false) val vDragField = view.findViewById(R.id.v_drag_field) acivOpenClose = view.findViewById(R.id.aciv_open_close) @@ -136,6 +137,7 @@ object OverlayLeftViewUtils { LeftMenuOpen.setValue(view, params, windowManager,::close,::open) try { windowManager!!.addView(overlayView, params) + checkProcess() isShowing = true } catch (e: Exception) { e.printStackTrace() @@ -147,6 +149,7 @@ object OverlayLeftViewUtils { * 打开状态栏 */ private fun open(overlayView: View,windowManager: WindowManager?) { + checkProcess() val valueAnimator = ValueAnimator.ofInt(params!!.x, 0) valueAnimator.duration = 100 valueAnimator.interpolator = LinearInterpolator() @@ -174,6 +177,27 @@ object OverlayLeftViewUtils { valueAnimator.start() } + private fun checkProcess() { + ThreadPoolService.execute { + val currentProcessName = ProcessUtils.getCurrentProcessName() + if (currentProcessName.contains(":video")) { + return@execute + } + val allBackgroundProcesses = ProcessUtils.getAllBackgroundProcesses() + var haveProcess = false + allBackgroundProcesses.forEach { + if (it.contains(":video")) { + haveProcess = true + return@forEach + } + } + System.err.println("进程是否存在---$haveProcess----") + if (!haveProcess) { + EmptyService.startService(Utils.getApp()) + } + } + } + fun addDragTarget(view :View?){ LeftMenuOpen.registerDragView(view) } @@ -186,7 +210,9 @@ object OverlayLeftViewUtils { * */ fun transmissionIndex(index:Int){ - LeftMenuOpen.transmissionIndex(index) + if(!ProcessUtils.isMainProcess(Utils.getApp())) { + LeftMenuOpen.transmissionIndex(index) + } } fun transmissionIndexGet(index: Int){ @@ -285,7 +311,7 @@ object OverlayLeftViewUtils { /** * 移除覆盖View在Activity上面 */ - fun dismissOverlayView() { + fun dismissOverlayView(isMain:Boolean) { if (!isShowing) { return } @@ -295,7 +321,9 @@ object OverlayLeftViewUtils { } } // 管理的要关闭都得关闭 - VideoActivity.startActivity(overlayView!!.context,VideoActivity.VIDEOTYPE_CLOSE) + if(isMain) { + VideoActivity.startActivity(overlayView!!.context, VideoActivity.VIDEOTYPE_CLOSE) + } subscribe = null LeftMenuOpen.clearValue() try { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt new file mode 100644 index 0000000000..e08f4a5d00 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt @@ -0,0 +1,118 @@ +package com.mogo.och.taxi.passenger.ui.video + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.graphics.PixelFormat +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import androidx.appcompat.widget.AppCompatImageView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.ui.leftmenu.ItemViewTouchListener +import io.reactivex.disposables.Disposable +import java.lang.Exception + +/** + * 视频全屏播放 + * + * @author yangyakun + */ +@SuppressLint("StaticFieldLeak") +object FloatingDistanceInfoUtils { + private const val TAG = "OverlayViewUtils" + private var windowManager: WindowManager? = null + + @Volatile + private var isShowing = false + + private var params:WindowManager.LayoutParams?=null + + + private var overlayView: View?=null + + /** + * 添加覆盖View在Activity上面 + */ + @JvmOverloads + fun showOverlayView(context: Activity,ani: Int = -1) { + if (isShowing) { + return + } + if (windowManager == null) { + windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager + } + + overlayView = LayoutInflater.from(context) + .inflate(R.layout.taxi_p_window_float_distance_info, null) as ConstraintLayout + overlayView?.let { view -> + // 设置View显示模式,沉浸式的侵入到状态栏,导航栏 + view.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) + layoutParams(ani) + + // 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除 + dismissOverlayView() + + try { + windowManager!!.addView(overlayView, params) + isShowing = true + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + private fun layoutParams(ani: Int) { + if(params ==null) { + params = WindowManager.LayoutParams() + } + params = WindowManager.LayoutParams() + params?.let { + it.width = WindowManager.LayoutParams.WRAP_CONTENT + it.height = WindowManager.LayoutParams.WRAP_CONTENT + it.alpha = 1.0f + it.gravity = Gravity.END or Gravity.TOP + it.x = 0 + it.y = 0 + it.format = PixelFormat.RGBA_8888 + // 设置窗口类型为应用子窗口,和PopupWindow同类型 + it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL + // 没有边界限制,允许窗口扩展到屏幕外 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + if (ani != -1) { + it.windowAnimations = ani + } + } + } + + /** + * 移除覆盖View在Activity上面 + */ + fun dismissOverlayView() { + if (!isShowing) { + return + } + try { + if (windowManager != null && overlayView != null) { + windowManager!!.removeViewImmediate(overlayView) + windowManager = null + params = null + } + if (overlayView!=null) { + overlayView = null + } + isShowing = false + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt index 306e5b05bf..8691df08b1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FullVideoUtils.kt @@ -10,9 +10,9 @@ import com.shuyu.gsyvideoplayer.GSYVideoManager import java.lang.Exception /** - * 遮罩层工具类 + * 视频全屏播放 * - * @author mogoauto + * @author yangyakun */ @SuppressLint("StaticFieldLeak") object FullVideoUtils { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt index baadfd9a17..3224717fc9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt @@ -5,34 +5,43 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.BitmapDrawable +import android.os.Build import android.os.Bundle import android.view.View +import android.view.WindowManager import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatImageView import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition -import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay +import com.mogo.och.taxi.passenger.mulprocess.ICallback +import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener import com.mogo.och.taxi.passenger.utils.FixMemoryLeak +import com.mogo.och.taxi.passenger.utils.PermissionUtil import com.mogo.och.taxi.passenger.utils.blur.GlideBlurTransform import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle -import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import java.util.* import kotlin.math.floor @@ -63,6 +72,37 @@ class VideoActivity : AppCompatActivity() { private var videotype = VIDEOTYPE_CONSULT + val callBack = object : ICallback.Stub() { + override fun onResult(meters :Long, timeInSecond:Long,speed:Float) { + if(speed<0){ + // 距离单位 + var disUnit = "公里" + // 距离 + var remainDis: String? = "0" + + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + remainDis = Math.round(meters.toFloat()).toString() + } else { + disUnit = "公里" + remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + // 剩余时间 + val time = Math.ceil(timeInSecond.toDouble() / 60f).toInt() + + val beforeTime = Calendar.getInstance() + beforeTime.add(Calendar.MINUTE, time) + //到达时间 + val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.TAXI_HH_mm) + System.err.println("------剩余公里$remainDis$disUnit----剩余分钟:$time------到达时间:$arriveTime") + }else{ + System.err.println("速度----$speed") + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) configPage() @@ -99,6 +139,7 @@ class VideoActivity : AppCompatActivity() { } initListener() initData() + LeftMenuOpen.registerCallback(callBack) } private fun initConsultData(){ @@ -289,6 +330,7 @@ class VideoActivity : AppCompatActivity() { OverlayLeftViewUtils.showOverlayView(this,isOpen = false, checkIndex = OverlayLeftViewUtils.MOVIE) } } + FloatingDistanceInfoUtils.showOverlayView(this) } override fun onResume() { @@ -336,8 +378,12 @@ class VideoActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() + if(videotype!=VIDEOTYPE_CLOSE){ + LeftMenuOpen.unregisterCallback(callBack) + } releaseOnNewInstance() - OverlayLeftViewUtils.dismissOverlayView() + OverlayLeftViewUtils.dismissOverlayView(false) + FloatingDistanceInfoUtils.dismissOverlayView() FixMemoryLeak.fixLeak(this) } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java index f813fe3f7f..7c6c8c22ae 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java @@ -1,5 +1,6 @@ package com.mogo.och.taxi.passenger.utils; +import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; @@ -8,6 +9,9 @@ import android.os.Build; import androidx.core.content.ContextCompat; +import com.mogo.eagle.core.network.utils.Util; +import com.mogo.eagle.core.utilcode.util.Utils; + /** * @author: wangmingjun * @date: 2021/12/7 @@ -34,4 +38,25 @@ public class PermissionUtil { } return false; } + + private static String processName = ""; + public static String getCurProcessName() { + if(!processName.isEmpty()){ + return processName; + } + // 获取此进程的标识符 + int pid = android.os.Process.myPid(); + // 获取活动管理器 + ActivityManager activityManager = (ActivityManager) + Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); + // 从应用程序进程列表找到当前进程,是:返回当前进程名 + for (ActivityManager.RunningAppProcessInfo appProcess : + activityManager.getRunningAppProcesses()) { + if (appProcess.pid == pid) { + + return appProcess.processName; + } + } + return null; + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml new file mode 100644 index 0000000000..6b91c4b7ca --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_distance_info.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ProcessUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ProcessUtils.java index c053be910c..5419e2a828 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ProcessUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ProcessUtils.java @@ -137,7 +137,7 @@ public final class ProcessUtils { Set set = new HashSet<>(); if (info != null) { for (ActivityManager.RunningAppProcessInfo aInfo : info) { - Collections.addAll(set, aInfo.pkgList); + Collections.addAll(set, aInfo.processName); } } return set;