From efccbe4993496eaaa1d88b3c5996a77971457d43 Mon Sep 17 00:00:00 2001 From: lingxiiii <1570242352@qq.com> Date: Sun, 4 May 2025 23:08:10 +0800 Subject: [PATCH 1/2] Fixed rocker's autoCard can't hiding --- app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt b/app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt index 06768f9..2e6d4b7 100644 --- a/app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt +++ b/app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt @@ -122,6 +122,7 @@ class Rocker(private val activity: Activity) : View.OnTouchListener { private fun switchHide(rockerView: RockerView, autoView: AppCompatImageView, expandMenuView: AppCompatImageView) { if (isHide) { + if(!autoCardVisible)root.findViewById(R.id.auto).callOnClick() autoView.setVisibility(View.GONE) rockerView.setVisibility(View.GONE) expandMenuView.setVisibility(View.GONE) From 2abfcaab98d06133fb10b4691d2e96b3e33058e6 Mon Sep 17 00:00:00 2001 From: lingxiiii <1570242352@qq.com> Date: Sun, 4 May 2025 23:11:00 +0800 Subject: [PATCH 2/2] Added loop location broadcast feature --- .../main/java/moe/fuqiuluo/portal/Portal.kt | 4 ++ .../java/moe/fuqiuluo/portal/ext/Perfs.kt | 7 ++++ .../portal/service/MockServiceHelper.kt | 41 +++++++++++++++++++ .../portal/ui/settings/SettingsFragment.kt | 6 +++ app/src/main/res/layout/fragment_settings.xml | 33 +++++++++++++++ .../java/moe/fuqiuluo/xposed/utils/FakeLoc.kt | 2 +- 6 files changed, 92 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/moe/fuqiuluo/portal/Portal.kt b/app/src/main/java/moe/fuqiuluo/portal/Portal.kt index 0f2e606..e0f8e0c 100644 --- a/app/src/main/java/moe/fuqiuluo/portal/Portal.kt +++ b/app/src/main/java/moe/fuqiuluo/portal/Portal.kt @@ -1,6 +1,7 @@ package moe.fuqiuluo.portal import android.app.Application +import android.content.Context import com.baidu.location.LocationClient import com.baidu.mapapi.CoordType import com.baidu.mapapi.SDKInitializer @@ -25,6 +26,8 @@ class Portal: Application() { CrashReport.setDeviceModel(applicationContext, Bugly.getDeviceModel()) CrashReport.setCollectPrivacyInfo(applicationContext, true) + appContext = applicationContext + //CrashReport.setAllThreadStackEnable(applicationContext, true, true) } @@ -32,6 +35,7 @@ class Portal: Application() { val DEFAULT_COORD_TYPE = CoordType.GCJ02 const val DEFAULT_COORD_STR = "GCJ02" + lateinit var appContext: Context //val DEFAULT_COORD_TYPE = CoordType.BD09LL //const val DEFAULT_COORD_STR = "bd09ll" } diff --git a/app/src/main/java/moe/fuqiuluo/portal/ext/Perfs.kt b/app/src/main/java/moe/fuqiuluo/portal/ext/Perfs.kt index cb786bd..697e8a0 100644 --- a/app/src/main/java/moe/fuqiuluo/portal/ext/Perfs.kt +++ b/app/src/main/java/moe/fuqiuluo/portal/ext/Perfs.kt @@ -220,4 +220,11 @@ var Context.disableWifiScan: Boolean FakeLoc.enableMockWifi = value } +var Context.loopBroadcastlocation: Boolean + get() = sharedPrefs.getBoolean("loopBroadcastLocation", FakeLoc.loopBroadcastLocation) + set(value) = sharedPrefs.edit { + putBoolean("loopBroadcastLocation", value) + FakeLoc.loopBroadcastLocation = value + } + diff --git a/app/src/main/java/moe/fuqiuluo/portal/service/MockServiceHelper.kt b/app/src/main/java/moe/fuqiuluo/portal/service/MockServiceHelper.kt index b65170e..7b5882e 100644 --- a/app/src/main/java/moe/fuqiuluo/portal/service/MockServiceHelper.kt +++ b/app/src/main/java/moe/fuqiuluo/portal/service/MockServiceHelper.kt @@ -6,6 +6,7 @@ import android.location.LocationManager import android.os.Build import android.os.Bundle import android.util.Log +import moe.fuqiuluo.portal.Portal import moe.fuqiuluo.portal.android.root.ShellUtils import moe.fuqiuluo.portal.ext.altitude import moe.fuqiuluo.portal.ext.debug @@ -19,6 +20,8 @@ import moe.fuqiuluo.portal.ext.enableRequestGeofence import moe.fuqiuluo.portal.ext.minSatelliteCount import moe.fuqiuluo.portal.ext.needDowngradeToCdma import moe.fuqiuluo.portal.ext.speed +import moe.fuqiuluo.portal.ext.reportDuration +import moe.fuqiuluo.portal.ext.loopBroadcastlocation import moe.fuqiuluo.xposed.utils.FakeLoc import java.io.File @@ -26,6 +29,9 @@ object MockServiceHelper { const val PROVIDER_NAME = "portal" private lateinit var randomKey: String + private var loopThread :Thread ?= null + @Volatile private var isRunning = false + fun tryInitService(locationManager: LocationManager) { val rely = Bundle() Log.d("MockServiceHelper", "Try to init service") @@ -125,6 +131,7 @@ object MockServiceHelper { rely.putDouble("speed", speed) rely.putDouble("altitude", altitude) rely.putFloat("accuracy", accuracy) + startLoopBroadcastLocation(locationManager) return if(locationManager.sendExtraCommand(PROVIDER_NAME, randomKey, rely)) { isMockStart(locationManager) } else { @@ -138,6 +145,7 @@ object MockServiceHelper { } val rely = Bundle() rely.putString("command_id", "stop") + stopLoopBroadcastLocation() if (locationManager.sendExtraCommand(PROVIDER_NAME, randomKey, rely)) { return !isMockStart(locationManager) } @@ -339,6 +347,39 @@ object MockServiceHelper { return ::randomKey.isInitialized } + + private fun startLoopBroadcastLocation(locationManager: LocationManager){ + val appContext = Portal.appContext + val delayTime=appContext.reportDuration.toLong() + + if(isRunning) return + if(!appContext.loopBroadcastlocation) return + + isRunning=true + loopThread=Thread{ + Log.d("MockServiceHelper","loopBoardcast: Start") + while(isRunning){ + try { + broadcastLocation(locationManager) + Thread.sleep(delayTime) + }catch (e:InterruptedException){ + if (FakeLoc.enableDebugLog) { + Log.d("MockServiceHelper","loopBoardcast: Stop") + } + break + } + } + } + loopThread!!.start() + } + + private fun stopLoopBroadcastLocation(){ + isRunning =false + loopThread?.interrupt() + loopThread = null + } + + @SuppressLint("DiscouragedPrivateApi") fun loadPortalLibrary(context: Context): Boolean { if (!ShellUtils.hasRoot()) return false diff --git a/app/src/main/java/moe/fuqiuluo/portal/ui/settings/SettingsFragment.kt b/app/src/main/java/moe/fuqiuluo/portal/ui/settings/SettingsFragment.kt index 43dd884..4af712f 100644 --- a/app/src/main/java/moe/fuqiuluo/portal/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/moe/fuqiuluo/portal/ui/settings/SettingsFragment.kt @@ -26,6 +26,7 @@ import moe.fuqiuluo.portal.ext.disableGetCurrentLocation import moe.fuqiuluo.portal.ext.disableRegisterLocationListener import moe.fuqiuluo.portal.ext.disableWifiScan import moe.fuqiuluo.portal.ext.hookSensor +import moe.fuqiuluo.portal.ext.loopBroadcastlocation import moe.fuqiuluo.portal.ext.minSatelliteCount import moe.fuqiuluo.portal.ext.needDowngradeToCdma import moe.fuqiuluo.portal.ext.needOpenSELinux @@ -242,6 +243,11 @@ class SettingsFragment : Fragment() { } } + binding.loopBroadcastLocationSwitch.isChecked = requireContext().loopBroadcastlocation + binding.loopBroadcastLocationSwitch.setOnCheckedChangeListener { _, isChecked -> + requireContext().loopBroadcastlocation = isChecked + showToast("重启模拟生效") + } return root } diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index f675ac7..a5ab6f9 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -473,6 +473,39 @@ android:layout_gravity="center_vertical" app:useMaterialThemeColors="true"/> + + + + + + + + diff --git a/xposed/src/main/java/moe/fuqiuluo/xposed/utils/FakeLoc.kt b/xposed/src/main/java/moe/fuqiuluo/xposed/utils/FakeLoc.kt index 9a37f37..8619250 100644 --- a/xposed/src/main/java/moe/fuqiuluo/xposed/utils/FakeLoc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/xposed/utils/FakeLoc.kt @@ -91,7 +91,7 @@ object FakeLoc { /** * 反定位复原加强(启用后将导致部分应用在关闭Portal后需要重新启动才能重新获取定位) */ - //var enableEnhancedAntiLocRestoration = true + var loopBroadcastLocation = false /** * 上一次的位置