fix(battery-opti-disable): integrate permissions view

This commit is contained in:
devthejo 2025-06-22 11:32:51 +02:00
parent 7082161b7f
commit d9b5d10684

View file

@ -1,8 +1,18 @@
import React, { useEffect, useCallback } from "react"; import React, { useEffect, useCallback } from "react";
import { View, TouchableOpacity, StyleSheet } from "react-native"; import {
View,
TouchableOpacity,
StyleSheet,
Platform,
AppState,
} from "react-native";
import { Button, Title } from "react-native-paper"; import { Button, Title } from "react-native-paper";
import { usePermissionsState, permissionsActions } from "~/stores"; import { usePermissionsState, permissionsActions } from "~/stores";
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import {
RequestDisableOptimization,
BatteryOptEnabled,
} from "react-native-battery-optimization-check";
import openSettings from "~/lib/native/openSettings"; import openSettings from "~/lib/native/openSettings";
import requestPermissionFcm from "~/permissions/requestPermissionFcm"; import requestPermissionFcm from "~/permissions/requestPermissionFcm";
@ -16,6 +26,29 @@ import * as Location from "expo-location";
import * as Notifications from "expo-notifications"; import * as Notifications from "expo-notifications";
import * as Contacts from "expo-contacts"; import * as Contacts from "expo-contacts";
// Battery optimization request handler
const requestBatteryOptimizationDisable = async () => {
if (Platform.OS !== "android") {
return true; // iOS doesn't have battery optimization
}
try {
const isEnabled = await BatteryOptEnabled();
if (isEnabled) {
console.log("Battery optimization enabled, requesting to disable...");
RequestDisableOptimization();
// Return false as the user needs to interact with the system dialog
return false;
} else {
console.log("Battery optimization already disabled");
return true;
}
} catch (error) {
console.error("Error handling battery optimization:", error);
return false;
}
};
const requestPermissions = { const requestPermissions = {
fcm: requestPermissionFcm, fcm: requestPermissionFcm,
locationBackground: requestPermissionLocationBackground, locationBackground: requestPermissionLocationBackground,
@ -23,6 +56,7 @@ const requestPermissions = {
readContacts: requestPermissionReadContacts, readContacts: requestPermissionReadContacts,
phoneCall: requestPermissionPhoneCall, phoneCall: requestPermissionPhoneCall,
motion: requestPermissionMotion.requestPermission, motion: requestPermissionMotion.requestPermission,
batteryOptimizationDisabled: requestBatteryOptimizationDisable,
}; };
const setPermissions = { const setPermissions = {
@ -32,6 +66,8 @@ const setPermissions = {
readContacts: (b) => permissionsActions.setReadContacts(b), readContacts: (b) => permissionsActions.setReadContacts(b),
phoneCall: (b) => permissionsActions.setPhoneCall(b), phoneCall: (b) => permissionsActions.setPhoneCall(b),
motion: (b) => permissionsActions.setMotion(b), motion: (b) => permissionsActions.setMotion(b),
batteryOptimizationDisabled: (b) =>
permissionsActions.setBatteryOptimizationDisabled(b),
}; };
const titlePermissions = { const titlePermissions = {
@ -41,6 +77,7 @@ const titlePermissions = {
readContacts: "Contacts", readContacts: "Contacts",
phoneCall: "Appels", phoneCall: "Appels",
motion: "Détection de mouvement", motion: "Détection de mouvement",
batteryOptimizationDisabled: "Optimisation de la batterie",
}; };
// Function to check current permission status // Function to check current permission status
@ -68,6 +105,17 @@ const checkPermissionStatus = async (permission) => {
// Note: Phone call permissions on iOS are determined at build time // Note: Phone call permissions on iOS are determined at build time
// and on Android they're requested at runtime // and on Android they're requested at runtime
return true; // This might need adjustment based on your specific implementation return true; // This might need adjustment based on your specific implementation
case "batteryOptimizationDisabled":
if (Platform.OS !== "android") {
return true; // iOS doesn't have battery optimization
}
try {
const isEnabled = await BatteryOptEnabled();
return !isEnabled; // Return true if optimization is disabled
} catch (error) {
console.error("Error checking battery optimization:", error);
return false;
}
default: default:
return false; return false;
} }
@ -95,18 +143,9 @@ const PermissionItem = ({ permission, status, onRequestPermission }) => (
); );
export default function Permissions() { export default function Permissions() {
const permissionsState = usePermissionsState([ // Create permissions list based on platform
"fcm", const getPermissionsList = () => {
"phoneCall", const basePermissions = [
"locationForeground",
"locationBackground",
"motion",
"readContacts",
]);
// Memoize the check permissions function
const checkAllPermissions = useCallback(async () => {
const permissionKeys = [
"fcm", "fcm",
"phoneCall", "phoneCall",
"locationForeground", "locationForeground",
@ -115,25 +154,70 @@ export default function Permissions() {
"readContacts", "readContacts",
]; ];
for (const permission of permissionKeys) { // Add battery optimization only on Android
if (Platform.OS === "android") {
return [...basePermissions, "batteryOptimizationDisabled"];
}
return basePermissions;
};
const permissionsList = getPermissionsList();
const permissionsState = usePermissionsState(permissionsList);
// Memoize the check permissions function
const checkAllPermissions = useCallback(async () => {
for (const permission of permissionsList) {
const status = await checkPermissionStatus(permission); const status = await checkPermissionStatus(permission);
setPermissions[permission](status); setPermissions[permission](status);
} }
}, []); }, [permissionsList]);
// Check all permissions when component mounts // Check all permissions when component mounts
useEffect(() => { useEffect(() => {
checkAllPermissions(); checkAllPermissions();
}, [checkAllPermissions]); }, [checkAllPermissions]);
// Listen for app state changes to re-check permissions when user returns from settings
useEffect(() => {
const handleAppStateChange = async (nextAppState) => {
if (nextAppState === "active") {
console.log("App became active, re-checking all permissions...");
// Re-check all permissions when app becomes active
await checkAllPermissions();
}
};
const subscription = AppState.addEventListener(
"change",
handleAppStateChange,
);
return () => {
subscription?.remove();
};
}, [checkAllPermissions]);
const handleRequestPermission = async (permission) => { const handleRequestPermission = async (permission) => {
try { try {
const granted = await requestPermissions[permission](); const granted = await requestPermissions[permission]();
setPermissions[permission](granted); setPermissions[permission](granted);
// Double-check the status to ensure UI is in sync // For battery optimization, we need to handle the async nature differently
const actualStatus = await checkPermissionStatus(permission); if (
setPermissions[permission](actualStatus); permission === "batteryOptimizationDisabled" &&
Platform.OS === "android"
) {
// Give a short delay for the system dialog to potentially complete
setTimeout(async () => {
const actualStatus = await checkPermissionStatus(permission);
setPermissions[permission](actualStatus);
}, 1000);
} else {
// Double-check the status to ensure UI is in sync
const actualStatus = await checkPermissionStatus(permission);
setPermissions[permission](actualStatus);
}
} catch (error) { } catch (error) {
console.error(`Error requesting ${permission} permission:`, error); console.error(`Error requesting ${permission} permission:`, error);
} }