mirror of
https://github.com/hmalik144/Weather-apps.git
synced 2026-03-18 15:36:04 +00:00
Permissions playstore dialog (#22)
- Permissions dispatcher added - Updated to widget api 31+ - circleci.yml updated - fastlane file fixed
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user