Skip to content

Commit 03368f3

Browse files
authored
Merge pull request #448 from opendocument-app/issue-446
Get rid of Firebase dependencies
2 parents 802ad7d + 07462bb commit 03368f3

20 files changed

+342
-362
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,13 @@ fastlane/report.xml
6868
.idea/
6969

7070
app/CMakeUserPresets.json
71+
72+
venv/
73+
74+
infra/scw-transfer/.terraform/
75+
infra/scw-transfer/.terraform.lock.hcl
76+
infra/scw-transfer/secret.auto.tfvars
77+
78+
# Terraform state files
79+
*.tfstate
80+
*.tfstate.backup

app/build.gradle

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import org.apache.tools.ant.filters.ReplaceTokens
22

33
plugins {
44
id 'com.android.application'
5-
id 'com.google.gms.google-services'
6-
id 'com.google.firebase.crashlytics'
75
id 'app.opendocument.conanandroidgradleplugin'
86
}
97

@@ -93,8 +91,6 @@ android {
9391
minifyEnabled true
9492
shrinkResources true
9593
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
96-
97-
firebaseCrashlytics.nativeSymbolUploadEnabled true
9894
ndk.debugSymbolLevel = "full"
9995
}
10096
}
@@ -135,13 +131,6 @@ android {
135131
}
136132

137133
dependencies {
138-
implementation platform('com.google.firebase:firebase-bom:34.1.0')
139-
implementation 'com.google.firebase:firebase-storage'
140-
implementation 'com.google.firebase:firebase-auth'
141-
implementation 'com.google.firebase:firebase-crashlytics-ndk'
142-
implementation 'com.google.firebase:firebase-analytics'
143-
implementation 'com.google.firebase:firebase-config'
144-
145134
implementation 'com.google.android.gms:play-services-ads:24.3.0'
146135
implementation 'com.google.android.play:review:2.0.2'
147136
implementation 'com.google.android.ump:user-messaging-platform:3.1.0'

app/src/lite/google-services.json

Lines changed: 0 additions & 65 deletions
This file was deleted.

app/src/main/java/at/tomtasche/reader/background/FileLoader.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
import android.os.Parcel;
77
import android.os.Parcelable;
88

9-
import com.google.firebase.analytics.FirebaseAnalytics;
10-
119
import java.io.File;
1210
import java.util.LinkedList;
1311
import java.util.List;
1412

1513
import at.tomtasche.reader.nonfree.AnalyticsManager;
14+
import at.tomtasche.reader.nonfree.AnalyticsConstants;
1615
import at.tomtasche.reader.nonfree.CrashManager;
1716

1817
public abstract class FileLoader {
@@ -86,7 +85,7 @@ void callOnSuccess(Result result) {
8685
mainHandler.post(new Runnable() {
8786
@Override
8887
public void run() {
89-
analyticsManager.report("loader_success_" + type, FirebaseAnalytics.Param.CONTENT_TYPE, result.options.fileType, FirebaseAnalytics.Param.CONTENT, result.options.fileExtension);
88+
analyticsManager.report("loader_success_" + type, AnalyticsConstants.PARAM_CONTENT_TYPE, result.options.fileType, AnalyticsConstants.PARAM_CONTENT, result.options.fileExtension);
9089

9190
FileLoaderListener strongReferenceListener = listener;
9291
if (strongReferenceListener != null) {
@@ -103,7 +102,7 @@ void callOnError(Result result, Throwable t) {
103102
mainHandler.post(new Runnable() {
104103
@Override
105104
public void run() {
106-
analyticsManager.report("loader_error_" + type, FirebaseAnalytics.Param.CONTENT_TYPE, result.options.fileType, FirebaseAnalytics.Param.CONTENT, result.options.fileExtension);
105+
analyticsManager.report("loader_error_" + type, AnalyticsConstants.PARAM_CONTENT_TYPE, result.options.fileType, AnalyticsConstants.PARAM_CONTENT, result.options.fileExtension);
107106

108107
FileLoaderListener strongReferenceListener = listener;
109108
if (strongReferenceListener != null) {

app/src/main/java/at/tomtasche/reader/background/LoaderService.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@
1111

1212
import com.google.android.gms.common.ConnectionResult;
1313
import com.google.android.gms.common.GoogleApiAvailability;
14-
import com.google.firebase.analytics.FirebaseAnalytics;
15-
1614
import java.io.File;
1715
import java.io.OutputStream;
1816

1917
import at.tomtasche.reader.R;
18+
import at.tomtasche.reader.nonfree.AnalyticsConstants;
2019
import at.tomtasche.reader.nonfree.AnalyticsManager;
2120
import at.tomtasche.reader.nonfree.ConfigManager;
2221
import at.tomtasche.reader.nonfree.CrashManager;
@@ -134,12 +133,12 @@ public void onSuccess(FileLoader.Result result) {
134133
if (result.loaderType == FileLoader.LoaderType.METADATA) {
135134
if (!coreLoader.isSupported(options)) {
136135
crashManager.log("we do not expect this file to be an ODF: " + options.originalUri.toString());
137-
analyticsManager.report("load_odf_error_expected", FirebaseAnalytics.Param.CONTENT_TYPE, options.fileType);
136+
analyticsManager.report("load_odf_error_expected", AnalyticsConstants.PARAM_CONTENT_TYPE, options.fileType);
138137
}
139138

140139
loadWithType(FileLoader.LoaderType.CORE, options);
141140
} else {
142-
analyticsManager.report("load_success", FirebaseAnalytics.Param.CONTENT_TYPE, options.fileType, FirebaseAnalytics.Param.CONTENT, result.loaderType.toString());
141+
analyticsManager.report("load_success", AnalyticsConstants.PARAM_CONTENT_TYPE, options.fileType, AnalyticsConstants.PARAM_CONTENT, result.loaderType.toString());
143142

144143
if (currentListener != null) {
145144
currentListener.onLoadSuccess(result);
@@ -167,7 +166,7 @@ public void onError(FileLoader.Result result, Throwable error) {
167166
}
168167

169168
if (result.loaderType == FileLoader.LoaderType.CORE) {
170-
analyticsManager.report("load_odf_error", FirebaseAnalytics.Param.CONTENT_TYPE, options.fileType);
169+
analyticsManager.report("load_odf_error", AnalyticsConstants.PARAM_CONTENT_TYPE, options.fileType);
171170

172171
if (rawLoader.isSupported(options)) {
173172
loadWithType(FileLoader.LoaderType.RAW, options);
@@ -192,7 +191,7 @@ public void onError(FileLoader.Result result, Throwable error) {
192191

193192
// MetadataLoader failed, so there's no point in trying to parse or upload the file
194193

195-
analyticsManager.report("load_error", FirebaseAnalytics.Param.CONTENT_TYPE, options.fileType, FirebaseAnalytics.Param.CONTENT, result.loaderType.toString());
194+
analyticsManager.report("load_error", AnalyticsConstants.PARAM_CONTENT_TYPE, options.fileType, AnalyticsConstants.PARAM_CONTENT, result.loaderType.toString());
196195

197196
if (currentListener != null) {
198197
currentListener.onError(result, error);
@@ -238,7 +237,7 @@ private void saveSync(FileLoader.Result lastResult, Uri outFile, String htmlDiff
238237
}
239238
});
240239
} catch (Throwable e) {
241-
analyticsManager.report("save_error", FirebaseAnalytics.Param.CONTENT_TYPE, lastResult.options.fileType);
240+
analyticsManager.report("save_error", AnalyticsConstants.PARAM_CONTENT_TYPE, lastResult.options.fileType);
242241
crashManager.log(e, lastResult.options.originalUri);
243242

244243
if (currentListener != null) {
@@ -287,4 +286,4 @@ public interface LoaderListener {
287286
void onUnsupported(FileLoader.Result result);
288287
void onSaveError();
289288
}
290-
}
289+
}

app/src/main/java/at/tomtasche/reader/background/OnlineLoader.java

Lines changed: 49 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,12 @@
33
import android.content.Context;
44
import android.net.Uri;
55
import android.os.Build;
6-
import android.os.Handler;
76

87
import androidx.annotation.RequiresApi;
98

10-
import com.google.android.gms.tasks.Task;
11-
import com.google.android.gms.tasks.Tasks;
12-
import com.google.firebase.auth.AuthResult;
13-
import com.google.firebase.auth.FirebaseAuth;
14-
import com.google.firebase.storage.FirebaseStorage;
15-
import com.google.firebase.storage.StorageMetadata;
16-
import com.google.firebase.storage.StorageReference;
17-
import com.google.firebase.storage.UploadTask;
18-
199
import java.io.File;
2010
import java.io.IOException;
11+
import java.io.InputStream;
2112
import java.io.OutputStream;
2213
import java.io.OutputStreamWriter;
2314
import java.io.PrintWriter;
@@ -26,14 +17,11 @@
2617
import java.net.URL;
2718
import java.net.URLEncoder;
2819
import java.nio.file.Files;
29-
import java.util.UUID;
30-
import java.util.concurrent.ExecutionException;
31-
32-
import at.tomtasche.reader.nonfree.AnalyticsManager;
33-
import at.tomtasche.reader.nonfree.CrashManager;
3420

3521
public class OnlineLoader extends FileLoader {
3622

23+
private static final String TRANSFER_BASE_URL = "https://transfer.opendocument.app/";
24+
3725
// https://help.joomlatools.com/article/169-google-viewer
3826
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
3927
private static final String[] MIME_WHITELIST = {"text/", "image/", "video/", "audio/",
@@ -76,26 +64,11 @@ public class OnlineLoader extends FileLoader {
7664

7765
private final CoreLoader coreLoader;
7866

79-
private StorageReference storage;
80-
private FirebaseAuth auth;
81-
8267
public OnlineLoader(Context context, CoreLoader coreLoader) {
8368
super(context, LoaderType.ONLINE);
8469
this.coreLoader = coreLoader;
8570
}
8671

87-
@Override
88-
public void initialize(FileLoaderListener listener, Handler mainHandler, Handler backgroundHandler, AnalyticsManager analyticsManager, CrashManager crashManager) {
89-
super.initialize(listener, mainHandler, backgroundHandler, analyticsManager, crashManager);
90-
91-
try {
92-
storage = FirebaseStorage.getInstance().getReference();
93-
auth = FirebaseAuth.getInstance();
94-
} catch (Throwable e) {
95-
crashManager.log(e);
96-
}
97-
}
98-
9972
@Override
10073
public boolean isSupported(Options options) {
10174
String fileType = options.fileType;
@@ -129,7 +102,7 @@ public void loadSync(Options options) {
129102
("text/rtf".equals(options.fileType) || "application/vnd.wordperfect".equals(options.fileType) || coreLoader.isSupported(options) || "application/vnd.ms-excel".equals(options.fileType) || "application/msword".equals(options.fileType) || "application/vnd.ms-powerpoint".equals(options.fileType) || options.fileType.startsWith("application/vnd.openxmlformats-officedocument.") || options.fileType.equals("application/pdf"))) {
130103
viewerUri = doOnlineConvert(options);
131104
} else {
132-
viewerUri = doFirebaseConvert(options);
105+
viewerUri = doTransferUpload(options);
133106
}
134107

135108
result.partTitles.add(null);
@@ -175,66 +148,63 @@ private Uri doOnlineConvert(Options options) throws IOException {
175148
return Uri.parse(basePath + redirectUrl);
176149
}
177150

178-
private Uri doFirebaseConvert(Options options) throws ExecutionException, InterruptedException, UnsupportedEncodingException {
179-
if (auth == null || storage == null) {
180-
throw new RuntimeException("firebase not initialized");
181-
}
151+
private Uri doTransferUpload(Options options) throws IOException {
152+
File binaryFile = AndroidFileCache.getCacheFile(context, options.cacheUri);
153+
String filename = options.filename;
154+
String encodedFilename = URLEncoder.encode(filename, StreamUtil.ENCODING);
182155

183-
Task<AuthResult> authenticationTask = null;
184-
String currentUserId = null;
185-
if (auth.getCurrentUser() != null) {
186-
currentUserId = auth.getCurrentUser().getUid();
187-
} else {
188-
authenticationTask = auth.signInAnonymously();
156+
HttpURLConnection connection = (HttpURLConnection) new URL(TRANSFER_BASE_URL + encodedFilename).openConnection();
157+
connection.setRequestMethod("PUT");
158+
connection.setDoOutput(true);
159+
connection.setInstanceFollowRedirects(false);
160+
161+
try (OutputStream outputStream = connection.getOutputStream()) {
162+
Files.copy(binaryFile.toPath(), outputStream);
163+
outputStream.flush();
189164
}
190165

191-
if (authenticationTask != null) {
192-
Tasks.await(authenticationTask);
166+
int responseCode = connection.getResponseCode();
167+
if (responseCode >= 200 && responseCode < 300) {
168+
String downloadUrl = readBody(connection);
169+
if (downloadUrl == null || downloadUrl.isEmpty()) {
170+
throw new IOException("server couldn't handle request");
171+
}
193172

194-
currentUserId = authenticationTask.getResult().getUser().getUid();
173+
return buildViewerUri(options, downloadUrl.trim());
174+
} else {
175+
String error = readError(connection);
176+
throw new IOException("server couldn't handle request: " + responseCode + " " + error);
195177
}
178+
}
196179

197-
StorageMetadata.Builder metadataBuilder = new StorageMetadata.Builder();
198-
if (!"N/A".equals(options.fileType)) {
199-
metadataBuilder.setContentType(options.fileType);
180+
private Uri buildViewerUri(Options options, String downloadUrl) throws UnsupportedEncodingException {
181+
if (coreLoader.isSupported(options)) {
182+
// ODF does not seem to be supported by google docs viewer
183+
return Uri.parse(MICROSOFT_VIEWER_URL + downloadUrl);
184+
} else {
185+
return Uri.parse(GOOGLE_VIEWER_URL + URLEncoder.encode(downloadUrl, StreamUtil.ENCODING));
200186
}
187+
}
201188

202-
String filePath = currentUserId + "/" + UUID.randomUUID() + "." + options.fileExtension;
203-
StorageReference reference = storage.child("uploads/" + filePath);
204-
UploadTask uploadTask = reference.putFile(options.cacheUri, metadataBuilder.build());
205-
Tasks.await(uploadTask);
206-
207-
if (uploadTask.isSuccessful()) {
208-
Uri viewerUri;
209-
if (coreLoader.isSupported(options)) {
210-
// ODF does not seem to be supported by google docs viewer
211-
String downloadUrl = "https://us-central1-admob-app-id-9025061963.cloudfunctions.net/download?filePath=" + filePath;
189+
private String readBody(HttpURLConnection connection) throws IOException {
190+
InputStream inputStream = connection.getInputStream();
191+
if (inputStream == null) {
192+
return null;
193+
}
212194

213-
viewerUri = Uri.parse(MICROSOFT_VIEWER_URL + downloadUrl);
214-
} else {
215-
Task<Uri> urlTask = reference.getDownloadUrl();
216-
Tasks.await(urlTask);
217-
String downloadUrl = urlTask.getResult().toString();
195+
return StreamUtil.readFully(inputStream);
196+
}
218197

219-
viewerUri = Uri.parse(GOOGLE_VIEWER_URL + URLEncoder.encode(downloadUrl, StreamUtil.ENCODING));
198+
private String readError(HttpURLConnection connection) {
199+
try {
200+
InputStream errorStream = connection.getErrorStream();
201+
if (errorStream == null) {
202+
return null;
220203
}
221204

222-
return viewerUri;
223-
} else {
224-
throw new RuntimeException("server couldn't handle request");
205+
return StreamUtil.readFully(errorStream);
206+
} catch (Throwable t) {
207+
return null;
225208
}
226209
}
227-
228-
@Override
229-
public void close() {
230-
super.close();
231-
232-
backgroundHandler.post(new Runnable() {
233-
@Override
234-
public void run() {
235-
auth = null;
236-
storage = null;
237-
}
238-
});
239-
}
240210
}

0 commit comments

Comments
 (0)