44import android .appwidget .AppWidgetManager ;
55import android .content .ComponentName ;
66import android .content .Context ;
7- import android .content .ContextWrapper ;
87import android .content .Intent ;
9- import android .graphics .Bitmap ;
10- import android .graphics .BitmapFactory ;
8+ import android .net .Uri ;
119import android .os .Build ;
1210import android .os .Bundle ;
1311import android .widget .RemoteViews ;
1816import com .facebook .react .bridge .ReactApplicationContext ;
1917import com .reactnativeandroidwidget .builder .CollectionViewItem ;
2018
21- import java .io .File ;
22- import java .io .FileInputStream ;
23- import java .io .FileOutputStream ;
24- import java .io .IOException ;
2519import java .util .ArrayList ;
26- import java .util .HashMap ;
2720import java .util .List ;
28- import java .util .Map ;
29- import java .util .Objects ;
3021
3122public class RNWidgetCollectionService extends RemoteViewsService {
3223 public static final int MAX_COLLECTION_WIDGETS = 2 ;
3324
34- public static void deleteWidgetImages (Context context , int widgetId ) {
35- deleteImages (context , "widget_" + widgetId );
36- }
37-
38- private static void deleteCollectionImages (Context context , int widgetId , int collectionId ) {
39- deleteImages (context , "widget_" + widgetId + "_collection_" + collectionId );
40- }
41-
42- private static void deleteImages (Context context , String prefix ) {
43- ContextWrapper cw = new ContextWrapper (context );
44- File directory = cw .getDir ("widget_list_images" , Context .MODE_PRIVATE );
45-
46- File [] files = directory .listFiles (pathname -> pathname .getName ().startsWith (prefix ));
47-
48- for (File f : Objects .requireNonNull (files )) {
49- f .delete ();
50- }
51- }
52-
5325 public static void storeCollection (ReactApplicationContext context , int widgetId , int collectionId , List <CollectionViewItem > collectionViewItems ) {
54- deleteCollectionImages (context , widgetId , collectionId );
26+ RNWidgetImageProvider . deleteCollectionImages (context , widgetId , collectionId );
5527 for (int i = 0 ; i < collectionViewItems .size (); i ++) {
5628 CollectionViewItem item = collectionViewItems .get (i );
5729
58- writeImage (context , widgetId , collectionId , i , item );
59- }
60- }
61-
62- private static void writeImage (ReactApplicationContext context , int widgetId , int collectionId , int position , CollectionViewItem item ) {
63- ContextWrapper cw = new ContextWrapper (context );
64- File directory = cw .getDir ("widget_list_images" , Context .MODE_PRIVATE );
65- File imagePath = new File (directory , getImageName (widgetId , collectionId , position ));
66-
67- FileOutputStream fos = null ;
68- try {
69- fos = new FileOutputStream (imagePath );
70- item .getBitmap ().compress (Bitmap .CompressFormat .PNG , 100 , fos );
71- } catch (Exception e ) {
72- e .printStackTrace ();
73- } finally {
74- try {
75- if (fos != null ) {
76- fos .close ();
77- }
78- } catch (IOException e ) {
79- e .printStackTrace ();
80- }
30+ RNWidgetImageProvider .writeImage (context , getImageName (widgetId , collectionId , i ), item .getBitmap ());
8131 }
8232 }
8333
@@ -92,9 +42,7 @@ public RemoteViewsFactory onGetViewFactory(Intent intent) {
9242}
9343
9444class ListRemoteViewsFactory implements RemoteViewsService .RemoteViewsFactory {
95- private final Map <String , Bitmap > mCache = new HashMap <>();
9645 private final int mCount ;
97- private final int mCollectionId ;
9846 private final List <Bundle > mCollectionItems ;
9947
10048 private final Context mContext ;
@@ -105,7 +53,6 @@ public ListRemoteViewsFactory(Context context, Intent intent) {
10553 mContext = context ;
10654 mAppWidgetId = intent .getIntExtra (AppWidgetManager .EXTRA_APPWIDGET_ID , AppWidgetManager .INVALID_APPWIDGET_ID );
10755 mCount = intent .getIntExtra ("collectionSize" , 0 );
108- mCollectionId = intent .getIntExtra ("collectionId" , 0 );
10956 mCollectionItems = intent .getParcelableArrayListExtra ("collectionItems" );
11057 widgetName = intent .getStringExtra ("widgetName" );
11158 }
@@ -114,20 +61,19 @@ public void onCreate() {
11461 }
11562
11663 public void onDestroy () {
117- mCache .clear ();
11864 }
11965
12066 public int getCount () {
12167 return mCount ;
12268 }
12369
12470 public RemoteViews getViewAt (int position ) {
71+ Bundle bundle = mCollectionItems .get (position );
72+
12573 RemoteViews listItemView = new RemoteViews (mContext .getPackageName (), R .layout .rn_widget_list_item );
12674 listItemView .removeAllViews (R .id .rn_widget_list_item_clickable_container );
127- Bitmap bitmapAt = getBitmapAt (position );
128- listItemView .setImageViewBitmap (R .id .rn_widget_list_item , bitmapAt );
129-
130- Bundle bundle = mCollectionItems .get (position );
75+ Uri imageUri = RNWidgetImageProvider .getImageUri (mContext , bundle .getString ("imageName" ));
76+ listItemView .setImageViewUri (R .id .rn_widget_list_item , imageUri );
13177
13278 // Set a fill-intent which will be used to fill-in the pending intent template
13379 // which is set on the collection view in RNWidget.
@@ -136,15 +82,11 @@ public RemoteViews getViewAt(int position) {
13682 listItemView .setOnClickFillInIntent (R .id .rn_widget_list_item , fillInIntent );
13783 }
13884
139- if (bitmapAt == null ) {
140- return listItemView ;
141- }
142-
14385 ArrayList <Bundle > clickableAreas = bundle .getParcelableArrayList ("clickableAreas" );
14486
14587 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
14688 for (Bundle clickableArea : clickableAreas ) {
147- addClickableArea (listItemView , clickableArea , bitmapAt . getWidth ( ));
89+ addClickableArea (listItemView , clickableArea , bundle . getInt ( "imageWidth" ));
14890 }
14991 }
15092
@@ -220,33 +162,5 @@ public boolean hasStableIds() {
220162 }
221163
222164 public void onDataSetChanged () {
223- this .mCache .clear ();
224- }
225-
226- private Bitmap getBitmapAt (int position ) {
227- if (!mCache .containsKey (getImageName (position ))) {
228- mCache .put (getImageName (position ), loadImage (position ));
229- }
230-
231- return mCache .get (getImageName (position ));
232- }
233-
234- private Bitmap loadImage (int position ) {
235- try {
236- ContextWrapper cw = new ContextWrapper (mContext );
237- File directory = cw .getDir ("widget_list_images" , Context .MODE_PRIVATE );
238- File imagePath = new File (directory , getImageName (position ));
239- FileInputStream fileInputStream = new FileInputStream (imagePath );
240- Bitmap bitmap = BitmapFactory .decodeStream (fileInputStream );
241- fileInputStream .close ();
242- return bitmap ;
243- } catch (IOException e ) {
244- e .printStackTrace ();
245- return null ;
246- }
247- }
248-
249- private String getImageName (int position ) {
250- return RNWidgetCollectionService .getImageName (mAppWidgetId , mCollectionId , position );
251165 }
252166}
0 commit comments