19
19
import android .app .Activity ;
20
20
import android .content .Context ;
21
21
import android .content .Intent ;
22
- import android .os .Handler ;
23
- import android .os .Looper ;
24
22
import android .util .Log ;
25
23
import androidx .annotation .NonNull ;
26
- import androidx .core . os . HandlerCompat ;
24
+ import androidx .annotation . VisibleForTesting ;
27
25
import com .google .android .gms .tasks .CancellationTokenSource ;
28
26
import com .google .android .gms .tasks .Task ;
29
27
import com .google .android .gms .tasks .TaskCompletionSource ;
@@ -45,73 +43,65 @@ class UpdateApkClient {
45
43
private static final String TAG = "FADUpdateAppClient" ;
46
44
private static final String REQUEST_METHOD = "GET" ;
47
45
private TaskCompletionSource <File > downloadTaskCompletionSource ;
48
- private CancellationTokenSource downloadCancellationTokenSource ;
49
46
private final Executor downloadExecutor ;
50
- private final Handler downloadHandler ;
51
47
private TaskCompletionSource <Void > installTaskCompletionSource ;
52
48
private final FirebaseApp firebaseApp ;
53
- private UpdateTaskImpl updateTask ;
54
- private TaskCompletionSource updateAppTaskCompletionSource ;
55
49
56
50
public UpdateApkClient (@ NonNull FirebaseApp firebaseApp ) {
57
51
this .downloadExecutor = Executors .newSingleThreadExecutor ();
58
- this .downloadHandler = HandlerCompat .createAsync (Looper .getMainLooper ());
59
52
this .firebaseApp = firebaseApp ;
60
53
}
61
54
62
55
public void updateApk (
63
- @ NonNull String downloadUrl ,
64
- @ NonNull Activity currentActivity ,
65
56
@ NonNull UpdateTaskImpl updateTask ,
66
- @ NonNull TaskCompletionSource updateAppTaskCompletionSource ) {
67
- this . updateTask = updateTask ;
68
- this . updateAppTaskCompletionSource = updateAppTaskCompletionSource ;
69
- downloadApk (downloadUrl )
57
+ @ NonNull String downloadUrl ,
58
+ @ NonNull Activity currentActivity ) {
59
+
60
+ downloadApk (downloadUrl , updateTask )
70
61
.addOnSuccessListener (
62
+ downloadExecutor ,
71
63
file ->
72
64
install (file .getPath (), currentActivity )
73
65
.addOnSuccessListener (
74
- downloadExecutor ,
75
- Void -> {
76
- updateTask .updateProgress (
77
- UpdateProgress .builder ()
78
- .setApkFileTotalBytes (file .length ())
79
- .setApkBytesDownloaded (file .length ())
80
- .setUpdateStatus (UpdateStatus .DOWNLOADED )
81
- .build ());
82
- updateAppTaskCompletionSource .setResult (null );
66
+ unused -> {
67
+ postUpdateProgress (
68
+ updateTask , file .length (), file .length (), UpdateStatus .DOWNLOADED );
69
+ updateTask .setResult ();
83
70
})
84
71
.addOnFailureListener (
85
72
e ->
86
- setUpdateAppErrorWithDefault (
73
+ setTaskCompletionErrorWithDefault (
74
+ updateTask ,
87
75
e ,
88
76
new FirebaseAppDistributionException (
89
77
Constants .ErrorMessages .NETWORK_ERROR ,
90
78
FirebaseAppDistributionException .Status .INSTALLATION_FAILURE ))))
91
79
.addOnFailureListener (
80
+ downloadExecutor ,
92
81
e ->
93
- setUpdateAppErrorWithDefault (
82
+ setTaskCompletionErrorWithDefault (
83
+ updateTask ,
94
84
e ,
95
85
new FirebaseAppDistributionException (
96
86
Constants .ErrorMessages .NETWORK_ERROR ,
97
87
FirebaseAppDistributionException .Status .DOWNLOAD_FAILURE )));
98
88
}
99
89
100
- private @ NonNull Task <File > downloadApk (@ NonNull String downloadUrl ) {
90
+ @ VisibleForTesting
91
+ @ NonNull
92
+ Task <File > downloadApk (@ NonNull String downloadUrl , UpdateTaskImpl updateTask ) {
101
93
if (downloadTaskCompletionSource != null
102
94
&& !downloadTaskCompletionSource .getTask ().isComplete ()) {
103
- downloadCancellationTokenSource . cancel ();
95
+ return downloadTaskCompletionSource . getTask ();
104
96
}
105
97
106
- downloadCancellationTokenSource = new CancellationTokenSource ();
107
- downloadTaskCompletionSource =
108
- new TaskCompletionSource <>(downloadCancellationTokenSource .getToken ());
98
+ downloadTaskCompletionSource = new TaskCompletionSource <>();
109
99
110
- makeApkDownloadRequest (downloadUrl );
100
+ makeApkDownloadRequest (downloadUrl , updateTask );
111
101
return downloadTaskCompletionSource .getTask ();
112
102
}
113
103
114
- private void makeApkDownloadRequest (@ NonNull String downloadUrl ) {
104
+ private void makeApkDownloadRequest (@ NonNull String downloadUrl , UpdateTaskImpl updateTask ) {
115
105
downloadExecutor .execute (
116
106
() -> {
117
107
try {
@@ -124,9 +114,9 @@ private void makeApkDownloadRequest(@NonNull String downloadUrl) {
124
114
FirebaseAppDistributionException .Status .DOWNLOAD_FAILURE ));
125
115
} else {
126
116
long responseLength = connection .getContentLength ();
127
- postUpdateProgress (responseLength , 0 , UpdateStatus .PENDING );
117
+ postUpdateProgress (updateTask , responseLength , 0 , UpdateStatus .PENDING );
128
118
String fileName = getApplicationName () + ".apk" ;
129
- downloadToDisk (connection .getInputStream (), responseLength , fileName );
119
+ downloadToDisk (connection .getInputStream (), responseLength , fileName , updateTask );
130
120
}
131
121
} catch (IOException | FirebaseAppDistributionException e ) {
132
122
setDownloadTaskCompletionErrorWithDefault (
@@ -138,7 +128,8 @@ private void makeApkDownloadRequest(@NonNull String downloadUrl) {
138
128
});
139
129
}
140
130
141
- private void downloadToDisk (InputStream input , long totalSize , String fileName ) {
131
+ private void downloadToDisk (
132
+ InputStream input , long totalSize , String fileName , UpdateTaskImpl updateTask ) {
142
133
143
134
File apkFile = getApkFileForApp (fileName );
144
135
apkFile .delete ();
@@ -160,11 +151,11 @@ private void downloadToDisk(InputStream input, long totalSize, String fileName)
160
151
long currentTimeMs = System .currentTimeMillis ();
161
152
if (currentTimeMs - lastMsUpdated > UPDATE_INTERVAL_MS ) {
162
153
lastMsUpdated = currentTimeMs ;
163
- postUpdateProgress (totalSize , downloadedSize , UpdateStatus .DOWNLOADING );
154
+ postUpdateProgress (updateTask , totalSize , downloadedSize , UpdateStatus .DOWNLOADING );
164
155
}
165
156
}
166
157
// completion
167
- postUpdateProgress (totalSize , downloadedSize , UpdateStatus .DOWNLOADED );
158
+ postUpdateProgress (updateTask , totalSize , downloadedSize , UpdateStatus .DOWNLOADED );
168
159
169
160
} catch (IOException e ) {
170
161
setDownloadTaskCompletionError (
@@ -257,30 +248,31 @@ void setInstallationResult(int resultCode) {
257
248
}
258
249
}
259
250
260
- private void setUpdateAppTaskCompletionError ( FirebaseAppDistributionException e ) {
261
- if ( updateAppTaskCompletionSource != null
262
- && !updateAppTaskCompletionSource . getTask () .isComplete ()) {
263
- updateAppTaskCompletionSource .setException (e );
251
+ private void setTaskCompletionError (
252
+ UpdateTaskImpl updateTask , FirebaseAppDistributionException e ) {
253
+ if ( updateTask != null && !updateTask .isComplete ()) {
254
+ updateTask .setException (e );
264
255
}
265
256
}
266
257
267
- private void setUpdateAppErrorWithDefault (
268
- Exception e , FirebaseAppDistributionException defaultFirebaseException ) {
258
+ private void setTaskCompletionErrorWithDefault (
259
+ UpdateTaskImpl updateTask ,
260
+ Exception e ,
261
+ FirebaseAppDistributionException defaultFirebaseException ) {
269
262
if (e instanceof FirebaseAppDistributionException ) {
270
- setUpdateAppTaskCompletionError ( (FirebaseAppDistributionException ) e );
263
+ setTaskCompletionError ( updateTask , (FirebaseAppDistributionException ) e );
271
264
} else {
272
- setUpdateAppTaskCompletionError ( defaultFirebaseException );
265
+ setTaskCompletionError ( updateTask , defaultFirebaseException );
273
266
}
274
267
}
275
268
276
- private void postUpdateProgress (long totalBytes , long downloadedBytes , UpdateStatus status ) {
277
- downloadHandler .post (
278
- () ->
279
- updateTask .updateProgress (
280
- UpdateProgress .builder ()
281
- .setApkFileTotalBytes (totalBytes )
282
- .setApkBytesDownloaded (downloadedBytes )
283
- .setUpdateStatus (status )
284
- .build ()));
269
+ private void postUpdateProgress (
270
+ UpdateTaskImpl updateTask , long totalBytes , long downloadedBytes , UpdateStatus status ) {
271
+ updateTask .updateProgress (
272
+ UpdateProgress .builder ()
273
+ .setApkFileTotalBytes (totalBytes )
274
+ .setApkBytesDownloaded (downloadedBytes )
275
+ .setUpdateStatus (status )
276
+ .build ());
285
277
}
286
278
}
0 commit comments