🎯 Główna Idea

Moduł Permissions upraszcza obsługę uprawnień Android. Zamiast ręcznie zarządzać ActivityResultContracts, wystarczy proste wywołanie z callbackiem.

📝 Podstawowe użycie

// Poproś o pojedyncze uprawnienie
ADict.Permissions.request(activity, Permission.CAMERA) { granted ->
    if (granted) {
        openCamera()
    } else {
        showDeniedMessage()
    }
}

// Sprawdź bez pytania
if (ADict.Permissions.isGranted(context, Permission.LOCATION)) {
    getCurrentLocation()
}

📋 Wiele uprawnień naraz

// Poproś o kilka uprawnień
ADict.Permissions.requestMultiple(
    activity,
    listOf(Permission.CAMERA, Permission.RECORD_AUDIO, Permission.LOCATION)
) { results ->
    // results: Map<String, Boolean>

    if (results.all { it.value }) {
        // Wszystkie przyznane
        startVideoRecordingWithLocation()
    } else {
        // Sprawdź które brakują
        val missing = results.filter { !it.value }.keys
        showMissingPermissions(missing)
    }
}

// Sprawdź które brakują
val missing = ADict.Permissions.getMissingPermissions(
    context,
    listOf(Permission.CAMERA, Permission.RECORD_AUDIO)
)
if (missing.isEmpty()) {
    // Wszystkie są
}

💬 Z wyjaśnieniem (Rationale)

Automatycznie pokazuje dialog z wyjaśnieniem gdy potrzeba:

ADict.Permissions.requestWithRationale(
    activity = activity,
    permission = Permission.CAMERA,
    rationale = "Potrzebujemy dostępu do kamery, aby zrobić zdjęcie profilowe",
    rationaleTitle = "Wymagane uprawnienie",  // opcjonalne
    positiveButton = "OK",                     // opcjonalne
    negativeButton = "Anuluj",                 // opcjonalne
    onGranted = {
        openCamera()
    },
    onDenied = {
        showAlternativeUpload()
    }
)

// Jeśli uprawnienie jest permanentnie odrzucone,
// automatycznie pokaże dialog z opcją przejścia do ustawień

📊 Stan uprawnienia

val state = ADict.Permissions.getState(activity, Permission.CAMERA)

when (state) {
    PermissionState.GRANTED -> {
        // Przyznane - można używać
        openCamera()
    }
    PermissionState.DENIED -> {
        // Odrzucone, ale można zapytać ponownie
        showRationale()
    }
    PermissionState.PERMANENTLY_DENIED -> {
        // Odrzucone z "Don't ask again" - trzeba iść do ustawień
        showSettingsPrompt()
    }
    PermissionState.NOT_APPLICABLE -> {
        // Nie dotyczy (np. Android 12 permission na Android 10)
    }
}

📱 Dostępne uprawnienia

Stała Uprawnienie Uwagi
Permission.CAMERAKamera
Permission.LOCATIONDokładna lokalizacja
Permission.LOCATION_COARSEPrzybliżona lokalizacja
Permission.RECORD_AUDIOMikrofon
Permission.READ_CONTACTSOdczyt kontaktów
Permission.WRITE_CONTACTSZapis kontaktów
Permission.READ_STORAGEOdczyt pamięciLegacy
Permission.READ_MEDIA_IMAGESOdczyt zdjęćAndroid 13+
Permission.READ_MEDIA_VIDEOOdczyt wideoAndroid 13+
Permission.POST_NOTIFICATIONSPowiadomieniaAndroid 13+
Permission.BLUETOOTH_CONNECTPołączenie BTAndroid 12+
Permission.BLUETOOTH_SCANSkanowanie BTAndroid 12+

🔧 Funkcje pomocnicze

// Otwórz ustawienia aplikacji
ADict.Permissions.openAppSettings(context)

// Otwórz ustawienia lokalizacji
ADict.Permissions.openLocationSettings(context)

// Otwórz ustawienia Bluetooth
ADict.Permissions.openBluetoothSettings(context)

// Czy lokalizacja włączona w systemie?
if (!ADict.Permissions.isLocationEnabled(context)) {
    showEnableLocationPrompt()
}

// Czy Bluetooth włączony?
if (!ADict.Permissions.isBluetoothEnabled(context)) {
    showEnableBluetoothPrompt()
}

// Obsłuż wynik w Activity (jeśli nie używasz ActivityResultContracts)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    ADict.Permissions.onRequestPermissionsResult(requestCode, permissions, grantResults)
}