From e25f590bd6e48d9d9a91d28e2ff616e199b1c1dc Mon Sep 17 00:00:00 2001 From: Mygod Date: Fri, 1 Jun 2018 20:55:48 +0800 Subject: [PATCH] Fix SecurityExceptions caused by LOH --- .../manage/LocalOnlyHotspotManager.kt | 24 ++++++++++++++++--- mobile/src/main/res/values-zh-rCN/strings.xml | 1 + mobile/src/main/res/values/strings.xml | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt index 07148997..b35fe453 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt @@ -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)) } } } diff --git a/mobile/src/main/res/values-zh-rCN/strings.xml b/mobile/src/main/res/values-zh-rCN/strings.xml index 301cad90..2e0299ed 100644 --- a/mobile/src/main/res/values-zh-rCN/strings.xml +++ b/mobile/src/main/res/values-zh-rCN/strings.xml @@ -29,6 +29,7 @@ 未添加服务请求 临时 WLAN 热点 + 使用临时热点需要打开位置服务。 打开热点失败 (原因:%s) 无频段 通用错误 diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 403e3f0b..5645e6ef 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -40,6 +40,7 @@ no service requests added Temporary Wi\u2011Fi hotspot + Temporary hotspot requires location to be turned on. Failed to start hotspot (reason: %s) no channel generic error