Compare commits
6 commits
44cb35d6d9
...
b150ac55ef
| Author | SHA1 | Date | |
|---|---|---|---|
| b150ac55ef | |||
| 742a1f445a | |||
| f759c44f20 | |||
| 0c881f5ce9 | |||
| 8163429539 | |||
| 2d59912c1a |
12 changed files with 100 additions and 81 deletions
|
|
@ -136,8 +136,8 @@ android {
|
||||||
applicationId 'fr.amicaleinsat.application'
|
applicationId 'fr.amicaleinsat.application'
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 23
|
versionCode 24
|
||||||
versionName "3.0.6"
|
versionName "3.0.7"
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
}
|
}
|
||||||
splits {
|
splits {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "campus",
|
"name": "campus",
|
||||||
"version": "3.0.6",
|
"version": "3.0.7",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-native start",
|
"start": "react-native start",
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ type Props = {
|
||||||
theme: CustomTheme,
|
theme: CustomTheme,
|
||||||
url: string,
|
url: string,
|
||||||
customJS: string,
|
customJS: string,
|
||||||
|
customPaddingFunction: null | (padding: number) => string,
|
||||||
collapsibleStack: Collapsible,
|
collapsibleStack: Collapsible,
|
||||||
onMessage: Function,
|
onMessage: Function,
|
||||||
onScroll: Function,
|
onScroll: Function,
|
||||||
|
|
@ -37,6 +38,7 @@ class WebViewScreen extends React.PureComponent<Props> {
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
customJS: '',
|
customJS: '',
|
||||||
showAdvancedControls: true,
|
showAdvancedControls: true,
|
||||||
|
customPaddingFunction: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
webviewRef: Object;
|
webviewRef: Object;
|
||||||
|
|
@ -157,8 +159,10 @@ class WebViewScreen extends React.PureComponent<Props> {
|
||||||
getRenderLoading = () => <BasicLoadingScreen isAbsolute={true}/>;
|
getRenderLoading = () => <BasicLoadingScreen isAbsolute={true}/>;
|
||||||
|
|
||||||
getJavascriptPadding(padding: number) {
|
getJavascriptPadding(padding: number) {
|
||||||
|
const customPadding = this.props.customPaddingFunction != null ? this.props.customPaddingFunction(padding) : "";
|
||||||
return (
|
return (
|
||||||
"document.getElementsByTagName('body')[0].style.paddingTop = '" + padding + "px';" +
|
"document.getElementsByTagName('body')[0].style.paddingTop = '" + padding + "px';" +
|
||||||
|
customPadding +
|
||||||
"true;"
|
"true;"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,11 @@ export default class AsyncStorageManager {
|
||||||
|
|
||||||
// Object storing preferences keys, default and current values for use in the app
|
// Object storing preferences keys, default and current values for use in the app
|
||||||
preferences = {
|
preferences = {
|
||||||
|
debugUnlocked: {
|
||||||
|
key: 'debugUnlocked',
|
||||||
|
default: '0',
|
||||||
|
current: '',
|
||||||
|
},
|
||||||
showIntro: {
|
showIntro: {
|
||||||
key: 'showIntro',
|
key: 'showIntro',
|
||||||
default: '1',
|
default: '1',
|
||||||
|
|
@ -49,16 +54,6 @@ export default class AsyncStorageManager {
|
||||||
default: '1',
|
default: '1',
|
||||||
current: '',
|
current: '',
|
||||||
},
|
},
|
||||||
expoToken: {
|
|
||||||
key: 'expoToken',
|
|
||||||
default: '',
|
|
||||||
current: '',
|
|
||||||
},
|
|
||||||
debugUnlocked: {
|
|
||||||
key: 'debugUnlocked',
|
|
||||||
default: '0',
|
|
||||||
current: '',
|
|
||||||
},
|
|
||||||
defaultStartScreen: {
|
defaultStartScreen: {
|
||||||
key: 'defaultStartScreen',
|
key: 'defaultStartScreen',
|
||||||
default: 'home',
|
default: 'home',
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {FlatList, Linking, Platform, View} from 'react-native';
|
import {FlatList, Linking, Platform, View} from 'react-native';
|
||||||
import i18n from "i18n-js";
|
import i18n from "i18n-js";
|
||||||
import AsyncStorageManager from "../../managers/AsyncStorageManager";
|
|
||||||
import {Avatar, Card, List, Title, withTheme} from 'react-native-paper';
|
import {Avatar, Card, List, Title, withTheme} from 'react-native-paper';
|
||||||
import packageJson from "../../../package.json";
|
import packageJson from "../../../package.json";
|
||||||
|
|
||||||
|
|
@ -32,10 +31,6 @@ type Props = {
|
||||||
navigation: Object,
|
navigation: Object,
|
||||||
};
|
};
|
||||||
|
|
||||||
type State = {
|
|
||||||
isDebugUnlocked: boolean,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a link in the device's browser
|
* Opens a link in the device's browser
|
||||||
* @param link The link to open
|
* @param link The link to open
|
||||||
|
|
@ -47,14 +42,8 @@ function openWebLink(link) {
|
||||||
/**
|
/**
|
||||||
* Class defining an about screen. This screen shows the user information about the app and it's author.
|
* Class defining an about screen. This screen shows the user information about the app and it's author.
|
||||||
*/
|
*/
|
||||||
class AboutScreen extends React.Component<Props, State> {
|
class AboutScreen extends React.Component<Props> {
|
||||||
|
|
||||||
debugTapCounter = 0;
|
|
||||||
modalRef: Object;
|
|
||||||
|
|
||||||
state = {
|
|
||||||
isDebugUnlocked: AsyncStorageManager.getInstance().preferences.debugUnlocked.current === '1'
|
|
||||||
};
|
|
||||||
/**
|
/**
|
||||||
* Data to be displayed in the app card
|
* Data to be displayed in the app card
|
||||||
*/
|
*/
|
||||||
|
|
@ -89,20 +78,13 @@ class AboutScreen extends React.Component<Props, State> {
|
||||||
text: i18n.t('aboutScreen.license'),
|
text: i18n.t('aboutScreen.license'),
|
||||||
showChevron: true
|
showChevron: true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
onPressCallback: () => this.props.navigation.navigate('debug'),
|
|
||||||
icon: 'bug-check',
|
|
||||||
text: i18n.t('aboutScreen.debug'),
|
|
||||||
showChevron: true,
|
|
||||||
showOnlyInDebug: true
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
/**
|
/**
|
||||||
* Data to be displayed in the author card
|
* Data to be displayed in the author card
|
||||||
*/
|
*/
|
||||||
authorData: Array<Object> = [
|
authorData: Array<Object> = [
|
||||||
{
|
{
|
||||||
onPressCallback: () => this.tryUnlockDebugMode(),
|
onPressCallback: () => console.log('cc'),
|
||||||
icon: 'account-circle',
|
icon: 'account-circle',
|
||||||
text: 'Arnaud VERGNET',
|
text: 'Arnaud VERGNET',
|
||||||
showChevron: false
|
showChevron: false
|
||||||
|
|
@ -223,7 +205,6 @@ class AboutScreen extends React.Component<Props, State> {
|
||||||
<Card.Content>
|
<Card.Content>
|
||||||
<FlatList
|
<FlatList
|
||||||
data={this.appData}
|
data={this.appData}
|
||||||
extraData={this.state.isDebugUnlocked}
|
|
||||||
keyExtractor={this.keyExtractor}
|
keyExtractor={this.keyExtractor}
|
||||||
renderItem={this.getCardItem}
|
renderItem={this.getCardItem}
|
||||||
/>
|
/>
|
||||||
|
|
@ -314,51 +295,26 @@ class AboutScreen extends React.Component<Props, State> {
|
||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
getCardItem = ({item}: Object) => {
|
getCardItem = ({item}: Object) => {
|
||||||
let shouldShow = item === undefined
|
|
||||||
|| !item.showOnlyInDebug
|
|
||||||
|| (item.showOnlyInDebug && this.state.isDebugUnlocked);
|
|
||||||
const getItemIcon = this.getItemIcon.bind(this, item);
|
const getItemIcon = this.getItemIcon.bind(this, item);
|
||||||
if (shouldShow) {
|
if (item.showChevron) {
|
||||||
if (item.showChevron) {
|
return (
|
||||||
return (
|
<List.Item
|
||||||
<List.Item
|
title={item.text}
|
||||||
title={item.text}
|
left={getItemIcon}
|
||||||
left={getItemIcon}
|
right={this.getChevronIcon}
|
||||||
right={this.getChevronIcon}
|
onPress={item.onPressCallback}
|
||||||
onPress={item.onPressCallback}
|
/>
|
||||||
/>
|
);
|
||||||
);
|
} else {
|
||||||
} else {
|
return (
|
||||||
return (
|
<List.Item
|
||||||
<List.Item
|
title={item.text}
|
||||||
title={item.text}
|
left={getItemIcon}
|
||||||
left={getItemIcon}
|
onPress={item.onPressCallback}
|
||||||
onPress={item.onPressCallback}
|
/>
|
||||||
/>
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tries to unlock debug mode
|
|
||||||
*/
|
|
||||||
tryUnlockDebugMode() {
|
|
||||||
this.debugTapCounter = this.debugTapCounter + 1;
|
|
||||||
if (this.debugTapCounter >= 4) {
|
|
||||||
this.unlockDebugMode();
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Unlocks debug mode
|
|
||||||
*/
|
|
||||||
unlockDebugMode() {
|
|
||||||
this.setState({isDebugUnlocked: true});
|
|
||||||
let key = AsyncStorageManager.getInstance().preferences.debugUnlocked.key;
|
|
||||||
AsyncStorageManager.getInstance().savePref(key, '1');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a card, depending on the given item's id
|
* Gets a card, depending on the given item's id
|
||||||
|
|
|
||||||
|
|
@ -174,11 +174,9 @@ class HomeScreen extends React.Component<Props, State> {
|
||||||
}
|
}
|
||||||
|
|
||||||
const onPressSettings = () => this.props.navigation.navigate("settings");
|
const onPressSettings = () => this.props.navigation.navigate("settings");
|
||||||
const onPressAbout = () => this.props.navigation.navigate("about");
|
|
||||||
return <MaterialHeaderButtons>
|
return <MaterialHeaderButtons>
|
||||||
<Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/>
|
<Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/>
|
||||||
<Item title={i18n.t("screens.settings")} iconName={"settings"} onPress={onPressSettings}/>
|
<Item title={i18n.t("screens.settings")} iconName={"settings"} onPress={onPressSettings}/>
|
||||||
<Item title={i18n.t("screens.about")} iconName={"information"} onPress={onPressAbout}/>
|
|
||||||
</MaterialHeaderButtons>;
|
</MaterialHeaderButtons>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,8 @@ class ScannerScreen extends React.Component<Props, State> {
|
||||||
maskOpacity={0.5}
|
maskOpacity={0.5}
|
||||||
animatedLineThickness={1}
|
animatedLineThickness={1}
|
||||||
animationDuration={1000}
|
animationDuration={1000}
|
||||||
|
width={250}
|
||||||
|
height={250}
|
||||||
/>
|
/>
|
||||||
</RNCamera>
|
</RNCamera>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,10 @@ import AsyncStorageManager from "../../managers/AsyncStorageManager";
|
||||||
import {Card, List, Switch, ToggleButton, withTheme} from 'react-native-paper';
|
import {Card, List, Switch, ToggleButton, withTheme} from 'react-native-paper';
|
||||||
import {Appearance} from "react-native-appearance";
|
import {Appearance} from "react-native-appearance";
|
||||||
import CustomSlider from "../../components/Overrides/CustomSlider";
|
import CustomSlider from "../../components/Overrides/CustomSlider";
|
||||||
|
import {StackNavigationProp} from "@react-navigation/stack";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
navigation: StackNavigationProp,
|
||||||
theme: CustomTheme,
|
theme: CustomTheme,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -19,6 +21,7 @@ type State = {
|
||||||
nightModeFollowSystem: boolean,
|
nightModeFollowSystem: boolean,
|
||||||
notificationReminderSelected: number,
|
notificationReminderSelected: number,
|
||||||
startScreenPickerSelected: string,
|
startScreenPickerSelected: string,
|
||||||
|
isDebugUnlocked: boolean,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -41,9 +44,19 @@ class SettingsScreen extends React.Component<Props, State> {
|
||||||
Appearance.getColorScheme() !== 'no-preference',
|
Appearance.getColorScheme() !== 'no-preference',
|
||||||
notificationReminderSelected: this.savedNotificationReminder,
|
notificationReminderSelected: this.savedNotificationReminder,
|
||||||
startScreenPickerSelected: AsyncStorageManager.getInstance().preferences.defaultStartScreen.current,
|
startScreenPickerSelected: AsyncStorageManager.getInstance().preferences.defaultStartScreen.current,
|
||||||
|
isDebugUnlocked: AsyncStorageManager.getInstance().preferences.debugUnlocked.current === '1'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlocks debug mode
|
||||||
|
*/
|
||||||
|
unlockDebugMode = () => {
|
||||||
|
this.setState({isDebugUnlocked: true});
|
||||||
|
let key = AsyncStorageManager.getInstance().preferences.debugUnlocked.key;
|
||||||
|
AsyncStorageManager.getInstance().savePref(key, '1');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the value for the proxiwash reminder notification time
|
* Saves the value for the proxiwash reminder notification time
|
||||||
*
|
*
|
||||||
|
|
@ -205,6 +218,31 @@ class SettingsScreen extends React.Component<Props, State> {
|
||||||
</View>
|
</View>
|
||||||
</List.Section>
|
</List.Section>
|
||||||
</Card>
|
</Card>
|
||||||
|
<Card style={{margin: 5}}>
|
||||||
|
<Card.Title title={i18n.t('settingsScreen.information')}/>
|
||||||
|
<List.Section>
|
||||||
|
{this.state.isDebugUnlocked
|
||||||
|
? <List.Item
|
||||||
|
title={i18n.t('screens.debug')}
|
||||||
|
left={props => <List.Icon {...props} icon="bug-check"/>}
|
||||||
|
onPress={() => this.props.navigation.navigate("debug")}
|
||||||
|
/>
|
||||||
|
:null}
|
||||||
|
<List.Item
|
||||||
|
title={i18n.t('screens.about')}
|
||||||
|
description={i18n.t('aboutScreen.buttonDesc')}
|
||||||
|
left={props => <List.Icon {...props} icon="information"/>}
|
||||||
|
onPress={() => this.props.navigation.navigate("about")}
|
||||||
|
onLongPress={this.unlockDebugMode}
|
||||||
|
/>
|
||||||
|
<List.Item
|
||||||
|
title={i18n.t('feedbackScreen.homeButtonTitle')}
|
||||||
|
description={i18n.t('feedbackScreen.homeButtonSubtitle')}
|
||||||
|
left={props => <List.Icon {...props} icon="bug"/>}
|
||||||
|
onPress={() => this.props.navigation.navigate("feedback")}
|
||||||
|
/>
|
||||||
|
</List.Section>
|
||||||
|
</Card>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,15 @@ import * as React from 'react';
|
||||||
import WebViewScreen from "../../../components/Screens/WebViewScreen";
|
import WebViewScreen from "../../../components/Screens/WebViewScreen";
|
||||||
|
|
||||||
const URL = 'https://etud-mel.insa-toulouse.fr/webmail/';
|
const URL = 'https://etud-mel.insa-toulouse.fr/webmail/';
|
||||||
|
|
||||||
|
const customPadding = (padding: string) => {
|
||||||
|
return (
|
||||||
|
"$('head').append('<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">');" +
|
||||||
|
"$('.minwidth').css('top', " + padding + ");" +
|
||||||
|
"$('#mailview-bottom').css('min-height', 500);"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class defining the app's available rooms screen.
|
* Class defining the app's available rooms screen.
|
||||||
* This screen uses a webview to render the page
|
* This screen uses a webview to render the page
|
||||||
|
|
@ -12,6 +21,7 @@ export const BlueMindWebsiteScreen = (props: Object) => {
|
||||||
return (
|
return (
|
||||||
<WebViewScreen
|
<WebViewScreen
|
||||||
{...props}
|
{...props}
|
||||||
|
customPaddingFunction={customPadding}
|
||||||
url={URL}/>
|
url={URL}/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,17 @@ import * as React from 'react';
|
||||||
import WebViewScreen from "../../../components/Screens/WebViewScreen";
|
import WebViewScreen from "../../../components/Screens/WebViewScreen";
|
||||||
|
|
||||||
const URL = 'https://wiki.etud.insa-toulouse.fr/';
|
const URL = 'https://wiki.etud.insa-toulouse.fr/';
|
||||||
|
|
||||||
|
const customPadding = (padding: string) => {
|
||||||
|
return (
|
||||||
|
"$('#p-logo-text').css('top', 10 + " + padding + ");" +
|
||||||
|
"$('#site-navigation h2').css('top', 10 + " + padding + ");" +
|
||||||
|
"$('#site-tools h2').css('top', 10 + " + padding + ");" +
|
||||||
|
"$('#user-tools h2').css('top', 10 + " + padding + ");"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class defining the app's available rooms screen.
|
* Class defining the app's available rooms screen.
|
||||||
* This screen uses a webview to render the page
|
* This screen uses a webview to render the page
|
||||||
|
|
@ -12,6 +23,7 @@ export const WiketudWebsiteScreen = (props: Object) => {
|
||||||
return (
|
return (
|
||||||
<WebViewScreen
|
<WebViewScreen
|
||||||
{...props}
|
{...props}
|
||||||
|
customPaddingFunction={customPadding}
|
||||||
url={URL}/>
|
url={URL}/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,8 @@
|
||||||
"startScreen": "Start Screen",
|
"startScreen": "Start Screen",
|
||||||
"startScreenSub": "Select which screen to start the app on",
|
"startScreenSub": "Select which screen to start the app on",
|
||||||
"proxiwashNotifReminder": "Machine running reminder",
|
"proxiwashNotifReminder": "Machine running reminder",
|
||||||
"proxiwashNotifReminderSub": "How many minutes before"
|
"proxiwashNotifReminderSub": "How many minutes before",
|
||||||
|
"information": "Information"
|
||||||
},
|
},
|
||||||
"homeScreen": {
|
"homeScreen": {
|
||||||
"listUpdated": "List updated!",
|
"listUpdated": "List updated!",
|
||||||
|
|
@ -110,6 +111,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"aboutScreen": {
|
"aboutScreen": {
|
||||||
|
"buttonDesc": "Information about the app and its creator",
|
||||||
"appstore": "See on the Appstore",
|
"appstore": "See on the Appstore",
|
||||||
"playstore": "See on the Playstore",
|
"playstore": "See on the Playstore",
|
||||||
"changelog": "Changelog",
|
"changelog": "Changelog",
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,8 @@
|
||||||
"startScreen": "Écran de démarrage",
|
"startScreen": "Écran de démarrage",
|
||||||
"startScreenSub": "Choisissez l'écran utilisé au démarrage",
|
"startScreenSub": "Choisissez l'écran utilisé au démarrage",
|
||||||
"proxiwashNotifReminder": "Rappel de machine en cours",
|
"proxiwashNotifReminder": "Rappel de machine en cours",
|
||||||
"proxiwashNotifReminderSub": "Combien de minutes avant"
|
"proxiwashNotifReminderSub": "Combien de minutes avant",
|
||||||
|
"information": "Informations"
|
||||||
},
|
},
|
||||||
"homeScreen": {
|
"homeScreen": {
|
||||||
"listUpdated": "List mise à jour!",
|
"listUpdated": "List mise à jour!",
|
||||||
|
|
@ -110,6 +111,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"aboutScreen": {
|
"aboutScreen": {
|
||||||
|
"buttonDesc": "Informations sur l'appli et son créateur",
|
||||||
"appstore": "Voir sur l'Appstore",
|
"appstore": "Voir sur l'Appstore",
|
||||||
"playstore": "Voir sur le Playstore",
|
"playstore": "Voir sur le Playstore",
|
||||||
"changelog": "Historique des modifications",
|
"changelog": "Historique des modifications",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue