Skip to content
This repository was archived by the owner on Oct 18, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/src/main/java/moe/fuqiuluo/portal/Portal.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -25,13 +26,16 @@ class Portal: Application() {
CrashReport.setDeviceModel(applicationContext, Bugly.getDeviceModel())
CrashReport.setCollectPrivacyInfo(applicationContext, true)

appContext = applicationContext

//CrashReport.setAllThreadStackEnable(applicationContext, true, true)
}

companion object {
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"
}
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/moe/fuqiuluo/portal/ext/Perfs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
}


41 changes: 41 additions & 0 deletions app/src/main/java/moe/fuqiuluo/portal/service/MockServiceHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -19,13 +20,18 @@ 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

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")
Expand Down Expand Up @@ -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 {
Expand All @@ -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)
}
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/moe/fuqiuluo/portal/ui/mock/Rocker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<View>(R.id.auto).callOnClick()
autoView.setVisibility(View.GONE)
rockerView.setVisibility(View.GONE)
expandMenuView.setVisibility(View.GONE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -242,6 +243,11 @@ class SettingsFragment : Fragment() {
}
}

binding.loopBroadcastLocationSwitch.isChecked = requireContext().loopBroadcastlocation
binding.loopBroadcastLocationSwitch.setOnCheckedChangeListener { _, isChecked ->
requireContext().loopBroadcastlocation = isChecked
showToast("重启模拟生效")
}
return root
}

Expand Down
33 changes: 33 additions & 0 deletions app/src/main/res/layout/fragment_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,39 @@
android:layout_gravity="center_vertical"
app:useMaterialThemeColors="true"/>
</LinearLayout>

<LinearLayout
android:id="@+id/loop_broadcast_location_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="5dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_vertical">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="反定位拉回"
android:textColor="@color/portal_mini_title_color" />
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解决位置拉回问题 可能导致发热"
android:textSize="11sp" />
</LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/loop_broadcast_location_switch"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
app:useMaterialThemeColors="true"/>
</LinearLayout>
</LinearLayout>

</ScrollView>
Expand Down
2 changes: 1 addition & 1 deletion xposed/src/main/java/moe/fuqiuluo/xposed/utils/FakeLoc.kt
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ object FakeLoc {
/**
* 反定位复原加强(启用后将导致部分应用在关闭Portal后需要重新启动才能重新获取定位)
*/
//var enableEnhancedAntiLocRestoration = true
var loopBroadcastLocation = false

/**
* 上一次的位置
Expand Down
Loading