Commit 51f2637f authored by wanglei's avatar wanglei

...处理权限

parent 6ba72111
......@@ -4,17 +4,17 @@
<uses-permission android:name="android.permission.INTERNET" /> <!-- 大致位置,依赖网络 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 精确的位置,GPS -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Recommended for Android 9 (API level 28) and lower. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Recommended for Android 9 (API level 28) and lower. -->
<!-- Required for Android 10 (API level 29) and higher. -->
<!-- <service -->
<!-- android:foregroundServiceType="location" -->
<!-- android:name="MyNavigationService" /> -->
<!-- Required only when requesting background location access on Android 10 (API level 29) and higher. -->
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- 身体活动数据 -->
<!-- <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
......
package com.base.locationsharewhite.ui.locationmap
import android.Manifest
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
......@@ -12,7 +15,6 @@ import androidx.lifecycle.lifecycleScope
import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.R
import com.base.locationsharewhite.bean.ConstObject
import com.base.locationsharewhite.bean.ViewerBean
import com.base.locationsharewhite.bean.ViewingBean
import com.base.locationsharewhite.databinding.ActivityLocationMapBinding
import com.base.locationsharewhite.helper.BaseActivity
......@@ -26,10 +28,12 @@ import com.base.locationsharewhite.ui.set.RenameActivity.Companion.RENAME_VIEWIN
import com.base.locationsharewhite.ui.views.DialogView.showMapTypeDialog
import com.base.locationsharewhite.ui.views.DialogView.showViewerMoreDialog
import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.IntentUtils.intentAppDetailsSettings
import com.base.locationsharewhite.utils.IntentUtils.intentLocationSetting
import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.SpStringUtils
import com.base.locationsharewhite.utils.SpStringUtils.VIEWER_NICKNAME_KEY
import com.base.locationsharewhite.utils.SpStringUtils.VIEWING_NICKNAME_KEY
import com.base.locationsharewhite.utils.SpStringUtils._DEVICE_NICKNAME_
import com.base.locationsharewhite.utils.ToastUtils.toast
......@@ -79,6 +83,7 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
showFriendGuideOrNoFriend()
initAdapter()
initViewingData()
}
private fun initAdapter() {
......@@ -231,6 +236,26 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
initViewingData()
}
binding.bottomSheet.setOnClickListener { }
binding.ivPermission.setOnClickListener {
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) { map ->
val result = map.values.all { it }
if (result) {
binding.ivPermission.visibility = View.INVISIBLE
} else {
val flag = checkLocationPermissionDeniedByUser()
if (flag) {
toast("Permission Denied By User")
launcher.launch(intentLocationSetting())
} else {
}
}
}
}
}
......@@ -411,8 +436,11 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
}
if (checkLocationPermission()) {
binding.ivPermission.visibility = View.GONE
locationPresenter.requestLocationUpdates()
locationPresenter.startUploadMyLocation()
} else {
binding.ivPermission.visibility = View.VISIBLE
}
refreshNickName()
}
......
......@@ -5,10 +5,10 @@ import android.app.Activity
import android.location.Location
import android.os.Looper
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.location.LocationPositionUtils.uploadMyLocation
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.utils.BatteryUtils.getBatteryLevel
import com.base.locationsharewhite.utils.LogEx
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
......@@ -82,6 +82,8 @@ class LocationPresenter(
oneShotLocationCallBack = null
}
}.addOnFailureListener { e ->
LogEx.logDebug(TAG, "e=$e")
}
}
......
package com.base.locationsharewhite.ui.main
import android.Manifest
import android.app.Dialog
import android.content.Intent
import android.graphics.Color
import android.os.Build
......@@ -11,19 +12,23 @@ import androidx.lifecycle.lifecycleScope
import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.ActivityMainBinding
import com.base.locationsharewhite.fcm.MsgMgr
import com.base.locationsharewhite.helper.BaseActivity
import com.base.locationsharewhite.helper.MyApplication
import com.base.locationsharewhite.helper.config.ConstConfig
import com.base.locationsharewhite.location.LocationLoginUtils
import com.base.locationsharewhite.map.MapUtils.addLocationMarker
import com.base.locationsharewhite.ui.howuse.HowUseActivity
import com.base.locationsharewhite.ui.locationmap.LocationMapActivity
import com.base.locationsharewhite.ui.set.SettingActivity
import com.base.locationsharewhite.ui.views.DialogView.showAppExitDialog
import com.base.locationsharewhite.ui.views.LocationPermissionDialog.showLocationAllowAllTimeDialog
import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.requestLocationAllowAllTime
import com.base.locationsharewhite.utils.ToastUtils.toast
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
......@@ -31,9 +36,13 @@ import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker
/**
* https://developer.android.com/about/versions/14/changes/data-safety?hl=zh-cn
*/
class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
private val TAG = "MainActivity"
private var allowAllTimeDialog: Dialog? = null
override val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
......@@ -58,17 +67,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
actionId = intent.extras?.getInt("actionId")
LogEx.logDebug(TAG, "initView actionId=$actionId", true)
if (!checkLocationPermission()) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) {
val flag1 = checkLocationPermission()
val flag2 = checkBackgroundLocationPermission()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
LogEx.logDebug(TAG, "权限自定义弹窗 flag1=$flag1 flag2=$flag2")
val denyFlag1 = checkLocationPermissionDeniedByUser()
val denyFlag2 = checkBackgroundLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "用户拒绝 denyFlag1=$denyFlag1 denyFlag2=$denyFlag2")
}
}
}
}
//访问运动数据
//https://developer.android.com/develop/sensors-and-location/location/transitions?hl=zh-cn
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
......@@ -82,8 +90,48 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
mapFragment?.getMapAsync(this)
LocationLoginUtils.login()
}
override fun onResume() {
super.onResume()
val isRecreate = updateAppLanguage(MyApplication.mainLanguage, TAG) {
MyApplication.mainLanguage = it
}
if (isRecreate) {
return
}
mainPresenter.requestLocationUpdates()
mainPresenter.startLocationJob(lifecycleScope)
showAllowAllTimeDialog()
isRunning = true
}
private fun showAllowAllTimeDialog() {
if (!checkLocationPermission() || !checkBackgroundLocationPermission()) {
// toast("显示权限始终允许弹窗")
if (allowAllTimeDialog == null) {
allowAllTimeDialog =
showLocationAllowAllTimeDialog(
setAction = {
requestLocationAllowAllTime(launcher, jumpOutAction = {}, permissionAllowAction = {})
},
dismissAction = {
allowAllTimeDialog = null
})
}
} else {
// toast("不显示权限始终允许弹窗")
allowAllTimeDialog?.dismiss()
allowAllTimeDialog = null
}
}
override fun initListener() {
super.initListener()
if (isLanguageRecreate(MyApplication.mainLanguage)) {
......@@ -114,27 +162,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
startActivity(Intent(this, SettingActivity::class.java))
}
binding.tvTittle.setOnClickListener {
if (BuildConfig.DEBUG) {
MsgMgr.sendNotification(this, ConstConfig.ACTION_SHARE_LOCATION)
}
}
}
override fun onResume() {
super.onResume()
val isRecreate = updateAppLanguage(MyApplication.mainLanguage, TAG) {
MyApplication.mainLanguage = it
}
if (isRecreate) {
return
}
mainPresenter.requestLocationUpdates()
mainPresenter.startLocationJob(lifecycleScope)
isRunning = true
}
override fun onPause() {
super.onPause()
if (isRunning) {
......
......@@ -6,6 +6,7 @@ import android.location.Location
import android.os.Looper
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.utils.LogEx
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
......@@ -23,6 +24,8 @@ class MainPresenter(
val activity: Activity
) {
private val TAG = "MainPresenter"
//google的地理位置服务
private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
private var googleLocation: LatLng? = null
......@@ -31,9 +34,11 @@ class MainPresenter(
private fun getGoogleServiceLocation() {
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
LogEx.logDebug(TAG, "getGoogleServiceLocation location=$location")
if (location != null) {
val latLng = LatLng(location.latitude, location.longitude)
googleLocation = latLng
LogEx.logDebug(TAG, "getGoogleServiceLocation latLng=$latLng")
}
}
}
......@@ -43,6 +48,7 @@ class MainPresenter(
*/
private fun getMyLocation(): LatLng? {
var latLng = activity.getLatLngByLocationManager()
LogEx.logDebug(TAG, "getMyLocation latLng=$latLng")
if (latLng == null) {
latLng = googleLocation
}
......
package com.base.locationsharewhite.ui.views
import android.app.AlertDialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.LinearLayout
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.DialogAllowAllTimeLocationBinding
object LocationPermissionDialog {
fun Context.showLocationAllowAllTimeDialog(
setAction: (() -> Unit)? = null,
dismissAction: (() -> Unit)? = null
): AlertDialog {
val dialog = AlertDialog.Builder(this).create()
val binding = DialogAllowAllTimeLocationBinding.inflate(LayoutInflater.from(this))
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345)
params?.height = LinearLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.CENTER
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.flClose.setOnClickListener {
dialog.dismiss()
}
binding.tvSettings.setOnClickListener {
dialog.dismiss()
setAction?.invoke()
}
dialog.setOnDismissListener {
dismissAction?.invoke()
}
return dialog
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
object IntentUtils {
fun intentAppDetailsSettings(context: Context): Intent {
val intent: Intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", context.packageName, null)
intent.setData(uri)
return intent
}
fun intentLocationSetting(): Intent {
val intent: Intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
return intent
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
......@@ -9,6 +10,10 @@ import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.core.app.ActivityCompat
import com.base.locationsharewhite.utils.IntentUtils.intentAppDetailsSettings
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.ToastUtils.toast
object PermissionUtils {
......@@ -38,6 +43,33 @@ object PermissionUtils {
return fineLocationPermission == PackageManager.PERMISSION_GRANTED && accessCoarsePermission == PackageManager.PERMISSION_GRANTED;
}
fun Activity.checkLocationPermissionDeniedByUser(): Boolean {
val deniedByUser1 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
val deniedByUser2 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)
LogEx.logDebug("checkLocationPermissionDeniedByUser", "accessCoarsePermission=$deniedByUser1")
LogEx.logDebug("checkLocationPermissionDeniedByUser", "fineLocationPermission=$deniedByUser2")
return deniedByUser1 && deniedByUser2
}
fun Context.checkBackgroundLocationPermission(): Boolean {
return ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_BACKGROUND_LOCATION
) == PackageManager.PERMISSION_GRANTED
}
fun Activity.checkBackgroundLocationPermissionDeniedByUser(): Boolean {
val deniedByUser1 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
return deniedByUser1
}
fun Context.requestStoragePermission(
launcher: ActivityLauncher,
jumpAction: (() -> Unit)? = null,
......@@ -60,4 +92,54 @@ object PermissionUtils {
}
}
fun Activity.requestLocationAllowAllTime(
launcher: ActivityLauncher,
jumpOutAction: (() -> Unit)? = null,//跳转到设置
permissionAllowAction: (() -> Unit)? = null//权限同意
) {
val TAG = "requestLocationAllowAllTime"
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
)
) { map ->
val result = map.values.all { it }
LogEx.logDebug(TAG, "定位权限回调 result=$result")
if (result) {
//跳转到后台位置设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { map ->
val backLocationResult = map.values.all { it }
LogEx.logDebug(TAG, "后台位置权限回调 backLocationResult=$backLocationResult")
if (backLocationResult) {
// toast("权限请求完毕")
permissionAllowAction?.invoke()
} else {
val userBackLocationDeny = this.checkBackgroundLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "userBackLocationDeny userBackLocationDeny=$userBackLocationDeny 跳转设置")
if (userBackLocationDeny) {
jumpOutAction?.invoke()
launcher.launch(intentAppDetailsSettings(this))
}
}
}
} else {
permissionAllowAction?.invoke()
// toast("权限请求完毕")
}
} else {
val userDeny = checkLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "userDeny userDeny=$userDeny 跳转设置")
if (userDeny) {
jumpOutAction?.invoke()
launcher.launch(intentAppDetailsSettings(this))
}
}
}
}
}
\ No newline at end of file
......@@ -53,6 +53,17 @@
app:layout_constraintTop_toBottomOf="@id/iv_change_map_type"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="14dp"
android:src="@mipmap/tishi"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_location"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
......@@ -105,7 +116,7 @@
app:layout_constraintBottom_toBottomOf="@id/tv_friend"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_friend"
tools:ignore="ContentDescription" />
tools:ignore="ContentDescription,ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="345dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_ffffff_15"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:padding="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/guanbi"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/iv_tishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="58dp"
android:src="@mipmap/tishi_permission"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="36dp"
android:layout_marginTop="27dp"
android:gravity="center_horizontal"
android:text="@string/allow_all_time_tip"
android:textColor="#001725"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_tishi" />
<LinearLayout
android:id="@+id/ll_step"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_tip">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_1"
android:textColor="#81888D"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_2"
android:textColor="#81888D"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_3"
android:textColor="#81888D"
android:textSize="15sp" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/cardview"
android:layout_width="238dp"
android:layout_height="64dp"
android:layout_marginTop="50dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="5dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_step">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="22dp"
android:src="@mipmap/yuan_permission"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:text="@string/allow_all_the_time"
android:textColor="#001725"
android:textSize="18sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tv_settings"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="34dp"
android:layout_marginBottom="27dp"
android:background="@drawable/bg_03b988_10"
android:gravity="center"
android:text="@string/open_settings"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cardview" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -24,4 +24,5 @@
<dimen name="dp_225">225dp</dimen>
<dimen name="dp_235">235dp</dimen>
<dimen name="dp_146">146dp</dimen>
<dimen name="dp_345">345dp</dimen>
</resources>
\ No newline at end of file
......@@ -65,4 +65,11 @@
<string name="location_sharing_not_enabled_yet">Location sharing not enabled yet</string>
<string name="copy_my_code_to_a_friend_to_view_his_her_location">Copy my code to a friend to view his/her location!</string>
<string name="open">Open</string>
<string name="sort_by">Sort by</string>
<string name="allow_all_time_tip">You\'ll need to set \"Location\"\ to \"Allow all the time \" in settings. If not, this app will not work correctly.</string>
<string name="allow_all_time_step_1">1. Click the below \"Open Settings\"</string>
<string name="allow_all_time_step_2">2.Click "Permissions" and then \"Location\"</string>
<string name="allow_all_time_step_3">3. Set to Allow all the time</string>
<string name="allow_all_the_time">Allow all the time</string>
<string name="open_settings">OPEN SETTINGS</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment