Skip to content

Commit

Permalink
Merge branch 'dev' into stage
Browse files Browse the repository at this point in the history
  • Loading branch information
JavidHaji-zada committed Dec 11, 2023
2 parents db49f46 + 48bd51e commit 3941e51
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 7 deletions.
3 changes: 2 additions & 1 deletion app.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@
}
],
["./plugins/withNotifications.js"],
["./plugins/withSupportsScreenAndroid.js"]
["./plugins/withSupportsScreenAndroid.js"],
["./plugins/withSecureFlag.js"]
],
"extra": {
"eas": {
Expand Down
57 changes: 57 additions & 0 deletions plugins/withSecureFlag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
exports.__esModule = true;
var config_plugins_1 = require("expo/config-plugins");
var withSecureFlag = function (config) {
return (0, config_plugins_1.withMainActivity)(config, function (config) { return __awaiter(void 0, void 0, void 0, function () {
var content, flagSecureCode;
return __generator(this, function (_a) {
if (config.modResults.language === 'java') {
content = config.modResults.contents;
content = content.replace('import android.os.Bundle;', "import android.os.Bundle;\n import android.view.WindowManager;");
flagSecureCode = "getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);";
if (!content.includes(flagSecureCode)) {
content = content.replace('super.onCreate(savedInstanceState);', "super.onCreate(savedInstanceState);\n ".concat(flagSecureCode));
}
config.modResults.contents = content;
}
return [2 /*return*/, config];
});
}); });
};
exports["default"] = withSecureFlag;
26 changes: 26 additions & 0 deletions plugins/withSecureFlag.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { ConfigPlugin, withMainActivity } from 'expo/config-plugins';

const withSecureFlag: ConfigPlugin = (config) => {
return withMainActivity(config, async (config) => {
if (config.modResults.language === 'java') {
let content = config.modResults.contents;
content = content.replace(
'import android.os.Bundle;',
`import android.os.Bundle;\n
import android.view.WindowManager;`
);
const flagSecureCode = `getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);`;
if (!content.includes(flagSecureCode)) {
content = content.replace(
'super.onCreate(savedInstanceState);',
`super.onCreate(savedInstanceState);\n
${flagSecureCode}`
);
}
config.modResults.contents = content;
}
return config;
});
};

export default withSecureFlag;
4 changes: 3 additions & 1 deletion src/appTypes/AirDAOEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { NotificationType } from './notification';

export enum AirDAOEventType {
CollectionItemOpened = 'collection-item-opened',
CloseAllModals = 'close-all-modals',
NotificationReceived = 'notification-received',
WalletItemOpened = 'wallet-item-opened',
FundsSentFromApp = 'user-sent-funds-from-app'
Expand All @@ -23,4 +24,5 @@ export type AirDAOFundsSentFromAppEventPayload = {
export type AirDAOEventPayload =
| AirDAOWalletItemOpenEventPayload
| AirDAONotificationReceiveEventPayload
| AirDAOFundsSentFromAppEventPayload;
| AirDAOFundsSentFromAppEventPayload
| null;
14 changes: 14 additions & 0 deletions src/components/composite/BottomSheet/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, {
useCallback,
useEffect,
useImperativeHandle,
useMemo,
useState
Expand All @@ -13,6 +14,8 @@ import { Separator } from '@components/base';
import { useFullscreenModalHeight } from '@hooks/useFullscreenModalHeight';
import { useKeyboardHeight } from '@hooks/useKeyboardHeight';
import { COLORS } from '@constants/colors';
import { AirDAOEventDispatcher } from '@lib';
import { AirDAOEventType } from '@appTypes';

export const BottomSheet = React.forwardRef<BottomSheetRef, BottomSheetProps>(
(
Expand All @@ -36,6 +39,17 @@ export const BottomSheet = React.forwardRef<BottomSheetRef, BottomSheetProps>(
const fullscreenModalHeight = useFullscreenModalHeight();
const keyboardHeight = useKeyboardHeight();

useEffect(() => {
const dismissListener = AirDAOEventDispatcher.subscribe(
AirDAOEventType.CloseAllModals,
() => setIsVisible(false)
);

return () => {
dismissListener.unsubscribe();
};
}, []);

const show = useCallback(() => {
setIsVisible(true);
}, []);
Expand Down
10 changes: 8 additions & 2 deletions src/hooks/usePasscodeEntryRevealer.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { useCallback, useEffect } from 'react';
import { useNavigation } from '@react-navigation/native';
import { RootNavigationProp } from '@appTypes';
import { AirDAOEventType, RootNavigationProp } from '@appTypes';
import { useAppState } from './useAppState';
import usePasscode from '@contexts/Passcode';
import { Cache, CacheKey } from '@lib/cache';
import { DeviceUtils } from '@utils/device';
import { AirDAOEventDispatcher } from '@lib';

export const usePasscodeEntryRevealer = () => {
const navigation = useNavigation<RootNavigationProp>();
Expand All @@ -30,7 +31,12 @@ export const usePasscodeEntryRevealer = () => {
return;
}
if (prevState === 'active' && (isFaceIDEnabled || isPasscodeEnabled)) {
navigation.navigate('Passcode');
// Our BottomSheet component is rendered on top of all screens,
// so any open instance of BottomSheet must be closed before navigating to Passcode
AirDAOEventDispatcher.dispatch(AirDAOEventType.CloseAllModals, null);
setTimeout(() => {
navigation.navigate('Passcode');
}, 500);
}
}, [appState, isFaceIDEnabled, isPasscodeEnabled, navigation, prevState]);

Expand Down
6 changes: 3 additions & 3 deletions src/screens/PasscodeEntry/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const PasscodeEntry = () => {
const supportedBiometrics = useSupportedBiometrics();
const passcodeRef = useRef<TextInput>(null);
const isFocused = useIsFocused();
const { appState } = useAppState();
const { appState, prevState } = useAppState();

const closePasscodeEntry = useCallback(() => {
const canGoBack = navigation.canGoBack();
Expand Down Expand Up @@ -71,14 +71,14 @@ export const PasscodeEntry = () => {
}, [closePasscodeEntry, t]);

useEffect(() => {
if (isFocused && appState === 'active') {
if (isFocused && appState === 'active' && prevState !== 'inactive') {
if (isFaceIDEnabled) {
authenticateWithFaceID();
} else {
passcodeRef.current?.focus();
}
}
}, [authenticateWithFaceID, isFaceIDEnabled, appState, isFocused]);
}, [authenticateWithFaceID, isFaceIDEnabled, appState, isFocused, prevState]);

const handlePasscode = async (typedPasscode: string[]) => {
if (typedPasscode.length === 4) {
Expand Down

0 comments on commit 3941e51

Please sign in to comment.