Skip to content

Commit 9ec7f9c

Browse files
committed
entirely get rid of firebase dependencies
1 parent 14bd341 commit 9ec7f9c

File tree

20 files changed

+714
-133
lines changed

20 files changed

+714
-133
lines changed

.gitignore

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

7070
app/CMakeUserPresets.json
71+
72+
infra/scw-transfer/terraform.tfvars
73+
74+
venv/
75+
76+
infra/scw-transfer/.terraform/

app/build.gradle

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import org.apache.tools.ant.filters.ReplaceTokens
33
plugins {
44
id 'com.android.application'
55
id 'com.google.gms.google-services'
6-
id 'com.google.firebase.crashlytics'
76
id 'app.opendocument.conanandroidgradleplugin'
87
}
98

@@ -51,6 +50,7 @@ android {
5150
)
5251
}
5352
}
53+
5454
}
5555

5656
flavorDimensions "default"
@@ -93,8 +93,6 @@ android {
9393
minifyEnabled true
9494
shrinkResources true
9595
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
96-
97-
firebaseCrashlytics.nativeSymbolUploadEnabled true
9896
ndk.debugSymbolLevel = "full"
9997
}
10098
}
@@ -135,11 +133,6 @@ android {
135133
}
136134

137135
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-
143136
implementation 'com.google.android.gms:play-services-ads:24.3.0'
144137
implementation 'com.google.android.play:review:2.0.2'
145138
implementation 'com.google.android.ump:user-messaging-platform:3.1.0'

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: 67 additions & 78 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://transfershxuil1jyq-transfer-sh.functions.fnc.nl-ams.scw.cloud";
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;
@@ -126,10 +99,10 @@ public void loadSync(Options options) {
12699
try {
127100
Uri viewerUri;
128101
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
129-
("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"))) {
102+
("text/rtf".equals(options.fileType))) {
130103
viewerUri = doOnlineConvert(options);
131104
} else {
132-
viewerUri = doFirebaseConvert(options);
105+
viewerUri = doTransferUpload(options);
133106
}
134107

135108
result.partTitles.add(null);
@@ -175,66 +148,82 @@ 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");
151+
private Uri doTransferUpload(Options options) throws IOException {
152+
File binaryFile = AndroidFileCache.getCacheFile(context, options.cacheUri);
153+
String filename = options.filename;
154+
if (filename == null || filename.isEmpty()) {
155+
filename = "document." + options.fileExtension;
181156
}
182157

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();
158+
String encodedFilename = URLEncoder.encode(filename, StreamUtil.ENCODING);
159+
String basePath = ensureTrailingSlash(TRANSFER_BASE_URL);
160+
HttpURLConnection connection = (HttpURLConnection) new URL(basePath + encodedFilename).openConnection();
161+
connection.setRequestMethod("PUT");
162+
connection.setDoOutput(true);
163+
connection.setInstanceFollowRedirects(false);
164+
if (!"N/A".equals(options.fileType)) {
165+
connection.setRequestProperty("Content-Type", options.fileType);
189166
}
190167

191-
if (authenticationTask != null) {
192-
Tasks.await(authenticationTask);
193-
194-
currentUserId = authenticationTask.getResult().getUser().getUid();
168+
try (OutputStream outputStream = connection.getOutputStream()) {
169+
Files.copy(binaryFile.toPath(), outputStream);
170+
outputStream.flush();
195171
}
196172

197-
StorageMetadata.Builder metadataBuilder = new StorageMetadata.Builder();
198-
if (!"N/A".equals(options.fileType)) {
199-
metadataBuilder.setContentType(options.fileType);
200-
}
173+
int responseCode = connection.getResponseCode();
174+
if (responseCode >= 200 && responseCode < 300) {
175+
String downloadUrl = readBody(connection);
176+
if (downloadUrl == null || downloadUrl.isEmpty()) {
177+
downloadUrl = connection.getHeaderField("Location");
178+
}
201179

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);
180+
if (downloadUrl == null || downloadUrl.isEmpty()) {
181+
throw new IOException("server couldn't handle request");
182+
}
206183

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;
184+
return buildViewerUri(options, downloadUrl.trim());
185+
} else {
186+
String error = readError(connection);
187+
throw new IOException("server couldn't handle request: " + responseCode + " " + error);
188+
}
189+
}
212190

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();
191+
private Uri buildViewerUri(Options options, String downloadUrl) throws UnsupportedEncodingException {
192+
if (coreLoader.isSupported(options)) {
193+
// ODF does not seem to be supported by google docs viewer
194+
return Uri.parse(MICROSOFT_VIEWER_URL + downloadUrl);
195+
} else {
196+
return Uri.parse(GOOGLE_VIEWER_URL + URLEncoder.encode(downloadUrl, StreamUtil.ENCODING));
197+
}
198+
}
218199

219-
viewerUri = Uri.parse(GOOGLE_VIEWER_URL + URLEncoder.encode(downloadUrl, StreamUtil.ENCODING));
220-
}
200+
private String ensureTrailingSlash(String base) {
201+
if (base.endsWith("/")) {
202+
return base;
203+
}
221204

222-
return viewerUri;
223-
} else {
224-
throw new RuntimeException("server couldn't handle request");
205+
return base + "/";
206+
}
207+
208+
private String readBody(HttpURLConnection connection) throws IOException {
209+
InputStream inputStream = connection.getInputStream();
210+
if (inputStream == null) {
211+
return null;
225212
}
213+
214+
return StreamUtil.readFully(inputStream);
226215
}
227216

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;
217+
private String readError(HttpURLConnection connection) {
218+
try {
219+
InputStream errorStream = connection.getErrorStream();
220+
if (errorStream == null) {
221+
return null;
237222
}
238-
});
223+
224+
return StreamUtil.readFully(errorStream);
225+
} catch (Throwable t) {
226+
return null;
227+
}
239228
}
240229
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package at.tomtasche.reader.background;
22

3+
import java.io.ByteArrayOutputStream;
34
import java.io.File;
45
import java.io.FileInputStream;
56
import java.io.FileOutputStream;
@@ -27,6 +28,13 @@ public static void copy(InputStream in, File dst) throws IOException {
2728
out.close();
2829
}
2930

31+
public static String readFully(InputStream in) throws IOException {
32+
ByteArrayOutputStream out = new ByteArrayOutputStream();
33+
copy(in, out);
34+
35+
return out.toString(ENCODING);
36+
}
37+
3038
// taken from: https://stackoverflow.com/a/9293885/198996
3139
public static void copy(InputStream in, OutputStream out) throws IOException {
3240
try {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package at.tomtasche.reader.nonfree;
2+
3+
public final class AnalyticsConstants {
4+
5+
private AnalyticsConstants() {
6+
}
7+
8+
public static final String PARAM_CONTENT_TYPE = "content_type";
9+
public static final String PARAM_CONTENT = "content";
10+
public static final String PARAM_ITEM_NAME = "item_name";
11+
12+
public static final String EVENT_SELECT_CONTENT = "select_content";
13+
public static final String EVENT_VIEW_ITEM = "view_item";
14+
public static final String EVENT_ADD_TO_CART = "add_to_cart";
15+
public static final String EVENT_SEARCH = "search";
16+
}

0 commit comments

Comments
 (0)