11package com .google_mlkit_commons ;
22
3- import com .google .android .gms .tasks .Task ;
4- import com .google .android .gms .tasks .Tasks ;
53import com .google .mlkit .common .model .DownloadConditions ;
64import com .google .mlkit .common .model .RemoteModel ;
75import com .google .mlkit .common .model .RemoteModelManager ;
86
9- import java .util .concurrent .Callable ;
10- import java .util .concurrent .ExecutionException ;
11- import java .util .concurrent .ExecutorService ;
12- import java .util .concurrent .Executors ;
13- import java .util .concurrent .Future ;
14-
157import io .flutter .plugin .common .MethodCall ;
168import io .flutter .plugin .common .MethodChannel ;
179
@@ -20,13 +12,22 @@ public class GenericModelManager {
2012 private static final String DELETE = "delete" ;
2113 private static final String CHECK = "check" ;
2214
23- public RemoteModelManager remoteModelManager = RemoteModelManager .getInstance ();
15+ public interface CheckModelIsDownloadedCallback {
16+ void onCheckResult (Boolean isDownloaded );
17+
18+ void onError (Exception e );
19+ }
2420
25- //To avoid downloading models in the main thread as they are around 20MB and may crash the app.
26- private final ExecutorService executorService = Executors .newCachedThreadPool ();
21+ public RemoteModelManager remoteModelManager = RemoteModelManager .getInstance ();
2722
2823 public void manageModel (final RemoteModel model , final MethodCall call , final MethodChannel .Result result ) {
2924 String task = call .argument ("task" );
25+
26+ if (task == null ) {
27+ result .notImplemented ();
28+ return ;
29+ }
30+
3031 switch (task ) {
3132 case DOWNLOAD :
3233 boolean isWifiReqRequired = call .argument ("wifi" );
@@ -41,52 +42,77 @@ public void manageModel(final RemoteModel model, final MethodCall call, final Me
4142 deleteModel (model , result );
4243 break ;
4344 case CHECK :
44- Boolean downloaded = isModelDownloaded (model );
45- if (downloaded != null ) result .success (downloaded );
46- else result .error ("error" , null , null );
45+ isModelDownloaded (
46+ model ,
47+ new CheckModelIsDownloadedCallback () {
48+ @ Override
49+ public void onCheckResult (Boolean isDownloaded ) {
50+ result .success (isDownloaded );
51+ }
52+
53+ @ Override
54+ public void onError (Exception e ) {
55+ result .error ("error" , e .toString (), null );
56+ }
57+ }
58+ );
4759 break ;
4860 default :
4961 result .notImplemented ();
5062 }
5163 }
5264
5365 public void downloadModel (RemoteModel remoteModel , DownloadConditions downloadConditions , final MethodChannel .Result result ) {
54- if (isModelDownloaded (remoteModel )) {
55- result .success ("success" );
56- return ;
57- }
58- remoteModelManager .download (remoteModel , downloadConditions ).addOnSuccessListener (aVoid -> result .success ("success" )).addOnFailureListener (e -> result .error ("error" , e .toString (), null ));
59- }
66+ isModelDownloaded (
67+ remoteModel ,
68+ new CheckModelIsDownloadedCallback () {
69+ @ Override
70+ public void onCheckResult (Boolean isDownloaded ) {
71+ if (isDownloaded ) {
72+ result .success ("success" );
73+ return ;
74+ }
6075
61- public void deleteModel (RemoteModel remoteModel , final MethodChannel .Result result ) {
62- if (!isModelDownloaded (remoteModel )) {
63- result .success ("success" );
64- return ;
65- }
66- remoteModelManager .deleteDownloadedModel (remoteModel ).addOnSuccessListener (aVoid -> result .success ("success" )).addOnFailureListener (e -> result .error ("error" , e .toString (), null ));
67- }
76+ remoteModelManager .download (remoteModel , downloadConditions )
77+ .addOnSuccessListener (aVoid -> result .success ("success" ))
78+ .addOnFailureListener (e -> result .error ("error" , e .toString (), null ));
79+ }
6880
69- public Boolean isModelDownloaded (RemoteModel model ) {
70- IsModelDownloaded myCallable = new IsModelDownloaded (remoteModelManager .isModelDownloaded (model ));
71- Future <Boolean > taskResult = executorService .submit (myCallable );
72- try {
73- return taskResult .get ();
74- } catch (InterruptedException | ExecutionException e ) {
75- e .printStackTrace ();
76- }
77- return null ;
81+ @ Override
82+ public void onError (Exception e ) {
83+ result .error ("error" , e .toString (), null );
84+ }
85+ }
86+ );
7887 }
79- }
8088
81- class IsModelDownloaded implements Callable <Boolean > {
82- final Task <Boolean > booleanTask ;
89+ public void deleteModel (RemoteModel remoteModel , final MethodChannel .Result result ) {
90+ isModelDownloaded (remoteModel , new CheckModelIsDownloadedCallback () {
91+ @ Override
92+ public void onCheckResult (Boolean isDownloaded ) {
93+ if (!isDownloaded ) {
94+ result .success ("success" );
95+ return ;
96+ }
97+ remoteModelManager .deleteDownloadedModel (remoteModel )
98+ .addOnSuccessListener (aVoid -> result .success ("success" ))
99+ .addOnFailureListener (e -> result .error ("error" , e .toString (), null ));
100+ }
83101
84- public IsModelDownloaded (Task <Boolean > booleanTask ) {
85- this .booleanTask = booleanTask ;
102+ @ Override
103+ public void onError (Exception e ) {
104+ result .error ("error" , e .toString (), null );
105+ }
106+ });
86107 }
87108
88- @ Override
89- public Boolean call () throws Exception {
90- return Tasks .await (booleanTask );
109+ public void isModelDownloaded (RemoteModel model , CheckModelIsDownloadedCallback callback ) {
110+ try {
111+ remoteModelManager .isModelDownloaded (model )
112+ .addOnFailureListener (callback ::onError )
113+ .addOnSuccessListener (callback ::onCheckResult );
114+ } catch (Exception e ) {
115+ callback .onError (e );
116+ }
91117 }
92- }
118+ }
0 commit comments