From 55e22efb668e91438387da49949f16195eb03ff5 Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Tue, 11 Jul 2023 12:18:33 +0300 Subject: [PATCH] Add .noMedia setting Signed-off-by: Nikolaos Karaolidis --- src/contexts/settings.tsx | 29 ++++++++++++++++++++++++++++- src/screens/settings.tsx | 18 ++++++++++++++++-- src/styles.tsx | 11 +++++++++-- src/types/settings.ts | 1 + 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/contexts/settings.tsx b/src/contexts/settings.tsx index bfd67f2..fa03317 100644 --- a/src/contexts/settings.tsx +++ b/src/contexts/settings.tsx @@ -9,11 +9,13 @@ import { Settings } from '../types'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { LoadingView } from '../components'; import WelcomeScreen from '../screens/welcome'; -import { FileSystem } from 'react-native-file-access'; +import { AndroidScoped, FileSystem } from 'react-native-file-access'; import { getPersistedUriPermissions, openDocumentTree, releasePersistableUriPermission, + createFile, + deleteFile, } from 'react-native-scoped-storage'; interface SettingsContextType { @@ -28,6 +30,7 @@ const SettingsContext = createContext( function SettingsProvider({ children }: { children: ReactNode }) { const [settings, setSettings] = useState({ storageUri: '', + noMedia: false, }); const [hasLoaded, setHasLoaded] = useState(false); @@ -44,13 +47,32 @@ function SettingsProvider({ children }: { children: ReactNode }) { void AsyncStorage.setItem('storageUri', updatedSettings.storageUri); + void FileSystem.exists( + AndroidScoped.appendPath(updatedSettings.storageUri, '.nomedia'), + ).then(noMediaExists => { + if (updatedSettings.noMedia && !noMediaExists) { + void createFile( + updatedSettings.storageUri, + '.nomedia', + 'text/x-unknown', + ); + } else if (!updatedSettings.noMedia && noMediaExists) { + void deleteFile( + AndroidScoped.appendPath(updatedSettings.storageUri, '.nomedia'), + ); + } + }); + setSettings(updatedSettings); }; useEffect(() => { const loadSettings = async () => { const storageUriValue = await AsyncStorage.getItem('storageUri'); + const noMediaValue = await AsyncStorage.getItem('noMedia'); + let storageUri = storageUriValue ?? ''; + let noMedia = noMediaValue === 'true'; if (storageUri !== '') { const permissions = await getPersistedUriPermissions(); @@ -75,10 +97,15 @@ function SettingsProvider({ children }: { children: ReactNode }) { } catch { storageUri = ''; } + + noMedia = await FileSystem.exists( + AndroidScoped.appendPath(storageUri, '.nomedia'), + ); } setSettings({ storageUri, + noMedia, }); setHasLoaded(true); diff --git a/src/screens/settings.tsx b/src/screens/settings.tsx index 920f3e2..23da3a8 100644 --- a/src/screens/settings.tsx +++ b/src/screens/settings.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { View } from 'react-native'; -import { Button, List, Snackbar } from 'react-native-paper'; +import { Button, List, Snackbar, Switch, Text } from 'react-native-paper'; import { useRealm } from '@realm/react'; import { openDocumentTree } from 'react-native-scoped-storage'; import { PaddedView } from '../components'; @@ -14,7 +14,7 @@ const SettingsScreen = () => { const [snackbarVisible, setSnackbarVisible] = useState(false); const [snackbarMessage, setSnackbarMessage] = useState(''); - const { setSettings } = useSettings(); + const { settings, setSettings } = useSettings(); const realm = useRealm(); @@ -66,6 +66,20 @@ const SettingsScreen = () => { }}> Change External Storage Path + + Hide media from gallery + { + setSettings({ noMedia: value }); + }} + /> + diff --git a/src/styles.tsx b/src/styles.tsx index 55e9159..82e5543 100644 --- a/src/styles.tsx +++ b/src/styles.tsx @@ -12,10 +12,10 @@ const moderateScale = (size: number, factor = 0.5) => const styles = StyleSheet.create({ marginBottom: { - marginBottom: verticalScale(5), + marginBottom: verticalScale(15), }, bigMarginBottom: { - marginBottom: verticalScale(25), + marginBottom: verticalScale(30), }, extremeMarginBottom: { marginBottom: verticalScale(100), @@ -23,6 +23,9 @@ const styles = StyleSheet.create({ padding: { padding: '5%', }, + smallPaddingHorizontal: { + paddingHorizontal: '2.5%', + }, centered: { flex: 1, justifyContent: 'center', @@ -31,6 +34,10 @@ const styles = StyleSheet.create({ centerText: { textAlign: 'center', }, + flexRowSpaceBetween: { + flexDirection: 'row', + justifyContent: 'space-between', + }, }); export { horizontalScale, verticalScale, moderateScale, styles as default }; diff --git a/src/types/settings.ts b/src/types/settings.ts index 57ec3e1..f495b03 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -1,5 +1,6 @@ interface Settings { storageUri: string; + noMedia: boolean; } export default Settings;