|
23 | 23 | import androidx.annotation.VisibleForTesting;
|
24 | 24 | import com.google.android.gms.tasks.Task;
|
25 | 25 | import com.google.android.gms.tasks.TaskCompletionSource;
|
| 26 | +import com.google.android.gms.tasks.Tasks; |
26 | 27 | import java.util.ArrayDeque;
|
27 | 28 | import java.util.Queue;
|
28 | 29 |
|
29 | 30 | class FirebaseAppDistributionLifecycleNotifier implements Application.ActivityLifecycleCallbacks {
|
30 | 31 |
|
31 |
| - /** A functional interface for a function that takes an activity and does something with it. */ |
32 |
| - interface ActivityConsumer { |
33 |
| - void consume(Activity activity) throws FirebaseAppDistributionException; |
| 32 | + /** A functional interface for a function that takes an activity and returns a value. */ |
| 33 | + interface ActivityFunction<T> { |
| 34 | + T apply(Activity activity) throws FirebaseAppDistributionException; |
| 35 | + } |
| 36 | + |
| 37 | + /** A functional interface for a function that takes an activity and returns a {@link Task}. */ |
| 38 | + interface ActivityChainingFunction<T> { |
| 39 | + Task<T> apply(Activity activity) throws FirebaseAppDistributionException; |
34 | 40 | }
|
35 | 41 |
|
36 | 42 | private static FirebaseAppDistributionLifecycleNotifier instance;
|
@@ -97,46 +103,115 @@ interface OnActivityDestroyedListener {
|
97 | 103 | * activity comes to the foreground.
|
98 | 104 | */
|
99 | 105 | Task<Activity> getForegroundActivity() {
|
100 |
| - return getForegroundActivity(activity -> {}); |
101 |
| - } |
102 |
| - |
103 |
| - /** |
104 |
| - * Get a {@link Task} that will succeed with a result of the app's foregrounded {@link Activity}, |
105 |
| - * when one is available, after passing the activity to an {@link ActivityConsumer}. |
106 |
| - * |
107 |
| - * <p>The returned task will fail with a {@link FirebaseAppDistributionException} if the consumer |
108 |
| - * throws. Otherwise it will never fail, and will wait indefinitely for a foreground activity |
109 |
| - * before applying the consumer. |
110 |
| - */ |
111 |
| - Task<Activity> getForegroundActivity(ActivityConsumer consumer) { |
112 | 106 | synchronized (lock) {
|
113 |
| - TaskCompletionSource<Activity> task = new TaskCompletionSource<>(); |
114 | 107 | if (currentActivity != null) {
|
115 |
| - consumeActivityAndCompleteTask(task, currentActivity, consumer); |
116 |
| - } else { |
117 |
| - addOnActivityResumedListener( |
118 |
| - new OnActivityResumedListener() { |
119 |
| - @Override |
120 |
| - public void onResumed(Activity activity) { |
121 |
| - consumeActivityAndCompleteTask(task, activity, consumer); |
122 |
| - removeOnActivityResumedListener(this); |
123 |
| - } |
124 |
| - }); |
| 108 | + return Tasks.forResult(currentActivity); |
125 | 109 | }
|
| 110 | + TaskCompletionSource<Activity> task = new TaskCompletionSource<>(); |
| 111 | + |
| 112 | + addOnActivityResumedListener( |
| 113 | + new OnActivityResumedListener() { |
| 114 | + @Override |
| 115 | + public void onResumed(Activity activity) { |
| 116 | + task.setResult(activity); |
| 117 | + removeOnActivityResumedListener(this); |
| 118 | + } |
| 119 | + }); |
126 | 120 |
|
127 | 121 | return task.getTask();
|
128 | 122 | }
|
129 | 123 | }
|
130 | 124 |
|
131 |
| - void consumeActivityAndCompleteTask( |
132 |
| - TaskCompletionSource task, Activity activity, ActivityConsumer consumer) { |
133 |
| - try { |
134 |
| - consumer.consume(activity); |
135 |
| - task.setResult(activity); |
136 |
| - } catch (Throwable t) { |
137 |
| - task.setException(FirebaseAppDistributionException.wrap(t)); |
138 |
| - } |
139 |
| - } |
| 125 | + // /** |
| 126 | + // * Get a {@link Task} that will succeed with a result of the app's foregrounded {@link Activity}, |
| 127 | + // * when one is available. |
| 128 | + // * |
| 129 | + // * <p>The returned task will never fail. It will instead remain pending indefinitely until some |
| 130 | + // * activity comes to the foreground. |
| 131 | + // */ |
| 132 | + // Task<Activity> getForegroundActivity() { |
| 133 | + // return getForegroundActivity(activity -> {}); |
| 134 | + // } |
| 135 | + |
| 136 | + // /** |
| 137 | + // * Get a {@link Task} that results from applying a {@link ActivityFunction} applied to the app's |
| 138 | + // * foregrounded {@link Activity}, when one is available. |
| 139 | + // * |
| 140 | + // * <p>The returned task will fail if the {@link ActivityFunction} throws, or the task it returns |
| 141 | + // * fails. Otherwise it will never fail, and will wait indefinitely for a foreground activity |
| 142 | + // * before applying the function. |
| 143 | + // */ |
| 144 | + // <T> Task<T> applyToForegroundActivityChaining(ActivityFunction<Task<T>> function) { |
| 145 | + // synchronized (lock) { |
| 146 | + // TaskCompletionSource<T> task = new TaskCompletionSource<>(); |
| 147 | + // if (currentActivity != null) { |
| 148 | + // chainToActivity(task, currentActivity, function); |
| 149 | + // } else { |
| 150 | + // addOnActivityResumedListener( |
| 151 | + // new OnActivityResumedListener() { |
| 152 | + // @Override |
| 153 | + // public void onResumed(Activity activity) { |
| 154 | + // chainToActivity(task, activity, function); |
| 155 | + // removeOnActivityResumedListener(this); |
| 156 | + // } |
| 157 | + // }); |
| 158 | + // } |
| 159 | + // |
| 160 | + // return task.getTask(); |
| 161 | + // } |
| 162 | + // } |
| 163 | + // |
| 164 | + // <T> Task<T> chainToActivity( |
| 165 | + // TaskCompletionSource<T> task, Activity activity, ActivityFunction<Task<T>> function) { |
| 166 | + // MoreExecutors |
| 167 | + // try { |
| 168 | + // function.apply(activity) |
| 169 | + // .addOnSuccessListener(task::setResult) |
| 170 | + // .addOnFailureListener(task::setException) |
| 171 | + // .addOnCanceledListener(task::canc) |
| 172 | + // continuation.on |
| 173 | + // task.setResult(function.apply(activity)); |
| 174 | + // } catch (Throwable t) { |
| 175 | + // task.setException(FirebaseAppDistributionException.wrap(t)); |
| 176 | + // } |
| 177 | + // } |
| 178 | + // |
| 179 | + // /** |
| 180 | + // * Get a {@link Task} that will succeed with a result of applying an {@link ActivityFunction} to |
| 181 | + // * the app's foregrounded {@link Activity}, when one is available. |
| 182 | + // * |
| 183 | + // * <p>The returned task will fail with a {@link FirebaseAppDistributionException} if the {@link |
| 184 | + // * ActivityFunction} throws. Otherwise it will never fail, and will wait indefinitely for a |
| 185 | + // * foreground activity before applying the function. |
| 186 | + // */ |
| 187 | + // <T> Task<T> applyToForegroundActivity(ActivityFunction<T> function) { |
| 188 | + // synchronized (lock) { |
| 189 | + // TaskCompletionSource<T> task = new TaskCompletionSource<>(); |
| 190 | + // if (currentActivity != null) { |
| 191 | + // applyToActivityAndCompleteTask(task, currentActivity, function); |
| 192 | + // } else { |
| 193 | + // addOnActivityResumedListener( |
| 194 | + // new OnActivityResumedListener() { |
| 195 | + // @Override |
| 196 | + // public void onResumed(Activity activity) { |
| 197 | + // applyToActivityAndCompleteTask(task, activity, function); |
| 198 | + // removeOnActivityResumedListener(this); |
| 199 | + // } |
| 200 | + // }); |
| 201 | + // } |
| 202 | + // |
| 203 | + // return task.getTask(); |
| 204 | + // } |
| 205 | + // } |
| 206 | + // |
| 207 | + // <T> void applyToActivityAndCompleteTask( |
| 208 | + // TaskCompletionSource<T> task, Activity activity, ActivityFunction<T> function) { |
| 209 | + // try { |
| 210 | + // task.setResult(function.apply(activity)); |
| 211 | + // } catch (Throwable t) { |
| 212 | + // task.setException(FirebaseAppDistributionException.wrap(t)); |
| 213 | + // } |
| 214 | + // } |
140 | 215 |
|
141 | 216 | void addOnActivityCreatedListener(@NonNull OnActivityCreatedListener listener) {
|
142 | 217 | synchronized (lock) {
|
|
0 commit comments