Change terminology from gallery to photo library (#2663)

* Update user-facing terminology from gallery to photo library

* Update terminology for devs to make the user-facing change easier to remember

* Update snapshots
This commit is contained in:
Amanda Bullington
2025-02-13 17:11:28 -08:00
committed by GitHub
parent 285612ed31
commit 400f118ad9
41 changed files with 209 additions and 222 deletions

View File

Binary file not shown.

View File

@@ -3,7 +3,7 @@
"data": [
{
"path": "assets/fonts/INatIcon.ttf",
"sha1": "89474f5d4caf95704dfaf57d6155f39b9fe2c08a"
"sha1": "4f576448e7cb11aa54c32307a73fcc265ea4a920"
},
{
"path": "assets/fonts/Lato-Bold.ttf",

View File

Binary file not shown.

View File

@@ -15,7 +15,7 @@ export default async function switchPowerMode() {
await waitFor( advancedInterfaceRadioButton ).toBeVisible().withTimeout( 10000 );
await advancedInterfaceRadioButton.tap();
// Tap the settings radio button for power user mode
const powerUserRadioButton = element( by.id( "all-observation-option" ) );
const powerUserRadioButton = element( by.id( "all-observation-options" ) );
await waitFor( powerUserRadioButton ).toBeVisible().withTimeout( 10000 );
await powerUserRadioButton.tap();
}

View File

@@ -3,53 +3,65 @@
"strings" : {
"CFBundleDisplayName" : {
"comment" : "Bundle display name",
"shouldTranslate" : false,
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "iNat Next"
}
},
"es-MX" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNat Next"
}
},
"hu" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNat Next"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNat Next"
}
}
}
},
"shouldTranslate" : false
},
"CFBundleName" : {
"comment" : "Bundle name",
"shouldTranslate" : false,
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "iNaturalistReactNative"
}
},
"es-MX" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNaturalistReactNative"
}
},
"hu" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNaturalistReactNative"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"state" : "needs_review",
"value" : "iNaturalistReactNative"
}
}
}
},
"shouldTranslate" : false
},
"NSAppleMusicUsageDescription" : {
"comment" : "Description of why we ask for permission to access the music library.",
@@ -353,8 +365,16 @@
},
"NSHumanReadableCopyright" : {
"comment" : "Copyright (human-readable)",
"shouldTranslate" : false,
"extractionState" : "extracted_with_value"
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : ""
}
}
},
"shouldTranslate" : false
},
"NSLocationAlwaysAndWhenInUseUsageDescription" : {
"comment" : "Privacy - Location Always and When In Use Usage Description",

View File

@@ -39,9 +39,9 @@ PODS:
- hermes-engine/Pre-built (= 0.73.11)
- hermes-engine/Pre-built (0.73.11)
- libevent (2.1.12)
- MMKV (2.0.0):
- MMKVCore (~> 2.0.0)
- MMKVCore (2.0.0)
- MMKV (2.0.2):
- MMKVCore (~> 2.0.2)
- MMKVCore (2.0.2)
- Mute (0.6.1)
- RCT-Folly (2022.05.16.00):
- boost
@@ -1528,8 +1528,8 @@ SPEC CHECKSUMS:
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
hermes-engine: d992945b77c506e5164e6a9a77510c9d57472c59
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
MMKV: f7d1d5945c8765f97f39c3d121f353d46735d801
MMKVCore: c04b296010fcb1d1638f2c69405096aac12f6390
MMKV: 3eacda84cd1c4fc95cf848d3ecb69d85ed56006c
MMKVCore: 508b4d3a8ce031f1b5c8bd235f0517fb3f4c73a9
Mute: 20135a96076f140cc82bfc8b810e2d6150d8ec7e
RCT-Folly: cd21f1661364f975ae76b3308167ad66b09f53f5
RCTRequired: 415e56f7c33799a6483e41e4dce607f3daf1e69b

View File

@@ -13,6 +13,7 @@
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
142F12D43DCA4301A4FA8E25 /* INatIcon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9E61060E5D7F4D7EADE6D77C /* INatIcon.ttf */; };
191A91132CD1916800ECC774 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 191A91122CD1916800ECC774 /* InfoPlist.xcstrings */; };
191A91142CD1916800ECC774 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 191A91122CD1916800ECC774 /* InfoPlist.xcstrings */; };
191A91152CD1916800ECC774 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 191A91122CD1916800ECC774 /* InfoPlist.xcstrings */; };
@@ -21,7 +22,6 @@
197A169E2A7C2567001A03DC /* taxonomy.json in Resources */ = {isa = PBXBuildFile; fileRef = 197A169C2A7C2567001A03DC /* taxonomy.json */; };
3DE2C0F71E184822B561A1ED /* Lato-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3A54425709BB4844AFBC680D /* Lato-Italic.ttf */; };
54EB1EFEC1F74152902EED02 /* Lato-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8C2D97D72EED451C887998A8 /* Lato-BoldItalic.ttf */; };
59925732D1464B6388BDAEB7 /* INatIcon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2CFF1354495A49DEA8CEA670 /* INatIcon.ttf */; };
5A8D64AB921678B40E0229C8 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; };
725BA058C5384A9185E8036A /* Lato-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 00752F4ADC554701A45A848A /* Lato-Bold.ttf */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
@@ -87,7 +87,6 @@
19A5877328F8E3310016D128 /* iNaturalistReactNative-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iNaturalistReactNative-Bridging-Header.h"; sourceTree = "<group>"; };
20043186B311EE211FEB259A /* libPods-iNaturalistReactNative.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative.a"; sourceTree = BUILT_PRODUCTS_DIR; };
2B8BE6258F04B67C38DE834A /* Pods-iNaturalistReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.release.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.release.xcconfig"; sourceTree = "<group>"; };
2CFF1354495A49DEA8CEA670 /* INatIcon.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = INatIcon.ttf; path = ../assets/fonts/INatIcon.ttf; sourceTree = "<group>"; };
3A54425709BB4844AFBC680D /* Lato-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Lato-Italic.ttf"; path = "../assets/fonts/Lato-Italic.ttf"; sourceTree = "<group>"; };
3A9BAF07FCF24F668E2EF5AB /* Lato-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Lato-Medium.ttf"; path = "../assets/fonts/Lato-Medium.ttf"; sourceTree = "<group>"; };
4B0AEEF6CA584BCF9880EB35 /* Lato-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Lato-Regular.ttf"; path = "../assets/fonts/Lato-Regular.ttf"; sourceTree = "<group>"; };
@@ -103,6 +102,7 @@
8C2D97D72EED451C887998A8 /* Lato-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Lato-BoldItalic.ttf"; path = "../assets/fonts/Lato-BoldItalic.ttf"; sourceTree = "<group>"; };
8F1AC6762BC1B610002F994B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
8F346E492CF6912700CED7B4 /* geomodel.mlmodel */ = {isa = PBXFileReference; lastKnownFileType = file.mlmodel; path = geomodel.mlmodel; sourceTree = "<group>"; };
9E61060E5D7F4D7EADE6D77C /* INatIcon.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = INatIcon.ttf; path = ../assets/fonts/INatIcon.ttf; sourceTree = "<group>"; };
A336AF0ADEAE537AB1B73F98 /* libPods-iNaturalistReactNative-ShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative-ShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B8FC28F6DD66FAD52B79E072 /* Pods-iNaturalistReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.debug.xcconfig"; sourceTree = "<group>"; };
D7AE5BDBC584A83878A04344 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
@@ -261,7 +261,7 @@
3A9BAF07FCF24F668E2EF5AB /* Lato-Medium.ttf */,
69DF855D92EA4ADFB73B47F1 /* Lato-MediumItalic.ttf */,
4B0AEEF6CA584BCF9880EB35 /* Lato-Regular.ttf */,
2CFF1354495A49DEA8CEA670 /* INatIcon.ttf */,
9E61060E5D7F4D7EADE6D77C /* INatIcon.ttf */,
);
name = Resources;
sourceTree = "<group>";
@@ -398,7 +398,7 @@
085DD3205807404CAFC32228 /* Lato-Medium.ttf in Resources */,
E5DFC1C6FBFA45739CE91C69 /* Lato-MediumItalic.ttf in Resources */,
AE4DC81B3A87484CB3FD6750 /* Lato-Regular.ttf in Resources */,
59925732D1464B6388BDAEB7 /* INatIcon.ttf in Resources */,
142F12D43DCA4301A4FA8E25 /* INatIcon.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -3,7 +3,7 @@
"data": [
{
"path": "assets/fonts/INatIcon.ttf",
"sha1": "89474f5d4caf95704dfaf57d6155f39b9fe2c08a"
"sha1": "4f576448e7cb11aa54c32307a73fcc265ea4a920"
},
{
"path": "assets/fonts/Lato-Bold.ttf",

View File

@@ -2,7 +2,10 @@ import RNFS from "react-native-fs";
export const computerVisionPath = `${RNFS.DocumentDirectoryPath}/computerVisionSuggestions`;
export const galleryPhotosPath = `${RNFS.DocumentDirectoryPath}/galleryPhotos`;
// note: when changing naming from gallery to photoLibrary in issue MOB-431,
// this galleryPhotos path was intentionally left as-is, to avoid any issues
// with cleaning caches
export const photoLibraryPhotosPath = `${RNFS.DocumentDirectoryPath}/galleryPhotos`;
export const photoUploadPath = `${RNFS.DocumentDirectoryPath}/photoUploads`;

View File

@@ -64,9 +64,9 @@ const AddObsModal = ( { closeModal, navAndCloseModal }: Props ) => {
className: classnames( GREEN_CIRCLE_CLASS, MARGINS.standardCamera )
},
photoLibrary: {
text: t( "Upload-photos-from-your-gallery" ),
icon: "gallery",
onPress: ( ) => navAndCloseModal( "PhotoGallery" ),
text: t( "Upload-photos-from-your-photo-library" ),
icon: "photo-library",
onPress: ( ) => navAndCloseModal( "PhotoLibrary" ),
testID: "import-media-button",
className: classnames( GREEN_CIRCLE_CLASS, MARGINS.photoLibrary ),
accessibilityLabel: t( "Photo-importer" ),

View File

@@ -1,7 +1,7 @@
import CameraFlip from "components/Camera/Buttons/CameraFlip.tsx";
import Close from "components/Camera/Buttons/Close.tsx";
import Flash from "components/Camera/Buttons/Flash.tsx";
import Gallery from "components/Camera/Buttons/Gallery.tsx";
import PhotoLibraryIcon from "components/Camera/Buttons/PhotoLibraryIcon.tsx";
import TakePhoto from "components/Camera/Buttons/TakePhoto.tsx";
import Zoom from "components/Camera/Buttons/Zoom.tsx";
import TabletButtons from "components/Camera/TabletButtons.tsx";
@@ -70,7 +70,7 @@ const AICameraButtons = ( {
disabled={!modelLoaded || takingPhoto}
flipCamera={flipCamera}
hasFlash={hasFlash}
hasGalleryButton
hasPhotoLibraryButton
rotatableAnimatedStyle={rotatableAnimatedStyle}
showPrediction={showPrediction}
showZoomButton={showZoomButton}
@@ -128,7 +128,7 @@ const AICameraButtons = ( {
</View>
<View><CameraFlip flipCamera={flipCamera} /></View>
<View>
<Gallery rotatableAnimatedStyle={rotatableAnimatedStyle} />
<PhotoLibraryIcon rotatableAnimatedStyle={rotatableAnimatedStyle} />
</View>
</View>
<View className="flex-row justify-center items-center w-full" pointerEvents="box-none">

View File

@@ -14,7 +14,7 @@ interface Props {
const isTablet = DeviceInfo.isTablet();
const Gallery = ( { rotatableAnimatedStyle }: Props ) => {
const PhotoLibraryIcon = ( { rotatableAnimatedStyle }: Props ) => {
const { t } = useTranslation( );
const navigation = useNavigation( );
@@ -32,13 +32,13 @@ const Gallery = ( { rotatableAnimatedStyle }: Props ) => {
"border-2",
"rounded"
)}
onPress={( ) => navigation.push( "PhotoGallery", {
onPress={( ) => navigation.push( "PhotoLibrary", {
cmonBack: true,
lastScreen: "Camera"
} )}
accessibilityLabel={t( "Photo-importer" )}
accessibilityHint={t( "Navigates-to-photo-importer" )}
icon="gallery"
icon="photo-library"
color={( colors?.white as string ) || "white"}
size={26}
width={62}
@@ -48,4 +48,4 @@ const Gallery = ( { rotatableAnimatedStyle }: Props ) => {
);
};
export default Gallery;
export default PhotoLibraryIcon;

View File

@@ -21,11 +21,11 @@ const SavePhotoPermissionGate = ( {
return (
<PermissionGateContainer
permissions={WRITE_MEDIA_PERMISSIONS}
title={t( "Save-photos-to-your-gallery" )}
titleDenied={t( "Save-photos-to-your-gallery" )}
body={t( "iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery" )}
title={t( "Save-photos-to-your-photo-library" )}
titleDenied={t( "Save-photos-to-your-photo-library" )}
body={t( "iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-photo-library" )}
buttonText={t( "SAVE-PHOTOS" )}
icon="gallery"
icon="photo-library"
image={require( "images/background/birger-strahl-ksiGE4hMiso-unsplash.jpg" )}
onModalHide={onModalHide}
onPermissionGranted={onPhotoPermissionGranted}

View File

@@ -97,12 +97,12 @@ const StandardCamera = ( {
const cameraUris = useStore( state => state.cameraUris );
const prepareCamera = useStore( state => state.prepareCamera );
const galleryUris = useStore( state => state.galleryUris );
const photoLibraryUris = useStore( state => state.photoLibraryUris );
const deletePhotoFromObservation = useStore( state => state.deletePhotoFromObservation );
const totalObsPhotoUris = useMemo(
( ) => [...cameraUris, ...galleryUris].length,
[cameraUris, galleryUris]
( ) => [...cameraUris, ...photoLibraryUris].length,
[cameraUris, photoLibraryUris]
);
const disallowAddingPhotos = totalObsPhotoUris >= MAX_PHOTOS_ALLOWED;
@@ -113,7 +113,7 @@ const StandardCamera = ( {
// newPhotoUris tracks photos taken in *this* instance of the camera. The
// camera might be instantiated with several cameraUris or
// galleryUris already in state, but we only want to show the CTA button or discard modal
// photoLibraryUris already in state, but we only want to show the CTA button or discard modal
// when the user has taken a photo with *this* instance of the camera
const photosTaken = newPhotoUris.length > 0 && totalObsPhotoUris > 0;
const {

View File

@@ -1,5 +1,5 @@
import classnames from "classnames";
import Gallery from "components/Camera/Buttons/Gallery.tsx";
import PhotoLibraryIcon from "components/Camera/Buttons/PhotoLibraryIcon.tsx";
import { CloseButton } from "components/SharedComponents";
import { View } from "components/styledComponents";
import React from "react";
@@ -43,7 +43,7 @@ interface Props {
handleCheckmarkPress?: ( _event: GestureResponderEvent ) => void;
handleClose?: ( _event: GestureResponderEvent ) => void;
hasFlash?: boolean;
hasGalleryButton?: boolean;
hasPhotoLibraryButton?: boolean;
photosTaken?: boolean;
rotatableAnimatedStyle: ViewStyle;
showPrediction?: boolean;
@@ -76,7 +76,7 @@ const TabletButtons = ( {
handleCheckmarkPress,
handleClose,
hasFlash,
hasGalleryButton,
hasPhotoLibraryButton,
photosTaken,
rotatableAnimatedStyle,
showPrediction,
@@ -147,9 +147,9 @@ const TabletButtons = ( {
</View>
{ hasFlash && <CameraButtonPlaceholder extraClassName="mt-[25px]" /> }
{ showZoomButton && <CameraButtonPlaceholder extraClassName="mt-[25px]" /> }
{ hasGalleryButton && (
{ hasPhotoLibraryButton && (
<View className="absolute bottom-6">
<Gallery rotatableAnimatedStyle={rotatableAnimatedStyle} />
<PhotoLibraryIcon rotatableAnimatedStyle={rotatableAnimatedStyle} />
</View>
) }
</View>

View File

@@ -12,9 +12,9 @@ import { log } from "sharedHelpers/logger";
import { displayName as appName } from "../../../../app.json";
const logger = log.extend( "savePhotosToCameraGallery" );
const logger = log.extend( "savePhotosToPhotoLibrary" );
// Save URIs to camera gallery (if a photo was taken using the app,
// Save URIs to camera photo library (if a photo was taken using the app,
// we want it accessible in the camera's folder, as if the user has taken those photos
// via their own camera app).
// One could argue this is a private method and shouldn't be exported and
@@ -22,7 +22,7 @@ const logger = log.extend( "savePhotosToCameraGallery" );
// be too complicated, so this at least makes it easy to test this one part
// ~~~kueda20240614
// $FlowIgnore
export async function savePhotosToCameraGallery(
export async function savePhotosToPhotoLibrary(
uris: [string],
location: Object
) {
@@ -55,7 +55,7 @@ export async function savePhotosToCameraGallery(
return savedUris;
} catch ( cameraRollSaveError ) {
// should never get here since in usePrepareStoreAndNavigate we check for device full
// and skip saving to gallery
// and skip saving to photo library
if (
cameraRollSaveError.message.match( /No space left on device/ )
|| cameraRollSaveError.message.match( /PHPhotosErrorDomain error 3305/ )
@@ -88,4 +88,4 @@ export async function savePhotosToCameraGallery(
return savedPhotoUris;
}
export default savePhotosToCameraGallery;
export default savePhotosToPhotoLibrary;

View File

@@ -8,7 +8,7 @@ import ObservationPhoto from "realmModels/ObservationPhoto";
import fetchPlaceName from "sharedHelpers/fetchPlaceName";
import useStore from "stores/useStore";
import savePhotosToCameraGallery from "../helpers/savePhotosToCameraGallery";
import savePhotosToPhotoLibrary from "../helpers/savePhotosToPhotoLibrary";
const usePrepareStoreAndNavigate = ( ): Function => {
const navigation = useNavigation( );
@@ -47,7 +47,7 @@ const usePrepareStoreAndNavigate = ( ): Function => {
return Promise.resolve( );
}
setSavingPhoto( true );
const savedPhotoUris = await savePhotosToCameraGallery( uris, userLocation );
const savedPhotoUris = await savePhotosToPhotoLibrary( uris, userLocation );
await logStageIfAICamera( "save_photos_to_photo_library_complete" );
if ( savedPhotoUris.length > 0 ) {
// Save these camera roll URIs, so later on observation editor can update

View File

@@ -1,6 +1,6 @@
import {
computerVisionPath,
galleryPhotosPath,
photoLibraryPhotosPath,
photoUploadPath,
rotatedOriginalPhotosPath,
soundUploadPath
@@ -46,8 +46,8 @@ const sharedDirectories = [
directoryName: "ComputerVisionSuggestions"
},
{
path: galleryPhotosPath,
directoryName: "GalleryPhotos"
path: photoLibraryPhotosPath,
directoryName: "PhotoLibraryPhotos"
},
{
path: photoUploadPath,

View File

@@ -5,7 +5,7 @@ import { fetchUserMe } from "api/users";
import { ApiResponse, ApisauceInstance, create } from "apisauce";
import {
computerVisionPath,
galleryPhotosPath,
photoLibraryPhotosPath,
photoUploadPath,
rotatedOriginalPhotosPath,
soundUploadPath
@@ -180,7 +180,7 @@ const signOut = async (
await unlink( logFilePath );
// clear all directories containing user generated data within Documents Directory
await removeAllFilesFromDirectory( computerVisionPath );
await removeAllFilesFromDirectory( galleryPhotosPath );
await removeAllFilesFromDirectory( photoLibraryPhotosPath );
await removeAllFilesFromDirectory( photoUploadPath );
await removeAllFilesFromDirectory( rotatedOriginalPhotosPath );
await removeAllFilesFromDirectory( soundUploadPath );

View File

@@ -54,11 +54,11 @@ const AddEvidenceSheet = ( {
accessibilityHint={t( "Navigates-to-camera" )}
/>
<EvidenceButton
icon="gallery"
icon="photo-library"
handlePress={( ) => {
// Show photo gallery, but skip group photos phase
// Show photo library, but skip group photos phase
navigation.navigate( "NoBottomTabStackNavigator", {
screen: "PhotoGallery",
screen: "PhotoLibrary",
params: { skipGroupPhotos: true }
} );
}}

View File

@@ -73,7 +73,7 @@ const GroupPhotos = ( {
const addPhotos = useCallback( () => {
navigation.navigate( "NoBottomTabStackNavigator", {
screen: "PhotoGallery",
screen: "PhotoLibrary",
params: { fromGroupPhotos: true }
} );
}, [navigation] );

View File

@@ -1,6 +1,6 @@
import { useFocusEffect, useNavigation, useRoute } from "@react-navigation/native";
import {
galleryPhotosPath
photoLibraryPhotosPath
} from "appConstants/paths.ts";
import navigateToObsDetails from "components/ObsDetails/helpers/navigateToObsDetails";
import { ActivityAnimation, ViewWrapper } from "components/SharedComponents";
@@ -29,17 +29,17 @@ import useStore from "stores/useStore";
const MAX_PHOTOS_ALLOWED = 20;
const DEFAULT_MODE_MAX_PHOTOS_ALLOWED = 1;
const PhotoGallery = ( ): Node => {
const PhotoLibrary = ( ): Node => {
const {
isDefaultMode
} = useLayoutPrefs( );
const navigation = useNavigation( );
const [photoGalleryShown, setPhotoGalleryShown] = useState( false );
const [photoLibraryShown, setPhotoLibraryShown] = useState( false );
const setPhotoImporterState = useStore( state => state.setPhotoImporterState );
const setGroupedPhotos = useStore( state => state.setGroupedPhotos );
const groupedPhotos = useStore( state => state.groupedPhotos );
const updateObservations = useStore( state => state.updateObservations );
const galleryUris = useStore( state => state.galleryUris );
const photoLibraryUris = useStore( state => state.photoLibraryUris );
const evidenceToAdd = useStore( state => state.evidenceToAdd );
const currentObservation = useStore( state => state.currentObservation );
const currentObservationIndex = useStore( state => state.currentObservationIndex );
@@ -57,7 +57,7 @@ const PhotoGallery = ( ): Node => {
const lastScreen = params?.lastScreen;
const navToObsEdit = useCallback( ( ) => navigation.navigate( "ObsEdit", {
lastScreen: "PhotoGallery"
lastScreen: "PhotoLibrary"
} ), [navigation] );
const advanceToMatchScreen = lastScreen === "Camera"
@@ -67,16 +67,16 @@ const PhotoGallery = ( ): Node => {
const navToMatchOrSuggestions = useCallback( async ( ) => {
if ( advanceToMatchScreen ) {
return navigation.navigate( "Match", {
lastScreen: "PhotoGallery"
lastScreen: "PhotoLibrary"
} );
}
return navigation.navigate( "Suggestions", {
lastScreen: "PhotoGallery"
lastScreen: "PhotoLibrary"
} );
}, [navigation, advanceToMatchScreen] );
const moveImagesToDocumentsDirectory = async selectedImages => {
const path = galleryPhotosPath;
const path = photoLibraryPhotosPath;
await RNFS.mkdir( path );
const movedImages = await Promise.all( selectedImages.map( async ( { image } ) => {
@@ -96,12 +96,12 @@ const PhotoGallery = ( ): Node => {
return movedImages;
};
const showPhotoGallery = React.useCallback( async () => {
if ( photoGalleryShown ) {
const showPhotoLibrary = React.useCallback( async () => {
if ( photoLibraryShown ) {
return;
}
setPhotoGalleryShown( true );
setPhotoLibraryShown( true );
if ( Platform.OS === "ios" ) {
// iOS has annoying transition of the screen - that if we don't wait enough time,
@@ -141,7 +141,7 @@ const PhotoGallery = ( ): Node => {
} else {
exitObservationsFlow();
}
setPhotoGalleryShown( false );
setPhotoLibraryShown( false );
return;
}
@@ -156,7 +156,7 @@ const PhotoGallery = ( ): Node => {
} ) )] );
navigation.setParams( { fromGroupPhotos: false } );
navigation.navigate( "NoBottomTabStackNavigator", { screen: "GroupPhotos" } );
setPhotoGalleryShown( false );
setPhotoLibraryShown( false );
return;
}
@@ -165,7 +165,7 @@ const PhotoGallery = ( ): Node => {
if ( skipGroupPhotos ) {
// add evidence to existing observation
setPhotoImporterState( {
galleryUris: [...galleryUris, ...importedPhotoUris],
photoLibraryUris: [...photoLibraryUris, ...importedPhotoUris],
evidenceToAdd: [...evidenceToAdd, ...importedPhotoUris]
} );
const obsPhotos = await ObservationPhoto
@@ -183,7 +183,7 @@ const PhotoGallery = ( ): Node => {
observations[currentObservationIndex] = updatedCurrentObservation;
updateObservations( observations );
navToObsEdit();
setPhotoGalleryShown( false );
setPhotoLibraryShown( false );
} else if ( selectedImages.length === 1 ) {
// create a new observation and skip group photos screen
const newObservation = await Observation.createObservationWithPhotos( [selectedImages[0]] );
@@ -199,18 +199,18 @@ const PhotoGallery = ( ): Node => {
observations: [newObservation]
} );
navToMatchOrSuggestions( );
setPhotoGalleryShown( false );
setPhotoLibraryShown( false );
} else {
// navigate to group photos
setPhotoImporterState( {
galleryUris: [...galleryUris, ...importedPhotoUris],
photoLibraryUris: [...photoLibraryUris, ...importedPhotoUris],
groupedPhotos: selectedImages.map( photo => ( {
photos: [photo]
} ) )
} );
navigation.setParams( { fromGroupPhotos: false } );
navigation.navigate( "NoBottomTabStackNavigator", { screen: "GroupPhotos" } );
setPhotoGalleryShown( false );
setPhotoLibraryShown( false );
}
}, [
advanceToMatchScreen,
@@ -219,7 +219,7 @@ const PhotoGallery = ( ): Node => {
evidenceToAdd,
exitObservationsFlow,
fromGroupPhotos,
galleryUris,
photoLibraryUris,
groupedPhotos,
navigation,
navToObsEdit,
@@ -227,7 +227,7 @@ const PhotoGallery = ( ): Node => {
numOfObsPhotos,
observations,
params,
photoGalleryShown,
photoLibraryShown,
setGroupedPhotos,
setPhotoImporterState,
skipGroupPhotos,
@@ -241,8 +241,8 @@ const PhotoGallery = ( ): Node => {
// Wait for screen to finish transition
interactionHandle = InteractionManager.runAfterInteractions( () => {
if ( !photoGalleryShown ) {
showPhotoGallery();
if ( !photoLibraryShown ) {
showPhotoLibrary();
}
} );
@@ -252,11 +252,11 @@ const PhotoGallery = ( ): Node => {
interactionHandle.cancel();
}
};
}, [photoGalleryShown, showPhotoGallery] )
}, [photoLibraryShown, showPhotoLibrary] )
);
return (
<ViewWrapper testID="PhotoGallery">
<ViewWrapper testID="PhotoLibrary">
<View className="flex-1 w-full h-full justify-center items-center">
<ActivityAnimation />
</View>
@@ -264,4 +264,4 @@ const PhotoGallery = ( ): Node => {
);
};
export default PhotoGallery;
export default PhotoLibrary;

View File

@@ -74,7 +74,7 @@ const PhotoSharing = ( ): Node => {
// Go to GroupPhotos screen
const firstObservationDefaults = { description: sharedText };
setPhotoImporterState( {
galleryUris: photoUris.map( x => x.image.uri ),
photoLibraryUris: photoUris.map( x => x.image.uri ),
groupedPhotos: photoUris.map( photo => ( {
photos: [photo]
} ) ),

View File

@@ -289,11 +289,11 @@ const Settings = ( ) => {
</View>
<View className="mt-4 pr-5">
<RadioButtonRow
testID="all-observation-option"
testID="all-observation-options"
smallLabel
checked={isAllAddObsOptionsMode}
onPress={() => setIsAllAddObsOptionsMode( true )}
label={t( "All-observation-option" )}
label={t( "All-observation-options" )}
/>
</View>
</View>

View File

@@ -22,58 +22,58 @@
"play-circle": 61717,
"photos": 61718,
"photos-outline": 61719,
"person": 61720,
"pencil": 61721,
"pencil-outline": 61722,
"pause": 61723,
"pause-circle": 61724,
"offline": 61725,
"observers": 61726,
"obscured": 61727,
"notifications-bell": 61728,
"noevidence": 61729,
"microphone": 61730,
"microphone-circle": 61731,
"map": 61732,
"map-marker-outline": 61733,
"map-layers": 61734,
"magnifying-glass": 61735,
"location-crosshairs": 61736,
"list-square": 61737,
"leaf": 61738,
"layers": 61739,
"laptop": 61740,
"label": 61741,
"label-outline": 61742,
"kebab-menu": 61743,
"info-circle-outline": 61744,
"inaturalist": 61745,
"identifiers": 61746,
"id-agree": 61747,
"iconic-unknown": 61748,
"iconic-reptilia": 61749,
"iconic-protozoa": 61750,
"iconic-plantae": 61751,
"iconic-mollusca": 61752,
"iconic-mammalia": 61753,
"iconic-insecta": 61754,
"iconic-fungi": 61755,
"iconic-chromista": 61756,
"iconic-aves": 61757,
"iconic-arachnida": 61758,
"iconic-animalia": 61759,
"iconic-amphibia": 61760,
"iconic-actinopterygii": 61761,
"help": 61762,
"help-circle": 61763,
"help-circle-outline": 61764,
"heart": 61765,
"hamburger-menu": 61766,
"grid": 61767,
"grid-square": 61768,
"globe-outline": 61769,
"gear": 61770,
"gallery": 61771,
"photo-library": 61720,
"person": 61721,
"pencil": 61722,
"pencil-outline": 61723,
"pause": 61724,
"pause-circle": 61725,
"offline": 61726,
"observers": 61727,
"obscured": 61728,
"notifications-bell": 61729,
"noevidence": 61730,
"microphone": 61731,
"microphone-circle": 61732,
"map": 61733,
"map-marker-outline": 61734,
"map-layers": 61735,
"magnifying-glass": 61736,
"location-crosshairs": 61737,
"list-square": 61738,
"leaf": 61739,
"layers": 61740,
"laptop": 61741,
"label": 61742,
"label-outline": 61743,
"kebab-menu": 61744,
"info-circle-outline": 61745,
"inaturalist": 61746,
"identifiers": 61747,
"id-agree": 61748,
"iconic-unknown": 61749,
"iconic-reptilia": 61750,
"iconic-protozoa": 61751,
"iconic-plantae": 61752,
"iconic-mollusca": 61753,
"iconic-mammalia": 61754,
"iconic-insecta": 61755,
"iconic-fungi": 61756,
"iconic-chromista": 61757,
"iconic-aves": 61758,
"iconic-arachnida": 61759,
"iconic-animalia": 61760,
"iconic-amphibia": 61761,
"iconic-actinopterygii": 61762,
"help": 61763,
"help-circle": 61764,
"help-circle-outline": 61765,
"heart": 61766,
"hamburger-menu": 61767,
"grid": 61768,
"grid-square": 61769,
"globe-outline": 61770,
"gear": 61771,
"flip": 61772,
"flash-on": 61773,
"flash-off": 61774,

View File

@@ -51,7 +51,7 @@ Add-Date-Time = Add Date/Time
Add-disagreement = Add disagreement
ADD-EVIDENCE = ADD EVIDENCE
# Label for a button that shows options for adding evidence, e.g. camera,
# gallery, sound, etc
# photo library, sound, etc
Add-evidence = Add evidence
Add-favorite = Add favorite
Add-Location = Add Location
@@ -81,7 +81,7 @@ Agree-with-ID-description = Would you like to agree with the ID and suggest the
AI-Camera = AI Camera
ALL = ALL
All = All
All-observation-option = All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Gallery, and Sound Recorder)
All-observation-options = All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Photo Library, and Sound Recorder)
All-observations = All observations
All-organisms = All organisms
# As in intellectual property rights over a photo or other creative work
@@ -198,8 +198,6 @@ Change-zoom = Change zoom
CHECK-YOUR-EMAIL = CHECK YOUR EMAIL!
# Label for a text input field during sign up to choose a username
CHOOSE-A-USERNAME = CHOOSE A USERNAME
# Text for a button prompting the user to grant access to the gallery
CHOOSE-PHOTOS = CHOOSE PHOTOS
# Label for button that chooses a taxon
Choose-taxon = Choose taxon
# Label for button that chooses the best suggestion among a list of suggested
@@ -592,7 +590,7 @@ improving--identification = Improving
iNat-is-global-community = iNaturalist is a global community of naturalists creating open data for science by collectively observing & identifying organisms
INATURALIST-ACCOUNT-SETTINGS = INATURALIST ACCOUNT SETTINGS
iNaturalist-AI-Camera = iNaturalist AI Camera
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery = iNaturalist can save photos you take in the app to your devices gallery.
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-photo-library = iNaturalist can save photos you take in the app to your devices photo library.
INATURALIST-COMMUNITY = INATURALIST COMMUNITY
iNaturalist-couldnt-identify-this-organism = iNaturalist couldnt identify this organism.
INATURALIST-FORUM = INATURALIST FORUM
@@ -850,8 +848,6 @@ OBSERVATIONS-WITHOUT-NUMBER =
Observations-you-upload-to-iNaturalist = Observations you upload to iNaturalist can be used by scientists and researchers worldwide.
# Button that starts a new observation
Observe = Observe
# Title of screen asking for permission to access the gallery
Observe-and-identify-organisms-from-your-gallery = Observe and identify organisms from your gallery
# Title of screen asking for permission to access the camera
Observe-and-identify-organisms-in-real-time-with-your-camera = Observe and identify organisms in real time with your camera
# Text for a button prompting the user to grant access to the camera
@@ -905,8 +901,6 @@ Photos = Photos
Photos-you-take-will-appear-here = Photos you take will appear here
# Title of screen asking for permission to access the camera when access was denied
Please-allow-Camera-Access = Please allow Camera Access
# Title of screen asking for permission to access the gallery when access was denied
Please-Allow-Gallery-Access = Please Allow Gallery Access
# Title of screen asking for permission to access location when access was denied
Please-allow-Location-Access = Please allow Location Access
# Title of screen asking for permission to access the microphone when access was denied
@@ -1090,7 +1084,7 @@ SAVE-CHANGES = SAVE CHANGES
SAVE-FOR-LATER = SAVE FOR LATER
SAVE-LOCATION = SAVE LOCATION
SAVE-PHOTOS = SAVE PHOTOS
Save-photos-to-your-gallery = Save photos to your gallery
Save-photos-to-your-photo-library = Save photos to your photo library
Saved-Observation = Saved observation, in queue to upload
Scan-the-area-around-you-for-organisms = Scan the area around you for organisms.
Scientific-Name = Scientific Name
@@ -1269,8 +1263,7 @@ Unreviewed-observations-only = Unreviewed observations only
Upload-Complete = Upload Complete
Upload-in-progress = Upload in progress
UPLOAD-NOW = UPLOAD NOW
Upload-photos-from-your-gallery = Upload multiple photos from your gallery
Upload-photos-from-your-gallery-and-create-observations = Upload photos from your gallery and create observations and get identifications of organisms youve already observed!
Upload-photos-from-your-photo-library = Upload multiple photos from your photo library
Upload-Progress = Upload { $uploadProgress } percent complete
UPLOAD-TO-INATURALIST = UPLOAD TO INATURALIST
# Shows the number of observations a user can upload to iNat from my observations page
@@ -1530,7 +1523,6 @@ Youre-always-in-control-of-the-location-privacy = Youre always in control of
# permission has been denied
Youve-denied-permission-prompt = Youve denied permission. Please grant permission in the settings app.
Youve-previously-denied-camera-permissions = You've previously denied camera permissions, so please enable them in settings.
Youve-previously-denied-gallery-permissions = Youve previously denied gallery permissions, so please enable them in settings.
Youve-previously-denied-location-permissions = Youve previously denied location permissions, so please enable them in settings.
Youve-previously-denied-microphone-permissions = Youve previously denied microphone permissions, so please enable them in settings.
Zoom-in-as-much-as-possible-to-improve = Zoom in as much as possible to improve location accuracy and get better identifications.

View File

@@ -38,7 +38,7 @@
"AI-Camera": "AI Camera",
"ALL": "ALL",
"All": "All",
"All-observation-option": "All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Gallery, and Sound Recorder)",
"All-observation-options": "All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Photo Library, and Sound Recorder)",
"All-observations": "All observations",
"All-organisms": "All organisms",
"all-rights-reserved": "all rights reserved",
@@ -104,7 +104,6 @@
"Change-zoom": "Change zoom",
"CHECK-YOUR-EMAIL": "CHECK YOUR EMAIL!",
"CHOOSE-A-USERNAME": "CHOOSE A USERNAME",
"CHOOSE-PHOTOS": "CHOOSE PHOTOS",
"Choose-taxon": "Choose taxon",
"Choose-top-taxon": "Choose top taxon",
"Clear": "Clear",
@@ -333,7 +332,7 @@
"iNat-is-global-community": "iNaturalist is a global community of naturalists creating open data for science by collectively observing & identifying organisms",
"INATURALIST-ACCOUNT-SETTINGS": "INATURALIST ACCOUNT SETTINGS",
"iNaturalist-AI-Camera": "iNaturalist AI Camera",
"iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery": "iNaturalist can save photos you take in the app to your devices gallery.",
"iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-photo-library": "iNaturalist can save photos you take in the app to your devices photo library.",
"INATURALIST-COMMUNITY": "INATURALIST COMMUNITY",
"iNaturalist-couldnt-identify-this-organism": "iNaturalist couldnt identify this organism.",
"INATURALIST-FORUM": "INATURALIST FORUM",
@@ -501,7 +500,6 @@
"OBSERVATIONS-WITHOUT-NUMBER": "{ $count ->\n [one] OBSERVATION\n *[other] OBSERVATIONS\n}",
"Observations-you-upload-to-iNaturalist": "Observations you upload to iNaturalist can be used by scientists and researchers worldwide.",
"Observe": "Observe",
"Observe-and-identify-organisms-from-your-gallery": "Observe and identify organisms from your gallery",
"Observe-and-identify-organisms-in-real-time-with-your-camera": "Observe and identify organisms in real time with your camera",
"OBSERVE-ORGANISMS": "OBSERVE ORGANISMS",
"OBSERVED-IN--label": "OBSERVED IN",
@@ -537,7 +535,6 @@
"Photos": "Photos",
"Photos-you-take-will-appear-here": "Photos you take will appear here",
"Please-allow-Camera-Access": "Please allow Camera Access",
"Please-Allow-Gallery-Access": "Please Allow Gallery Access",
"Please-allow-Location-Access": "Please allow Location Access",
"Please-allow-Microphone-Access": "Please allow Microphone Access",
"Please-choose-a-different-password": "Please choose a different password.",
@@ -682,7 +679,7 @@
"SAVE-FOR-LATER": "SAVE FOR LATER",
"SAVE-LOCATION": "SAVE LOCATION",
"SAVE-PHOTOS": "SAVE PHOTOS",
"Save-photos-to-your-gallery": "Save photos to your gallery",
"Save-photos-to-your-photo-library": "Save photos to your photo library",
"Saved-Observation": "Saved observation, in queue to upload",
"Scan-the-area-around-you-for-organisms": "Scan the area around you for organisms.",
"Scientific-Name": "Scientific Name",
@@ -817,8 +814,7 @@
"Upload-Complete": "Upload Complete",
"Upload-in-progress": "Upload in progress",
"UPLOAD-NOW": "UPLOAD NOW",
"Upload-photos-from-your-gallery": "Upload multiple photos from your gallery",
"Upload-photos-from-your-gallery-and-create-observations": "Upload photos from your gallery and create observations and get identifications of organisms youve already observed!",
"Upload-photos-from-your-photo-library": "Upload multiple photos from your photo library",
"Upload-Progress": "Upload { $uploadProgress } percent complete",
"UPLOAD-TO-INATURALIST": "UPLOAD TO INATURALIST",
"Upload-x-observations": "Upload { $count ->\n [one] 1 observation\n *[other] { $count } observations\n}",
@@ -927,7 +923,6 @@
"Youre-always-in-control-of-the-location-privacy": "Youre always in control of the location privacy of every observation you create.",
"Youve-denied-permission-prompt": "Youve denied permission. Please grant permission in the settings app.",
"Youve-previously-denied-camera-permissions": "You've previously denied camera permissions, so please enable them in settings.",
"Youve-previously-denied-gallery-permissions": "Youve previously denied gallery permissions, so please enable them in settings.",
"Youve-previously-denied-location-permissions": "Youve previously denied location permissions, so please enable them in settings.",
"Youve-previously-denied-microphone-permissions": "Youve previously denied microphone permissions, so please enable them in settings.",
"Zoom-in-as-much-as-possible-to-improve": "Zoom in as much as possible to improve location accuracy and get better identifications.",

View File

@@ -51,7 +51,7 @@ Add-Date-Time = Add Date/Time
Add-disagreement = Add disagreement
ADD-EVIDENCE = ADD EVIDENCE
# Label for a button that shows options for adding evidence, e.g. camera,
# gallery, sound, etc
# photo library, sound, etc
Add-evidence = Add evidence
Add-favorite = Add favorite
Add-Location = Add Location
@@ -81,7 +81,7 @@ Agree-with-ID-description = Would you like to agree with the ID and suggest the
AI-Camera = AI Camera
ALL = ALL
All = All
All-observation-option = All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Gallery, and Sound Recorder)
All-observation-options = All observation options (including iNaturalist AI Camera, Standard Camera, Uploading from Photo Library, and Sound Recorder)
All-observations = All observations
All-organisms = All organisms
# As in intellectual property rights over a photo or other creative work
@@ -198,8 +198,6 @@ Change-zoom = Change zoom
CHECK-YOUR-EMAIL = CHECK YOUR EMAIL!
# Label for a text input field during sign up to choose a username
CHOOSE-A-USERNAME = CHOOSE A USERNAME
# Text for a button prompting the user to grant access to the gallery
CHOOSE-PHOTOS = CHOOSE PHOTOS
# Label for button that chooses a taxon
Choose-taxon = Choose taxon
# Label for button that chooses the best suggestion among a list of suggested
@@ -592,7 +590,7 @@ improving--identification = Improving
iNat-is-global-community = iNaturalist is a global community of naturalists creating open data for science by collectively observing & identifying organisms
INATURALIST-ACCOUNT-SETTINGS = INATURALIST ACCOUNT SETTINGS
iNaturalist-AI-Camera = iNaturalist AI Camera
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-gallery = iNaturalist can save photos you take in the app to your devices gallery.
iNaturalist-can-save-photos-you-take-in-the-app-to-your-devices-photo-library = iNaturalist can save photos you take in the app to your devices photo library.
INATURALIST-COMMUNITY = INATURALIST COMMUNITY
iNaturalist-couldnt-identify-this-organism = iNaturalist couldnt identify this organism.
INATURALIST-FORUM = INATURALIST FORUM
@@ -850,8 +848,6 @@ OBSERVATIONS-WITHOUT-NUMBER =
Observations-you-upload-to-iNaturalist = Observations you upload to iNaturalist can be used by scientists and researchers worldwide.
# Button that starts a new observation
Observe = Observe
# Title of screen asking for permission to access the gallery
Observe-and-identify-organisms-from-your-gallery = Observe and identify organisms from your gallery
# Title of screen asking for permission to access the camera
Observe-and-identify-organisms-in-real-time-with-your-camera = Observe and identify organisms in real time with your camera
# Text for a button prompting the user to grant access to the camera
@@ -905,8 +901,6 @@ Photos = Photos
Photos-you-take-will-appear-here = Photos you take will appear here
# Title of screen asking for permission to access the camera when access was denied
Please-allow-Camera-Access = Please allow Camera Access
# Title of screen asking for permission to access the gallery when access was denied
Please-Allow-Gallery-Access = Please Allow Gallery Access
# Title of screen asking for permission to access location when access was denied
Please-allow-Location-Access = Please allow Location Access
# Title of screen asking for permission to access the microphone when access was denied
@@ -1090,7 +1084,7 @@ SAVE-CHANGES = SAVE CHANGES
SAVE-FOR-LATER = SAVE FOR LATER
SAVE-LOCATION = SAVE LOCATION
SAVE-PHOTOS = SAVE PHOTOS
Save-photos-to-your-gallery = Save photos to your gallery
Save-photos-to-your-photo-library = Save photos to your photo library
Saved-Observation = Saved observation, in queue to upload
Scan-the-area-around-you-for-organisms = Scan the area around you for organisms.
Scientific-Name = Scientific Name
@@ -1269,8 +1263,7 @@ Unreviewed-observations-only = Unreviewed observations only
Upload-Complete = Upload Complete
Upload-in-progress = Upload in progress
UPLOAD-NOW = UPLOAD NOW
Upload-photos-from-your-gallery = Upload multiple photos from your gallery
Upload-photos-from-your-gallery-and-create-observations = Upload photos from your gallery and create observations and get identifications of organisms youve already observed!
Upload-photos-from-your-photo-library = Upload multiple photos from your photo library
Upload-Progress = Upload { $uploadProgress } percent complete
UPLOAD-TO-INATURALIST = UPLOAD TO INATURALIST
# Shows the number of observations a user can upload to iNat from my observations page
@@ -1530,7 +1523,6 @@ Youre-always-in-control-of-the-location-privacy = Youre always in control of
# permission has been denied
Youve-denied-permission-prompt = Youve denied permission. Please grant permission in the settings app.
Youve-previously-denied-camera-permissions = You've previously denied camera permissions, so please enable them in settings.
Youve-previously-denied-gallery-permissions = Youve previously denied gallery permissions, so please enable them in settings.
Youve-previously-denied-location-permissions = Youve previously denied location permissions, so please enable them in settings.
Youve-previously-denied-microphone-permissions = Youve previously denied microphone permissions, so please enable them in settings.
Zoom-in-as-much-as-possible-to-improve = Zoom in as much as possible to improve location accuracy and get better identifications.

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -7,7 +7,7 @@ import { createNativeStackNavigator } from "@react-navigation/native-stack";
// eslint-disable-next-line import/no-unresolved
import CameraContainer from "components/Camera/CameraContainer";
import GroupPhotosContainer from "components/PhotoImporter/GroupPhotosContainer";
import PhotoGallery from "components/PhotoImporter/PhotoGallery";
import PhotoLibrary from "components/PhotoImporter/PhotoLibrary";
import { Heading4 } from "components/SharedComponents";
import Mortal from "components/SharedComponents/Mortal";
import PermissionGateContainer, {
@@ -72,21 +72,6 @@ const CameraContainerWithPermission = ( ) => fadeInComponent(
</Mortal>
);
// const GalleryContainerWithPermission = ( ) => (
// <PermissionGateContainer
// permissions={READ_WRITE_MEDIA_PERMISSIONS}
// title={t( "Observe-and-identify-organisms-from-your-gallery" )}
// titleDenied={t( "Please-Allow-Gallery-Access" )}
// body={t( "Upload-photos-from-your-gallery-and-create-observations" )}
// blockedPrompt={t( "Youve-previously-denied-gallery-permissions" )}
// buttonText={t( "CHOOSE-PHOTOS" )}
// icon="gallery"
// image={require( "images/background/viviana-rishe-j2330n6bg3I-unsplash.jpg" )}
// >
// <PhotoGallery />
// </PermissionGateContainer>
// );
// On iOS we don't actually need PHOTO LIBRARY permission to import photos,
// and in fact, if we ask for it and the user denies it after already
// granting add-only permission, the user can never grant it again until they
@@ -94,8 +79,8 @@ const CameraContainerWithPermission = ( ) => fadeInComponent(
// albums, but for now this works. ~~~~kueda20240829
// TODO verify this is true for Android
const GalleryContainerWithPermission = ( ) => (
<PhotoGallery />
const PhotoLibraryContainerWithPermission = ( ) => (
<PhotoLibrary />
);
const SoundRecorderWithPermission = ( ) => fadeInComponent(
@@ -132,8 +117,8 @@ const NoBottomTabStackNavigator = ( ): Node => (
options={CAMERA_SCREEN_OPTIONS}
/>
<Stack.Screen
name="PhotoGallery"
component={GalleryContainerWithPermission}
name="PhotoLibrary"
component={PhotoLibraryContainerWithPermission}
options={hideHeader}
/>
<Stack.Screen

View File

@@ -1,5 +1,5 @@
import {
galleryPhotosPath, photoUploadPath, rotatedOriginalPhotosPath, soundUploadPath
photoLibraryPhotosPath, photoUploadPath, rotatedOriginalPhotosPath, soundUploadPath
} from "appConstants/paths.ts";
import { log } from "sharedHelpers/logger";
import removeAllFilesFromDirectory from "sharedHelpers/removeAllFilesFromDirectory.ts";
@@ -26,7 +26,7 @@ const clearRotatedOriginalPhotosDirectory = async ( ) => {
};
const clearGalleryPhotos = async ( ) => {
await removeAllFilesFromDirectory( galleryPhotosPath );
await removeAllFilesFromDirectory( photoLibraryPhotosPath );
};
// this hook checks to see which localFilePaths are still needed in photoUploads/

View File

@@ -1,4 +1,4 @@
import { galleryPhotosPath, rotatedOriginalPhotosPath } from "appConstants/paths.ts";
import { photoLibraryPhotosPath, rotatedOriginalPhotosPath } from "appConstants/paths.ts";
import { DocumentDirectoryPath } from "react-native-fs";
import type { RealmObservation } from "realmModels/types.d.ts";
import {
@@ -22,7 +22,7 @@ export function isNew( observation: RealmObservation ) {
}
export function isFromGallery( observation: RealmObservation ) {
return originalPhotoUri( observation ).includes( galleryPhotosPath );
return originalPhotoUri( observation ).includes( photoLibraryPhotosPath );
}
export function isFromSharing( observation: RealmObservation ) {

View File

@@ -25,7 +25,7 @@ const useShare = ( ): void => {
return;
}
// show user a loading animation screen (like PhotoGallery)
// show user a loading animation screen (like PhotoLibrary)
// while observations are created
navigation.navigate( "PhotoSharing", { item } );
}, [navigation] );

View File

@@ -10,7 +10,7 @@ const DEFAULT_STATE = {
currentObservation: null,
currentObservationIndex: 0,
evidenceToAdd: [],
galleryUris: [],
photoLibraryUris: [],
groupedPhotos: [],
observations: [],
// Track when any obs was last marked as viewed so we know when to update
@@ -140,7 +140,7 @@ const createObservationFlowSlice = ( set, get ) => ( {
currentObservation: observationToJSON( updatedObservations[state.currentObservationIndex] )
} ) ),
setPhotoImporterState: options => set( state => ( {
galleryUris: options?.galleryUris || state.galleryUris,
photoLibraryUris: options?.photoLibraryUris || state.photoLibraryUris,
savingPhoto: options?.savingPhoto || state.savingPhoto,
evidenceToAdd: options?.evidenceToAdd || state.evidenceToAdd,
groupedPhotos: options?.groupedPhotos || state.groupedPhotos,

View File

@@ -69,7 +69,7 @@ const navigateToPhotoImporter = async ( ) => {
await actor.press( photoImporter );
};
describe( "PhotoGallery navigation", ( ) => {
describe( "PhotoLibrary navigation", ( ) => {
global.withAnimatedTimeTravelEnabled( );
beforeEach( ( ) => {
useStore.setState( { isAdvancedUser: true } );

View File

@@ -163,7 +163,7 @@ exports[`CustomTabBar with advanced user layout should render correctly 1`] = `
]
}
>
</Text>
</View>
</View>
@@ -624,7 +624,7 @@ exports[`CustomTabBar with advanced user layout should render correctly 1`] = `
]
}
>
</Text>
</View>
</View>
@@ -768,7 +768,7 @@ exports[`CustomTabBar with advanced user layout should render correctly 1`] = `
]
}
>
</Text>
</View>
</View>

View File

@@ -1,9 +1,9 @@
import { CameraRoll } from "@react-native-camera-roll/camera-roll";
import { savePhotosToCameraGallery } from "components/Camera/helpers/savePhotosToCameraGallery.ts";
import { savePhotosToPhotoLibrary } from "components/Camera/helpers/savePhotosToPhotoLibrary.ts";
import faker from "tests/helpers/faker";
describe( "userPrepareStoreAndNavigate", ( ) => {
describe( "savePhotosToCameraGallery", ( ) => {
describe( "savePhotosToPhotoLibrary", ( ) => {
it( "should call CameraRoll.save three times when given three uris", async ( ) => {
const uris = [
faker.system.filePath( ),
@@ -11,7 +11,7 @@ describe( "userPrepareStoreAndNavigate", ( ) => {
faker.system.filePath( )
];
const mockOnEachSuccess = jest.fn( );
await savePhotosToCameraGallery( uris, mockOnEachSuccess );
await savePhotosToPhotoLibrary( uris, mockOnEachSuccess );
// This should test that CameraRoll.save was called once for each of the
// uris AND that it was called in the order of the uris array
// https://jestjs.io/docs/mock-functions#custom-matchers

View File

@@ -36,7 +36,7 @@ exports[`IdentificationsCount renders default reliably 1`] = `
]
}
>
</Text>
<Text
maxFontSizeMultiplier={2}
@@ -111,7 +111,7 @@ exports[`IdentificationsCount renders filled reliably 1`] = `
]
}
>
</Text>
<Text
maxFontSizeMultiplier={2}
@@ -186,7 +186,7 @@ exports[`IdentificationsCount renders white reliably 1`] = `
]
}
>
</Text>
<Text
maxFontSizeMultiplier={2}

View File

@@ -194,7 +194,7 @@ exports[`InlineUser when offline renders reliably 1`] = `
}
testID="InlineUser.FallbackPicture"
>
</Text>
</View>
<Text
@@ -322,7 +322,7 @@ exports[`InlineUser when user has no icon set renders reliably 1`] = `
}
testID="InlineUser.FallbackPicture"
>
</Text>
</View>
<Text

View File

@@ -117,7 +117,7 @@ exports[`ObsGridItem for an observation with a photo should render 1`] = `
]
}
>
</Text>
</View>
</View>
@@ -359,7 +359,7 @@ exports[`ObsGridItem for an observation without a photo should render 1`] = `
]
}
>
</Text>
</View>
</View>

View File

@@ -255,7 +255,7 @@ exports[`TaxonResult should render correctly 1`] = `
]
}
>
</Text>
</View>
</View>
@@ -511,7 +511,7 @@ exports[`TaxonResult should render correctly 1`] = `
]
}
>
</Text>
</View>
</View>