diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 5d65bc1..664e1a7 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,15 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
@@ -42,4 +118,4 @@
-
\ No newline at end of file
+
diff --git a/app.config.js b/app.config.js
index d9f67bd..8c92868 100644
--- a/app.config.js
+++ b/app.config.js
@@ -80,6 +80,22 @@ module.exports = {
// Provide your Google Maps API key
googleMapsApiKey: 'YOUR_IOS_GOOGLE_MAPS_API_KEY',
},
+ infoPlist: {
+ NSCameraUsageDescription: 'Allow CodeBuilder Admin to access the camera for capturing photos and video.',
+ NSMicrophoneUsageDescription: 'Allow CodeBuilder Admin to access the microphone for calls, audio, and video capture.',
+ NSPhotoLibraryUsageDescription: 'Allow CodeBuilder Admin to access your photo library to select media.',
+ NSPhotoLibraryAddUsageDescription: 'Allow CodeBuilder Admin to save photos or videos to your library.',
+ NSLocationWhenInUseUsageDescription: 'Allow CodeBuilder Admin to access your location while using the app.',
+ NSLocationAlwaysAndWhenInUseUsageDescription: 'Allow CodeBuilder Admin to access your location even when the app is not active.',
+ NSCalendarsUsageDescription: 'Allow CodeBuilder Admin to access your calendars.',
+ NSContactsUsageDescription: 'Allow CodeBuilder Admin to access your contacts.',
+ NSBluetoothAlwaysUsageDescription: 'Allow CodeBuilder Admin to use Bluetooth for nearby devices.',
+ NSBluetoothPeripheralUsageDescription: 'Allow CodeBuilder Admin to use Bluetooth peripherals.',
+ NSMotionUsageDescription: 'Allow CodeBuilder Admin to access motion data.',
+ NSSpeechRecognitionUsageDescription: 'Allow CodeBuilder Admin to transcribe speech.',
+ NSFaceIDUsageDescription: 'Allow CodeBuilder Admin to use Face ID for authentication.',
+ NSUserTrackingUsageDescription: 'Allow CodeBuilder Admin to track activity for personalized experiences.',
+ },
},
android: {
versionCode: versionData.androidVersionCode, // Using Android versionCode from version.json
@@ -88,7 +104,391 @@ module.exports = {
backgroundColor: '#ffffff',
},
package: 'com.digitalnomad91.codebuilderadmin',
- permissions: ['NOTIFICATIONS', 'POST_NOTIFICATIONS', 'READ_PHONE_STATE'],
+ permissions: [
+ 'NOTIFICATIONS',
+ 'POST_NOTIFICATIONS',
+ 'android.permission.READ_PHONE_STATE',
+ 'android.permission.ACCESS_ALL_DOWNLOADS',
+ 'android.permission.ACCESS_BLUETOOTH_SHARE',
+ 'android.permission.ACCESS_CACHE_FILESYSTEM',
+ 'android.permission.ACCESS_CHECKIN_PROPERTIES',
+ 'android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY',
+ 'android.permission.ACCESS_DOWNLOAD_MANAGER',
+ 'android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED',
+ 'android.permission.ACCESS_DRM_CERTIFICATES',
+ 'android.permission.ACCESS_EPHEMERAL_APPS',
+ 'android.permission.ACCESS_FM_RADIO',
+ 'android.permission.ACCESS_INPUT_FLINGER',
+ 'android.permission.ACCESS_KEYGUARD_SECURE_STORAGE',
+ 'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
+ 'android.permission.ACCESS_MOCK_LOCATION',
+ 'android.permission.ACCESS_MTP',
+ 'android.permission.ACCESS_NETWORK_CONDITIONS',
+ 'android.permission.ACCESS_NETWORK_STATE',
+ 'android.permission.ACCESS_NOTIFICATIONS',
+ 'android.permission.ACCESS_NOTIFICATION_POLICY',
+ 'android.permission.ACCESS_PDB_STATE',
+ 'android.permission.ACCESS_SURFACE_FLINGER',
+ 'android.permission.ACCESS_VOICE_INTERACTION_SERVICE',
+ 'android.permission.ACCESS_VR_MANAGER',
+ 'android.permission.ACCESS_WIFI_STATE',
+ 'android.permission.ACCESS_WIMAX_STATE',
+ 'android.permission.ACCESS_BACKGROUND_LOCATION',
+ 'android.permission.ACCESS_COARSE_LOCATION',
+ 'android.permission.ACCESS_FINE_LOCATION',
+ 'android.permission.ACCESS_MEDIA_LOCATION',
+ 'android.permission.ACCEPT_HANDOVER',
+ 'android.permission.ACCOUNT_MANAGER',
+ 'android.permission.ACTIVITY_RECOGNITION',
+ 'android.permission.ADD_VOICEMAIL',
+ 'android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK',
+ 'android.permission.ANSWER_PHONE_CALLS',
+ 'android.permission.ASEC_ACCESS',
+ 'android.permission.ASEC_CREATE',
+ 'android.permission.ASEC_DESTROY',
+ 'android.permission.ASEC_MOUNT_UNMOUNT',
+ 'android.permission.ASEC_RENAME',
+ 'android.permission.AUTHENTICATE_ACCOUNTS',
+ 'android.permission.BACKUP',
+ 'android.permission.BATTERY_STATS',
+ 'android.permission.BIND_ACCESSIBILITY_SERVICE',
+ 'android.permission.BIND_APPWIDGET',
+ 'android.permission.BIND_CARRIER_MESSAGING_SERVICE',
+ 'android.permission.BIND_CARRIER_SERVICES',
+ 'android.permission.BIND_CHOOSER_TARGET_SERVICE',
+ 'android.permission.BIND_CONDITION_PROVIDER_SERVICE',
+ 'android.permission.BIND_CONNECTION_SERVICE',
+ 'android.permission.BIND_DEVICE_ADMIN',
+ 'android.permission.BIND_DIRECTORY_SEARCH',
+ 'android.permission.BIND_DREAM_SERVICE',
+ 'android.permission.BIND_INCALL_SERVICE',
+ 'android.permission.BIND_INPUT_METHOD',
+ 'android.permission.BIND_INTENT_FILTER_VERIFIER',
+ 'android.permission.BIND_JOB_SERVICE',
+ 'android.permission.BIND_KEYGUARD_APPWIDGET',
+ 'android.permission.BIND_MIDI_DEVICE_SERVICE',
+ 'android.permission.BIND_NFC_SERVICE',
+ 'android.permission.BIND_NOTIFICATION_LISTENER_SERVICE',
+ 'android.permission.BIND_NOTIFICATION_RANKER_SERVICE',
+ 'android.permission.BIND_PACKAGE_VERIFIER',
+ 'android.permission.BIND_PRINT_RECOMMENDATION_SERVICE',
+ 'android.permission.BIND_PRINT_SERVICE',
+ 'android.permission.BIND_PRINT_SPOOLER_SERVICE',
+ 'android.permission.BIND_QUICK_SETTINGS_TILE',
+ 'android.permission.BIND_REMOTEVIEWS',
+ 'android.permission.BIND_REMOTE_DISPLAY',
+ 'android.permission.BIND_ROUTE_PROVIDER',
+ 'android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE',
+ 'android.permission.BIND_SCREENING_SERVICE',
+ 'android.permission.BIND_TELECOM_CONNECTION_SERVICE',
+ 'android.permission.BIND_TEXT_SERVICE',
+ 'android.permission.BIND_TRUST_AGENT',
+ 'android.permission.BIND_TV_INPUT',
+ 'android.permission.BIND_TV_REMOTE_SERVICE',
+ 'android.permission.BIND_VOICE_INTERACTION',
+ 'android.permission.BIND_VPN_SERVICE',
+ 'android.permission.BIND_VR_LISTENER_SERVICE',
+ 'android.permission.BIND_WALLPAPER',
+ 'android.permission.BLUETOOTH',
+ 'android.permission.BLUETOOTH_ADMIN',
+ 'android.permission.BLUETOOTH_ADVERTISE',
+ 'android.permission.BLUETOOTH_CONNECT',
+ 'android.permission.BLUETOOTH_MAP',
+ 'android.permission.BLUETOOTH_PRIVILEGED',
+ 'android.permission.BLUETOOTH_SCAN',
+ 'android.permission.BLUETOOTH_STACK',
+ 'android.permission.BODY_SENSORS',
+ 'android.permission.BODY_SENSORS_BACKGROUND',
+ 'android.permission.BRICK',
+ 'android.permission.BROADCAST_CALLLOG_INFO',
+ 'android.permission.BROADCAST_NETWORK_PRIVILEGED',
+ 'android.permission.BROADCAST_PACKAGE_REMOVED',
+ 'android.permission.BROADCAST_PHONE_ACCOUNT_REGISTRATION',
+ 'android.permission.BROADCAST_SMS',
+ 'android.permission.BROADCAST_STICKY',
+ 'android.permission.BROADCAST_WAP_PUSH',
+ 'android.permission.CACHE_CONTENT',
+ 'android.permission.CALL_PHONE',
+ 'android.permission.CALL_PRIVILEGED',
+ 'android.permission.CAMERA',
+ 'android.permission.CAMERA_DISABLE_TRANSMIT_LED',
+ 'android.permission.CAMERA_SEND_SYSTEM_EVENTS',
+ 'android.permission.CAPTURE_AUDIO_HOTWORD',
+ 'android.permission.CAPTURE_AUDIO_OUTPUT',
+ 'android.permission.CAPTURE_SECURE_VIDEO_OUTPUT',
+ 'android.permission.CAPTURE_TV_INPUT',
+ 'android.permission.CAPTURE_VIDEO_OUTPUT',
+ 'android.permission.CARRIER_FILTER_SMS',
+ 'android.permission.CHANGE_APP_IDLE_STATE',
+ 'android.permission.CHANGE_BACKGROUND_DATA_SETTING',
+ 'android.permission.CHANGE_COMPONENT_ENABLED_STATE',
+ 'android.permission.CHANGE_CONFIGURATION',
+ 'android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST',
+ 'android.permission.CHANGE_NETWORK_STATE',
+ 'android.permission.CHANGE_WIFI_MULTICAST_STATE',
+ 'android.permission.CHANGE_WIFI_STATE',
+ 'android.permission.CHANGE_WIMAX_STATE',
+ 'android.permission.CLEAR_APP_CACHE',
+ 'android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS',
+ 'android.permission.CLEAR_APP_USER_DATA',
+ 'android.permission.CONFIGURE_DISPLAY_COLOR_TRANSFORM',
+ 'android.permission.CONFIGURE_WIFI_DISPLAY',
+ 'android.permission.CONFIRM_FULL_BACKUP',
+ 'android.permission.CONNECTIVITY_INTERNAL',
+ 'android.permission.CONTROL_INCALL_EXPERIENCE',
+ 'android.permission.CONTROL_KEYGUARD',
+ 'android.permission.CONTROL_LOCATION_UPDATES',
+ 'android.permission.CONTROL_VPN',
+ 'android.permission.CONTROL_WIFI_DISPLAY',
+ 'android.permission.COPY_PROTECTED_DATA',
+ 'android.permission.CREATE_USERS',
+ 'android.permission.CRYPT_KEEPER',
+ 'android.permission.DELETE_CACHE_FILES',
+ 'android.permission.DELETE_PACKAGES',
+ 'android.permission.DEVICE_POWER',
+ 'android.permission.DIAGNOSTIC',
+ 'android.permission.DISABLE_KEYGUARD',
+ 'android.permission.DISPATCH_NFC_MESSAGE',
+ 'android.permission.DISPATCH_PROVISIONING_MESSAGE',
+ 'android.permission.DOWNLOAD_CACHE_NON_PURGEABLE',
+ 'android.permission.DUMP',
+ 'android.permission.DVB_DEVICE',
+ 'android.permission.EXPAND_STATUS_BAR',
+ 'android.permission.FACTORY_TEST',
+ 'android.permission.FILTER_EVENTS',
+ 'android.permission.FLASHLIGHT',
+ 'android.permission.FORCE_BACK',
+ 'android.permission.FORCE_STOP_PACKAGES',
+ 'android.permission.FOREGROUND_SERVICE',
+ 'android.permission.FOREGROUND_SERVICE_CAMERA',
+ 'android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE',
+ 'android.permission.FOREGROUND_SERVICE_DATA_SYNC',
+ 'android.permission.FOREGROUND_SERVICE_HEALTH',
+ 'android.permission.FOREGROUND_SERVICE_LOCATION',
+ 'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK',
+ 'android.permission.FOREGROUND_SERVICE_MICROPHONE',
+ 'android.permission.FOREGROUND_SERVICE_PHONE_CALL',
+ 'android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING',
+ 'android.permission.FRAME_STATS',
+ 'android.permission.FREEZE_SCREEN',
+ 'android.permission.GET_ACCOUNTS',
+ 'android.permission.GET_ACCOUNTS_PRIVILEGED',
+ 'android.permission.GET_APP_GRANTED_URI_PERMISSIONS',
+ 'android.permission.GET_APP_OPS_STATS',
+ 'android.permission.GET_DETAILED_TASKS',
+ 'android.permission.GET_INTENT_SENDER_INTENT',
+ 'android.permission.GET_PACKAGE_IMPORTANCE',
+ 'android.permission.GET_PACKAGE_SIZE',
+ 'android.permission.GET_PASSWORD',
+ 'android.permission.GET_PROCESS_STATE_AND_OOM_SCORE',
+ 'android.permission.GET_TASKS',
+ 'android.permission.GET_TOP_ACTIVITY_INFO',
+ 'android.permission.GLOBAL_SEARCH',
+ 'android.permission.GLOBAL_SEARCH_CONTROL',
+ 'android.permission.GRANT_RUNTIME_PERMISSIONS',
+ 'android.permission.HARDWARE_TEST',
+ 'android.permission.HDMI_CEC',
+ 'android.permission.INJECT_EVENTS',
+ 'android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS',
+ 'android.permission.INSTALL_LOCATION_PROVIDER',
+ 'android.permission.INSTALL_PACKAGES',
+ 'android.permission.INTENT_FILTER_VERIFICATION_AGENT',
+ 'android.permission.INTERACT_ACROSS_USERS',
+ 'android.permission.INTERACT_ACROSS_USERS_FULL',
+ 'android.permission.INTERNAL_SYSTEM_WINDOW',
+ 'android.permission.INTERNET',
+ 'android.permission.INVOKE_CARRIER_SETUP',
+ 'android.permission.KILL_BACKGROUND_PROCESSES',
+ 'android.permission.KILL_UID',
+ 'android.permission.LAUNCH_TRUST_AGENT_SETTINGS',
+ 'android.permission.LOCAL_MAC_ADDRESS',
+ 'android.permission.LOCATION_HARDWARE',
+ 'android.permission.LOOP_RADIO',
+ 'android.permission.MANAGE_ACCOUNTS',
+ 'android.permission.MANAGE_ACTIVITY_STACKS',
+ 'android.permission.MANAGE_APP_OPS_RESTRICTIONS',
+ 'android.permission.MANAGE_APP_TOKENS',
+ 'android.permission.MANAGE_CA_CERTIFICATES',
+ 'android.permission.MANAGE_DEVICE_ADMINS',
+ 'android.permission.MANAGE_DOCUMENTS',
+ 'android.permission.MANAGE_EXTERNAL_STORAGE',
+ 'android.permission.MANAGE_FINGERPRINT',
+ 'android.permission.MANAGE_MEDIA_PROJECTION',
+ 'android.permission.MANAGE_NETWORK_POLICY',
+ 'android.permission.MANAGE_NOTIFICATIONS',
+ 'android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS',
+ 'android.permission.MANAGE_SOUND_TRIGGER',
+ 'android.permission.MANAGE_USB',
+ 'android.permission.MANAGE_USERS',
+ 'android.permission.MANAGE_VOICE_KEYPHRASES',
+ 'android.permission.MASTER_CLEAR',
+ 'android.permission.MEDIA_CONTENT_CONTROL',
+ 'android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS',
+ 'android.permission.MODIFY_AUDIO_ROUTING',
+ 'android.permission.MODIFY_AUDIO_SETTINGS',
+ 'android.permission.MODIFY_CELL_BROADCASTS',
+ 'android.permission.MODIFY_DAY_NIGHT_MODE',
+ 'android.permission.MODIFY_NETWORK_ACCOUNTING',
+ 'android.permission.MODIFY_PARENTAL_CONTROLS',
+ 'android.permission.MODIFY_PHONE_STATE',
+ 'android.permission.MOUNT_FORMAT_FILESYSTEMS',
+ 'android.permission.MOUNT_UNMOUNT_FILESYSTEMS',
+ 'android.permission.MOVE_PACKAGE',
+ 'android.permission.NEARBY_WIFI_DEVICES',
+ 'android.permission.NET_ADMIN',
+ 'android.permission.NET_TUNNELING',
+ 'android.permission.NFC',
+ 'android.permission.NFC_HANDOVER_STATUS',
+ 'android.permission.NFC_TRANSACTION_EVENT',
+ 'android.permission.NOTIFICATIONS',
+ 'android.permission.NOTIFY_PENDING_SYSTEM_UPDATE',
+ 'android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS',
+ 'android.permission.OEM_UNLOCK_STATE',
+ 'android.permission.OVERRIDE_WIFI_CONFIG',
+ 'android.permission.PACKAGE_USAGE_STATS',
+ 'android.permission.PACKAGE_VERIFICATION_AGENT',
+ 'android.permission.PACKET_KEEPALIVE_OFFLOAD',
+ 'android.permission.PEERS_MAC_ADDRESS',
+ 'android.permission.PERFORM_CDMA_PROVISIONING',
+ 'android.permission.PERFORM_SIM_ACTIVATION',
+ 'android.permission.PERSISTENT_ACTIVITY',
+ 'android.permission.PROCESS_CALLLOG_INFO',
+ 'android.permission.PROCESS_OUTGOING_CALLS',
+ 'android.permission.PROCESS_PHONE_ACCOUNT_REGISTRATION',
+ 'android.permission.PROVIDE_TRUST_AGENT',
+ 'android.permission.QUERY_ALL_PACKAGES',
+ 'android.permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT',
+ 'android.permission.READ_BLOCKED_NUMBERS',
+ 'android.permission.READ_CALENDAR',
+ 'android.permission.READ_CALL_LOG',
+ 'android.permission.READ_CONTACTS',
+ 'android.permission.READ_DREAM_STATE',
+ 'android.permission.READ_EXTERNAL_STORAGE',
+ 'android.permission.READ_FRAME_BUFFER',
+ 'android.permission.READ_INPUT_STATE',
+ 'android.permission.READ_INSTALL_SESSIONS',
+ 'android.permission.READ_LOGS',
+ 'android.permission.READ_MEDIA_AUDIO',
+ 'android.permission.READ_MEDIA_IMAGES',
+ 'android.permission.READ_MEDIA_VIDEO',
+ 'android.permission.READ_MEDIA_VISUAL_USER_SELECTED',
+ 'android.permission.READ_NETWORK_USAGE_HISTORY',
+ 'android.permission.READ_OEM_UNLOCK_STATE',
+ 'android.permission.READ_PHONE_NUMBERS',
+ 'android.permission.READ_PRECISE_PHONE_STATE',
+ 'android.permission.READ_PRIVILEGED_PHONE_STATE',
+ 'android.permission.READ_PROFILE',
+ 'android.permission.READ_SEARCH_INDEXABLES',
+ 'android.permission.READ_SMS',
+ 'android.permission.READ_SOCIAL_STREAM',
+ 'android.permission.READ_SYNC_SETTINGS',
+ 'android.permission.READ_SYNC_STATS',
+ 'android.permission.READ_USER_DICTIONARY',
+ 'android.permission.READ_WIFI_CREDENTIAL',
+ 'android.permission.REAL_GET_TASKS',
+ 'android.permission.REBOOT',
+ 'android.permission.RECEIVE_BLUETOOTH_MAP',
+ 'android.permission.RECEIVE_BOOT_COMPLETED',
+ 'android.permission.RECEIVE_DATA_ACTIVITY_CHANGE',
+ 'android.permission.RECEIVE_EMERGENCY_BROADCAST',
+ 'android.permission.RECEIVE_MEDIA_RESOURCE_USAGE',
+ 'android.permission.RECEIVE_MMS',
+ 'android.permission.RECEIVE_SMS',
+ 'android.permission.RECEIVE_STK_COMMANDS',
+ 'android.permission.RECEIVE_WAP_PUSH',
+ 'android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE',
+ 'android.permission.RECOVERY',
+ 'android.permission.RECORD_AUDIO',
+ 'android.permission.REGISTER_CALL_PROVIDER',
+ 'android.permission.REGISTER_CONNECTION_MANAGER',
+ 'android.permission.REGISTER_SIM_SUBSCRIPTION',
+ 'android.permission.REGISTER_WINDOW_MANAGER_LISTENERS',
+ 'android.permission.REMOTE_AUDIO_PLAYBACK',
+ 'android.permission.REMOVE_DRM_CERTIFICATES',
+ 'android.permission.REMOVE_TASKS',
+ 'android.permission.REORDER_TASKS',
+ 'android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS',
+ 'android.permission.REQUEST_INSTALL_PACKAGES',
+ 'android.permission.RESET_FINGERPRINT_LOCKOUT',
+ 'android.permission.RESET_SHORTCUT_MANAGER_THROTTLING',
+ 'android.permission.RESTART_PACKAGES',
+ 'android.permission.RETRIEVE_WINDOW_CONTENT',
+ 'android.permission.RETRIEVE_WINDOW_TOKEN',
+ 'android.permission.REVOKE_RUNTIME_PERMISSIONS',
+ 'android.permission.SCORE_NETWORKS',
+ 'android.permission.SCHEDULE_EXACT_ALARM',
+ 'android.permission.SEND_CALL_LOG_CHANGE',
+ 'android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS',
+ 'android.permission.SEND_RESPOND_VIA_MESSAGE',
+ 'android.permission.SEND_SMS',
+ 'android.permission.SEND_SMS_NO_CONFIRMATION',
+ 'android.permission.SERIAL_PORT',
+ 'android.permission.SET_ACTIVITY_WATCHER',
+ 'android.permission.SET_ALWAYS_FINISH',
+ 'android.permission.SET_ANIMATION_SCALE',
+ 'android.permission.SET_DEBUG_APP',
+ 'android.permission.SET_INPUT_CALIBRATION',
+ 'android.permission.SET_KEYBOARD_LAYOUT',
+ 'android.permission.SET_ORIENTATION',
+ 'android.permission.SET_POINTER_SPEED',
+ 'android.permission.SET_PREFERRED_APPLICATIONS',
+ 'android.permission.SET_PROCESS_LIMIT',
+ 'android.permission.SET_SCREEN_COMPATIBILITY',
+ 'android.permission.SET_TIME',
+ 'android.permission.SET_TIME_ZONE',
+ 'android.permission.SET_WALLPAPER',
+ 'android.permission.SET_WALLPAPER_COMPONENT',
+ 'android.permission.SET_WALLPAPER_HINTS',
+ 'android.permission.SHUTDOWN',
+ 'android.permission.SIGNAL_PERSISTENT_PROCESSES',
+ 'android.permission.START_ANY_ACTIVITY',
+ 'android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY',
+ 'android.permission.START_TASKS_FROM_RECENTS',
+ 'android.permission.STATUS_BAR',
+ 'android.permission.STATUS_BAR_SERVICE',
+ 'android.permission.STOP_APP_SWITCHES',
+ 'android.permission.STORAGE_INTERNAL',
+ 'android.permission.SUBSCRIBED_FEEDS_READ',
+ 'android.permission.SUBSCRIBED_FEEDS_WRITE',
+ 'android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME',
+ 'android.permission.SYSTEM_ALERT_WINDOW',
+ 'android.permission.TABLET_MODE',
+ 'android.permission.TEMPORARY_ENABLE_ACCESSIBILITY',
+ 'android.permission.TETHER_PRIVILEGED',
+ 'android.permission.TRANSMIT_IR',
+ 'android.permission.TRUST_LISTENER',
+ 'android.permission.TV_INPUT_HARDWARE',
+ 'android.permission.TV_VIRTUAL_REMOTE_CONTROLLER',
+ 'android.permission.UPDATE_APP_OPS_STATS',
+ 'android.permission.UPDATE_CONFIG',
+ 'android.permission.UPDATE_DEVICE_STATS',
+ 'android.permission.UPDATE_LOCK',
+ 'android.permission.UPDATE_LOCK_TASK_PACKAGES',
+ 'android.permission.USER_ACTIVITY',
+ 'android.permission.USE_BIOMETRIC',
+ 'android.permission.USE_CREDENTIALS',
+ 'android.permission.USE_FINGERPRINT',
+ 'android.permission.USE_FULL_SCREEN_INTENT',
+ 'android.permission.USE_SIP',
+ 'android.permission.VIBRATE',
+ 'android.permission.WAKE_LOCK',
+ 'android.permission.WRITE_APN_SETTINGS',
+ 'android.permission.WRITE_BLOCKED_NUMBERS',
+ 'android.permission.WRITE_CALENDAR',
+ 'android.permission.WRITE_CALL_LOG',
+ 'android.permission.WRITE_CONTACTS',
+ 'android.permission.WRITE_DREAM_STATE',
+ 'android.permission.WRITE_EXTERNAL_STORAGE',
+ 'android.permission.WRITE_GSERVICES',
+ 'android.permission.WRITE_MEDIA_STORAGE',
+ 'android.permission.WRITE_PROFILE',
+ 'android.permission.WRITE_SECURE_SETTINGS',
+ 'android.permission.WRITE_SETTINGS',
+ 'android.permission.WRITE_SMS',
+ 'android.permission.WRITE_SOCIAL_STREAM',
+ 'android.permission.WRITE_SYNC_SETTINGS',
+ 'android.permission.WRITE_USER_DICTIONARY',
+ ],
googleServicesFile: './google-services.json',
useNextNotificationsApi: true,
notification: {
diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx
index 6ee54da..41e3084 100644
--- a/app/(tabs)/_layout.tsx
+++ b/app/(tabs)/_layout.tsx
@@ -44,6 +44,13 @@ export default function TabLayout() {
tabBarIcon: ({ color }: { color: string }) => ,
}}
/>
+ ,
+ }}
+ />
);
}
diff --git a/app/(tabs)/permissions/camera-mic.tsx b/app/(tabs)/permissions/camera-mic.tsx
new file mode 100644
index 0000000..27779ab
--- /dev/null
+++ b/app/(tabs)/permissions/camera-mic.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import CameraMicrophonePermissionDemo from '@/components/permissions/CameraMicrophonePermissionDemo';
+
+export default function CameraMicScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/connectivity.tsx b/app/(tabs)/permissions/connectivity.tsx
new file mode 100644
index 0000000..fedd0f4
--- /dev/null
+++ b/app/(tabs)/permissions/connectivity.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import BluetoothNearbyPermissionDemo from '@/components/permissions/BluetoothNearbyPermissionDemo';
+
+export default function ConnectivityScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/index.tsx b/app/(tabs)/permissions/index.tsx
new file mode 100644
index 0000000..a58330f
--- /dev/null
+++ b/app/(tabs)/permissions/index.tsx
@@ -0,0 +1,60 @@
+import { Link } from 'expo-router';
+import React from 'react';
+import { View, Text, StyleSheet, ScrollView, Pressable } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+
+const routes = [
+ { href: '/permissions/location', title: 'Location (foreground/background)' },
+ { href: '/permissions/camera-mic', title: 'Camera & Microphone' },
+ { href: '/permissions/notifications', title: 'Notifications' },
+ { href: '/permissions/media-storage', title: 'Media Library' },
+ { href: '/permissions/storage', title: 'Storage & File Access' },
+ { href: '/permissions/telephony-sms', title: 'Telephony & SMS' },
+ { href: '/permissions/connectivity', title: 'Bluetooth & Nearby' },
+];
+
+export default function PermissionsHub() {
+ return (
+
+
+
+
+ Explore Android permission demos. Each link opens a focused screen that requests the associated runtime permissions and
+ performs a small capability check.
+
+ {routes.map((route) => (
+
+ {route.title}
+
+
+ Open demo
+
+
+
+ ))}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ lead: { color: '#ccc', fontSize: 14, lineHeight: 20, marginBottom: 6 },
+ card: {
+ backgroundColor: '#111',
+ padding: 16,
+ borderRadius: 10,
+ gap: 8,
+ borderWidth: 1,
+ borderColor: '#222',
+ },
+ cardTitle: { color: '#fff', fontSize: 16, fontWeight: '600' },
+ button: {
+ backgroundColor: '#1e88e5',
+ paddingVertical: 10,
+ borderRadius: 8,
+ alignItems: 'center',
+ },
+ buttonText: { color: '#fff', fontWeight: '600' },
+});
diff --git a/app/(tabs)/permissions/location.tsx b/app/(tabs)/permissions/location.tsx
new file mode 100644
index 0000000..c9d3855
--- /dev/null
+++ b/app/(tabs)/permissions/location.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import LocationPermissionDemo from '@/components/permissions/LocationPermissionDemo';
+
+export default function LocationScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/media-storage.tsx b/app/(tabs)/permissions/media-storage.tsx
new file mode 100644
index 0000000..5a41d0e
--- /dev/null
+++ b/app/(tabs)/permissions/media-storage.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import MediaLibraryPermissionDemo from '@/components/permissions/MediaLibraryPermissionDemo';
+
+export default function MediaStorageScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/notifications.tsx b/app/(tabs)/permissions/notifications.tsx
new file mode 100644
index 0000000..cd61eae
--- /dev/null
+++ b/app/(tabs)/permissions/notifications.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import NotificationsPermissionDemo from '@/components/permissions/NotificationsPermissionDemo';
+
+export default function NotificationsScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/storage.tsx b/app/(tabs)/permissions/storage.tsx
new file mode 100644
index 0000000..f0b5ce3
--- /dev/null
+++ b/app/(tabs)/permissions/storage.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import StoragePermissionDemo from '@/components/permissions/StoragePermissionDemo';
+
+export default function StorageScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/app/(tabs)/permissions/telephony-sms.tsx b/app/(tabs)/permissions/telephony-sms.tsx
new file mode 100644
index 0000000..dcd722b
--- /dev/null
+++ b/app/(tabs)/permissions/telephony-sms.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { View, StyleSheet } from 'react-native';
+import CustomHeader from '@/components/CustomHeader';
+import TelephonySmsPermissionDemo from '@/components/permissions/TelephonySmsPermissionDemo';
+
+export default function TelephonySmsScreen() {
+ return (
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+});
diff --git a/assets/permissions-hub.png b/assets/permissions-hub.png
new file mode 100644
index 0000000..0f33627
Binary files /dev/null and b/assets/permissions-hub.png differ
diff --git a/components/permissions/BluetoothNearbyPermissionDemo.tsx b/components/permissions/BluetoothNearbyPermissionDemo.tsx
new file mode 100644
index 0000000..45a858d
--- /dev/null
+++ b/components/permissions/BluetoothNearbyPermissionDemo.tsx
@@ -0,0 +1,54 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView, PermissionsAndroid, Platform } from 'react-native';
+
+const REQUESTS = [
+ PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
+ PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
+ PermissionsAndroid.PERMISSIONS.BLUETOOTH_ADVERTISE,
+ PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
+ PermissionsAndroid.PERMISSIONS.NEARBY_WIFI_DEVICES,
+];
+
+export default function BluetoothNearbyPermissionDemo() {
+ const [statuses, setStatuses] = useState>({});
+
+ const request = async () => {
+ if (Platform.OS !== 'android') {
+ setStatuses({ platform: 'Only relevant on Android' });
+ return;
+ }
+ const results = await PermissionsAndroid.requestMultiple(REQUESTS);
+ setStatuses(results);
+ };
+
+ return (
+
+ Bluetooth & Nearby
+
+ Requests BLUETOOTH_CONNECT / SCAN / ADVERTISE along with NEARBY_WIFI_DEVICES and fine location to showcase nearby device
+ discovery prerequisites.
+
+
+
+ {Object.keys(statuses).length === 0 ? (
+ No results yet
+ ) : (
+ Object.entries(statuses).map(([key, value]) => (
+
+ {key.split('.').pop()}: {value}
+
+ ))
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+});
diff --git a/components/permissions/CameraMicrophonePermissionDemo.tsx b/components/permissions/CameraMicrophonePermissionDemo.tsx
new file mode 100644
index 0000000..d7aebf3
--- /dev/null
+++ b/components/permissions/CameraMicrophonePermissionDemo.tsx
@@ -0,0 +1,45 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView } from 'react-native';
+import { Camera } from 'expo-camera';
+
+export default function CameraMicrophonePermissionDemo() {
+ const [cameraStatus, setCameraStatus] = useState('unknown');
+ const [micStatus, setMicStatus] = useState('unknown');
+ const [availableTypes, setAvailableTypes] = useState('not queried');
+
+ const requestPermissions = async () => {
+ const camera = await Camera.requestCameraPermissionsAsync();
+ const mic = await Camera.requestMicrophonePermissionsAsync();
+ setCameraStatus(camera.status);
+ setMicStatus(mic.status);
+
+ if (camera.status === 'granted') {
+ const types = await Camera.getAvailableCameraTypesAsync();
+ setAvailableTypes(types.join(', ') || 'none reported');
+ }
+ };
+
+ return (
+
+ Camera & Microphone
+
+ Requests CAMERA and RECORD_AUDIO plus microphone access via expo-camera. Queries available camera types once granted.
+
+
+
+ Camera: {cameraStatus}
+ Microphone: {micStatus}
+ Available cameras: {availableTypes}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+});
diff --git a/components/permissions/LocationPermissionDemo.tsx b/components/permissions/LocationPermissionDemo.tsx
new file mode 100644
index 0000000..966b7f8
--- /dev/null
+++ b/components/permissions/LocationPermissionDemo.tsx
@@ -0,0 +1,62 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView, Platform } from 'react-native';
+import * as Location from 'expo-location';
+
+export default function LocationPermissionDemo() {
+ const [status, setStatus] = useState(null);
+ const [backgroundStatus, setBackgroundStatus] = useState(null);
+ const [coords, setCoords] = useState('');
+ const [error, setError] = useState('');
+
+ const requestPermissions = async () => {
+ setError('');
+ const fg = await Location.requestForegroundPermissionsAsync();
+ setStatus(fg.status);
+
+ if (Platform.OS === 'android') {
+ const bg = await Location.requestBackgroundPermissionsAsync();
+ setBackgroundStatus(bg.status);
+ }
+ };
+
+ const fetchLocation = async () => {
+ try {
+ const loc = await Location.getCurrentPositionAsync({});
+ setCoords(`${loc.coords.latitude.toFixed(5)}, ${loc.coords.longitude.toFixed(5)}`);
+ } catch (e) {
+ setError(e instanceof Error ? e.message : String(e));
+ }
+ };
+
+ return (
+
+ Location (foreground & background)
+
+ Requests ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATION and demonstrates fetching a single
+ location fix via expo-location.
+
+
+
+
+
+
+
+ Foreground: {status ?? 'unknown'}
+ {Platform.OS === 'android' && Background: {backgroundStatus ?? 'unknown'}}
+ {coords ? Last fix: {coords} : null}
+ {error ? {error} : null}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+ error: { color: '#ff6b6b' },
+ gap: { height: 10 },
+});
diff --git a/components/permissions/MediaLibraryPermissionDemo.tsx b/components/permissions/MediaLibraryPermissionDemo.tsx
new file mode 100644
index 0000000..ef506f6
--- /dev/null
+++ b/components/permissions/MediaLibraryPermissionDemo.tsx
@@ -0,0 +1,46 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView } from 'react-native';
+import * as MediaLibrary from 'expo-media-library';
+
+export default function MediaLibraryPermissionDemo() {
+ const [status, setStatus] = useState('unknown');
+ const [assetSummary, setAssetSummary] = useState('Not loaded');
+
+ const requestPermissions = async () => {
+ const permissions = await MediaLibrary.requestPermissionsAsync(true);
+ setStatus(permissions.status);
+ };
+
+ const loadAssets = async () => {
+ const assets = await MediaLibrary.getAssetsAsync({ first: 5, sortBy: MediaLibrary.SortBy.modificationTime });
+ setAssetSummary(`Fetched ${assets.assets.length} of ${assets.totalCount} assets`);
+ };
+
+ return (
+
+ Media & Storage
+
+ Requests READ_MEDIA_* / ACCESS_MEDIA_LOCATION style permissions and fetches a small sample of media entries from the
+ device library.
+
+
+
+
+
+
+ Status: {status}
+ {assetSummary}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+ gap: { height: 10 },
+});
diff --git a/components/permissions/NotificationsPermissionDemo.tsx b/components/permissions/NotificationsPermissionDemo.tsx
new file mode 100644
index 0000000..62fbfab
--- /dev/null
+++ b/components/permissions/NotificationsPermissionDemo.tsx
@@ -0,0 +1,53 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView } from 'react-native';
+import * as Notifications from 'expo-notifications';
+
+export default function NotificationsPermissionDemo() {
+ const [status, setStatus] = useState('unknown');
+ const [lastScheduledId, setLastScheduledId] = useState('');
+
+ const requestPermissions = async () => {
+ const settings = await Notifications.requestPermissionsAsync();
+ // Expo returns both a status field and a legacy granted boolean; normalize to a single label for display.
+ const derivedStatus = settings.status ?? (settings.granted ? 'granted' : 'denied');
+ setStatus(derivedStatus);
+ };
+
+ const schedule = async () => {
+ const id = await Notifications.scheduleNotificationAsync({
+ content: {
+ title: 'Permission demo',
+ body: 'Local notification demonstrating POST_NOTIFICATIONS / NOTIFICATIONS usage.',
+ },
+ trigger: { seconds: 2 },
+ });
+ setLastScheduledId(id);
+ };
+
+ return (
+
+ Notifications
+
+ Requests NOTIFICATIONS / POST_NOTIFICATIONS and schedules a sample local notification through expo-notifications.
+
+
+
+
+
+
+ Status: {status}
+ {lastScheduledId ? Last scheduled id: {lastScheduledId} : null}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+ gap: { height: 10 },
+});
diff --git a/components/permissions/StoragePermissionDemo.tsx b/components/permissions/StoragePermissionDemo.tsx
new file mode 100644
index 0000000..3df8ee8
--- /dev/null
+++ b/components/permissions/StoragePermissionDemo.tsx
@@ -0,0 +1,55 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView, PermissionsAndroid, Platform } from 'react-native';
+
+const REQUESTS = [
+ PermissionsAndroid.PERMISSIONS.MANAGE_EXTERNAL_STORAGE,
+ PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
+ PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
+ PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES,
+ PermissionsAndroid.PERMISSIONS.READ_MEDIA_VIDEO,
+ PermissionsAndroid.PERMISSIONS.READ_MEDIA_AUDIO,
+];
+
+export default function StoragePermissionDemo() {
+ const [statuses, setStatuses] = useState>({});
+
+ const request = async () => {
+ if (Platform.OS !== 'android') {
+ setStatuses({ platform: 'Only relevant on Android' });
+ return;
+ }
+ const results = await PermissionsAndroid.requestMultiple(REQUESTS);
+ setStatuses(results);
+ };
+
+ return (
+
+ Storage & File Access
+
+ Requests MANAGE_EXTERNAL_STORAGE plus legacy READ/WRITE_EXTERNAL_STORAGE and modern READ_MEDIA_* runtime permissions to
+ illustrate storage access flows.
+
+
+
+ {Object.keys(statuses).length === 0 ? (
+ No results yet
+ ) : (
+ Object.entries(statuses).map(([key, value]) => (
+
+ {key.split('.').pop()}: {value}
+
+ ))
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+});
diff --git a/components/permissions/TelephonySmsPermissionDemo.tsx b/components/permissions/TelephonySmsPermissionDemo.tsx
new file mode 100644
index 0000000..7ce005a
--- /dev/null
+++ b/components/permissions/TelephonySmsPermissionDemo.tsx
@@ -0,0 +1,56 @@
+import React, { useState } from 'react';
+import { View, Text, Button, StyleSheet, ScrollView, PermissionsAndroid, Platform } from 'react-native';
+
+const REQUESTS = [
+ PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE,
+ PermissionsAndroid.PERMISSIONS.READ_PHONE_NUMBERS,
+ PermissionsAndroid.PERMISSIONS.READ_SMS,
+ PermissionsAndroid.PERMISSIONS.SEND_SMS,
+ PermissionsAndroid.PERMISSIONS.CALL_PHONE,
+ PermissionsAndroid.PERMISSIONS.ANSWER_PHONE_CALLS,
+ PermissionsAndroid.PERMISSIONS.PROCESS_OUTGOING_CALLS,
+];
+
+export default function TelephonySmsPermissionDemo() {
+ const [statuses, setStatuses] = useState>({});
+
+ const request = async () => {
+ if (Platform.OS !== 'android') {
+ setStatuses({ platform: 'Only relevant on Android' });
+ return;
+ }
+ const results = await PermissionsAndroid.requestMultiple(REQUESTS);
+ setStatuses(results);
+ };
+
+ return (
+
+ Telephony & SMS
+
+ Requests READ_PHONE_STATE, READ_PHONE_NUMBERS, CALL_PHONE, SEND_SMS, ANSWER_PHONE_CALLS, and PROCESS_OUTGOING_CALLS. These
+ permissions are sensitive and may require additional Play Store declarations.
+
+
+
+ {Object.keys(statuses).length === 0 ? (
+ No results yet
+ ) : (
+ Object.entries(statuses).map(([key, value]) => (
+
+ {key.split('.').pop()}: {value}
+
+ ))
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: { flex: 1, backgroundColor: '#000' },
+ content: { padding: 16, gap: 12 },
+ title: { color: '#fff', fontSize: 18, fontWeight: '700' },
+ copy: { color: '#ccc', fontSize: 14, lineHeight: 20 },
+ statusBox: { backgroundColor: '#111', padding: 12, borderRadius: 8, marginTop: 12 },
+ statusText: { color: '#fff', marginBottom: 4 },
+});
diff --git a/version.json b/version.json
index ff9a2dd..3f7a1a1 100644
--- a/version.json
+++ b/version.json
@@ -1,5 +1,5 @@
{
- "version": "1.0.68",
- "iosBuildNumber": "68",
- "androidVersionCode": 68
+ "version": "1.0.69",
+ "iosBuildNumber": "69",
+ "androidVersionCode": 69
}
\ No newline at end of file