Compare commits
83 Commits
dependabot
...
2.0.8
Author | SHA1 | Date |
---|---|---|
RenJuan | 4a72a9f591 | |
RenJuan | 80e788679d | |
RenJuan | 6eec607abf | |
RenJuan | 28b6b0e06d | |
RenJuan | da86eb0253 | |
RenJuan | eb977a1f24 | |
RenJuan | 1e2f85fe1d | |
RenJuan | a370c26775 | |
RenJuan | 4d6eaa522b | |
仁 人 卷 | 1e27fdd969 | |
仁 人 卷 | a88aaf0f00 | |
仁 人 卷 | 91371b8380 | |
仁 人 卷 | 09910f6122 | |
仁 人 卷 | 09ceba1725 | |
仁 人 卷 | d989221fe4 | |
仁 人 卷 | 5c84a09ded | |
仁 人 卷 | 25ec007581 | |
仁 人 卷 | c7d41f77e0 | |
仁 人 卷 | eaf073c066 | |
仁 人 卷 | b02724d556 | |
仁 人 卷 | e3189433a4 | |
仁 人 卷 | 2daa815af4 | |
仁 人 卷 | bcee5e706a | |
Ren Juan | b64c6a93f6 | |
Ren Juan | ca3899e331 | |
Ren Juan | bc2bf366d0 | |
Ren Juan | e5bbc64b9b | |
Ren Juan | 05a7e20d4d | |
Ren Juan | 47341586bd | |
Ren Juan | faf3aec937 | |
Ren Juan | a8bd22c0a3 | |
Ren Juan | a763ef9d5f | |
Ren Juan | ecbc1f2260 | |
Ren Juan | 470c231695 | |
Ren Juan | 8ae9271414 | |
Ren Juan | f3b91b2262 | |
Ren Juan | ba4c83a925 | |
Ren Juan | 71191e5256 | |
Ren Juan | 871c1208c3 | |
Ren Juan | eb01f8981a | |
Ren Juan | 183a97003e | |
Ren Juan | de380df8d6 | |
Ren Juan | fcb38c09b0 | |
Ren Juan | c160aad0fd | |
Ren Juan | 01739a2ad7 | |
Ren Juan | 81ff54af6b | |
Ren Juan | cb5076fd0f | |
Ren Juan | bef5b44ba9 | |
Ren Juan | 82189c85f4 | |
Ren Juan | f3b3883a8a | |
Ren Juan | ef315a96c5 | |
Ren Juan | 6c2cf9c460 | |
Ren Juan | 43d1dc5216 | |
Ren Juan | 30e4633fa8 | |
Ren Juan | dbe8c04fdc | |
Ren Juan | a35ec2685f | |
Ren Juan | 89f938df22 | |
Ren Juan | 7158412677 | |
Ren Juan | 78bdab26c5 | |
Ren Juan | 3d92a384db | |
Ren Juan | c8ffd5b1af | |
Ren Juan | a4c841a13e | |
Ren Juan | 98870adc75 | |
Ren Juan | 8d83acad60 | |
Ren Juan | 80950b3426 | |
Ren Juan | 13887bcbda | |
Ren Juan | 651793bfe2 | |
Ren Juan | e9f70bb9c2 | |
Ren Juan | 31a55ff5f5 | |
Ren Juan | fc00582125 | |
Ren Juan | 9bbfaf7cfe | |
Ren Juan | aa55906a14 | |
Ren Juan | 8be39f846c | |
Ren Juan | 3eac13ac65 | |
Ren Juan | 7397c33d50 | |
Ren Juan | 40f0b58bc3 | |
Ren Juan | e56a630b3d | |
Ren Juan | 2d062e396d | |
Ren Juan | 29128bd858 | |
Ren Juan | dae937d38d | |
Ren Juan | 122f316e8a | |
Ren Juan | d1db9377c9 | |
Ren Juan | 7f7161ca67 |
|
@ -1,21 +1,30 @@
|
||||||
import 'react-native-gesture-handler';
|
import 'react-native-gesture-handler';
|
||||||
import { StatusBar } from 'expo-status-bar';
|
import { StatusBar } from 'expo-status-bar';
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Text } from 'react-native';
|
import { Alert, Text } from 'react-native';
|
||||||
import * as Location from 'expo-location';
|
import * as Location from 'expo-location';
|
||||||
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
||||||
|
|
||||||
import useCachedResources from './hooks/useCachedResources';
|
import useCachedResources from './hooks/useCachedResources';
|
||||||
import useColorScheme from './hooks/useColorScheme';
|
import useColorScheme from './hooks/useColorScheme';
|
||||||
import Navigation from './navigation';
|
import Navigation from './navigation';
|
||||||
import { GT2 } from './GT2';
|
import { Trips } from './GT2';
|
||||||
export var debug:boolean = true;
|
|
||||||
export var expoGeoState:any;
|
var debug:boolean = false;
|
||||||
|
var expoGeoState:any = null;
|
||||||
|
var advised:boolean = false;
|
||||||
|
|
||||||
|
export function getAdvised() : boolean { return advised; }
|
||||||
|
export function setAdvised() : void { advised = true; }
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const isLoadingComplete = useCachedResources();
|
const isLoadingComplete = useCachedResources();
|
||||||
const colorScheme = useColorScheme();
|
const colorScheme = useColorScheme();
|
||||||
|
|
||||||
const [isKM, setIsKM] = useState(false);
|
const [isKM, setIsKM] = useState(false);
|
||||||
const toggleUnits = () => setIsKM(previousState => !previousState);
|
const toggleUnits = () => setIsKM(previousState => !previousState);
|
||||||
|
|
||||||
|
|
||||||
const [location, setLocation] = useState(Object);
|
const [location, setLocation] = useState(Object);
|
||||||
const [errorMsg, setErrorMsg] = useState("");
|
const [errorMsg, setErrorMsg] = useState("");
|
||||||
|
|
||||||
|
@ -24,11 +33,16 @@ export default function App() {
|
||||||
let { status } = await Location.requestForegroundPermissionsAsync();
|
let { status } = await Location.requestForegroundPermissionsAsync();
|
||||||
if (status !== 'granted') {
|
if (status !== 'granted') {
|
||||||
setErrorMsg('Permission to access location was denied');
|
setErrorMsg('Permission to access location was denied');
|
||||||
|
Trips.setLocEnabled(false);
|
||||||
|
Alert.alert("Permission to access location was denied, this app requires it.");
|
||||||
return;
|
return;
|
||||||
}
|
} else Trips.setLocEnabled(true);
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
let location = await Location.getCurrentPositionAsync({});
|
let location = await Location.getCurrentPositionAsync({});
|
||||||
setLocation(location);
|
setLocation(location);
|
||||||
|
Trips.deltaLoc(location);
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -39,6 +53,7 @@ export default function App() {
|
||||||
expoGeoState = JSON.stringify(location);
|
expoGeoState = JSON.stringify(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!isLoadingComplete) {
|
if (!isLoadingComplete) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
|
@ -58,4 +73,5 @@ export default function App() {
|
||||||
</SafeAreaProvider>
|
</SafeAreaProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import { StyleSheet } from 'react-native';
|
||||||
|
import { Alert, Pressable } from 'react-native';
|
||||||
|
import { Text, View } from './components/Themed.tsx';
|
||||||
|
import * as TaskManager from 'expo-task-manager';
|
||||||
|
import * as Location from 'expo-location';
|
||||||
|
import { bgOps, Trips, setBgOps } from './GT2';
|
||||||
|
|
||||||
|
const BACKGROUND_LOCATION_TRACKER = 'BACKGROUND_LOCATION_TRACKER'
|
||||||
|
|
||||||
|
|
||||||
|
const getUpdates = async () => {
|
||||||
|
|
||||||
|
await Location.startLocationUpdatesAsync(BACKGROUND_LOCATION_TRACKER , {
|
||||||
|
accuracy: Location.Accuracy.Highest
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function PermissionsButton() {
|
||||||
|
|
||||||
|
const [fuBgOps, setfuBgOps] = useState(0);
|
||||||
|
|
||||||
|
const requestPermissions = async () => {
|
||||||
|
const { status } = await Location.requestBackgroundPermissionsAsync();
|
||||||
|
setBgOps((status === 'granted'));
|
||||||
|
setfuBgOps(fuBgOps => fuBgOps + 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!bgOps)
|
||||||
|
return(
|
||||||
|
<View style={styles.container} lightColor="lime" darkColor="forestgreen">
|
||||||
|
<Pressable style={styles.button}
|
||||||
|
onPressIn={requestPermissions }>
|
||||||
|
<Text style={styles.text}>{'Enable background operations'}</Text>
|
||||||
|
<Text style={styles.text2}>{' (Only used during a trip)'}</Text>
|
||||||
|
</Pressable>
|
||||||
|
</View>);
|
||||||
|
else
|
||||||
|
return(
|
||||||
|
<View style={styles.container} lightColor="lime" darkColor="forestgreen">
|
||||||
|
<Text style={styles.text}>{'Trips can run in background.'}</Text>
|
||||||
|
</View>);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskManager.defineTask(BACKGROUND_LOCATION_TRACKER , async ({ data, error }) => {
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
// Error occurred - check `error.message` for more details.
|
||||||
|
console.log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
const { location } = data;
|
||||||
|
Trips.deltaLoc( location );
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
marginVertical: 2,
|
||||||
|
marginTop: -20,
|
||||||
|
marginBottom: 15,
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
fontSize: 10,
|
||||||
|
backgroundColor: 'lime',
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: "blue",
|
||||||
|
},
|
||||||
|
text2: {
|
||||||
|
fontSize: 10,
|
||||||
|
color: "navy",
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,119 +0,0 @@
|
||||||
/** Class for handling coordinates original by Linus Helgesson */
|
|
||||||
export class Coordinate {
|
|
||||||
|
|
||||||
mLatitude:number = 0.0;
|
|
||||||
mLongitude:number = 0.0;
|
|
||||||
mResults:any = [0, 0];
|
|
||||||
PI_OVER_180:number = 0.017453292519943295769236907684886;
|
|
||||||
EARTH_RADIUS:number = 6371009;
|
|
||||||
|
|
||||||
constructor (longitude:number, latitude:number) {
|
|
||||||
this.mLongitude = longitude;
|
|
||||||
this.mLatitude = latitude;
|
|
||||||
}
|
|
||||||
getLongitude() { return this.mLongitude; }
|
|
||||||
setLongitude(longitude:number) { this.mLongitude = longitude; }
|
|
||||||
getLatitude() { return this.mLatitude; }
|
|
||||||
setLatitude(latitude:number) { this.mLatitude = latitude; }
|
|
||||||
/**
|
|
||||||
* Calculates a bounding box of a certain size arund a coordinate.This function takes a size in meters as
|
|
||||||
* a parameter and returns an array of two Coordinate objects. The first Coordinate is the upper left corner
|
|
||||||
* while the last coordinate is the bottom right corner.er than the second.
|
|
||||||
*/
|
|
||||||
getBoundingBox(side: number) {
|
|
||||||
var ret:any = [Coordinate, Coordinate];
|
|
||||||
|
|
||||||
var degLatM:number , degLatM:number, degLongM:number, deltaLat:number, deltaLong:number;
|
|
||||||
|
|
||||||
degLatM = 110574.235;
|
|
||||||
degLongM = 110572.833 * Math.cos(this.mLatitude * this.PI_OVER_180);
|
|
||||||
deltaLat = side / degLatM;
|
|
||||||
deltaLong = side / degLongM;
|
|
||||||
|
|
||||||
ret[0] = new Coordinate(this.getLongitude() - deltaLong, this.getLatitude() - deltaLat);
|
|
||||||
ret[1] = new Coordinate(this.getLongitude() + deltaLong, this.getLatitude() + deltaLat);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Calculates the distance between two Coordinate objects using the Spherical law of cosines found at:
|
|
||||||
*/
|
|
||||||
distanceTo(dest:Coordinate) {
|
|
||||||
this.computeDistanceAndBearing(this.mLatitude, this.mLongitude, dest.getLatitude(), dest.getLongitude(), this.mResults);
|
|
||||||
return this.mResults[0];
|
|
||||||
};
|
|
||||||
computeDistanceAndBearing(lat1:number, lon1:number, lat2:number, lon2:number, results:any) {
|
|
||||||
var MAXITERS = 20;
|
|
||||||
lat1 *= Math.PI / 180.0;
|
|
||||||
lat2 *= Math.PI / 180.0;
|
|
||||||
lon1 *= Math.PI / 180.0;
|
|
||||||
lon2 *= Math.PI / 180.0;
|
|
||||||
var a = 6378137.0;
|
|
||||||
var b = 6356752.3142;
|
|
||||||
var f = (a - b) / a;
|
|
||||||
var aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);
|
|
||||||
var L = lon2 - lon1;
|
|
||||||
var A = 0.0;
|
|
||||||
var U1 = Math.atan((1.0 - f) * Math.tan(lat1));
|
|
||||||
var U2 = Math.atan((1.0 - f) * Math.tan(lat2));
|
|
||||||
var cosU1 = Math.cos(U1);
|
|
||||||
var cosU2 = Math.cos(U2);
|
|
||||||
var sinU1 = Math.sin(U1);
|
|
||||||
var sinU2 = Math.sin(U2);
|
|
||||||
var cosU1cosU2 = cosU1 * cosU2;
|
|
||||||
var sinU1sinU2 = sinU1 * sinU2;
|
|
||||||
var sigma = 0.0;
|
|
||||||
var deltaSigma = 0.0;
|
|
||||||
var cosSqAlpha = 0.0;
|
|
||||||
var cos2SM = 0.0;
|
|
||||||
var cosSigma = 0.0;
|
|
||||||
var sinSigma = 0.0;
|
|
||||||
var cosLambda = 0.0;
|
|
||||||
var sinLambda = 0.0;
|
|
||||||
var lambda = L;
|
|
||||||
for (var iter = 0; iter < MAXITERS; iter++) {
|
|
||||||
{
|
|
||||||
var lambdaOrig = lambda;
|
|
||||||
cosLambda = Math.cos(lambda);
|
|
||||||
sinLambda = Math.sin(lambda);
|
|
||||||
var t1 = cosU2 * sinLambda;
|
|
||||||
var t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
|
|
||||||
var sinSqSigma = t1 * t1 + t2 * t2;
|
|
||||||
sinSigma = Math.sqrt(sinSqSigma);
|
|
||||||
cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda;
|
|
||||||
sigma = Math.atan2(sinSigma, cosSigma);
|
|
||||||
var sinAlpha = (sinSigma === 0) ? 0.0 : cosU1cosU2 * sinLambda / sinSigma;
|
|
||||||
cosSqAlpha = 1.0 - sinAlpha * sinAlpha;
|
|
||||||
cos2SM = (cosSqAlpha === 0) ? 0.0 : cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha;
|
|
||||||
var uSquared = cosSqAlpha * aSqMinusBSqOverBSq;
|
|
||||||
A = 1 + (uSquared / 16384.0) * (4096.0 + uSquared * (-768 + uSquared * (320.0 - 175.0 * uSquared)));
|
|
||||||
var B = (uSquared / 1024.0) * (256.0 + uSquared * (-128.0 + uSquared * (74.0 - 47.0 * uSquared)));
|
|
||||||
var C = (f / 16.0) * cosSqAlpha * (4.0 + f * (4.0 - 3.0 * cosSqAlpha));
|
|
||||||
var cos2SMSq = cos2SM * cos2SM;
|
|
||||||
deltaSigma = B * sinSigma * (cos2SM + (B / 4.0) * (cosSigma * (-1.0 + 2.0 * cos2SMSq) - (B / 6.0) * cos2SM * (-3.0 + 4.0 * sinSigma * sinSigma) * (-3.0 + 4.0 * cos2SMSq)));
|
|
||||||
lambda = L + (1.0 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SM + C * cosSigma * (-1.0 + 2.0 * cos2SM * cos2SM)));
|
|
||||||
var delta = (lambda - lambdaOrig) / lambda;
|
|
||||||
if (Math.abs(delta) < 1.0E-12) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
var distance = (b * A * (sigma - deltaSigma));
|
|
||||||
results[0] = distance;
|
|
||||||
if (results.length > 1) {
|
|
||||||
var initialBearing = Math.atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
|
|
||||||
initialBearing *= 180.0 / Math.PI;
|
|
||||||
results[1] = initialBearing;
|
|
||||||
if (results.length > 2) {
|
|
||||||
var finalBearing = Math.atan2(cosU1 * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda);
|
|
||||||
finalBearing *= 180.0 / Math.PI;
|
|
||||||
results[2] = finalBearing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,63 +1,265 @@
|
||||||
import * as React from 'react';
|
import React, { useState, useEffect, Component } from 'react';
|
||||||
import { Coordinate } from "./Coordinate";
|
import * as Location from 'expo-location';
|
||||||
import { Text, View } from './components/Themed';
|
import { Text, View } from './components/Themed';
|
||||||
import { StyleSheet } from 'react-native';
|
import { StyleSheet } from 'react-native';
|
||||||
|
import * as geolib from 'geolib';
|
||||||
|
|
||||||
|
export const ver:string = "2.0.8"
|
||||||
|
var debug:number = 0;
|
||||||
|
var endIsNigh:boolean = false;
|
||||||
|
var testCount = 0;
|
||||||
|
export var bgOps:boolean = false;
|
||||||
|
var expoGeoState:any = null;
|
||||||
|
export var locEnabled:boolean = false;
|
||||||
|
|
||||||
|
const heartbeat:number = 500;
|
||||||
|
const displayBeat:number = 3;
|
||||||
|
const ticksPerDS = 10;
|
||||||
|
|
||||||
|
const geoLibAccuracy:number = 0.1;
|
||||||
|
const minExpoAccuracy:number = 5;
|
||||||
|
|
||||||
|
export function getEndIsLast() : boolean { return endIsNigh; }
|
||||||
|
export function setBgOps(value:boolean) { bgOps = value; }
|
||||||
|
export function setEndIsLast(value:boolean) { endIsNigh = value; }
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
tripText: {
|
tripText: {
|
||||||
marginHorizontal: -10,
|
marginHorizontal: -10,
|
||||||
marginVertical: 60,
|
marginVertical: 60,
|
||||||
textAlign: 'center',
|
textAlign: 'left',
|
||||||
width: "80%",
|
width: "80%",
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
}});
|
}});
|
||||||
|
|
||||||
class Chronometer {
|
interface expoGeoObj {
|
||||||
|
coords: [
|
||||||
|
altitude:number,
|
||||||
|
altitudeAccuracy:number,
|
||||||
|
latitude:number,
|
||||||
|
accuracy:number,
|
||||||
|
longitude:number,
|
||||||
|
heading:number,
|
||||||
|
speed:number,
|
||||||
|
timestamp:number
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
public display:string = "";
|
|
||||||
clock:number = 0;
|
|
||||||
intervalID:any = null;
|
|
||||||
|
|
||||||
tick() {let hours:number = 0, minutes:number = 0, seconds:number = 0;
|
class Coordinate {
|
||||||
this.clock++;
|
|
||||||
hours = this.clock < 3600 ? 0 : (this.clock / 3600);
|
public mLatitude:number = 0.0;
|
||||||
minutes = this.clock < 60 ? 0 : (this.clock - (hours * 3600)) / 60;
|
public mLongitude:number = 0.0;
|
||||||
seconds = this.clock % 60;
|
public glCoords:any = {};
|
||||||
this.display = hours + ":" + minutes + ":" + seconds;
|
|
||||||
|
constructor (latitude:number, longitude:number ) {
|
||||||
|
this.mLongitude = longitude;
|
||||||
|
this.mLatitude = latitude;
|
||||||
|
this.get_glcoords();
|
||||||
}
|
}
|
||||||
public start() { this.clock = 0;
|
|
||||||
this.intervalID = setInterval(this.tick, 1000);
|
public set(lat:number,lon:number) {
|
||||||
|
this.mLatitude = lat;
|
||||||
|
this.mLongitude = lon;
|
||||||
|
this.get_glcoords();
|
||||||
|
}
|
||||||
|
|
||||||
|
public get_glcoords() {
|
||||||
|
this.glCoords['lat'] = this.mLatitude;
|
||||||
|
this.glCoords['lon'] = this.mLongitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set_glcoords(lat:number,lon:number) {
|
||||||
|
this.glCoords['lat'] = lat;
|
||||||
|
this.glCoords['lon'] = lon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public roundTo(precision:number) {
|
||||||
|
var lat = this.mLatitude * Math.pow(10,precision);
|
||||||
|
var lon = this.mLongitude * Math.pow(10,precision);
|
||||||
|
lat = (Math.round(lat)) / Math.pow(10,precision);
|
||||||
|
lon = (Math.round(lon)) / Math.pow(10, precision);
|
||||||
|
this.set_glcoords(lat,lon);
|
||||||
|
}
|
||||||
|
|
||||||
|
public distanceTo(otherPoint:Coordinate) : number {
|
||||||
|
this.roundTo(Trips.sensitivity)
|
||||||
|
otherPoint.roundTo(Trips.sensitivity);
|
||||||
|
return geolib.getPreciseDistance(this.glCoords,otherPoint.glCoords,geoLibAccuracy);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function startTracking(client:any){
|
||||||
|
if (debug > 5) console.log('Starting tracking')
|
||||||
|
if(!client.location){
|
||||||
|
client.location = await Location.watchPositionAsync({
|
||||||
|
accuracy: Location.Accuracy.Highest,
|
||||||
|
distanceInterval: 3,
|
||||||
|
timeInterval: (heartbeat / 2),
|
||||||
|
}, (loc) => {
|
||||||
|
Trips.deltaLoc(loc)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stopTracking(client:any){
|
||||||
|
if (debug > 5) console.log('Remove tracking')
|
||||||
|
await client.location.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
class Trip {
|
||||||
|
|
||||||
|
public elapsed:string = "00.00.00";
|
||||||
|
ticks:number = 0;
|
||||||
|
interval:any;
|
||||||
|
minTripDone:boolean = false;
|
||||||
|
segments:number = 1;
|
||||||
|
ds:number = 0;
|
||||||
|
CO2:number = 0.0;
|
||||||
|
location:any = null;
|
||||||
|
lastDSFixTick = 0;
|
||||||
|
lastFix:Coordinate = new Coordinate(0.0,0.0);
|
||||||
|
loc:Coordinate = new Coordinate(0.0,0.0);
|
||||||
|
|
||||||
|
tick() {let hours:number = 0, minutes:number = 0, seconds:number = 0, totals:number = 0;
|
||||||
|
this.ticks++;
|
||||||
|
totals = this.ticks * ( heartbeat / 1000 ) ;
|
||||||
|
hours = totals < 3600 ? 0 : (totals / 3600);
|
||||||
|
minutes = totals < 60 ? 0 : (totals - (hours * 3600)) / 60;
|
||||||
|
seconds = totals % 60;
|
||||||
|
this.elapsed = hours.toFixed(0) + ":" + minutes.toFixed(0) + ":" + seconds.toFixed(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public start() { this.interval = setInterval(() => this.tick(), heartbeat);
|
||||||
|
if (!bgOps) startTracking(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public resume() { this.lastFix.mLatitude = 0.0;
|
||||||
|
this.segments++;
|
||||||
|
this.interval = setInterval(() => this.tick(), heartbeat); }
|
||||||
|
|
||||||
|
public stop() { Trips.distance += this.ds;
|
||||||
|
this.ds = 0.0;
|
||||||
|
clearInterval(this.interval);
|
||||||
|
if (!bgOps) stopTracking(this);
|
||||||
}
|
}
|
||||||
public resume() { this.intervalID = setInterval(this.tick, 1000); }
|
|
||||||
public stop() { clearInterval(this.intervalID); }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export class GT2 {
|
export class GT2 {
|
||||||
|
|
||||||
displayInterval:any = null;
|
trip:Trip = new Trip();
|
||||||
clock:Chronometer = new Chronometer();
|
endPoint:Coordinate = new Coordinate(0.0,0.0);
|
||||||
startPoint:Coordinate = new Coordinate(0,0);
|
startPoint:Coordinate = new Coordinate(0.0,0.0);
|
||||||
|
|
||||||
|
displayInterval:number = displayBeat * heartbeat;
|
||||||
|
arc:number = 0.0;
|
||||||
public distance:number = 0.0;
|
public distance:number = 0.0;
|
||||||
co2Rate:number = 0.0;
|
co2Rate:number = 250.0;
|
||||||
currTime:number = 0;
|
sensitivity:number = 3;
|
||||||
lastTime:number = 0;
|
z:number = 0.0;
|
||||||
loc:Coordinate = new Coordinate(0,0);
|
public v:number = 0.0;
|
||||||
public v:number = 0;
|
|
||||||
public inProgress:boolean = false;
|
public inProgress:boolean = false;
|
||||||
public paused:boolean = false;
|
public paused:boolean = false;
|
||||||
public elapsed:number = 0.0;
|
public elapsed:number = 0.0;
|
||||||
segments:number = 1;
|
elevation:number = 0.0;
|
||||||
|
public units:string = "km";
|
||||||
|
public CO2Effect:string = "carbon burden";
|
||||||
|
|
||||||
|
nTrips:number = 0;
|
||||||
|
|
||||||
|
n:number = 0.0;
|
||||||
|
m:number = 0.0;
|
||||||
|
|
||||||
|
public deltaLoc(lastFix:any) {
|
||||||
|
|
||||||
|
var t:number = 0.0;
|
||||||
|
var lat:number = 0.0;
|
||||||
|
var lon:number = 0.0;
|
||||||
|
lastFix = JSON.stringify(lastFix);
|
||||||
|
let expoFix:expoGeoObj = JSON.parse(lastFix);
|
||||||
|
|
||||||
|
if (debug > 10) {
|
||||||
|
|
||||||
|
console.log("lat " + expoFix.coords['latitude'] + " lon " + expoFix.coords['longitude']);
|
||||||
|
console.log("heading " + expoFix.coords['heading']);
|
||||||
|
console.log("accuracy " + expoFix.coords['accuracy']);
|
||||||
|
console.log("speed " + expoFix.coords['speed']);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lat = expoFix.coords['latitude']; lon = expoFix.coords['longitude'];
|
||||||
|
|
||||||
|
this.trip.loc.set(lat,lon);
|
||||||
|
|
||||||
|
if (Trips.startPoint.mLatitude == 0.0) Trips.startPoint.set(lat,lon);
|
||||||
|
|
||||||
|
if (this.trip.lastFix.mLatitude == 0.0)
|
||||||
|
this.trip.lastFix.set(lat,lon);
|
||||||
|
else
|
||||||
|
if ((this.trip.ticks % ticksPerDS) == 0) {
|
||||||
|
t = expoFix.coords['accuracy']; if (t < minExpoAccuracy ) return;
|
||||||
|
this.trip.ds += this.trip.lastFix.distanceTo(this.trip.loc);
|
||||||
|
if (this.trip.ds > 250 && !this.trip.minTripDone) {
|
||||||
|
this.trip.ds -= 250;
|
||||||
|
this.trip.minTripDone = true;
|
||||||
|
}
|
||||||
|
this.trip.lastFix.set(lat,lon);
|
||||||
|
if (debug > 10) console.log('delta ' + this.trip.ds);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public end() {
|
||||||
|
|
||||||
|
|
||||||
|
this.trip.stop();
|
||||||
|
this.inProgress = false;
|
||||||
|
this.arc = this.startPoint.distanceTo(this.trip.loc);
|
||||||
|
this.trip.CO2 = ( this.distance / 1000 ) * this.co2Rate;
|
||||||
|
this.nTrips++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public from(last:GT2) {
|
||||||
|
|
||||||
|
this.startPoint = last.startPoint;
|
||||||
|
this.trip.loc = last.trip.loc;
|
||||||
|
this.elapsed = last.elapsed;
|
||||||
|
this.trip.elapsed= last.trip.elapsed;
|
||||||
|
this.endPoint = last.endPoint;
|
||||||
|
this.CO2Effect = last.CO2Effect;
|
||||||
|
this.co2Rate = last.co2Rate;
|
||||||
|
this.units = last.units;
|
||||||
|
this.sensitivity = last.sensitivity;
|
||||||
|
this.arc = last.arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public setLocEnabled(value:boolean) { locEnabled = value}
|
||||||
|
|
||||||
|
public pause() {
|
||||||
|
|
||||||
|
if (!this.paused) {
|
||||||
|
this.trip.stop();
|
||||||
|
this.paused = true;
|
||||||
|
} else {
|
||||||
|
this.trip.resume();
|
||||||
|
this.paused = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public reset() {
|
public reset() {
|
||||||
|
|
||||||
this.startPoint = new Coordinate(0,0);
|
|
||||||
this.distance = 0.0;
|
this.distance = 0.0;
|
||||||
this.co2Rate = 0.0;
|
this.arc = 0.0;
|
||||||
this.currTime = 0;
|
this.endPoint = new Coordinate(0,0);
|
||||||
this.lastTime = 0;
|
this.startPoint = new Coordinate(0,0);
|
||||||
this.loc = new Coordinate(0,0);
|
|
||||||
this.v = 0;
|
this.v = 0;
|
||||||
this.inProgress = false;
|
this.inProgress = false;
|
||||||
this.paused = false;
|
this.paused = false;
|
||||||
|
@ -65,53 +267,131 @@ export class GT2 {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public end() {
|
|
||||||
|
|
||||||
this.clock.stop();
|
|
||||||
this.inProgress = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public pause() {
|
|
||||||
|
|
||||||
this.clock.stop();
|
|
||||||
this.paused = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public resume() {
|
|
||||||
|
|
||||||
this.clock.start();
|
|
||||||
this.paused = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public start() {
|
public start() {
|
||||||
|
|
||||||
this.clock.start();
|
this.reset();
|
||||||
|
this.trip = new Trip();
|
||||||
|
this.trip.start();
|
||||||
this.inProgress = true;
|
this.inProgress = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lt:number = 0.0;
|
||||||
|
|
||||||
public TripDisplay() {
|
public getTripSummary() : string {
|
||||||
|
|
||||||
|
var preferredUnits:number = ((this.units == 'km') ? (this.distance / 1000)
|
||||||
|
: (this.distance / 1609.34));
|
||||||
|
var preferredUnitsArc:number = ((this.units == 'km') ? (this.arc / 1000)
|
||||||
|
: (this.arc / 1609.34));
|
||||||
|
|
||||||
if (!thisTrip.inProgress)
|
|
||||||
return (
|
return (
|
||||||
<View>
|
'Elapsed - ' + this.trip.elapsed + '\n' +
|
||||||
<Text style={styles.tripText}>
|
'Origin: ' + 'lat: ' + this.startPoint.mLatitude.toFixed(8) +
|
||||||
{' No trip started yet.\n'}
|
' long: ' + this.startPoint.mLongitude.toFixed(8) + '\n' +
|
||||||
</Text>
|
'Destination: ' + 'lat: ' + this.trip.loc.mLatitude.toFixed(8) +
|
||||||
</View>);
|
' long: ' + this.trip.loc.mLongitude.toFixed(8) + '\n' +
|
||||||
else
|
'CO2: ' + this.trip.CO2.toFixed(1) + ' grams ' + this.CO2Effect + '\n\n' +
|
||||||
|
'CO2 Rate / Sensitivity: ' + this.co2Rate + " / " + this.sensitivity + '\n' +
|
||||||
|
'Arc distance from origin to destination: ' + preferredUnitsArc.toFixed(2) + this.units + '\n' +
|
||||||
|
'Path distance while consuming fuel: ' + preferredUnits.toFixed(2) + ' ' + this.units );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public getTripPanel() : string {
|
||||||
|
|
||||||
|
var bigDS:number = this.distance + this.trip.ds;
|
||||||
|
var seconds:number = this.trip.ticks;
|
||||||
|
|
||||||
|
if (this.inProgress) {
|
||||||
|
this.v = this.trip.ds / seconds;
|
||||||
return (
|
return (
|
||||||
<View>
|
'Elapsed - ' + this.trip.elapsed + '\n' +
|
||||||
<Text style={styles.tripText}>
|
'Geo: ' + 'lat: ' + this.trip.loc.mLatitude.toFixed(8) +
|
||||||
{'Elapsed - '}{this.clock.display}{'\n'}
|
' long: ' + this.trip.loc.mLongitude.toFixed(8) + '\n' +
|
||||||
{'Geo: '}{'lat: '}{this.loc.mLatitude}{' long: '}{this.loc.mLatitude}{'\n'}
|
'Vector: ' + 'distance: ' + bigDS.toFixed(2) + ' meters, velocity: ' + this.v.toFixed(1) + ' m/s \n' +
|
||||||
{'Vector: '}{'distance: '}{this.distance}{' velocity: '}{this.v}{'\n'}
|
'Altitude: ' + this.elevation + '\n');
|
||||||
</Text>
|
}
|
||||||
</View>);
|
else return("No trip in progress. " + this.nTrips + " trip(s) completed.");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export var thisTrip:GT2 = new GT2();
|
export class TripDisplay extends React.Component {
|
||||||
|
|
||||||
|
constructor(props:any) {
|
||||||
|
super(props);
|
||||||
|
this.state = { seconds: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
interval:any;
|
||||||
|
|
||||||
|
tick() {
|
||||||
|
this.setState(state => ({
|
||||||
|
seconds: 1
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.interval = setInterval(() => this.tick(), Trips.displayInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
clearInterval(this.interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
|
||||||
|
if (debug > 10)
|
||||||
|
return(
|
||||||
|
<View>
|
||||||
|
<Text style={styles.tripText}>
|
||||||
|
{Trips.getTripPanel() }
|
||||||
|
</Text>
|
||||||
|
</View> );
|
||||||
|
else
|
||||||
|
return(
|
||||||
|
<View>
|
||||||
|
<Text style={styles.tripText}>
|
||||||
|
{Trips.getTripPanel() }
|
||||||
|
</Text>
|
||||||
|
<Text>{expoGeoState}</Text>
|
||||||
|
</View> );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TripSummary extends React.Component {
|
||||||
|
|
||||||
|
handleRefresh = () => {
|
||||||
|
// by calling this method react re-renders the component
|
||||||
|
this.setState({});
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
|
||||||
|
if (endIsNigh) {
|
||||||
|
setEndIsLast(false);
|
||||||
|
return(
|
||||||
|
<View>
|
||||||
|
<Text style={styles.tripText}>
|
||||||
|
{LastTrip.getTripSummary() }
|
||||||
|
</Text>
|
||||||
|
</View> );
|
||||||
|
|
||||||
|
} else
|
||||||
|
return(
|
||||||
|
<View>
|
||||||
|
<Text style={styles.tripText}>
|
||||||
|
{Trips.getTripSummary() }
|
||||||
|
</Text>
|
||||||
|
</View> );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export var Trips:GT2 = new GT2();
|
||||||
|
export var LastTrip:GT2 = new GT2();
|
|
@ -1,9 +1,10 @@
|
||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "Green Travel Carbon Calculator",
|
"name": "GT2 Green Travel Carbon App",
|
||||||
"slug": "Ejectable",
|
"slug": "GT2standalone",
|
||||||
"version": "2.0.0",
|
"version": "2.0.8",
|
||||||
"orientation": "portrait",
|
"orientation": "default",
|
||||||
|
"description": "Travel Carbon Footprint (simplified version)",
|
||||||
"icon": "./assets/images/icon.png",
|
"icon": "./assets/images/icon.png",
|
||||||
"scheme": "myapp",
|
"scheme": "myapp",
|
||||||
"userInterfaceStyle": "automatic",
|
"userInterfaceStyle": "automatic",
|
||||||
|
@ -19,9 +20,24 @@
|
||||||
"**/*"
|
"**/*"
|
||||||
],
|
],
|
||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true
|
"supportsTablet": true,
|
||||||
|
"bundleIdentifier": "app.greentravel.gt2",
|
||||||
|
"buildNumber": "4",
|
||||||
|
"infoPlist": {
|
||||||
|
"UIBackgroundModes": [
|
||||||
|
"location",
|
||||||
|
"fetch"
|
||||||
|
]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
|
"package": "app.greentravel.gt2",
|
||||||
|
"permissions": [
|
||||||
|
"ACCESS_COARSE_LOCATION",
|
||||||
|
"ACCESS_FINE_LOCATION",
|
||||||
|
"FOREGROUND_SERVICE",
|
||||||
|
"ACCESS_BACKGROUND_LOCATION"
|
||||||
|
],
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
"foregroundImage": "./assets/images/adaptive-icon.png",
|
"foregroundImage": "./assets/images/adaptive-icon.png",
|
||||||
"backgroundColor": "#ffffff"
|
"backgroundColor": "#ffffff"
|
||||||
|
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 43 KiB |
|
@ -0,0 +1,65 @@
|
||||||
|
import * as WebBrowser from 'expo-web-browser';
|
||||||
|
import React, { useState} from 'react';
|
||||||
|
import { Button, StyleSheet, TouchableOpacity } from 'react-native';
|
||||||
|
|
||||||
|
import Colors from '../constants/Colors';
|
||||||
|
import { MonoText } from './StyledText';
|
||||||
|
import { Text, View } from './Themed';
|
||||||
|
import { TripSummary } from '../GT2';
|
||||||
|
|
||||||
|
export default function EndScreenInfo({ path }: { path: string }) {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
<View style={styles.summaryContainer}>
|
||||||
|
<Text
|
||||||
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
|
Summary of this trip:
|
||||||
|
</Text>
|
||||||
|
<TripSummary/>
|
||||||
|
<Text
|
||||||
|
style = {styles.helpLinkText}
|
||||||
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
|
{'Min trip for carbon accounting\n is 250 meters.'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.helpContainer}>
|
||||||
|
<TouchableOpacity onPress={handleHelpPress} style={styles.helpLink}>
|
||||||
|
<Text style={styles.helpLinkText} lightColor={Colors.light.tint}>
|
||||||
|
World Bank on Greenhouse Gas Accounting
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleHelpPress() {
|
||||||
|
WebBrowser.openBrowserAsync(
|
||||||
|
'https://olc.worldbank.org/content/ghg-accounting-101-self-paced'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
summaryContainer: {
|
||||||
|
marginVertical: -9,
|
||||||
|
alignItems: 'center',
|
||||||
|
marginHorizontal: 50,
|
||||||
|
},
|
||||||
|
helpContainer: {
|
||||||
|
marginTop: 10,
|
||||||
|
marginHorizontal: 20,
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
helpLink: {
|
||||||
|
paddingVertical: 15,
|
||||||
|
},
|
||||||
|
helpLinkText: {
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
});
|
|
@ -1,31 +1,54 @@
|
||||||
import * as WebBrowser from 'expo-web-browser';
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { StyleSheet, TouchableOpacity } from 'react-native';
|
import { StyleSheet, TouchableOpacity } from 'react-native';
|
||||||
|
|
||||||
import Colors from '../constants/Colors';
|
|
||||||
import { MonoText } from './StyledText';
|
|
||||||
import { Text, View } from './Themed';
|
import { Text, View } from './Themed';
|
||||||
|
import * as Device from 'expo-device';
|
||||||
|
import { ver } from '../GT2';
|
||||||
|
|
||||||
export default function ScreenInfo() {
|
export default function ScreenInfo() {
|
||||||
return (
|
return (
|
||||||
<View style={styles.settingsContainer}>
|
<View style={styles.settingsContainer}>
|
||||||
<Text
|
<Text
|
||||||
style={styles.settingsText}
|
style={styles.switchText}
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
Switch dark km/ light mi, select fuel used, or manually set CO2 per distance
|
{'Switch dark: km, light: mi'}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
export function ScreenInfo2() {
|
export function ScreenInfo2() {
|
||||||
return (
|
return (
|
||||||
<View style={styles.settingsContainer}>
|
<View>
|
||||||
<Text
|
<Text
|
||||||
style={styles.settingsText}
|
style={styles.tripControlText}
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
Use Pause if fuel burning portion of trip interrupted
|
{'Pause trip if fuel burning interrupted.\n'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export function ScreenInfo4() {
|
||||||
|
return (
|
||||||
|
<View style={styles.settingsContainer}>
|
||||||
|
<Text
|
||||||
|
style={styles.sensitive}
|
||||||
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
|
{'set CO2 rate above or \nselect fuel type below\nhigher sensitivity may cause\n spurious motion at rest'}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ScreenInfo5() {
|
||||||
|
return (
|
||||||
|
<View style={styles.settingsContainer}>
|
||||||
|
<Text
|
||||||
|
style={styles.sensitive}
|
||||||
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
|
{'set CO2 rate or use fuel type buttons below'}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
@ -33,35 +56,75 @@ export function ScreenInfo2() {
|
||||||
|
|
||||||
export function ScreenInfo3() {
|
export function ScreenInfo3() {
|
||||||
return (
|
return (
|
||||||
<View style={styles.settingsContainer}>
|
<View style={styles.splashContainer}>
|
||||||
<Text
|
<Text
|
||||||
style={styles.settingsText}
|
style={styles.titleText}
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
Green Travel Carbon Calculator v. 2
|
{'Green Travel Calculator v. ' + ver }
|
||||||
</Text>
|
</Text>
|
||||||
<Text
|
<Text
|
||||||
style={styles.versionText}
|
style={styles.versionText}
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
expo version
|
expo {Device.osName == 'iOS' ? 'iOS ' : 'android '} version
|
||||||
|
</Text>
|
||||||
|
<Text
|
||||||
|
style={styles.cautionText}
|
||||||
|
lightColor="rgba(0,0,0,0.8)"
|
||||||
|
darkColor="rgba(255,255,255,0.8)">
|
||||||
|
{'\nNote: accuracy depends on sensitivity setting, your device, and carrier.'}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
|
splashContainer: {
|
||||||
|
marginHorizontal: 50,
|
||||||
|
marginVertical: 20,
|
||||||
|
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||||
|
},
|
||||||
settingsContainer: {
|
settingsContainer: {
|
||||||
marginHorizontal: 50,
|
marginHorizontal: 50,
|
||||||
marginVertical: 20,
|
marginVertical: 20,
|
||||||
},
|
},
|
||||||
|
sensitive: {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
fontSize: 14,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
titleText: {
|
||||||
|
color: 'white',
|
||||||
|
fontSize: 17,
|
||||||
|
lineHeight: 24,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
switchText: {
|
||||||
|
fontSize: 10,
|
||||||
|
lineHeight: 24,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
settingsText: {
|
settingsText: {
|
||||||
fontSize: 17,
|
fontSize: 17,
|
||||||
lineHeight: 24,
|
lineHeight: 24,
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
|
tripControlText: {
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
lineHeight: 24,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
versionText: {
|
versionText: {
|
||||||
fontSize: 8,
|
color: 'yellow',
|
||||||
|
fontSize: 10,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
cautionText: {
|
||||||
|
top: 90,
|
||||||
|
color: 'white',
|
||||||
|
fontSize: 14,
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { FontAwesome } from '@expo/vector-icons';
|
||||||
import * as Font from 'expo-font';
|
import * as Font from 'expo-font';
|
||||||
import * as SplashScreen from 'expo-splash-screen';
|
import * as HomeScreen from 'expo-splash-screen';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
export default function useCachedResources() {
|
export default function useCachedResources() {
|
||||||
|
@ -10,11 +10,11 @@ export default function useCachedResources() {
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
async function loadResourcesAndDataAsync() {
|
async function loadResourcesAndDataAsync() {
|
||||||
try {
|
try {
|
||||||
SplashScreen.preventAutoHideAsync();
|
HomeScreen.preventAutoHideAsync();
|
||||||
|
|
||||||
// Load fonts
|
// Load fonts
|
||||||
await Font.loadAsync({
|
await Font.loadAsync({
|
||||||
...Ionicons.font,
|
...FontAwesome.font,
|
||||||
'space-mono': require('../assets/fonts/SpaceMono-Regular.ttf'),
|
'space-mono': require('../assets/fonts/SpaceMono-Regular.ttf'),
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -22,7 +22,7 @@ export default function useCachedResources() {
|
||||||
console.warn(e);
|
console.warn(e);
|
||||||
} finally {
|
} finally {
|
||||||
setLoadingComplete(true);
|
setLoadingComplete(true);
|
||||||
SplashScreen.hideAsync();
|
HomeScreen.hideAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
/**
|
|
||||||
* Learn more about createBottomTabNavigator:
|
|
||||||
* https://reactnavigation.org/docs/bottom-tab-navigator
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
|
||||||
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
|
||||||
import { createStackNavigator } from '@react-navigation/stack';
|
|
||||||
import * as React from 'react';
|
|
||||||
import Colors from '../constants/Colors';
|
|
||||||
import useColorScheme from '../hooks/useColorScheme';
|
|
||||||
import SplashScreen from '../screens/SplashScreen';
|
|
||||||
import SettingsScreen from '../screens/SettingsScreen';
|
|
||||||
import TripScreen from '../screens/TripScreen';
|
|
||||||
import { SplashParamList, BottomTabParamList, TripParamList, SettingsParamList } from '../types';
|
|
||||||
|
|
||||||
export const BottomTab = createBottomTabNavigator<BottomTabParamList>();
|
|
||||||
|
|
||||||
export default function BottomTabNavigator() {
|
|
||||||
const colorScheme = useColorScheme();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<BottomTab.Navigator
|
|
||||||
initialRouteName="Splash"
|
|
||||||
tabBarOptions={{ activeTintColor: Colors[colorScheme].tint }}>
|
|
||||||
<BottomTab.Screen
|
|
||||||
name="Splash"
|
|
||||||
component={SplashNavigator}
|
|
||||||
options={{
|
|
||||||
tabBarIcon: ({ color }) => <TabBarIcon name="ios-code" color={color} />,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<BottomTab.Screen
|
|
||||||
name="Settings"
|
|
||||||
component={SettingsNavigator}
|
|
||||||
options={{
|
|
||||||
tabBarIcon: ({ color }) => <TabBarIcon name="ios-code" color={color} />,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<BottomTab.Screen
|
|
||||||
name="Trip"
|
|
||||||
component={TripNavigator}
|
|
||||||
options={{
|
|
||||||
tabBarIcon: ({ color }) => <TabBarIcon name="ios-code" color={color} />,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</BottomTab.Navigator>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// You can explore the built-in icon families and icons on the web at:
|
|
||||||
// https://icons.expo.fyi/
|
|
||||||
function TabBarIcon(props: { name: React.ComponentProps<typeof Ionicons>['name']; color: string }) {
|
|
||||||
return <Ionicons size={30} style={{ marginBottom: -3 }} {...props} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each tab has its own navigation stack, you can read more about this pattern here:
|
|
||||||
// https://reactnavigation.org/docs/tab-based-navigation#a-stack-navigator-for-each-tab
|
|
||||||
const SplashStack = createStackNavigator<SplashParamList>();
|
|
||||||
|
|
||||||
function SplashNavigator() {
|
|
||||||
return (
|
|
||||||
<SplashStack.Navigator>
|
|
||||||
<SplashStack.Screen
|
|
||||||
name="SplashScreen"
|
|
||||||
component={SplashScreen}
|
|
||||||
options={{ headerTitle: 'Green Travel' }}
|
|
||||||
/>
|
|
||||||
</SplashStack.Navigator>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export const TripStack = createStackNavigator<TripParamList>();
|
|
||||||
|
|
||||||
function TripNavigator() {
|
|
||||||
return (
|
|
||||||
<TripStack.Navigator>
|
|
||||||
<TripStack.Screen
|
|
||||||
name="TripScreen"
|
|
||||||
component={TripScreen}
|
|
||||||
options={{ headerTitle: 'Trip' }}
|
|
||||||
/>
|
|
||||||
</TripStack.Navigator>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const SettingsStack = createStackNavigator<SettingsParamList>();
|
|
||||||
|
|
||||||
function SettingsNavigator() {
|
|
||||||
return (
|
|
||||||
<SettingsStack.Navigator>
|
|
||||||
<SettingsStack.Screen
|
|
||||||
name="SettingsScreen"
|
|
||||||
component={SettingsScreen}
|
|
||||||
options={{ headerTitle: 'Settings' }}
|
|
||||||
/>
|
|
||||||
</SettingsStack.Navigator>
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -4,17 +4,20 @@
|
||||||
* https://reactnavigation.org/docs/configuring-links
|
* https://reactnavigation.org/docs/configuring-links
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { LinkingOptions } from '@react-navigation/native';
|
||||||
import * as Linking from 'expo-linking';
|
import * as Linking from 'expo-linking';
|
||||||
|
|
||||||
export default {
|
import { RootStackParamList } from '../types';
|
||||||
|
|
||||||
|
const linking: LinkingOptions<RootStackParamList> = {
|
||||||
prefixes: [Linking.makeUrl('/')],
|
prefixes: [Linking.makeUrl('/')],
|
||||||
config: {
|
config: {
|
||||||
screens: {
|
screens: {
|
||||||
Root: {
|
Root: {
|
||||||
screens: {
|
screens: {
|
||||||
Splash: {
|
Home: {
|
||||||
screens: {
|
screens: {
|
||||||
SplashScreen: 'home',
|
HomeScreen: 'home',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Trip: {
|
Trip: {
|
||||||
|
@ -29,7 +32,10 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Modal: 'modal',
|
||||||
NotFound: '*',
|
NotFound: '*',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default linking;
|
||||||
|
|
|
@ -1,16 +1,23 @@
|
||||||
/**
|
/**
|
||||||
* If you are not familiar with React Navigation, check out the "Fundamentals" guide:
|
* If you are not familiar with React Navigation, refer to the "Fundamentals" guide:
|
||||||
* https://reactnavigation.org/docs/getting-started
|
* https://reactnavigation.org/docs/getting-started
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
import { FontAwesome } from '@expo/vector-icons';
|
||||||
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||||
import { NavigationContainer, DefaultTheme, DarkTheme } from '@react-navigation/native';
|
import { NavigationContainer, DefaultTheme, DarkTheme } from '@react-navigation/native';
|
||||||
import { createStackNavigator } from '@react-navigation/stack';
|
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { ColorSchemeName } from 'react-native';
|
import { ColorSchemeName, Pressable } from 'react-native';
|
||||||
|
|
||||||
|
import Colors from '../constants/Colors';
|
||||||
|
import useColorScheme from '../hooks/useColorScheme';
|
||||||
|
import ModalScreen from '../screens/ModalScreen';
|
||||||
import NotFoundScreen from '../screens/NotFoundScreen';
|
import NotFoundScreen from '../screens/NotFoundScreen';
|
||||||
import { RootStackParamList } from '../types';
|
import TripScreen from '../screens/TripScreen';
|
||||||
import BottomTabNavigator from './BottomTabNavigator';
|
import HomeScreen from '../screens/HomeScreen';
|
||||||
|
import SettingsScreen from '../screens/SettingsScreen';
|
||||||
|
import { RootStackParamList, RootTabParamList, RootTabScreenProps } from '../types';
|
||||||
import LinkingConfiguration from './LinkingConfiguration';
|
import LinkingConfiguration from './LinkingConfiguration';
|
||||||
|
|
||||||
export default function Navigation({ colorScheme }: { colorScheme: ColorSchemeName }) {
|
export default function Navigation({ colorScheme }: { colorScheme: ColorSchemeName }) {
|
||||||
|
@ -23,15 +30,87 @@ export default function Navigation({ colorScheme }: { colorScheme: ColorSchemeNa
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// A root stack navigator is often used for displaying modals on top of all other content
|
/**
|
||||||
// Read more here: https://reactnavigation.org/docs/modal
|
* A root stack navigator is often used for displaying modals on top of all other content.
|
||||||
const Stack = createStackNavigator<RootStackParamList>();
|
* https://reactnavigation.org/docs/modal
|
||||||
|
*/
|
||||||
|
const Stack = createNativeStackNavigator<RootStackParamList>();
|
||||||
|
|
||||||
function RootNavigator() {
|
function RootNavigator() {
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator screenOptions={{ headerShown: false }}>
|
<Stack.Navigator>
|
||||||
<Stack.Screen name="Root" component={BottomTabNavigator} />
|
<Stack.Screen name="Root" component={BottomTabNavigator} options={{ headerShown: false }} />
|
||||||
<Stack.Screen name="NotFound" component={NotFoundScreen} options={{ title: 'Oops!' }} />
|
<Stack.Screen name="NotFound" component={NotFoundScreen} options={{ title: 'Oops!' }} />
|
||||||
|
<Stack.Group screenOptions={{ presentation: 'modal' }}>
|
||||||
|
<Stack.Screen name='Modal' component={ModalScreen} />
|
||||||
|
</Stack.Group>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A bottom tab navigator displays tab buttons on the bottom of the display to switch screens.
|
||||||
|
* https://reactnavigation.org/docs/bottom-tab-navigator
|
||||||
|
*/
|
||||||
|
export const BottomTab = createBottomTabNavigator<RootTabParamList>();
|
||||||
|
|
||||||
|
function BottomTabNavigator() {
|
||||||
|
const colorScheme = useColorScheme();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BottomTab.Navigator
|
||||||
|
initialRouteName="Home"
|
||||||
|
screenOptions={{
|
||||||
|
tabBarActiveTintColor: Colors[colorScheme].tint,
|
||||||
|
}}>
|
||||||
|
<BottomTab.Screen
|
||||||
|
name="Home"
|
||||||
|
component={HomeScreen}
|
||||||
|
options={({ navigation }: RootTabScreenProps<'Home'>) => ({
|
||||||
|
title: 'Home',
|
||||||
|
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
|
||||||
|
headerRight: () => (
|
||||||
|
<Pressable
|
||||||
|
onPress={() => navigation.navigate('Modal')}
|
||||||
|
style={({ pressed }) => ({
|
||||||
|
opacity: pressed ? 0.5 : 1,
|
||||||
|
})}>
|
||||||
|
<FontAwesome
|
||||||
|
name="info-circle"
|
||||||
|
size={25}
|
||||||
|
color={Colors[colorScheme].text}
|
||||||
|
style={{ marginRight: 15 }}
|
||||||
|
/>
|
||||||
|
</Pressable>
|
||||||
|
),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<BottomTab.Screen
|
||||||
|
name="Settings"
|
||||||
|
component={SettingsScreen}
|
||||||
|
options={{
|
||||||
|
title: 'Settings',
|
||||||
|
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<BottomTab.Screen
|
||||||
|
name="Trip"
|
||||||
|
component={TripScreen}
|
||||||
|
options={{
|
||||||
|
title: 'Trip',
|
||||||
|
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</BottomTab.Navigator>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You can explore the built-in icon families and icons on the web at https://icons.expo.fyi/
|
||||||
|
*/
|
||||||
|
function TabBarIcon(props: {
|
||||||
|
name: React.ComponentProps<typeof FontAwesome>['name'];
|
||||||
|
color: string;
|
||||||
|
}) {
|
||||||
|
return <FontAwesome size={30} style={{ marginBottom: -3 }} {...props} />;
|
||||||
|
}
|
||||||
|
|
|
@ -12,35 +12,40 @@
|
||||||
"preset": "jest-expo"
|
"preset": "jest-expo"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/vector-icons": "^12.0.0",
|
"@expo/vector-icons": "^13.0.0",
|
||||||
"@react-native-community/masked-view": "0.1.10",
|
"@expo/webpack-config": "^0.17.0",
|
||||||
"@react-navigation/bottom-tabs": "5.11.2",
|
"@react-navigation/bottom-tabs": "^6.0.5",
|
||||||
"@react-navigation/native": "~5.8.10",
|
"@react-navigation/native": "^6.0.2",
|
||||||
"@react-navigation/stack": "~5.12.8",
|
"@react-navigation/native-stack": "^6.1.0",
|
||||||
"expo": "~42.0.1",
|
"@react-navigation/stack": "^6.0.7",
|
||||||
"expo-asset": "~8.3.2",
|
"expo": "~46.0.0",
|
||||||
"expo-constants": "~11.0.1",
|
"expo-asset": "~8.6.1",
|
||||||
"expo-font": "~9.2.1",
|
"expo-constants": "~13.2.3",
|
||||||
"expo-linking": "~2.3.1",
|
"expo-device": "~4.3.0",
|
||||||
"expo-location": "~12.1.2",
|
"expo-font": "~10.2.0",
|
||||||
"expo-splash-screen": "~0.11.2",
|
"expo-linking": "~3.2.2",
|
||||||
"expo-status-bar": "~1.0.4",
|
"expo-location": "~14.3.0",
|
||||||
"expo-web-browser": "~9.2.0",
|
"expo-modules-core": "^0.11.4",
|
||||||
"react": "16.13.1",
|
"expo-splash-screen": "~0.16.1",
|
||||||
"react-dom": "16.13.1",
|
"expo-status-bar": "~1.4.0",
|
||||||
"react-native": "https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz",
|
"expo-task-manager": "~10.3.0",
|
||||||
"react-native-gesture-handler": "~1.10.2",
|
"expo-web-browser": "~11.0.0",
|
||||||
"react-native-reanimated": "~2.2.0",
|
"geolib": "^3.3.1",
|
||||||
"react-native-safe-area-context": "3.2.0",
|
"react": "18.0",
|
||||||
"react-native-screens": "~3.4.0",
|
"react-dom": "18.0",
|
||||||
"react-native-web": "~0.13.12"
|
"react-native": "0.69.4",
|
||||||
|
"react-native-gesture-handler": "~2.5.0",
|
||||||
|
"react-native-reanimated": "~2.9.1",
|
||||||
|
"react-native-safe-area-context": "4.3.1",
|
||||||
|
"react-native-screens": "~3.15.0",
|
||||||
|
"react-native-web": "^0.18.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.9.0",
|
"@babel/core": "^7.9.0",
|
||||||
"@types/react": "~16.9.35",
|
"@types/react": "~18.0",
|
||||||
"@types/react-native": "~0.63.2",
|
"@types/react-native": "~0.69.4",
|
||||||
"jest-expo": "~41.0.0-beta.0",
|
"jest-expo": "~41.0.0-beta.0",
|
||||||
"typescript": "~4.0.0"
|
"typescript": "~4.7.0"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
import * as React from 'react';
|
||||||
|
import { StyleSheet, ImageBackground } from 'react-native';
|
||||||
|
import { Text, View } from '../components/Themed';
|
||||||
|
import { ScreenInfo3 } from '../components/ScreenInfo';
|
||||||
|
import { RootTabScreenProps } from '../types';
|
||||||
|
|
||||||
|
const image = { uri: "https://meansofproduction.biz/images/GREENT.jpg" };
|
||||||
|
|
||||||
|
export var nav:any = null;
|
||||||
|
|
||||||
|
export default function HomeScreen( { navigation }: RootTabScreenProps<'Home'>) {
|
||||||
|
nav = navigation;
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<ImageBackground source={image} resizeMode="cover" style={styles.image}>
|
||||||
|
<Text style={styles.title}>GT2</Text>
|
||||||
|
<View style={styles.separator} />
|
||||||
|
<ScreenInfo3 />
|
||||||
|
</ImageBackground>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
image: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: "center"
|
||||||
|
},
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
color: 'white',
|
||||||
|
fontSize: 40,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
separator: {
|
||||||
|
marginVertical: 10,
|
||||||
|
height: 1,
|
||||||
|
width: '80%',
|
||||||
|
},
|
||||||
|
});
|
|
@ -0,0 +1,43 @@
|
||||||
|
import { StatusBar } from 'expo-status-bar';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Button, Platform, StyleSheet } from 'react-native';
|
||||||
|
|
||||||
|
import EndScreenInfo from '../components/EndScreenInfo';
|
||||||
|
import { Text, View } from '../components/Themed';
|
||||||
|
import { RootTabScreenProps } from '../types';
|
||||||
|
|
||||||
|
var advised:boolean = false;
|
||||||
|
export function getAdvised() : boolean { return advised; }
|
||||||
|
export function setAdvised() : void { advised = true; }
|
||||||
|
|
||||||
|
export default function ModalScreen({ navigation }: RootTabScreenProps<'Settings'>) {
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text style={styles.title}>Carbon Impact</Text>
|
||||||
|
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
||||||
|
<EndScreenInfo path="/screens/ModalScreen.tsx" />
|
||||||
|
<Button title={'Dismiss'}
|
||||||
|
onPress={() => { navigation.goBack(); }}
|
||||||
|
/>
|
||||||
|
{/* Use a light status bar on iOS to account for the black space above the modal */}
|
||||||
|
<StatusBar style={Platform.OS === 'ios' ? 'light' : 'auto'} />
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
separator: {
|
||||||
|
marginVertical: 5,
|
||||||
|
height: 1,
|
||||||
|
width: '80%',
|
||||||
|
},
|
||||||
|
});
|
|
@ -1,12 +1,9 @@
|
||||||
import { StackScreenProps } from '@react-navigation/stack';
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
||||||
|
|
||||||
import { RootStackParamList } from '../types';
|
import { RootStackScreenProps } from '../types';
|
||||||
|
|
||||||
export default function NotFoundScreen({
|
export default function NotFoundScreen({ navigation }: RootStackScreenProps<'NotFound'>) {
|
||||||
navigation,
|
|
||||||
}: StackScreenProps<RootStackParamList, 'NotFound'>) {
|
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<Text style={styles.title}>This screen doesn't exist.</Text>
|
<Text style={styles.title}>This screen doesn't exist.</Text>
|
||||||
|
|
|
@ -2,18 +2,75 @@ import * as React from 'react';
|
||||||
import { Alert, Button, StyleSheet, Switch, TextInput } from 'react-native';
|
import { Alert, Button, StyleSheet, Switch, TextInput } from 'react-native';
|
||||||
import { Text, View } from '../components/Themed';
|
import { Text, View } from '../components/Themed';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import ScreenInfo from '../components/ScreenInfo';
|
import ScreenInfo, { ScreenInfo4, ScreenInfo5 } from '../components/ScreenInfo';
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context';
|
import { Trips } from '../GT2';
|
||||||
|
import { RootTabScreenProps } from '../types';
|
||||||
|
|
||||||
export default function SettingsScreen() {
|
|
||||||
const [number, onChangeNumber] = React.useState("");
|
export default function SettingsScreen( { navigation }: RootTabScreenProps<'Settings'>) {
|
||||||
|
const [rate, setRate] = useState("255");
|
||||||
|
const [sens, setSens] = useState("3");
|
||||||
const [isKM, setMiles] = useState(false);
|
const [isKM, setMiles] = useState(false);
|
||||||
const toggleUnits = () => setMiles(previousState => !previousState);
|
const toggleUnits = () => { setMiles(previousState => !previousState)
|
||||||
|
Trips.units = isKM ? "km" : "mi";
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<Text style={styles.title}>Model Settings</Text>
|
<Text style={styles.title}>Model Settings</Text>
|
||||||
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
||||||
|
<View style={styles.captions}>
|
||||||
|
<Text style={styles.caption}>CO2 / km</Text>
|
||||||
|
<Text>{' '}</Text>
|
||||||
|
<Text style={styles.caption}>sensitivity</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.inputs}>
|
||||||
|
<TextInput
|
||||||
|
style={styles.input}
|
||||||
|
returnKeyType={'done'}
|
||||||
|
onChangeText={rate => { setRate(rate); Trips.co2Rate = Number(rate);} }
|
||||||
|
value={rate}
|
||||||
|
placeholder={Trips.co2Rate.toString()}
|
||||||
|
keyboardType="numeric"
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
style={styles.input}
|
||||||
|
returnKeyType={'done'}
|
||||||
|
onChangeText={sens => { setSens(sens);
|
||||||
|
var s = Number(sens);
|
||||||
|
if (s < 3 || s > 7) Alert.alert("Sensitivity must be greater than 2 and less than 8");
|
||||||
|
else Trips.sensitivity = Number(sens); }}
|
||||||
|
value={sens}
|
||||||
|
placeholder={Trips.sensitivity.toString()}
|
||||||
|
keyboardType="numeric"
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
<ScreenInfo4/>
|
||||||
|
<View style={styles.controls} >
|
||||||
|
<Button
|
||||||
|
title="Jet"
|
||||||
|
onPress={() => {
|
||||||
|
Trips.co2Rate = 285.0;
|
||||||
|
Trips.CO2Effect = "carbon burden";
|
||||||
|
Alert.alert('Jet Fuel Selected \n 285 g / passenger / km')}
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Gasoline"
|
||||||
|
onPress={() => {
|
||||||
|
Trips.co2Rate = 255.0;
|
||||||
|
Trips.CO2Effect = "carbon burden";
|
||||||
|
Alert.alert('Gasoline Selected \n 255 g for driver \n only passenger / km')}
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Food"
|
||||||
|
onPress={() => {
|
||||||
|
Trips.co2Rate = -255.0;
|
||||||
|
Trips.CO2Effect = "carbon relief";
|
||||||
|
Alert.alert('Savings vs Gasoline Selected')}
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
<ScreenInfo />
|
<ScreenInfo />
|
||||||
<Switch
|
<Switch
|
||||||
style={styles.switch}
|
style={styles.switch}
|
||||||
|
@ -23,36 +80,18 @@ export default function SettingsScreen() {
|
||||||
onValueChange={toggleUnits}
|
onValueChange={toggleUnits}
|
||||||
value={isKM}
|
value={isKM}
|
||||||
/>
|
/>
|
||||||
<View style={styles.controls} >
|
|
||||||
<Button
|
|
||||||
title="Jet"
|
|
||||||
onPress={() => Alert.alert('Jet Fuel Selected \n 285 g / passenger / km')}
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
title="Gasoline"
|
|
||||||
onPress={() => Alert.alert('Gasoline Selected \n 255 g for driver \n only passenger / km')}
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
title="Food"
|
|
||||||
onPress={() => Alert.alert('Savings vs Gasoline Selected')}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
<TextInput
|
|
||||||
style={styles.input}
|
|
||||||
returnKeyType={'done'}
|
|
||||||
onChangeText={onChangeNumber}
|
|
||||||
value={number}
|
|
||||||
placeholder="0.67"
|
|
||||||
keyboardType="numeric"
|
|
||||||
/>
|
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
|
caption: {
|
||||||
|
fontSize: 10,
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
switch: {
|
switch: {
|
||||||
marginVertical: 20,
|
marginVertical: 2,
|
||||||
},
|
},
|
||||||
container: {
|
container: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
|
@ -60,21 +99,39 @@ const styles = StyleSheet.create({
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
},
|
},
|
||||||
controls: {
|
controls: {
|
||||||
marginVertical: 20,
|
marginVertical: 5,
|
||||||
width: "80%",
|
width: "80%",
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
justifyContent: "space-between",
|
justifyContent: "space-between",
|
||||||
},
|
},
|
||||||
|
captions: {
|
||||||
|
marginVertical: 15,
|
||||||
|
width: "90%",
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: "center"
|
||||||
|
},
|
||||||
|
inputs: {
|
||||||
|
marginVertical: -20,
|
||||||
|
width: "80%",
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: "center",
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
},
|
},
|
||||||
separator: {
|
separator: {
|
||||||
marginVertical: 10,
|
marginVertical: 2,
|
||||||
height: 1,
|
height: 1,
|
||||||
width: '80%',
|
width: '80%',
|
||||||
},
|
},
|
||||||
input: {
|
input: {
|
||||||
|
height: 40,
|
||||||
|
margin: 10,
|
||||||
|
borderWidth: 1,
|
||||||
|
padding: 10,
|
||||||
|
},
|
||||||
|
input2: {
|
||||||
height: 40,
|
height: 40,
|
||||||
margin: 30,
|
margin: 30,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import * as React from 'react';
|
|
||||||
import { StyleSheet } from 'react-native';
|
|
||||||
import { Text, View } from '../components/Themed';
|
|
||||||
import { ScreenInfo3 } from '../components/ScreenInfo';
|
|
||||||
|
|
||||||
export default function TripScreen() {
|
|
||||||
return (
|
|
||||||
<View style={styles.container}>
|
|
||||||
<Text style={styles.title}>GT2</Text>
|
|
||||||
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
|
||||||
<ScreenInfo3 />
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
container: {
|
|
||||||
flex: 1,
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
},
|
|
||||||
title: {
|
|
||||||
fontSize: 40,
|
|
||||||
fontWeight: 'bold',
|
|
||||||
},
|
|
||||||
separator: {
|
|
||||||
marginVertical: 10,
|
|
||||||
height: 1,
|
|
||||||
width: '80%',
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -1,8 +1,14 @@
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { Button, StyleSheet, Alert } from 'react-native';
|
import { useState } from 'react';
|
||||||
|
import { Alert, Button, StyleSheet } from 'react-native';
|
||||||
import { Text, View } from '../components/Themed';
|
import { Text, View } from '../components/Themed';
|
||||||
import { ScreenInfo2 } from '../components/ScreenInfo';
|
import { ScreenInfo2 } from '../components/ScreenInfo';
|
||||||
import { GT2, thisTrip } from '../GT2';
|
import { bgOps, TripDisplay, LastTrip, Trips, setEndIsLast } from '../GT2';
|
||||||
|
import { RootTabScreenProps } from '../types';
|
||||||
|
import * as Device from 'expo-device';
|
||||||
|
import PermissionsButton from '../BGEO';
|
||||||
|
|
||||||
|
var debug:number = 0;
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
|
@ -29,48 +35,92 @@ const styles = StyleSheet.create({
|
||||||
|
|
||||||
function startTrip() {
|
function startTrip() {
|
||||||
|
|
||||||
thisTrip.start();
|
if (!bgOps) {
|
||||||
Alert.alert('Trip Started');
|
if (Device.osName === 'iOS')
|
||||||
|
Alert.alert("Background location not enabled. Must be in foreground and awake during trip!");
|
||||||
|
else Alert.alert('Stay in foreground, awake during trip!');
|
||||||
|
}
|
||||||
|
|
||||||
|
Trips.start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function pauseTrip() {
|
function pauseTrip() {
|
||||||
|
|
||||||
thisTrip.pause();
|
if (!Trips.paused) {
|
||||||
Alert.alert('Trip Paused');
|
Trips.pause();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Trips.pause();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function endTrip() {
|
|
||||||
|
|
||||||
thisTrip.end();
|
function endTrip() { Trips.end(); }
|
||||||
Alert.alert('Trip Ended');
|
|
||||||
|
|
||||||
}
|
export default function TripScreen( { navigation }: RootTabScreenProps<'Trip'>) {
|
||||||
|
|
||||||
export default function TripScreen() {
|
const [sButtonText, setSButtonText] = useState("Start");
|
||||||
|
const [pButtonText, setPButtonText] = useState("Pause");
|
||||||
|
|
||||||
|
if (Trips.nTrips < 1)
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
|
<PermissionsButton />
|
||||||
<Text style={styles.title}>Trip Control</Text>
|
<Text style={styles.title}>Trip Control</Text>
|
||||||
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
||||||
<ScreenInfo2 />
|
<ScreenInfo2 />
|
||||||
<View style={styles.controls} >
|
<View style={styles.controls} >
|
||||||
<Button
|
<Button
|
||||||
title="Start"
|
title={sButtonText}
|
||||||
onPress={() => startTrip() }
|
onPress={() => {
|
||||||
|
if (!Trips.inProgress) {startTrip();
|
||||||
|
if (Trips.inProgress) { setSButtonText("End"); setPButtonText('Pause');}}
|
||||||
|
else {setSButtonText('Start'); LastTrip.from(Trips); endTrip(); navigation.push('Modal'); }}
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
title="Pause"
|
title={pButtonText}
|
||||||
onPress={() => pauseTrip()}
|
onPress={() => { if (!Trips.inProgress) Alert.alert("No trip in progress!"); else {
|
||||||
/>
|
if (!Trips.paused) {setPButtonText("Resume");pauseTrip();}
|
||||||
<Button
|
else {setPButtonText('Pause');pauseTrip();}}}
|
||||||
title="Stop"
|
}
|
||||||
onPress={() => endTrip() }
|
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
< thisTrip.TripDisplay />
|
<TripDisplay></TripDisplay>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
else
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<PermissionsButton />
|
||||||
|
<Text style={styles.title}>Trip Control</Text>
|
||||||
|
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
|
||||||
|
<ScreenInfo2 />
|
||||||
|
<View style={styles.controls} >
|
||||||
|
<Button
|
||||||
|
title={sButtonText}
|
||||||
|
onPress={() => {
|
||||||
|
if (!Trips.inProgress) {startTrip();
|
||||||
|
if (Trips.inProgress) { setSButtonText("End"); setPButtonText('Pause');}}
|
||||||
|
else {setSButtonText('Start'); endTrip(); LastTrip.from(Trips); navigation.push('Modal'); }}
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title={pButtonText}
|
||||||
|
onPress={() => { if (!Trips.inProgress) Alert.alert("No trip in progress!"); else {
|
||||||
|
if (!Trips.paused) {setPButtonText("Resume");pauseTrip();}
|
||||||
|
else {setPButtonText('Pause');pauseTrip();}}}
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
<TripDisplay></TripDisplay>
|
||||||
|
<View>
|
||||||
|
<Button title={'Show Last Trip'} onPress={() => { setEndIsLast(true); navigation.push('Modal'); } } />
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
"extends": "expo/tsconfig.base",
|
"extends": "expo/tsconfig.base",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"suppressImplicitAnyIndexErrors": true,
|
||||||
"strict": true
|
"strict": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,25 +3,34 @@
|
||||||
* https://reactnavigation.org/docs/typescript/
|
* https://reactnavigation.org/docs/typescript/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs';
|
||||||
|
import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/native';
|
||||||
|
import { NativeStackScreenProps } from '@react-navigation/native-stack';
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
namespace ReactNavigation {
|
||||||
|
interface RootParamList extends RootStackParamList {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export type RootStackParamList = {
|
export type RootStackParamList = {
|
||||||
Root: undefined;
|
Root: NavigatorScreenParams<RootTabParamList> | undefined;
|
||||||
|
Modal: undefined;
|
||||||
NotFound: undefined;
|
NotFound: undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type BottomTabParamList = {
|
export type RootStackScreenProps<Screen extends keyof RootStackParamList> = NativeStackScreenProps<
|
||||||
Splash: undefined;
|
RootStackParamList,
|
||||||
Trip: undefined;
|
Screen
|
||||||
|
>;
|
||||||
|
|
||||||
|
export type RootTabParamList = {
|
||||||
|
Home: undefined;
|
||||||
Settings: undefined;
|
Settings: undefined;
|
||||||
|
Trip: undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TripParamList = {
|
export type RootTabScreenProps<Screen extends keyof RootTabParamList> = CompositeScreenProps<
|
||||||
TripScreen: undefined;
|
BottomTabScreenProps<RootTabParamList, Screen>,
|
||||||
};
|
NativeStackScreenProps<RootStackParamList>
|
||||||
|
>;
|
||||||
export type SettingsParamList = {
|
|
||||||
SettingsScreen: undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type SplashParamList = {
|
|
||||||
SplashScreen: undefined;
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
import 'react-native-gesture-handler';
|
|
||||||
import { StatusBar } from 'expo-status-bar';
|
|
||||||
import React, { useState, useEffect } from 'react';
|
|
||||||
import { Platform, Text, View, Switch, StyleSheet } from 'react-native';
|
|
||||||
import * as Location from 'expo-location';
|
|
||||||
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
||||||
import useCachedResources from './hooks/useCachedResources';
|
|
||||||
import useColorScheme from './hooks/useColorScheme';
|
|
||||||
import Navigation from './navigation';
|
|
||||||
|
|
||||||
export var debug:boolean = false;
|
|
||||||
export var expoGeoState:any;
|
|
||||||
export var tripInProgress:boolean = true;
|
|
||||||
|
|
||||||
export default function App() {
|
|
||||||
const isLoadingComplete = useCachedResources();
|
|
||||||
const colorScheme = useColorScheme();
|
|
||||||
const [isKM, setIsKM] = useState(false);
|
|
||||||
const toggleUnits = () => setIsKM(previousState => !previousState);
|
|
||||||
const [location, setLocation] = useState(Object);
|
|
||||||
const [errorMsg, setErrorMsg] = useState("");
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
(async () => {
|
|
||||||
let { status } = await Location.requestForegroundPermissionsAsync();
|
|
||||||
if (status !== 'granted') {
|
|
||||||
setErrorMsg('Permission to access location was denied');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let location = await Location.getCurrentPositionAsync({});
|
|
||||||
setLocation(location);
|
|
||||||
})();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
expoGeoState = 'Waiting..';
|
|
||||||
if (errorMsg) {
|
|
||||||
expoGeoState = errorMsg;
|
|
||||||
} else if (location) {
|
|
||||||
expoGeoState = JSON.stringify(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isLoadingComplete) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
if (!debug)
|
|
||||||
return (
|
|
||||||
<SafeAreaProvider>
|
|
||||||
<Navigation colorScheme={colorScheme} />
|
|
||||||
<StatusBar />
|
|
||||||
</SafeAreaProvider>
|
|
||||||
);
|
|
||||||
else
|
|
||||||
return (
|
|
||||||
<SafeAreaProvider>
|
|
||||||
<Navigation colorScheme={colorScheme} />
|
|
||||||
<Text>{expoGeoState}</Text>
|
|
||||||
<StatusBar />
|
|
||||||
</SafeAreaProvider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function toggleTripInProgress() {tripInProgress = !tripInProgress;}
|
|
|
@ -1,175 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
/* Generated from Java with JSweet 3.0.0 - http://www.jsweet.org */
|
|
||||||
/**
|
|
||||||
* Constructor taking a longitude and a latitude
|
|
||||||
*
|
|
||||||
* @param {number} longitude
|
|
||||||
* @param {number} latitude
|
|
||||||
* @class
|
|
||||||
* @author Linus Helgesson
|
|
||||||
*/
|
|
||||||
var Coordinate = /** @class */ (function () {
|
|
||||||
function Coordinate(longitude, latitude) {
|
|
||||||
if (((typeof longitude === 'number') || longitude === null) && ((typeof latitude === 'number') || latitude === null)) {
|
|
||||||
var __args = arguments;
|
|
||||||
this.mLongitude = 0;
|
|
||||||
this.mLatitude = 0;
|
|
||||||
this.mResults = [0, 0];
|
|
||||||
this.mLongitude = longitude;
|
|
||||||
this.mLatitude = latitude;
|
|
||||||
}
|
|
||||||
else if (longitude === undefined && latitude === undefined) {
|
|
||||||
var __args = arguments;
|
|
||||||
this.mLongitude = 0;
|
|
||||||
this.mLatitude = 0;
|
|
||||||
this.mResults = [0, 0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw new Error('invalid overload');
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get the longitude part of this coordinate
|
|
||||||
*
|
|
||||||
* @return {number} The longitude part of this coordinate
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.getLongitude = function () {
|
|
||||||
return this.mLongitude;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Set the longitude part of this coordinate
|
|
||||||
*
|
|
||||||
* @param {number} longitude The longitude part of this coordinate
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.setLongitude = function (longitude) {
|
|
||||||
this.mLongitude = longitude;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Get the latitude part of this coordinate
|
|
||||||
*
|
|
||||||
* @return {number} The latitude part of this coordinate
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.getLatitude = function () {
|
|
||||||
return this.mLatitude;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Set the latitude part of this coordinate
|
|
||||||
*
|
|
||||||
* @param {number} latitude The latitude part of this coordinate
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.setLatitude = function (latitude) {
|
|
||||||
this.mLatitude = latitude;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Calculates a bounding box of a certain size arund a coordinate. This is mainly used for a quick check
|
|
||||||
* in the database for cameras that are close to a coordinate. This function takes a size ion meters as
|
|
||||||
* a parameter and returns an array of two Coordinate objects. The first Coordinate is the upper left corner
|
|
||||||
* while the last coordinate is the bottom right corner.
|
|
||||||
*
|
|
||||||
* @param {number} side The length of the square side in meters
|
|
||||||
*
|
|
||||||
* @return {Coordinate[]} Two cordinates where the first is smaller than the second.
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.getBoundingBox = function (side: number) {
|
|
||||||
var ret = [null, null];
|
|
||||||
|
|
||||||
var degLatM:number , degLatM:number, degLongM:number, deltaLat:number, deltaLong:number;
|
|
||||||
|
|
||||||
degLatM = 110574.235;
|
|
||||||
degLongM = 110572.833 * Math.cos(this.mLatitude * this.PI_OVER_180);
|
|
||||||
deltaLat = side / degLatM;
|
|
||||||
deltaLong = side / degLongM;
|
|
||||||
|
|
||||||
ret[0] = new Coordinate(this.getLongitude() - deltaLong, this.getLatitude() - deltaLat);
|
|
||||||
ret[1] = new Coordinate(this.getLongitude() + deltaLong, this.getLatitude() + deltaLat);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Calculates the distance between two Coordinate objects using the Spherical law of cosines found at:
|
|
||||||
*
|
|
||||||
* http://www.movable-type.co.uk/scripts/latlong.html
|
|
||||||
*
|
|
||||||
* @param coordinate The coordinate to measure the distance to.
|
|
||||||
* @return {number} the distance in meters
|
|
||||||
* @param {Coordinate} dest
|
|
||||||
*/
|
|
||||||
Coordinate.prototype.distanceTo = function (dest) {
|
|
||||||
Coordinate.computeDistanceAndBearing(this.mLatitude, this.mLongitude, dest.getLatitude(), dest.getLongitude(), this.mResults);
|
|
||||||
return this.mResults[0];
|
|
||||||
};
|
|
||||||
/*private*/ Coordinate.computeDistanceAndBearing = function (lat1, lon1, lat2, lon2, results) {
|
|
||||||
var MAXITERS = 20;
|
|
||||||
lat1 *= Math.PI / 180.0;
|
|
||||||
lat2 *= Math.PI / 180.0;
|
|
||||||
lon1 *= Math.PI / 180.0;
|
|
||||||
lon2 *= Math.PI / 180.0;
|
|
||||||
var a = 6378137.0;
|
|
||||||
var b = 6356752.3142;
|
|
||||||
var f = (a - b) / a;
|
|
||||||
var aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);
|
|
||||||
var L = lon2 - lon1;
|
|
||||||
var A = 0.0;
|
|
||||||
var U1 = Math.atan((1.0 - f) * Math.tan(lat1));
|
|
||||||
var U2 = Math.atan((1.0 - f) * Math.tan(lat2));
|
|
||||||
var cosU1 = Math.cos(U1);
|
|
||||||
var cosU2 = Math.cos(U2);
|
|
||||||
var sinU1 = Math.sin(U1);
|
|
||||||
var sinU2 = Math.sin(U2);
|
|
||||||
var cosU1cosU2 = cosU1 * cosU2;
|
|
||||||
var sinU1sinU2 = sinU1 * sinU2;
|
|
||||||
var sigma = 0.0;
|
|
||||||
var deltaSigma = 0.0;
|
|
||||||
var cosSqAlpha = 0.0;
|
|
||||||
var cos2SM = 0.0;
|
|
||||||
var cosSigma = 0.0;
|
|
||||||
var sinSigma = 0.0;
|
|
||||||
var cosLambda = 0.0;
|
|
||||||
var sinLambda = 0.0;
|
|
||||||
var lambda = L;
|
|
||||||
for (var iter = 0; iter < MAXITERS; iter++) {
|
|
||||||
{
|
|
||||||
var lambdaOrig = lambda;
|
|
||||||
cosLambda = Math.cos(lambda);
|
|
||||||
sinLambda = Math.sin(lambda);
|
|
||||||
var t1 = cosU2 * sinLambda;
|
|
||||||
var t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
|
|
||||||
var sinSqSigma = t1 * t1 + t2 * t2;
|
|
||||||
sinSigma = Math.sqrt(sinSqSigma);
|
|
||||||
cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda;
|
|
||||||
sigma = Math.atan2(sinSigma, cosSigma);
|
|
||||||
var sinAlpha = (sinSigma === 0) ? 0.0 : cosU1cosU2 * sinLambda / sinSigma;
|
|
||||||
cosSqAlpha = 1.0 - sinAlpha * sinAlpha;
|
|
||||||
cos2SM = (cosSqAlpha === 0) ? 0.0 : cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha;
|
|
||||||
var uSquared = cosSqAlpha * aSqMinusBSqOverBSq;
|
|
||||||
A = 1 + (uSquared / 16384.0) * (4096.0 + uSquared * (-768 + uSquared * (320.0 - 175.0 * uSquared)));
|
|
||||||
var B = (uSquared / 1024.0) * (256.0 + uSquared * (-128.0 + uSquared * (74.0 - 47.0 * uSquared)));
|
|
||||||
var C = (f / 16.0) * cosSqAlpha * (4.0 + f * (4.0 - 3.0 * cosSqAlpha));
|
|
||||||
var cos2SMSq = cos2SM * cos2SM;
|
|
||||||
deltaSigma = B * sinSigma * (cos2SM + (B / 4.0) * (cosSigma * (-1.0 + 2.0 * cos2SMSq) - (B / 6.0) * cos2SM * (-3.0 + 4.0 * sinSigma * sinSigma) * (-3.0 + 4.0 * cos2SMSq)));
|
|
||||||
lambda = L + (1.0 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SM + C * cosSigma * (-1.0 + 2.0 * cos2SM * cos2SM)));
|
|
||||||
var delta = (lambda - lambdaOrig) / lambda;
|
|
||||||
if (Math.abs(delta) < 1.0E-12) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
var distance = (b * A * (sigma - deltaSigma));
|
|
||||||
results[0] = distance;
|
|
||||||
if (results.length > 1) {
|
|
||||||
var initialBearing = Math.atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
|
|
||||||
initialBearing *= 180.0 / Math.PI;
|
|
||||||
results[1] = initialBearing;
|
|
||||||
if (results.length > 2) {
|
|
||||||
var finalBearing = Math.atan2(cosU1 * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda);
|
|
||||||
finalBearing *= 180.0 / Math.PI;
|
|
||||||
results[2] = finalBearing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Coordinate.PI_OVER_180 = 0.017453292;
|
|
||||||
Coordinate.EARTH_RADIUS = 6371009;
|
|
||||||
return Coordinate;
|
|
||||||
}());
|
|
||||||
Coordinate["__class"] = "Coordinate";
|
|
|
@ -1,55 +0,0 @@
|
||||||
# To learn about Buck see [Docs](https://buckbuild.com/).
|
|
||||||
# To run your application with Buck:
|
|
||||||
# - install Buck
|
|
||||||
# - `npm start` - to start the packager
|
|
||||||
# - `cd android`
|
|
||||||
# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
|
|
||||||
# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
|
|
||||||
# - `buck install -r android/app` - compile, install and run application
|
|
||||||
#
|
|
||||||
|
|
||||||
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
|
|
||||||
|
|
||||||
lib_deps = []
|
|
||||||
|
|
||||||
create_aar_targets(glob(["libs/*.aar"]))
|
|
||||||
|
|
||||||
create_jar_targets(glob(["libs/*.jar"]))
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "all-libs",
|
|
||||||
exported_deps = lib_deps,
|
|
||||||
)
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "app-code",
|
|
||||||
srcs = glob([
|
|
||||||
"src/main/java/**/*.java",
|
|
||||||
]),
|
|
||||||
deps = [
|
|
||||||
":all-libs",
|
|
||||||
":build_config",
|
|
||||||
":res",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
android_build_config(
|
|
||||||
name = "build_config",
|
|
||||||
package = "app.greentravel",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_resource(
|
|
||||||
name = "res",
|
|
||||||
package = "app.greentravel",
|
|
||||||
res = "src/main/res",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_binary(
|
|
||||||
name = "app",
|
|
||||||
keystore = "//android/keystores:debug",
|
|
||||||
manifest = "src/main/AndroidManifest.xml",
|
|
||||||
package_type = "debug",
|
|
||||||
deps = [
|
|
||||||
":app-code",
|
|
||||||
],
|
|
||||||
)
|
|
|
@ -1,219 +0,0 @@
|
||||||
apply plugin: "com.android.application"
|
|
||||||
|
|
||||||
import com.android.build.OutputFile
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
|
|
||||||
* and bundleReleaseJsAndAssets).
|
|
||||||
* These basically call `react-native bundle` with the correct arguments during the Android build
|
|
||||||
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
|
|
||||||
* bundle directly from the development server. Below you can see all the possible configurations
|
|
||||||
* and their defaults. If you decide to add a configuration block, make sure to add it before the
|
|
||||||
* `apply from: "../../node_modules/react-native/react.gradle"` line.
|
|
||||||
*
|
|
||||||
* project.ext.react = [
|
|
||||||
* // the name of the generated asset file containing your JS bundle
|
|
||||||
* bundleAssetName: "index.android.bundle",
|
|
||||||
*
|
|
||||||
* // the entry file for bundle generation. If none specified and
|
|
||||||
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
|
|
||||||
* // default. Can be overridden with ENTRY_FILE environment variable.
|
|
||||||
* entryFile: "index.android.js",
|
|
||||||
*
|
|
||||||
* // https://reactnative.dev/docs/performance#enable-the-ram-format
|
|
||||||
* bundleCommand: "ram-bundle",
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in debug mode
|
|
||||||
* bundleInDebug: false,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in release mode
|
|
||||||
* bundleInRelease: true,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in another build variant (if configured).
|
|
||||||
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'bundleIn${productFlavor}${buildType}'
|
|
||||||
* // 'bundleIn${buildType}'
|
|
||||||
* // bundleInFreeDebug: true,
|
|
||||||
* // bundleInPaidRelease: true,
|
|
||||||
* // bundleInBeta: true,
|
|
||||||
*
|
|
||||||
* // whether to disable dev mode in custom build variants (by default only disabled in release)
|
|
||||||
* // for example: to disable dev mode in the staging build type (if configured)
|
|
||||||
* devDisabledInStaging: true,
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'devDisabledIn${productFlavor}${buildType}'
|
|
||||||
* // 'devDisabledIn${buildType}'
|
|
||||||
*
|
|
||||||
* // the root of your project, i.e. where "package.json" lives
|
|
||||||
* root: "../../",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in debug mode
|
|
||||||
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in release mode
|
|
||||||
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in debug mode
|
|
||||||
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in release mode
|
|
||||||
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
|
|
||||||
*
|
|
||||||
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
|
|
||||||
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
|
|
||||||
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
|
|
||||||
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
|
|
||||||
* // for example, you might want to remove it from here.
|
|
||||||
* inputExcludes: ["android/**", "ios/**"],
|
|
||||||
*
|
|
||||||
* // override which node gets called and with what additional arguments
|
|
||||||
* nodeExecutableAndArgs: ["node"],
|
|
||||||
*
|
|
||||||
* // supply additional arguments to the packager
|
|
||||||
* extraPackagerArgs: []
|
|
||||||
* ]
|
|
||||||
*/
|
|
||||||
|
|
||||||
project.ext.react = [
|
|
||||||
enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes",
|
|
||||||
]
|
|
||||||
|
|
||||||
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
|
|
||||||
apply from: "../../node_modules/react-native/react.gradle"
|
|
||||||
apply from: "../../node_modules/expo-constants/scripts/get-app-config-android.gradle"
|
|
||||||
apply from: "../../node_modules/expo-updates/scripts/create-manifest-android.gradle"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set this to true to create two separate APKs instead of one:
|
|
||||||
* - An APK that only works on ARM devices
|
|
||||||
* - An APK that only works on x86 devices
|
|
||||||
* The advantage is the size of the APK is reduced by about 4MB.
|
|
||||||
* Upload all the APKs to the Play Store and people will download
|
|
||||||
* the correct one based on the CPU architecture of their device.
|
|
||||||
*/
|
|
||||||
def enableSeparateBuildPerCPUArchitecture = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run Proguard to shrink the Java bytecode in release builds.
|
|
||||||
*/
|
|
||||||
def enableProguardInReleaseBuilds = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The preferred build flavor of JavaScriptCore.
|
|
||||||
*
|
|
||||||
* For example, to use the international variant, you can use:
|
|
||||||
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
|
||||||
*
|
|
||||||
* The international variant includes ICU i18n library and necessary data
|
|
||||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
|
||||||
* give correct results when using with locales other than en-US. Note that
|
|
||||||
* this variant is about 6MiB larger per architecture than default.
|
|
||||||
*/
|
|
||||||
def jscFlavor = 'org.webkit:android-jsc:+'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether to enable the Hermes VM.
|
|
||||||
*
|
|
||||||
* This should be set on project.ext.react and mirrored here. If it is not set
|
|
||||||
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
|
|
||||||
* and the benefits of using Hermes will therefore be sharply reduced.
|
|
||||||
*/
|
|
||||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
applicationId 'app.greentravel'
|
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
|
||||||
versionCode 1
|
|
||||||
versionName "1.0.0"
|
|
||||||
}
|
|
||||||
splits {
|
|
||||||
abi {
|
|
||||||
reset()
|
|
||||||
enable enableSeparateBuildPerCPUArchitecture
|
|
||||||
universalApk false // If true, also generate a universal APK
|
|
||||||
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
signingConfigs {
|
|
||||||
debug {
|
|
||||||
storeFile file('debug.keystore')
|
|
||||||
storePassword 'android'
|
|
||||||
keyAlias 'androiddebugkey'
|
|
||||||
keyPassword 'android'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
|
||||||
debug {
|
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
}
|
|
||||||
release {
|
|
||||||
// Caution! In production, you need to generate your own keystore file.
|
|
||||||
// see https://reactnative.dev/docs/signed-apk-android.
|
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
minifyEnabled enableProguardInReleaseBuilds
|
|
||||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// applicationVariants are e.g. debug, release
|
|
||||||
applicationVariants.all { variant ->
|
|
||||||
variant.outputs.each { output ->
|
|
||||||
// For each separate APK per architecture, set a unique version code as described here:
|
|
||||||
// https://developer.android.com/studio/build/configure-apk-splits.html
|
|
||||||
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
|
|
||||||
def abi = output.getFilter(OutputFile.ABI)
|
|
||||||
if (abi != null) { // null for the universal-debug, universal-release variants
|
|
||||||
output.versionCodeOverride =
|
|
||||||
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
||||||
//noinspection GradleDynamicVersion
|
|
||||||
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
|
|
||||||
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.fbjni'
|
|
||||||
}
|
|
||||||
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.flipper'
|
|
||||||
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
|
||||||
}
|
|
||||||
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.flipper'
|
|
||||||
}
|
|
||||||
addUnimodulesDependencies()
|
|
||||||
|
|
||||||
if (enableHermes) {
|
|
||||||
def hermesPath = "../../node_modules/hermes-engine/android/";
|
|
||||||
debugImplementation files(hermesPath + "hermes-debug.aar")
|
|
||||||
releaseImplementation files(hermesPath + "hermes-release.aar")
|
|
||||||
} else {
|
|
||||||
implementation jscFlavor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run this once to be able to run the application with BUCK
|
|
||||||
// puts all compile dependencies into folder libs for BUCK to use
|
|
||||||
task copyDownloadableDepsToLibs(type: Copy) {
|
|
||||||
from configurations.compile
|
|
||||||
into 'libs'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
|
|
@ -1,19 +0,0 @@
|
||||||
"""Helper definitions to glob .aar and .jar targets"""
|
|
||||||
|
|
||||||
def create_aar_targets(aarfiles):
|
|
||||||
for aarfile in aarfiles:
|
|
||||||
name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
android_prebuilt_aar(
|
|
||||||
name = name,
|
|
||||||
aar = aarfile,
|
|
||||||
)
|
|
||||||
|
|
||||||
def create_jar_targets(jarfiles):
|
|
||||||
for jarfile in jarfiles:
|
|
||||||
name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
prebuilt_jar(
|
|
||||||
name = name,
|
|
||||||
binary_jar = jarfile,
|
|
||||||
)
|
|
|
@ -1,10 +0,0 @@
|
||||||
# Add project specific ProGuard rules here.
|
|
||||||
# By default, the flags in this file are appended to flags specified
|
|
||||||
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
|
|
||||||
# You can edit the include path and order by changing the proguardFiles
|
|
||||||
# directive in build.gradle.
|
|
||||||
#
|
|
||||||
# For more details, see
|
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
|
||||||
|
|
||||||
# Add any project specific keep options here:
|
|
|
@ -1,7 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
|
||||||
|
|
||||||
<application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
|
|
||||||
</manifest>
|
|
|
@ -1,69 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
||||||
*
|
|
||||||
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
|
|
||||||
* directory of this source tree.
|
|
||||||
*/
|
|
||||||
package app.greentravel;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import com.facebook.flipper.android.AndroidFlipperClient;
|
|
||||||
import com.facebook.flipper.android.utils.FlipperUtils;
|
|
||||||
import com.facebook.flipper.core.FlipperClient;
|
|
||||||
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
|
|
||||||
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
|
|
||||||
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
|
|
||||||
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.bridge.ReactContext;
|
|
||||||
import com.facebook.react.modules.network.NetworkingModule;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
public class ReactNativeFlipper {
|
|
||||||
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
|
|
||||||
if (FlipperUtils.shouldEnableFlipper(context)) {
|
|
||||||
final FlipperClient client = AndroidFlipperClient.getInstance(context);
|
|
||||||
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
|
|
||||||
client.addPlugin(new ReactFlipperPlugin());
|
|
||||||
client.addPlugin(new DatabasesFlipperPlugin(context));
|
|
||||||
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
|
|
||||||
client.addPlugin(CrashReporterPlugin.getInstance());
|
|
||||||
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
|
|
||||||
NetworkingModule.setCustomClientBuilder(
|
|
||||||
new NetworkingModule.CustomClientBuilder() {
|
|
||||||
@Override
|
|
||||||
public void apply(OkHttpClient.Builder builder) {
|
|
||||||
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
client.addPlugin(networkFlipperPlugin);
|
|
||||||
client.start();
|
|
||||||
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
|
|
||||||
// Hence we run if after all native modules have been initialized
|
|
||||||
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
|
|
||||||
if (reactContext == null) {
|
|
||||||
reactInstanceManager.addReactInstanceEventListener(
|
|
||||||
new ReactInstanceManager.ReactInstanceEventListener() {
|
|
||||||
@Override
|
|
||||||
public void onReactContextInitialized(ReactContext reactContext) {
|
|
||||||
reactInstanceManager.removeReactInstanceEventListener(this);
|
|
||||||
reactContext.runOnNativeModulesQueueThread(
|
|
||||||
new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
client.addPlugin(new FrescoFlipperPlugin());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
client.addPlugin(new FrescoFlipperPlugin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.greentravel">
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
||||||
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
|
|
||||||
<meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/>
|
|
||||||
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="42.0.0"/>
|
|
||||||
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/>
|
|
||||||
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/>
|
|
||||||
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://exp.host/@anonymous/Ejectable"/>
|
|
||||||
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:screenOrientation="portrait">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
|
||||||
</intent-filter>
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
<data android:scheme="myapp"/>
|
|
||||||
<data android:scheme="app.greentravel"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
|
@ -1,60 +0,0 @@
|
||||||
package app.greentravel;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.content.Intent;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
import com.facebook.react.ReactActivity;
|
|
||||||
import com.facebook.react.ReactActivityDelegate;
|
|
||||||
import com.facebook.react.ReactRootView;
|
|
||||||
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
|
|
||||||
|
|
||||||
import expo.modules.splashscreen.singletons.SplashScreen;
|
|
||||||
import expo.modules.splashscreen.SplashScreenImageResizeMode;
|
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends ReactActivity {
|
|
||||||
|
|
||||||
// Added automatically by Expo Config
|
|
||||||
@Override
|
|
||||||
public void onConfigurationChanged(Configuration newConfig) {
|
|
||||||
super.onConfigurationChanged(newConfig);
|
|
||||||
Intent intent = new Intent("onConfigurationChanged");
|
|
||||||
intent.putExtra("newConfig", newConfig);
|
|
||||||
sendBroadcast(intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
// Set the theme to AppTheme BEFORE onCreate to support
|
|
||||||
// coloring the background, status bar, and navigation bar.
|
|
||||||
// This is required for expo-splash-screen.
|
|
||||||
setTheme(R.style.AppTheme);
|
|
||||||
super.onCreate(null);
|
|
||||||
// @generated begin expo-splash-screen-mainActivity-onCreate-show-splash - expo prebuild (DO NOT MODIFY) sync-8915a20732e7fda227585f9b6ef0d38bef4fbbbe
|
|
||||||
SplashScreen.show(this, SplashScreenImageResizeMode.CONTAIN, ReactRootView.class, false);
|
|
||||||
// @generated end expo-splash-screen-mainActivity-onCreate-show-splash
|
|
||||||
// SplashScreen.show(...) has to be called after super.onCreate(...)
|
|
||||||
// Below line is handled by '@expo/configure-splash-screen' command and it's discouraged to modify it manually
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the main component registered from JavaScript.
|
|
||||||
* This is used to schedule rendering of the component.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected String getMainComponentName() {
|
|
||||||
return "main";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReactActivityDelegate createReactActivityDelegate() {
|
|
||||||
return new ReactActivityDelegate(this, getMainComponentName()) {
|
|
||||||
@Override
|
|
||||||
protected ReactRootView createRootView() {
|
|
||||||
return new RNGestureHandlerEnabledRootView(MainActivity.this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,125 +0,0 @@
|
||||||
package app.greentravel;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
import com.facebook.react.PackageList;
|
|
||||||
import com.facebook.react.ReactApplication;
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
|
||||||
import com.facebook.react.ReactPackage;
|
|
||||||
import com.facebook.react.shell.MainReactPackage;
|
|
||||||
import com.facebook.soloader.SoLoader;
|
|
||||||
import app.greentravel.generated.BasePackageList;
|
|
||||||
|
|
||||||
import org.unimodules.adapters.react.ReactAdapterPackage;
|
|
||||||
import org.unimodules.adapters.react.ModuleRegistryAdapter;
|
|
||||||
import org.unimodules.adapters.react.ReactModuleRegistryProvider;
|
|
||||||
import org.unimodules.core.interfaces.Package;
|
|
||||||
import org.unimodules.core.interfaces.SingletonModule;
|
|
||||||
import expo.modules.updates.UpdatesController;
|
|
||||||
|
|
||||||
import com.facebook.react.bridge.JSIModulePackage;
|
|
||||||
import com.swmansion.reanimated.ReanimatedJSIModulePackage;
|
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
public class MainApplication extends Application implements ReactApplication {
|
|
||||||
private final ReactModuleRegistryProvider mModuleRegistryProvider = new ReactModuleRegistryProvider(
|
|
||||||
new BasePackageList().getPackageList()
|
|
||||||
);
|
|
||||||
|
|
||||||
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
|
|
||||||
@Override
|
|
||||||
public boolean getUseDeveloperSupport() {
|
|
||||||
return BuildConfig.DEBUG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<ReactPackage> getPackages() {
|
|
||||||
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
||||||
packages.add(new ModuleRegistryAdapter(mModuleRegistryProvider));
|
|
||||||
return packages;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getJSMainModuleName() {
|
|
||||||
return "index";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected JSIModulePackage getJSIModulePackage() {
|
|
||||||
return new ReanimatedJSIModulePackage();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected @Nullable String getJSBundleFile() {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
return super.getJSBundleFile();
|
|
||||||
} else {
|
|
||||||
return UpdatesController.getInstance().getLaunchAssetFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected @Nullable String getBundleAssetName() {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
return super.getBundleAssetName();
|
|
||||||
} else {
|
|
||||||
return UpdatesController.getInstance().getBundleAssetName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReactNativeHost getReactNativeHost() {
|
|
||||||
return mReactNativeHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
SoLoader.init(this, /* native exopackage */ false);
|
|
||||||
|
|
||||||
if (!BuildConfig.DEBUG) {
|
|
||||||
UpdatesController.initialize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
|
|
||||||
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param reactInstanceManager
|
|
||||||
*/
|
|
||||||
private static void initializeFlipper(
|
|
||||||
Context context, ReactInstanceManager reactInstanceManager) {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
We use reflection here to pick up the class that initializes Flipper,
|
|
||||||
since Flipper library is not available in release mode
|
|
||||||
*/
|
|
||||||
Class<?> aClass = Class.forName("app.greentravel.ReactNativeFlipper");
|
|
||||||
aClass
|
|
||||||
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
|
|
||||||
.invoke(null, context, reactInstanceManager);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 47 KiB |
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="@color/splashscreen_background"/>
|
|
||||||
</layer-list>
|
|
|
@ -1,5 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/iconBackground"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
|
@ -1,5 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/iconBackground"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 12 KiB |
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<resources/>
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<resources>
|
|
||||||
<color name="splashscreen_background">#ffffff</color>
|
|
||||||
<color name="iconBackground">#ffffff</color>
|
|
||||||
<color name="colorPrimary">#023c69</color>
|
|
||||||
<color name="colorPrimaryDark">#ffffff</color>
|
|
||||||
</resources>
|
|
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">Ejectable</string>
|
|
||||||
</resources>
|
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="android:textColor">@android:color/black</item>
|
|
||||||
<item name="android:editTextStyle">@style/ResetEditText</item>
|
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
|
||||||
</style>
|
|
||||||
<style name="ResetEditText" parent="@android:style/Widget.EditText">
|
|
||||||
<item name="android:padding">0dp</item>
|
|
||||||
<item name="android:textColorHint">#c8c8c8</item>
|
|
||||||
<item name="android:textColor">@android:color/black</item>
|
|
||||||
</style>
|
|
||||||
<style name="Theme.App.SplashScreen" parent="AppTheme">
|
|
||||||
<item name="android:windowBackground">@drawable/splashscreen</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
|
@ -1,38 +0,0 @@
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
|
||||||
|
|
||||||
buildscript {
|
|
||||||
ext {
|
|
||||||
buildToolsVersion = "29.0.3"
|
|
||||||
minSdkVersion = 21
|
|
||||||
compileSdkVersion = 30
|
|
||||||
targetSdkVersion = 30
|
|
||||||
}
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
dependencies {
|
|
||||||
classpath("com.android.tools.build:gradle:4.1.0")
|
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
|
||||||
// in the individual module build.gradle files
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
mavenLocal()
|
|
||||||
maven {
|
|
||||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
|
||||||
url("$rootDir/../node_modules/react-native/android")
|
|
||||||
}
|
|
||||||
maven {
|
|
||||||
// Android JSC is installed from npm
|
|
||||||
url("$rootDir/../node_modules/jsc-android/dist")
|
|
||||||
}
|
|
||||||
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
maven { url 'https://www.jitpack.io' }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
# Project-wide Gradle settings.
|
|
||||||
|
|
||||||
# IDE (e.g. Android Studio) users:
|
|
||||||
# Gradle settings configured through the IDE *will override*
|
|
||||||
# any settings specified in this file.
|
|
||||||
|
|
||||||
# For more details on how to configure your build environment visit
|
|
||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
|
||||||
|
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
|
||||||
# Default value: -Xmx10248m -XX:MaxPermSize=256m
|
|
||||||
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
|
||||||
|
|
||||||
# When configured, Gradle will run in incubating parallel mode.
|
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
|
||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
|
||||||
# org.gradle.parallel=true
|
|
||||||
|
|
||||||
# AndroidX package structure to make it clearer which packages are bundled with the
|
|
||||||
# Android operating system, and which are packaged with your app's APK
|
|
||||||
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
|
||||||
android.useAndroidX=true
|
|
||||||
|
|
||||||
# Automatically convert third-party libraries to use AndroidX
|
|
||||||
android.enableJetifier=true
|
|
||||||
|
|
||||||
# Version of flipper SDK to use with React Native
|
|
||||||
FLIPPER_VERSION=0.54.0
|
|
||||||
|
|
||||||
# The hosted JavaScript engine
|
|
||||||
# Supported values: expo.jsEngine = "hermes" | "jsc"
|
|
||||||
expo.jsEngine=jsc
|
|
|
@ -1,5 +0,0 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
|
||||||
distributionPath=wrapper/dists
|
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
|
|
@ -1,183 +0,0 @@
|
||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright 2015 the original author or authors.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
##
|
|
||||||
## Gradle start up script for UN*X
|
|
||||||
##
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
|
||||||
# Resolve links: $0 may be a link
|
|
||||||
PRG="$0"
|
|
||||||
# Need this for relative symlinks.
|
|
||||||
while [ -h "$PRG" ] ; do
|
|
||||||
ls=`ls -ld "$PRG"`
|
|
||||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
|
||||||
if expr "$link" : '/.*' > /dev/null; then
|
|
||||||
PRG="$link"
|
|
||||||
else
|
|
||||||
PRG=`dirname "$PRG"`"/$link"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
SAVED="`pwd`"
|
|
||||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
|
||||||
APP_HOME="`pwd -P`"
|
|
||||||
cd "$SAVED" >/dev/null
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
|
||||||
APP_BASE_NAME=`basename "$0"`
|
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
|
||||||
MAX_FD="maximum"
|
|
||||||
|
|
||||||
warn () {
|
|
||||||
echo "$*"
|
|
||||||
}
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo
|
|
||||||
echo "$*"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
|
||||||
cygwin=false
|
|
||||||
msys=false
|
|
||||||
darwin=false
|
|
||||||
nonstop=false
|
|
||||||
case "`uname`" in
|
|
||||||
CYGWIN* )
|
|
||||||
cygwin=true
|
|
||||||
;;
|
|
||||||
Darwin* )
|
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
NONSTOP* )
|
|
||||||
nonstop=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
|
||||||
if [ -n "$JAVA_HOME" ] ; then
|
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
|
||||||
# IBM's JDK on AIX uses strange locations for the executables
|
|
||||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
|
||||||
else
|
|
||||||
JAVACMD="$JAVA_HOME/bin/java"
|
|
||||||
fi
|
|
||||||
if [ ! -x "$JAVACMD" ] ; then
|
|
||||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
location of your Java installation."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
JAVACMD="java"
|
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
location of your Java installation."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
|
||||||
if [ $? -eq 0 ] ; then
|
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
|
||||||
MAX_FD="$MAX_FD_LIMIT"
|
|
||||||
fi
|
|
||||||
ulimit -n $MAX_FD
|
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Darwin, add options to specify how the application appears in the dock
|
|
||||||
if $darwin; then
|
|
||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
||||||
SEP=""
|
|
||||||
for dir in $ROOTDIRSRAW ; do
|
|
||||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
||||||
SEP="|"
|
|
||||||
done
|
|
||||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
||||||
# Add a user-defined pattern to the cygpath arguments
|
|
||||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
||||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
||||||
fi
|
|
||||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
||||||
i=0
|
|
||||||
for arg in "$@" ; do
|
|
||||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
|
||||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
|
||||||
|
|
||||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
|
||||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
|
||||||
else
|
|
||||||
eval `echo args$i`="\"$arg\""
|
|
||||||
fi
|
|
||||||
i=`expr $i + 1`
|
|
||||||
done
|
|
||||||
case $i in
|
|
||||||
0) set -- ;;
|
|
||||||
1) set -- "$args0" ;;
|
|
||||||
2) set -- "$args0" "$args1" ;;
|
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Escape application args
|
|
||||||
save () {
|
|
||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
|
||||||
echo " "
|
|
||||||
}
|
|
||||||
APP_ARGS=`save "$@"`
|
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
|
|
@ -1,103 +0,0 @@
|
||||||
@rem
|
|
||||||
@rem Copyright 2015 the original author or authors.
|
|
||||||
@rem
|
|
||||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
@rem you may not use this file except in compliance with the License.
|
|
||||||
@rem You may obtain a copy of the License at
|
|
||||||
@rem
|
|
||||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
@rem
|
|
||||||
@rem Unless required by applicable law or agreed to in writing, software
|
|
||||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
@rem See the License for the specific language governing permissions and
|
|
||||||
@rem limitations under the License.
|
|
||||||
@rem
|
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
|
||||||
@rem ##########################################################################
|
|
||||||
@rem
|
|
||||||
@rem Gradle startup script for Windows
|
|
||||||
@rem
|
|
||||||
@rem ##########################################################################
|
|
||||||
|
|
||||||
@rem Set local scope for the variables with windows NT shell
|
|
||||||
if "%OS%"=="Windows_NT" setlocal
|
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
|
||||||
set APP_BASE_NAME=%~n0
|
|
||||||
set APP_HOME=%DIRNAME%
|
|
||||||
|
|
||||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
|
||||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
|
||||||
|
|
||||||
@rem Find java.exe
|
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
|
||||||
|
|
||||||
set JAVA_EXE=java.exe
|
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
|
||||||
if "%ERRORLEVEL%" == "0" goto init
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
||||||
echo.
|
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
echo location of your Java installation.
|
|
||||||
|
|
||||||
goto fail
|
|
||||||
|
|
||||||
:findJavaFromJavaHome
|
|
||||||
set JAVA_HOME=%JAVA_HOME:"=%
|
|
||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
|
||||||
|
|
||||||
if exist "%JAVA_EXE%" goto init
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
|
||||||
echo.
|
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
|
||||||
echo location of your Java installation.
|
|
||||||
|
|
||||||
goto fail
|
|
||||||
|
|
||||||
:init
|
|
||||||
@rem Get command-line arguments, handling Windows variants
|
|
||||||
|
|
||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
|
||||||
|
|
||||||
:win9xME_args
|
|
||||||
@rem Slurp the command line arguments.
|
|
||||||
set CMD_LINE_ARGS=
|
|
||||||
set _SKIP=2
|
|
||||||
|
|
||||||
:win9xME_args_slurp
|
|
||||||
if "x%~1" == "x" goto execute
|
|
||||||
|
|
||||||
set CMD_LINE_ARGS=%*
|
|
||||||
|
|
||||||
:execute
|
|
||||||
@rem Setup the command line
|
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
|
||||||
|
|
||||||
:end
|
|
||||||
@rem End local scope for the variables with windows NT shell
|
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
|
||||||
|
|
||||||
:fail
|
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
|
||||||
rem the _cmd.exe /c_ return code!
|
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
|
||||||
exit /b 1
|
|
||||||
|
|
||||||
:mainEnd
|
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
|
||||||
|
|
||||||
:omega
|
|
|
@ -1,9 +0,0 @@
|
||||||
rootProject.name = 'Ejectable'
|
|
||||||
|
|
||||||
apply from: '../node_modules/react-native-unimodules/gradle.groovy'
|
|
||||||
includeUnimodulesProjects()
|
|
||||||
|
|
||||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle");
|
|
||||||
applyNativeModulesSettingsGradle(settings)
|
|
||||||
|
|
||||||
include ':app'
|
|
|
@ -1,36 +0,0 @@
|
||||||
{
|
|
||||||
"expo": {
|
|
||||||
"name": "Ejectable",
|
|
||||||
"slug": "Ejectable",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"orientation": "portrait",
|
|
||||||
"icon": "./assets/images/icon.png",
|
|
||||||
"scheme": "myapp",
|
|
||||||
"userInterfaceStyle": "automatic",
|
|
||||||
"splash": {
|
|
||||||
"image": "./assets/images/splash.png",
|
|
||||||
"resizeMode": "contain",
|
|
||||||
"backgroundColor": "#ffffff"
|
|
||||||
},
|
|
||||||
"updates": {
|
|
||||||
"fallbackToCacheTimeout": 0
|
|
||||||
},
|
|
||||||
"assetBundlePatterns": [
|
|
||||||
"**/*"
|
|
||||||
],
|
|
||||||
"ios": {
|
|
||||||
"supportsTablet": true,
|
|
||||||
"bundleIdentifier": "app.greentravel"
|
|
||||||
},
|
|
||||||
"android": {
|
|
||||||
"adaptiveIcon": {
|
|
||||||
"foregroundImage": "./assets/images/adaptive-icon.png",
|
|
||||||
"backgroundColor": "#ffffff"
|
|
||||||
},
|
|
||||||
"package": "app.greentravel"
|
|
||||||
},
|
|
||||||
"web": {
|
|
||||||
"favicon": "./assets/images/favicon.png"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 47 KiB |
|
@ -1,7 +0,0 @@
|
||||||
module.exports = function(api) {
|
|
||||||
api.cache(true);
|
|
||||||
return {
|
|
||||||
presets: ['babel-preset-expo'],
|
|
||||||
plugins: ['react-native-reanimated/plugin'],
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -1,67 +0,0 @@
|
||||||
import * as WebBrowser from 'expo-web-browser';
|
|
||||||
import React from 'react';
|
|
||||||
import { StyleSheet, TouchableOpacity } from 'react-native';
|
|
||||||
|
|
||||||
import Colors from '../constants/Colors';
|
|
||||||
import { MonoText } from './StyledText';
|
|
||||||
import { Text, View } from './Themed';
|
|
||||||
|
|
||||||
export default function ScreenInfo() {
|
|
||||||
return (
|
|
||||||
<View style={styles.settingsContainer}>
|
|
||||||
<Text
|
|
||||||
style={styles.settingsText}
|
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
|
||||||
Switch dark km/ light mi, select fuel used, or manually set CO2 per distance
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
export function ScreenInfo2() {
|
|
||||||
return (
|
|
||||||
<View style={styles.settingsContainer}>
|
|
||||||
<Text
|
|
||||||
style={styles.settingsText}
|
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
|
||||||
Use Pause if fuel burning portion of trip interrupted
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function ScreenInfo3() {
|
|
||||||
return (
|
|
||||||
<View style={styles.settingsContainer}>
|
|
||||||
<Text
|
|
||||||
style={styles.settingsText}
|
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
|
||||||
Green Travel Carbon Calculator v. 2
|
|
||||||
</Text>
|
|
||||||
<Text
|
|
||||||
style={styles.versionText}
|
|
||||||
lightColor="rgba(0,0,0,0.8)"
|
|
||||||
darkColor="rgba(255,255,255,0.8)">
|
|
||||||
expo version
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
settingsContainer: {
|
|
||||||
marginHorizontal: 50,
|
|
||||||
marginVertical: 20,
|
|
||||||
},
|
|
||||||
settingsText: {
|
|
||||||
fontSize: 17,
|
|
||||||
lineHeight: 24,
|
|
||||||
textAlign: 'center',
|
|
||||||
},
|
|
||||||
versionText: {
|
|
||||||
fontSize: 8,
|
|
||||||
textAlign: 'center',
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -1,7 +0,0 @@
|
||||||
import * as React from 'react';
|
|
||||||
|
|
||||||
import { Text, TextProps } from './Themed';
|
|
||||||
|
|
||||||
export function MonoText(props: TextProps) {
|
|
||||||
return <Text {...props} style={[props.style, { fontFamily: 'space-mono' }]} />;
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/**
|
|
||||||
* Learn more about Light and Dark modes:
|
|
||||||
* https://docs.expo.io/guides/color-schemes/
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as React from 'react';
|
|
||||||
import { Text as DefaultText, View as DefaultView } from 'react-native';
|
|
||||||
|
|
||||||
import Colors from '../constants/Colors';
|
|
||||||
import useColorScheme from '../hooks/useColorScheme';
|
|
||||||
|
|
||||||
export function useThemeColor(
|
|
||||||
props: { light?: string; dark?: string },
|
|
||||||
colorName: keyof typeof Colors.light & keyof typeof Colors.dark
|
|
||||||
) {
|
|
||||||
const theme = useColorScheme();
|
|
||||||
const colorFromProps = props[theme];
|
|
||||||
|
|
||||||
if (colorFromProps) {
|
|
||||||
return colorFromProps;
|
|
||||||
} else {
|
|
||||||
return Colors[theme][colorName];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ThemeProps = {
|
|
||||||
lightColor?: string;
|
|
||||||
darkColor?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type TextProps = ThemeProps & DefaultText['props'];
|
|
||||||
export type ViewProps = ThemeProps & DefaultView['props'];
|
|
||||||
|
|
||||||
export function Text(props: TextProps) {
|
|
||||||
const { style, lightColor, darkColor, ...otherProps } = props;
|
|
||||||
const color = useThemeColor({ light: lightColor, dark: darkColor }, 'text');
|
|
||||||
|
|
||||||
return <DefaultText style={[{ color }, style]} {...otherProps} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function View(props: ViewProps) {
|
|
||||||
const { style, lightColor, darkColor, ...otherProps } = props;
|
|
||||||
const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, 'background');
|
|
||||||
|
|
||||||
return <DefaultView style={[{ backgroundColor }, style]} {...otherProps} />;
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
import * as React from 'react';
|
|
||||||
import renderer from 'react-test-renderer';
|
|
||||||
|
|
||||||
import { MonoText } from '../StyledText';
|
|
||||||
|
|
||||||
it(`renders correctly`, () => {
|
|
||||||
const tree = renderer.create(<MonoText>Snapshot test!</MonoText>).toJSON();
|
|
||||||
|
|
||||||
expect(tree).toMatchSnapshot();
|
|
||||||
});
|
|
|
@ -1,19 +0,0 @@
|
||||||
const tintColorLight = '#2f95dc';
|
|
||||||
const tintColorDark = '#fff';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
light: {
|
|
||||||
text: '#000',
|
|
||||||
background: 'lime',
|
|
||||||
tint: tintColorLight,
|
|
||||||
tabIconDefault: '#ccc',
|
|
||||||
tabIconSelected: tintColorLight,
|
|
||||||
},
|
|
||||||
dark: {
|
|
||||||
text: '#fff',
|
|
||||||
background: 'forestgreen',
|
|
||||||
tint: tintColorDark,
|
|
||||||
tabIconDefault: '#ccc',
|
|
||||||
tabIconSelected: tintColorDark,
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,12 +0,0 @@
|
||||||
import { Dimensions } from 'react-native';
|
|
||||||
|
|
||||||
const width = Dimensions.get('window').width;
|
|
||||||
const height = Dimensions.get('window').height;
|
|
||||||
|
|
||||||
export default {
|
|
||||||
window: {
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
},
|
|
||||||
isSmallDevice: width < 375,
|
|
||||||
};
|
|
|
@ -1,33 +0,0 @@
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
|
||||||
import * as Font from 'expo-font';
|
|
||||||
import * as SplashScreen from 'expo-splash-screen';
|
|
||||||
import * as React from 'react';
|
|
||||||
|
|
||||||
export default function useCachedResources() {
|
|
||||||
const [isLoadingComplete, setLoadingComplete] = React.useState(false);
|
|
||||||
|
|
||||||
// Load any resources or data that we need prior to rendering the app
|
|
||||||
React.useEffect(() => {
|
|
||||||
async function loadResourcesAndDataAsync() {
|
|
||||||
try {
|
|
||||||
SplashScreen.preventAutoHideAsync();
|
|
||||||
|
|
||||||
// Load fonts
|
|
||||||
await Font.loadAsync({
|
|
||||||
...Ionicons.font,
|
|
||||||
'space-mono': require('../assets/fonts/SpaceMono-Regular.ttf'),
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
// We might want to provide this error information to an error reporting service
|
|
||||||
console.warn(e);
|
|
||||||
} finally {
|
|
||||||
setLoadingComplete(true);
|
|
||||||
SplashScreen.hideAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
loadResourcesAndDataAsync();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return isLoadingComplete;
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
import { ColorSchemeName, useColorScheme as _useColorScheme } from 'react-native';
|
|
||||||
|
|
||||||
// The useColorScheme value is always either light or dark, but the built-in
|
|
||||||
// type suggests that it can be null. This will not happen in practice, so this
|
|
||||||
// makes it a bit easier to work with.
|
|
||||||
export default function useColorScheme(): NonNullable<ColorSchemeName> {
|
|
||||||
return _useColorScheme() as NonNullable<ColorSchemeName>;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
import 'react-native-gesture-handler';
|
|
||||||
import { registerRootComponent } from 'expo';
|
|
||||||
|
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
|
|
||||||
// It also ensures that whether you load the app in Expo Go or in a native build,
|
|
||||||
// the environment is set up appropriately
|
|
||||||
registerRootComponent(App);
|
|
|
@ -1,490 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 46;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
|
|
||||||
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
|
|
||||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
|
||||||
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
|
||||||
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
|
|
||||||
96905EF65AED1B983A6B3ABC /* libPods-Ejectable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Ejectable.a */; };
|
|
||||||
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
|
|
||||||
BF08072FA6744A9D844FE5DC /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EBCAEC857C04AAFB2233027 /* noop-file.swift */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
|
|
||||||
13B07F961A680F5B00A75B9A /* Ejectable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ejectable.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Ejectable/AppDelegate.h; sourceTree = "<group>"; };
|
|
||||||
13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Ejectable/AppDelegate.m; sourceTree = "<group>"; };
|
|
||||||
13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
|
|
||||||
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Ejectable/Images.xcassets; sourceTree = "<group>"; };
|
|
||||||
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Ejectable/Info.plist; sourceTree = "<group>"; };
|
|
||||||
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Ejectable/main.m; sourceTree = "<group>"; };
|
|
||||||
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Ejectable.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Ejectable.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
6C2E3173556A471DD304B334 /* Pods-Ejectable.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ejectable.debug.xcconfig"; path = "Target Support Files/Pods-Ejectable/Pods-Ejectable.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
7A4D352CD337FB3A3BF06240 /* Pods-Ejectable.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ejectable.release.xcconfig"; path = "Target Support Files/Pods-Ejectable/Pods-Ejectable.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Ejectable/SplashScreen.storyboard; sourceTree = "<group>"; };
|
|
||||||
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
|
|
||||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
|
||||||
ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
|
|
||||||
1EBCAEC857C04AAFB2233027 /* noop-file.swift */ = {isa = PBXFileReference; name = "noop-file.swift"; path = "Ejectable/noop-file.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
||||||
B674FEB0BB5648A0B28DCAFF /* Ejectable-Bridging-Header.h */ = {isa = PBXFileReference; name = "Ejectable-Bridging-Header.h"; path = "Ejectable/Ejectable-Bridging-Header.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
96905EF65AED1B983A6B3ABC /* libPods-Ejectable.a in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
13B07FAE1A68108700A75B9A /* Ejectable */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
BB2F792B24A3F905000567C9 /* Supporting */,
|
|
||||||
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
|
|
||||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
|
||||||
13B07FB01A68108700A75B9A /* AppDelegate.m */,
|
|
||||||
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
|
||||||
13B07FB61A68108700A75B9A /* Info.plist */,
|
|
||||||
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
|
|
||||||
13B07FB71A68108700A75B9A /* main.m */,
|
|
||||||
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
|
|
||||||
1EBCAEC857C04AAFB2233027 /* noop-file.swift */,
|
|
||||||
B674FEB0BB5648A0B28DCAFF /* Ejectable-Bridging-Header.h */,
|
|
||||||
);
|
|
||||||
name = Ejectable;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
|
||||||
ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
|
|
||||||
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Ejectable.a */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
name = Libraries;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
83CBB9F61A601CBA00E9B192 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
13B07FAE1A68108700A75B9A /* Ejectable */,
|
|
||||||
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
|
||||||
83CBBA001A601CBA00E9B192 /* Products */,
|
|
||||||
2D16E6871FA4F8E400B85C8A /* Frameworks */,
|
|
||||||
D65327D7A22EEC0BE12398D9 /* Pods */,
|
|
||||||
);
|
|
||||||
indentWidth = 2;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
tabWidth = 2;
|
|
||||||
usesTabs = 0;
|
|
||||||
};
|
|
||||||
83CBBA001A601CBA00E9B192 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
13B07F961A680F5B00A75B9A /* Ejectable.app */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
BB2F792B24A3F905000567C9 /* Supporting */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
BB2F792C24A3F905000567C9 /* Expo.plist */,
|
|
||||||
);
|
|
||||||
name = Supporting;
|
|
||||||
path = Ejectable/Supporting;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
D65327D7A22EEC0BE12398D9 /* Pods */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
6C2E3173556A471DD304B334 /* Pods-Ejectable.debug.xcconfig */,
|
|
||||||
7A4D352CD337FB3A3BF06240 /* Pods-Ejectable.release.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Pods;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
13B07F861A680F5B00A75B9A /* Ejectable */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Ejectable" */;
|
|
||||||
buildPhases = (
|
|
||||||
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
|
|
||||||
FD10A7F022414F080027D42C /* Start Packager */,
|
|
||||||
13B07F871A680F5B00A75B9A /* Sources */,
|
|
||||||
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
|
||||||
13B07F8E1A680F5B00A75B9A /* Resources */,
|
|
||||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
|
||||||
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = Ejectable;
|
|
||||||
productName = Ejectable;
|
|
||||||
productReference = 13B07F961A680F5B00A75B9A /* Ejectable.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastUpgradeCheck = 1130;
|
|
||||||
TargetAttributes = {
|
|
||||||
13B07F861A680F5B00A75B9A = {
|
|
||||||
LastSwiftMigration = 1120;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Ejectable" */;
|
|
||||||
compatibilityVersion = "Xcode 3.2";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = 83CBB9F61A601CBA00E9B192;
|
|
||||||
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
13B07F861A680F5B00A75B9A /* Ejectable */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
|
|
||||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
|
||||||
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
|
|
||||||
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
|
|
||||||
DC39BFF2389A4CA08F834468 /* Ejectable-Bridging-Header.h in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "Bundle React Native code and images";
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n../node_modules/expo-constants/scripts/get-app-config-ios.sh\n../node_modules/expo-updates/scripts/create-manifest-ios.sh\n";
|
|
||||||
};
|
|
||||||
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/Pods-Ejectable-checkManifestLockResult.txt",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-Ejectable/Pods-Ejectable-resources.sh",
|
|
||||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
|
||||||
);
|
|
||||||
name = "[CP] Copy Pods Resources";
|
|
||||||
outputPaths = (
|
|
||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Ejectable/Pods-Ejectable-resources.sh\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
FD10A7F022414F080027D42C /* Start Packager */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "Start Packager";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
13B07F871A680F5B00A75B9A /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
|
|
||||||
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
|
||||||
BF08072FA6744A9D844FE5DC /* noop-file.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
13B07FB21A68108700A75B9A /* Base */,
|
|
||||||
);
|
|
||||||
name = LaunchScreen.xib;
|
|
||||||
path = Ejectable;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
13B07F941A680F5B00A75B9A /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Ejectable.debug.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
ENABLE_BITCODE = NO;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"FB_SONARKIT_ENABLED=1",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = Ejectable/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "app.greentravel";
|
|
||||||
PRODUCT_NAME = greentravel;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = Ejectable/Ejectable-Bridging-Header.h;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Ejectable/greentravel.entitlements;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
13B07F951A680F5B00A75B9A /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Ejectable.release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
INFOPLIST_FILE = Ejectable/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "app.greentravel";
|
|
||||||
PRODUCT_NAME = greentravel;
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = Ejectable/Ejectable-Bridging-Header.h;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Ejectable/greentravel.entitlements;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"\"$(inherited)\"",
|
|
||||||
);
|
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Ejectable/greentravel.entitlements;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
83CBBA211A601CBA00E9B192 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = YES;
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"\"$(inherited)\"",
|
|
||||||
);
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Ejectable/greentravel.entitlements;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Ejectable" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
13B07F941A680F5B00A75B9A /* Debug */,
|
|
||||||
13B07F951A680F5B00A75B9A /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Ejectable" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
83CBBA201A601CBA00E9B192 /* Debug */,
|
|
||||||
83CBBA211A601CBA00E9B192 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,88 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "1130"
|
|
||||||
version = "1.3">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
|
||||||
BuildableName = "Ejectable.app"
|
|
||||||
BlueprintName = "Ejectable"
|
|
||||||
ReferencedContainer = "container:Ejectable.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
||||||
<Testables>
|
|
||||||
<TestableReference
|
|
||||||
skipped = "NO">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
|
|
||||||
BuildableName = "EjectableTests.xctest"
|
|
||||||
BlueprintName = "EjectableTests"
|
|
||||||
ReferencedContainer = "container:Ejectable.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
</Testables>
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
|
||||||
BuildableName = "Ejectable.app"
|
|
||||||
BlueprintName = "Ejectable"
|
|
||||||
ReferencedContainer = "container:Ejectable.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
|
||||||
BuildableName = "Ejectable.app"
|
|
||||||
BlueprintName = "Ejectable"
|
|
||||||
ReferencedContainer = "container:Ejectable.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
|
@ -1,10 +0,0 @@
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <EXUpdates/EXUpdatesAppController.h>
|
|
||||||
#import <React/RCTBridgeDelegate.h>
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
#import <UMCore/UMAppDelegateWrapper.h>
|
|
||||||
|
|
||||||
@interface AppDelegate : UMAppDelegateWrapper <RCTBridgeDelegate, EXUpdatesAppControllerDelegate>
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,111 +0,0 @@
|
||||||
#import "AppDelegate.h"
|
|
||||||
|
|
||||||
#import <React/RCTBridge.h>
|
|
||||||
#import <React/RCTBundleURLProvider.h>
|
|
||||||
#import <React/RCTRootView.h>
|
|
||||||
#import <React/RCTLinkingManager.h>
|
|
||||||
|
|
||||||
#import <UMCore/UMModuleRegistry.h>
|
|
||||||
#import <UMReactNativeAdapter/UMNativeModulesProxy.h>
|
|
||||||
#import <UMReactNativeAdapter/UMModuleRegistryAdapter.h>
|
|
||||||
#import <EXSplashScreen/EXSplashScreenService.h>
|
|
||||||
#import <UMCore/UMModuleRegistryProvider.h>
|
|
||||||
|
|
||||||
#if defined(FB_SONARKIT_ENABLED) && __has_include(<FlipperKit/FlipperClient.h>)
|
|
||||||
#import <FlipperKit/FlipperClient.h>
|
|
||||||
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
|
|
||||||
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
|
|
||||||
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
|
|
||||||
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
|
|
||||||
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>
|
|
||||||
|
|
||||||
static void InitializeFlipper(UIApplication *application) {
|
|
||||||
FlipperClient *client = [FlipperClient sharedClient];
|
|
||||||
SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
|
|
||||||
[client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
|
|
||||||
[client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
|
|
||||||
[client addPlugin:[FlipperKitReactPlugin new]];
|
|
||||||
[client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
|
|
||||||
[client start];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@interface AppDelegate () <RCTBridgeDelegate>
|
|
||||||
|
|
||||||
@property (nonatomic, strong) UMModuleRegistryAdapter *moduleRegistryAdapter;
|
|
||||||
@property (nonatomic, strong) NSDictionary *launchOptions;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation AppDelegate
|
|
||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
||||||
{
|
|
||||||
#if defined(FB_SONARKIT_ENABLED) && __has_include(<FlipperKit/FlipperClient.h>)
|
|
||||||
InitializeFlipper(application);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
self.moduleRegistryAdapter = [[UMModuleRegistryAdapter alloc] initWithModuleRegistryProvider:[[UMModuleRegistryProvider alloc] init]];
|
|
||||||
self.launchOptions = launchOptions;
|
|
||||||
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
|
|
||||||
#ifdef DEBUG
|
|
||||||
[self initializeReactNativeApp];
|
|
||||||
#else
|
|
||||||
EXUpdatesAppController *controller = [EXUpdatesAppController sharedInstance];
|
|
||||||
controller.delegate = self;
|
|
||||||
[controller startAndShowLaunchScreen:self.window];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
[super application:application didFinishLaunchingWithOptions:launchOptions];
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (RCTBridge *)initializeReactNativeApp
|
|
||||||
{
|
|
||||||
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:self.launchOptions];
|
|
||||||
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"main" initialProperties:nil];
|
|
||||||
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
|
|
||||||
|
|
||||||
UIViewController *rootViewController = [UIViewController new];
|
|
||||||
rootViewController.view = rootView;
|
|
||||||
self.window.rootViewController = rootViewController;
|
|
||||||
[self.window makeKeyAndVisible];
|
|
||||||
|
|
||||||
return bridge;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
|
|
||||||
{
|
|
||||||
NSArray<id<RCTBridgeModule>> *extraModules = [_moduleRegistryAdapter extraModulesForBridge:bridge];
|
|
||||||
// If you'd like to export some custom RCTBridgeModules that are not Expo modules, add them here!
|
|
||||||
return extraModules;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
|
|
||||||
#ifdef DEBUG
|
|
||||||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
|
|
||||||
#else
|
|
||||||
return [[EXUpdatesAppController sharedInstance] launchAssetUrl];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)appController:(EXUpdatesAppController *)appController didStartWithSuccess:(BOOL)success {
|
|
||||||
appController.bridge = [self initializeReactNativeApp];
|
|
||||||
EXSplashScreenService *splashScreenService = (EXSplashScreenService *)[UMModuleRegistryProvider getSingletonModuleForClass:[EXSplashScreenService class]];
|
|
||||||
[splashScreenService showSplashScreenFor:self.window.rootViewController];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Linking API
|
|
||||||
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
|
|
||||||
return [RCTLinkingManager application:application openURL:url options:options];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Universal Links
|
|
||||||
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
|
|
||||||
return [RCTLinkingManager application:application
|
|
||||||
continueUserActivity:userActivity
|
|
||||||
restorationHandler:restorationHandler];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,42 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="iOS"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
|
||||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
|
||||||
</dependencies>
|
|
||||||
<objects>
|
|
||||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
|
||||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
|
|
||||||
<rect key="frame" x="20" y="439" width="441" height="21"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
|
||||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ejectable" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
|
||||||
<rect key="frame" x="20" y="140" width="441" height="43"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
|
||||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
</subviews>
|
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
|
|
||||||
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
|
|
||||||
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
|
|
||||||
</constraints>
|
|
||||||
<nil key="simulatedStatusBarMetrics"/>
|
|
||||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
|
||||||
<point key="canvasLocation" x="548" y="455"/>
|
|
||||||
</view>
|
|
||||||
</objects>
|
|
||||||
</document>
|
|
|
@ -1,3 +0,0 @@
|
||||||
//
|
|
||||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
|
||||||
//
|
|
Before Width: | Height: | Size: 583 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.0 KiB |