Skip to content

Commit b8a7c69

Browse files
authored
Merge branch 'Expensify:main' into openPolicyCompanyCardsFeed-emailList
2 parents cccde95 + 94e72fc commit b8a7c69

71 files changed

Lines changed: 3178 additions & 1571 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/buildAdHoc.yml

Lines changed: 472 additions & 0 deletions
Large diffs are not rendered by default.

.github/workflows/testBuild.yml

Lines changed: 24 additions & 370 deletions
Large diffs are not rendered by default.

.github/workflows/testBuildOnPush.yml

Lines changed: 25 additions & 397 deletions
Large diffs are not rendered by default.

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ android {
113113
minSdkVersion rootProject.ext.minSdkVersion
114114
targetSdkVersion rootProject.ext.targetSdkVersion
115115
multiDexEnabled rootProject.ext.multiDexEnabled
116-
versionCode 1009031802
117-
versionName "9.3.18-2"
116+
versionCode 1009031806
117+
versionName "9.3.18-6"
118118
// Supported language variants must be declared here to avoid from being removed during the compilation.
119119
// This also helps us to not include unnecessary language variants in the APK.
120120
resConfigs "en", "es"

android/app/src/main/java/com/expensify/chat/bootsplash/BootSplashModule.java

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.expensify.chat.R;
1717
import com.facebook.common.logging.FLog;
1818
import com.facebook.react.bridge.Promise;
19+
import com.facebook.react.bridge.LifecycleEventListener;
1920
import com.facebook.react.bridge.ReactApplicationContext;
2021
import com.facebook.react.bridge.ReactContextBaseJavaModule;
2122
import com.facebook.react.bridge.ReactMethod;
@@ -30,7 +31,7 @@
3031
import java.util.TimerTask;
3132

3233
@ReactModule(name = BootSplashModule.NAME)
33-
public class BootSplashModule extends ReactContextBaseJavaModule {
34+
public class BootSplashModule extends ReactContextBaseJavaModule implements LifecycleEventListener {
3435

3536
public static final String NAME = "BootSplash";
3637
private static final BootSplashQueue<Promise> mPromiseQueue = new BootSplashQueue<>();
@@ -41,6 +42,26 @@ public class BootSplashModule extends ReactContextBaseJavaModule {
4142

4243
public BootSplashModule(ReactApplicationContext reactContext) {
4344
super(reactContext);
45+
reactContext.addLifecycleEventListener(this);
46+
}
47+
48+
@Override
49+
public void onHostResume() {}
50+
51+
@Override
52+
public void onHostPause() {}
53+
54+
@Override
55+
public void onHostDestroy() {
56+
mShouldKeepOnScreen = false;
57+
clearPromiseQueue();
58+
59+
if (mDialog != null) {
60+
try {
61+
mDialog.dismiss();
62+
} catch (Exception ignored) {}
63+
mDialog = null;
64+
}
4465
}
4566

4667
@Override
@@ -123,19 +144,63 @@ public void onSplashScreenExit(@NonNull SplashScreenView view) {
123144

124145
mDialog = new BootSplashDialog(activity, R.style.BootTheme);
125146

126-
mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
147+
UiThreadUtil.runOnUiThread(new Runnable() {
127148
@Override
128-
public void onShow(DialogInterface dialog) {
129-
mShouldKeepOnScreen = false;
149+
public void run() {
150+
showDialog(mDialog, new Runnable() {
151+
@Override
152+
public void run() {
153+
mShouldKeepOnScreen = false;
154+
}
155+
});
130156
}
131157
});
158+
}
132159

133-
UiThreadUtil.runOnUiThread(new Runnable() {
160+
private static void showDialog(
161+
@NonNull final BootSplashDialog dialog,
162+
@NonNull final Runnable callback
163+
) {
164+
if (dialog.isShowing()) {
165+
callback.run();
166+
return;
167+
}
168+
169+
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
134170
@Override
135-
public void run() {
136-
mDialog.show();
171+
public void onShow(DialogInterface d) {
172+
callback.run();
173+
}
174+
});
175+
176+
try {
177+
dialog.show();
178+
} catch (Exception exception) {
179+
callback.run();
180+
}
181+
}
182+
183+
private static void dismissDialog(
184+
@Nullable final BootSplashDialog dialog,
185+
@NonNull final Runnable callback
186+
) {
187+
if (dialog == null || !dialog.isShowing()) {
188+
callback.run();
189+
return;
190+
}
191+
192+
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
193+
@Override
194+
public void onDismiss(DialogInterface d) {
195+
callback.run();
137196
}
138197
});
198+
199+
try {
200+
dialog.dismiss();
201+
} catch (Exception exception) {
202+
callback.run();
203+
}
139204
}
140205

141206
private void clearPromiseQueue() {
@@ -153,7 +218,7 @@ private void hideAndClearPromiseQueue() {
153218
public void run() {
154219
final Activity activity = getReactApplicationContext().getCurrentActivity();
155220

156-
if (mShouldKeepOnScreen || activity == null || activity.isFinishing()) {
221+
if (mShouldKeepOnScreen || activity == null || activity.isFinishing() || activity.isDestroyed()) {
157222
final Timer timer = new Timer();
158223

159224
timer.schedule(new TimerTask() {
@@ -166,15 +231,13 @@ public void run() {
166231
} else if (mDialog == null) {
167232
clearPromiseQueue();
168233
} else {
169-
mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
234+
dismissDialog(mDialog, new Runnable() {
170235
@Override
171-
public void onDismiss(DialogInterface dialog) {
236+
public void run() {
172237
mDialog = null;
173238
clearPromiseQueue();
174239
}
175240
});
176-
177-
mDialog.dismiss();
178241
}
179242
}
180243
});

docs/articles/Unlisted/Compliance-Documentation.md

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,91 @@
11
---
22
title: How to access Expensify’s SOC 1, SOC 2, and compliance documentation
3-
description: Learn how to access Expensify’s SOC 1 and SOC 2 reports, bridge letter, and key legal policies.
4-
keywords: SOC 1, SOC 2, security report, compliance, bridge letter, Expensify privacy policy, Expensify subprocessors, Expensify terms of service
3+
description: Learn how to request compliance documents through the Expensify Trust Center.
4+
keywords: SOC, SOC 1 Type 2, SOC 2 Type 2, bridge letter, W-9, COI, Certificate of Insurance, compliance documentation, security report, vendor security review
5+
internalScope: Audience is security reviewers, procurement teams, and customers evaluating Expensify. Covers how to obtain SOC reports and compliance documentation from the Trust Center. Does not cover technical security architecture details or audit control explanations.
56
---
67

7-
Expensify is committed to keeping your data secure and transparent. You can access our latest SOC reports and compliance documentation below.
8+
Expensify is committed to protecting your data and maintaining transparency around our security practices.
89

9-
# Expensify SOC 1 and SOC 2 reports
10+
All compliance documentation, including SOC reports and insurance certificates — is available through our Trust Center.
1011

11-
You can view or download the following audit documents to verify our security and operational controls:
12+
---
13+
14+
# How to access Expensify compliance documentation
15+
16+
You can request and download the latest compliance documents directly from the Expensify Trust Center:
17+
18+
https://trust.expensify.com/
19+
20+
The Trust Center includes:
21+
22+
- SOC 1 Type 2 Report
23+
- SOC 2 Type 2 Report
24+
- SOC 1 and SOC 2 Bridge Letter
25+
- Certificate of Insurance
26+
- W-9
27+
- Additional security and compliance resources
28+
29+
You may be asked to submit a short access request form before downloading certain documents.
30+
31+
---
32+
33+
# How to request Expensify’s SOC 1 Type 2 Report or SOC 2 Type 2 Report
34+
35+
If you need a SOC report for a vendor security review or procurement process:
36+
37+
1. Go to https://trust.expensify.com/
38+
2. Select the SOC 1 Type 2 Report or SOC 2 Type 2 Report
39+
3. Click Request access
40+
4. Complete the request form
41+
5. Submit the form to receive access instructions
1242

13-
- [Bridge Letter for SOC 1 and SOC 2 – June 2025](https://drive.google.com/file/d/1kxttniCMLFah4uPNjhknxs0Zor6tWGWE/view?usp=drive_link)
14-
- [SOC 1 Type 2 Report – September 30, 2024](https://s3-us-west-1.amazonaws.com/concierge-responses-expensify-com/uploads%2F1733950182002-SOC+1+Type+2+Report+09-30-24+-+Expensify.pdf)
15-
- [SOC 2 Type 2 Report – September 30, 2024](https://s3-us-west-1.amazonaws.com/concierge-responses-expensify-com/uploads%2F1733950193162-SOC+2+Type+2+Report+09-30-24+-+Expensify.pdf)
43+
---
44+
45+
# How to get Expensify’s SOC 1 and SOC 2 Bridge Letter
46+
47+
The SOC bridge letter provides coverage between the end of the last audit period and the current date.
48+
49+
To access the bridge letter:
50+
51+
1. Visit https://trust.expensify.com/
52+
2. Select SOC 1 and SOC 2 Bridge Letter
53+
3. Click Request access (if prompted)
54+
4. Download the document once approved
55+
56+
---
57+
58+
# How to get Expensify’s W-9 or Certificate of Insurance
59+
60+
For accounting, tax setup, or vendor onboarding:
1661

17-
**Note:** If you need additional details for vendor security reviews or procurement, reach out to your Account Manager or [Concierge](mailto:concierge@expensify.com).
62+
1. Go to https://trust.expensify.com/
63+
2. Select W-9 or Certificate of Insurance
64+
3. Request or download the document
1865

1966
---
2067

21-
# Additional Expensify legal resources
68+
# When to contact Expensify about compliance documentation
2269

23-
You can find more information about our legal and compliance commitments here:
70+
If you’re unable to access a document in the Trust Center, or if your organization requires additional documentation for a vendor security review, reach out to your Account Manager or Concierge.
2471

25-
- [Expensify Terms of Service](https://www.expensify.com/terms)
26-
- [Expensify Privacy Policy](https://www.expensify.com/privacy)
27-
- [List of Subprocessors](https://use.expensify.com/subprocessors)
72+
Include details about:
73+
74+
- The document you need
75+
- Your company name
76+
- Any required deadline
77+
78+
This helps us respond as quickly as possible.
2879

2980
---
3081

3182
# FAQ
3283

33-
## Who can access Expensify’s SOC 1 and SOC 2 reports?
84+
## Who can access Expensify’s SOC 1 Type 2 and SOC 2 Type 2 reports?
85+
86+
Anyone conducting a vendor security review or procurement evaluation can request access through the Trust Center. Approval may be required before downloading.
3487

35-
Anyone evaluating Expensify for security and compliance purposes can access these reports using the links above. If you're a current customer, you can also request them from your Account Manager.
88+
## What is the SOC bridge letter used for?
3689

37-
## What is the bridge letter for?
90+
The bridge letter provides coverage between the end date of the most recent SOC audit and the present date. It confirms there have been no material changes affecting control effectiveness.
3891

39-
The bridge letter explains the period between the last audit date and the current date to maintain coverage while a new audit is underway.

ios/NewExpensify/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.3.18.2</string>
47+
<string>9.3.18.6</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.3.18</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.3.18.2</string>
16+
<string>9.3.18.6</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/ShareViewController/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.3.18</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.3.18.2</string>
16+
<string>9.3.18.6</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

0 commit comments

Comments
 (0)