Fix SecurityExceptions caused by LOH

This commit is contained in:
Mygod
2018-06-01 20:55:48 +08:00
parent 68a7a3e444
commit e25f590bd6
3 changed files with 23 additions and 3 deletions

View File

@@ -2,13 +2,16 @@ package be.mygod.vpnhotspot.manage
import android.Manifest
import android.annotation.TargetApi
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.IBinder
import android.provider.Settings
import android.support.v7.widget.RecyclerView
import android.view.View
import android.widget.Toast
import be.mygod.vpnhotspot.LocalOnlyHotspotService
import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.databinding.ListitemInterfaceBinding
@@ -31,13 +34,28 @@ class LocalOnlyHotspotManager(private val parent: TetheringFragment) : Manager()
val binder = manager.binder
if (binder?.iface != null) binder.stop() else {
val context = manager.parent.requireContext()
if (context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) ==
if (context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
context.startForegroundService(Intent(context, LocalOnlyHotspotService::class.java))
} else {
manager.parent.requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
TetheringFragment.START_LOCAL_ONLY_HOTSPOT)
return
}
/**
* LOH also requires location to be turned on. Source:
* https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/53e0284/service/java/com/android/server/wifi/WifiServiceImpl.java#1204
* https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/53e0284/service/java/com/android/server/wifi/WifiSettingsStore.java#228
*/
if (Settings.Secure.getInt(view.context.contentResolver, Settings.Secure.LOCATION_MODE,
Settings.Secure.LOCATION_MODE_OFF) == Settings.Secure.LOCATION_MODE_OFF) {
Toast.makeText(view.context, R.string.tethering_temp_hotspot_location, Toast.LENGTH_LONG).show()
try {
view.context.startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
} catch (exc: ActivityNotFoundException) {
exc.printStackTrace()
}
return
}
context.startForegroundService(Intent(context, LocalOnlyHotspotService::class.java))
}
}
}

View File

@@ -29,6 +29,7 @@
<string name="repeater_failure_reason_no_service_requests">未添加服务请求</string>
<string name="tethering_temp_hotspot">临时 WLAN 热点</string>
<string name="tethering_temp_hotspot_location">使用临时热点需要打开位置服务。</string>
<string name="tethering_temp_hotspot_failure">打开热点失败 (原因:%s)</string>
<string name="tethering_temp_hotspot_failure_no_channel">无频段</string>
<string name="tethering_temp_hotspot_failure_generic">通用错误</string>

View File

@@ -40,6 +40,7 @@
<string name="repeater_failure_reason_no_service_requests">no service requests added</string>
<string name="tethering_temp_hotspot">Temporary Wi\u2011Fi hotspot</string>
<string name="tethering_temp_hotspot_location">Temporary hotspot requires location to be turned on.</string>
<string name="tethering_temp_hotspot_failure">Failed to start hotspot (reason: %s)</string>
<string name="tethering_temp_hotspot_failure_no_channel">no channel</string>
<string name="tethering_temp_hotspot_failure_generic">generic error</string>