Permissions playstore dialog (#22)

- Permissions dispatcher added
 - Updated to widget api 31+
 - circleci.yml updated
 - fastlane file fixed
This commit is contained in:
2023-08-13 17:11:05 +01:00
committed by GitHub
parent 1fa34764df
commit 247ff22115
23 changed files with 269 additions and 171 deletions

View File

@@ -6,7 +6,7 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.appttude.h_mal.atlas_weather.R
import com.appttude.h_mal.atlas_weather.model.forecast.WeatherDisplay
import com.appttude.h_mal.atlas_weather.ui.BaseFragment
import com.appttude.h_mal.atlas_weather.base.BaseFragment
import com.appttude.h_mal.atlas_weather.utils.navigateTo
import com.appttude.h_mal.atlas_weather.viewmodel.WorldViewModel
import com.appttude.h_mal.monoWeather.ui.home.adapter.WeatherRecyclerAdapter

View File

@@ -11,24 +11,30 @@ import androidx.fragment.app.Fragment
import androidx.navigation.Navigation.findNavController
import androidx.navigation.ui.onNavDestinationSelected
import com.appttude.h_mal.atlas_weather.R
import com.appttude.h_mal.atlas_weather.application.LOCATION_PERMISSION_REQUEST
import com.appttude.h_mal.atlas_weather.base.BaseFragment
import com.appttude.h_mal.atlas_weather.model.forecast.Forecast
import com.appttude.h_mal.atlas_weather.model.forecast.WeatherDisplay
import com.appttude.h_mal.atlas_weather.utils.displayToast
import com.appttude.h_mal.atlas_weather.utils.navigateTo
import com.appttude.h_mal.atlas_weather.viewmodel.MainViewModel
import com.appttude.h_mal.monoWeather.dialog.PermissionsDeclarationDialog
import com.appttude.h_mal.atlas_weather.ui.BaseFragment
import com.appttude.h_mal.monoWeather.ui.home.adapter.WeatherRecyclerAdapter
import kotlinx.android.synthetic.main.fragment_home.*
import permissions.dispatcher.NeedsPermission
import permissions.dispatcher.OnNeverAskAgain
import permissions.dispatcher.OnPermissionDenied
import permissions.dispatcher.OnShowRationale
import permissions.dispatcher.PermissionRequest
import permissions.dispatcher.RuntimePermissions
/**
* A simple [Fragment] subclass.
* create an instance of this fragment.
*/
@RuntimePermissions
class HomeFragment : BaseFragment<MainViewModel>(R.layout.fragment_home) {
lateinit var dialog: PermissionsDeclarationDialog
lateinit var recyclerAdapter: WeatherRecyclerAdapter
@SuppressLint("MissingPermission")
@@ -36,14 +42,10 @@ class HomeFragment : BaseFragment<MainViewModel>(R.layout.fragment_home) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
dialog = PermissionsDeclarationDialog(requireContext())
swipe_refresh.apply {
setOnRefreshListener {
getPermissionResult(ACCESS_COARSE_LOCATION, LOCATION_PERMISSION_REQUEST) {
viewModel.fetchData()
isRefreshing = true
}
showLocationWithPermissionCheck()
isRefreshing = true
}
}
@@ -57,16 +59,7 @@ class HomeFragment : BaseFragment<MainViewModel>(R.layout.fragment_home) {
@SuppressLint("MissingPermission")
override fun onStart() {
super.onStart()
dialog.showDialog(agreeCallback = {
getPermissionResult(ACCESS_COARSE_LOCATION, LOCATION_PERMISSION_REQUEST) {
viewModel.fetchData()
}
})
}
override fun onStop() {
super.onStop()
dialog.dismiss()
showLocationWithPermissionCheck()
}
override fun onSuccess(data: Any?) {
@@ -83,14 +76,8 @@ class HomeFragment : BaseFragment<MainViewModel>(R.layout.fragment_home) {
swipe_refresh.isRefreshing = false
}
@SuppressLint("MissingPermission")
override fun permissionsGranted() {
viewModel.fetchData()
}
private fun navigateToFurtherDetails(forecast: Forecast) {
val directions = HomeFragmentDirections
.actionHomeFragmentToFurtherDetailsFragment(forecast)
val directions = HomeFragmentDirections.actionHomeFragmentToFurtherDetailsFragment(forecast)
navigateTo(directions)
}
@@ -103,4 +90,35 @@ class HomeFragment : BaseFragment<MainViewModel>(R.layout.fragment_home) {
val navController = findNavController(requireActivity(), R.id.container)
return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// NOTE: delegate the permission handling to generated method
onRequestPermissionsResult(requestCode, grantResults)
}
@SuppressLint("MissingPermission")
@NeedsPermission(ACCESS_COARSE_LOCATION)
fun showLocation() {
viewModel.fetchData()
}
@OnShowRationale(ACCESS_COARSE_LOCATION)
fun showRationaleForLocation(request: PermissionRequest) {
PermissionsDeclarationDialog(requireContext()).showDialog({
request.proceed()
}, {
request.cancel()
})
}
@OnPermissionDenied(ACCESS_COARSE_LOCATION)
fun onLocationDenied() {
displayToast("Location permissions have been denied")
}
@OnNeverAskAgain(ACCESS_COARSE_LOCATION)
fun onLocationNeverAskAgain() {
displayToast("Location permissions have been to never ask again")
}
}

View File

@@ -1,5 +1,6 @@
package com.appttude.h_mal.monoWeather.ui.widget
import android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
import android.Manifest.permission.ACCESS_COARSE_LOCATION
import android.app.Activity
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
@@ -7,20 +8,26 @@ import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID
import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
import android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID
import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Build
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat.checkSelfPermission
import com.appttude.h_mal.atlas_weather.R
import com.appttude.h_mal.atlas_weather.utils.displayToast
import com.appttude.h_mal.monoWeather.dialog.DeclarationBuilder
import com.appttude.h_mal.monoWeather.dialog.PermissionsDeclarationDialog
import kotlinx.android.synthetic.monoWeather.permissions_declaration_dialog.cancel
import kotlinx.android.synthetic.monoWeather.permissions_declaration_dialog.submit
import permissions.dispatcher.NeedsPermission
import permissions.dispatcher.OnNeverAskAgain
import permissions.dispatcher.OnPermissionDenied
import permissions.dispatcher.OnShowRationale
import permissions.dispatcher.PermissionRequest
import permissions.dispatcher.RuntimePermissions
const val PERMISSION_CODE = 401
@RuntimePermissions
class WidgetLocationPermissionActivity : AppCompatActivity(), DeclarationBuilder {
override val link: String = "https://sites.google.com/view/hmaldev/home/monochrome"
override var message: String = ""
@@ -54,31 +61,16 @@ class WidgetLocationPermissionActivity : AppCompatActivity(), DeclarationBuilder
}
submit.setOnClickListener {
if (checkSelfPermission(this, ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED) {
requestPermissions(arrayOf(ACCESS_COARSE_LOCATION), PERMISSION_CODE)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
showBackgroundLocationWithPermissionCheck()
} else {
submitWidget()
showLocationWithPermissionCheck()
}
}
cancel.setOnClickListener { finish() }
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PERMISSION_GRANTED) {
submitWidget()
} else {
displayToast("Location Permission denied")
}
}
}
private fun submitWidget() {
sendUpdateIntent()
finishCurrencyWidgetActivity()
@@ -106,4 +98,66 @@ class WidgetLocationPermissionActivity : AppCompatActivity(), DeclarationBuilder
sendBroadcast(this)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// NOTE: delegate the permission handling to generated method
onRequestPermissionsResult(requestCode, grantResults)
}
@NeedsPermission(ACCESS_COARSE_LOCATION)
fun showLocation() {
submitWidget()
}
@RequiresApi(Build.VERSION_CODES.Q)
@NeedsPermission(ACCESS_BACKGROUND_LOCATION)
fun showBackgroundLocation() {
submitWidget()
}
@OnShowRationale(ACCESS_COARSE_LOCATION)
fun showRationaleForLocation(request: PermissionRequest) {
PermissionsDeclarationDialog(this).showDialog({
request.proceed()
}, {
request.cancel()
})
}
@RequiresApi(Build.VERSION_CODES.Q)
@OnShowRationale(ACCESS_BACKGROUND_LOCATION)
fun showRationaleForBackgroundLocation(request: PermissionRequest) {
PermissionsDeclarationDialog(this).showDialog({
request.proceed()
}, {
request.cancel()
})
}
@OnPermissionDenied(ACCESS_COARSE_LOCATION)
fun onLocationDenied() {
displayToast("Location permissions have been denied")
}
@RequiresApi(Build.VERSION_CODES.Q)
@OnPermissionDenied(ACCESS_BACKGROUND_LOCATION)
fun onBackgroundLocationDenied() {
displayToast("Background Location permissions have been denied")
}
@OnNeverAskAgain(ACCESS_COARSE_LOCATION)
fun onLocationNeverAskAgain() {
displayToast("Location permissions have been to never ask again")
}
@RequiresApi(Build.VERSION_CODES.Q)
@OnNeverAskAgain(ACCESS_BACKGROUND_LOCATION)
fun onBackgroundLocationNeverAskAgain() {
displayToast("Background Location permissions have been to never ask again")
}
}

View File

@@ -3,7 +3,7 @@ package com.appttude.h_mal.monoWeather.ui.world
import android.os.Bundle
import android.view.View
import com.appttude.h_mal.atlas_weather.R
import com.appttude.h_mal.atlas_weather.ui.BaseFragment
import com.appttude.h_mal.atlas_weather.base.BaseFragment
import com.appttude.h_mal.atlas_weather.utils.displayToast
import com.appttude.h_mal.atlas_weather.utils.goBack
import com.appttude.h_mal.atlas_weather.utils.hideKeyboard

View File

@@ -6,7 +6,7 @@ import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.appttude.h_mal.atlas_weather.R
import com.appttude.h_mal.atlas_weather.model.forecast.WeatherDisplay
import com.appttude.h_mal.atlas_weather.ui.BaseFragment
import com.appttude.h_mal.atlas_weather.base.BaseFragment
import com.appttude.h_mal.atlas_weather.utils.navigateTo
import com.appttude.h_mal.atlas_weather.viewmodel.WorldViewModel
import com.appttude.h_mal.monoWeather.ui.world.WorldFragmentDirections.actionWorldFragmentToWorldItemFragment

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:configure="com.appttude.h_mal.monoWeather.ui.widget.WidgetLocationPermissionActivity"
android:initialKeyguardLayout="@layout/weather_app_widget"
android:initialLayout="@layout/weather_app_widget"
android:targetCellWidth="5"
android:targetCellHeight="1"
android:previewImage="@drawable/widget_screenshot"
android:resizeMode="vertical|horizontal"
android:updatePeriodMillis="1800000"
android:widgetCategory="home_screen">
</appwidget-provider>