22
33import android .Manifest ;
44import android .app .Activity ;
5+ import android .content .ClipData ;
56import android .content .ContentResolver ;
67import android .content .ContentValues ;
78import android .content .Context ;
1213import android .os .Build ;
1314import android .os .Bundle ;
1415import android .os .IBinder ;
16+ import android .os .Parcelable ;
1517import android .provider .MediaStore ;
18+ import android .support .annotation .NonNull ;
19+ import android .support .annotation .RequiresApi ;
1620import android .support .v4 .app .BundleCompat ;
17- import android .widget .Toast ;
1821
22+ import com .github .oliveiradev .lib .exceptions .ExternalStorageWriteException ;
23+ import com .github .oliveiradev .lib .exceptions .NotPermissionException ;
1924import com .github .oliveiradev .lib .shared .Constants ;
2025import com .github .oliveiradev .lib .shared .TypeRequest ;
26+ import com .github .oliveiradev .lib .util .Utils ;
2127
2228import java .text .SimpleDateFormat ;
29+ import java .util .ArrayList ;
2330import java .util .Date ;
31+ import java .util .List ;
2432import java .util .Locale ;
2533
2634/**
@@ -33,6 +41,7 @@ public class OverlapActivity extends Activity {
3341 private static final int REQUEST_GALLERY = 1 ;
3442
3543 private Uri fileUri ;
44+ private TypeRequest typeRequest ;
3645
3746 @ Override
3847 protected void onCreate (final Bundle savedInstanceState ) {
@@ -69,7 +78,7 @@ protected void onNewIntent(Intent intent) {
6978 }
7079
7180 private void handleIntent (Intent intent ) {
72- TypeRequest typeRequest = (TypeRequest ) intent .getExtras ().get (Constants .REQUEST_TYPE_EXTRA );
81+ typeRequest = (TypeRequest ) intent .getExtras ().get (Constants .REQUEST_TYPE_EXTRA );
7382 final Bundle bundle = intent .getExtras ().getBundle (Constants .CALLER_EXTRA );
7483 if (bundle != null ) {
7584 IBinder iBinder = BundleCompat .getBinder (bundle , Constants .CALLER_EXTRA );
@@ -80,15 +89,54 @@ private void handleIntent(Intent intent) {
8089 }
8190
8291 if (hasPermission (typeRequest )) {
83- if (typeRequest == TypeRequest .GALLERY )
84- gallery ();
85- else
86- camera ();
92+ switch (typeRequest ) {
93+ case GALLERY :
94+ gallery ();
95+ break ;
96+ case CAMERA :
97+ camera ();
98+ break ;
99+ case COMBINE :
100+ combine (false );
101+ break ;
102+ case COMBINE_MULTIPLE :
103+ combine (true );
104+ break ;
105+ }
87106 }else {
88107 requestPermission (typeRequest );
89108 }
90109 }
91110
111+ private void combine (boolean isMultiple ) {
112+ if (!Utils .isExternalStorageWritable ()) {
113+ rx2Photo .propagateThrowable (new ExternalStorageWriteException ());
114+ return ;
115+ }
116+
117+ fileUri = createImageUri ();
118+ List <Intent > intentList = new ArrayList <>();
119+ Intent chooserIntent = null ;
120+ Intent pickIntent = new Intent (Intent .ACTION_PICK , MediaStore .Images .Media .EXTERNAL_CONTENT_URI );
121+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .JELLY_BEAN_MR2 ) {
122+ pickIntent .putExtra (Intent .EXTRA_ALLOW_MULTIPLE , isMultiple );
123+ }
124+ intentList = Utils .addIntentsToList (this , intentList , pickIntent );
125+ Intent takePhotoIntent = new Intent (MediaStore .ACTION_IMAGE_CAPTURE );
126+ takePhotoIntent .putExtra (MediaStore .EXTRA_OUTPUT , fileUri );
127+ intentList = Utils .addIntentsToList (this , intentList , takePhotoIntent );
128+ if (!intentList .isEmpty ()) {
129+ String title = rx2Photo .getTitle () != null ? rx2Photo .getTitle () : getString (R .string .picker_header );
130+ chooserIntent = Intent .createChooser (intentList .remove (intentList .size () - 1 ), title );
131+ chooserIntent .putExtra (Intent .EXTRA_INITIAL_INTENTS , intentList .toArray (new Parcelable []{}));
132+ }
133+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .JELLY_BEAN_MR2 && isMultiple ) {
134+ startActivityForResult (chooserIntent , Constants .REQUEST_CODE_COMBINE_MULPITPLE );
135+ } else {
136+ startActivityForResult (chooserIntent , Constants .REQUEST_CODE_COMBINE );
137+ }
138+ }
139+
92140 private void gallery () {
93141 /*Intent intent = new Intent();
94142 intent.setType("image*/ /*");
@@ -101,11 +149,14 @@ private void gallery() {
101149 private void camera () {
102150 Intent takePictureIntent = new Intent (MediaStore .ACTION_IMAGE_CAPTURE );
103151 if (takePictureIntent .resolveActivity (getPackageManager ()) != null ) {
152+ if (!Utils .isExternalStorageWritable ()) {
153+ rx2Photo .propagateThrowable (new ExternalStorageWriteException ());
154+ return ;
155+ }
104156 fileUri = createImageUri ();
105157 takePictureIntent .putExtra (MediaStore .EXTRA_OUTPUT , fileUri );
106158 startActivityForResult (takePictureIntent , Constants .REQUEST_CODE_TAKE_PICURE );
107159 }
108-
109160 }
110161
111162 private boolean hasPermission (TypeRequest typeRequest ) {
@@ -114,12 +165,12 @@ private boolean hasPermission(TypeRequest typeRequest) {
114165
115166 return checkSelfPermission ( Manifest .permission .WRITE_EXTERNAL_STORAGE )
116167 == PackageManager .PERMISSION_GRANTED ;
117- }else {
168+ } else {
118169 return checkSelfPermission ( Manifest .permission .WRITE_EXTERNAL_STORAGE )
119170 == PackageManager .PERMISSION_GRANTED
120171 && checkSelfPermission (Manifest .permission .CAMERA ) == PackageManager .PERMISSION_GRANTED ;
121172 }
122- }else {
173+ } else {
123174 return true ;
124175 }
125176 }
@@ -132,35 +183,53 @@ private void requestPermission(TypeRequest typeRequest){
132183 }
133184
134185 @ Override
135- public void onRequestPermissionsResult (int requestCode , String [] permissions , int [] grantResults ) {
186+ public void onRequestPermissionsResult (int requestCode , @ NonNull String [] permissions , @ NonNull int [] grantResults ) {
136187 super .onRequestPermissionsResult (requestCode , permissions , grantResults );
137- switch (requestCode ) {
138- case REQUEST_CAMERA :
139- if (grantResults .length > 1
140- && grantResults [0 ] == PackageManager .PERMISSION_GRANTED
141- && grantResults [1 ] == PackageManager .PERMISSION_GRANTED ){
142- camera ();
143-
144- }else {
145- Toast .makeText (this ,R .string .error_camera_permission ,Toast .LENGTH_LONG ).show ();
146- finish ();
147- }
148- break ;
149- case REQUEST_GALLERY :
150- if (grantResults .length >= 1
151- && grantResults [0 ] == PackageManager .PERMISSION_GRANTED ){
152- gallery ();
188+ if (requestCode == REQUEST_CAMERA && typeRequest .equals (TypeRequest .CAMERA )) {
189+ if (grantResults .length > 1
190+ && grantResults [0 ] == PackageManager .PERMISSION_GRANTED
191+ && grantResults [1 ] == PackageManager .PERMISSION_GRANTED ){
192+ camera ();
193+ } else {
194+ rx2Photo .propagateThrowable (new NotPermissionException (NotPermissionException .RequestEnum .CAMERA ));
195+ finish ();
196+ }
197+ } else if (requestCode == REQUEST_GALLERY && typeRequest .equals (TypeRequest .GALLERY )) {
198+ if (grantResults .length >= 1
199+ && grantResults [0 ] == PackageManager .PERMISSION_GRANTED ){
200+ gallery ();
153201
154- }else {
155- Toast .makeText (this ,R .string .error_gallery_permission ,Toast .LENGTH_LONG ).show ();
156- finish ();
202+ } else {
203+ rx2Photo .propagateThrowable (new NotPermissionException (NotPermissionException .RequestEnum .GALLERY ));
204+ finish ();
205+ }
206+ } else if (permissions .length == 2 && (typeRequest .equals (TypeRequest .COMBINE ) || typeRequest .equals (TypeRequest .COMBINE_MULTIPLE ))) {
207+ if (grantResults [0 ] == PackageManager .PERMISSION_GRANTED ) {
208+ if (grantResults [1 ] == PackageManager .PERMISSION_GRANTED ) {
209+ if (typeRequest .equals (TypeRequest .COMBINE )) {
210+ combine (false );
211+ } else {
212+ combine (true );
213+ }
214+ } else {
215+ rx2Photo .propagateThrowable (new NotPermissionException (NotPermissionException .RequestEnum .CAMERA ));
157216 }
158- break ;
159-
217+ } else {
218+ rx2Photo .propagateThrowable (new NotPermissionException (NotPermissionException .RequestEnum .GALLERY ));
219+ }
160220
221+ finish ();
161222 }
162223 }
163224
225+ /**
226+ * If we not choose camera, temp file is unused and must be removed
227+ */
228+ private void removeUnusedFile () {
229+ if (fileUri != null )
230+ getContentResolver ().delete (fileUri , null , null );
231+ }
232+
164233 private Uri createImageUri () {
165234 ContentResolver contentResolver = getContentResolver ();
166235 ContentValues cv = new ContentValues ();
@@ -181,17 +250,29 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) {
181250 fileUri = savedInstanceState .getParcelable (FILE_URI_EXTRA );
182251 }
183252
184- private Uri getUri (int requestCode , Intent data ) {
185- if (requestCode == Constants .REQUEST_CODE_ATTACH_IMAGE ) return data .getData ();
186- else if (requestCode == Constants .REQUEST_CODE_TAKE_PICURE ) return fileUri ;
187- else return null ;
188- }
189-
253+ @ RequiresApi (api = Build .VERSION_CODES .JELLY_BEAN )
190254 @ Override
191255 protected void onActivityResult (int requestCode , int resultCode , Intent data ) {
192256 super .onActivityResult (requestCode , resultCode , data );
193- if (resultCode == Activity .RESULT_OK && (requestCode == Constants .REQUEST_CODE_ATTACH_IMAGE || requestCode == Constants .REQUEST_CODE_TAKE_PICURE ))
194- rx2Photo .onActivityResult (getUri (requestCode , data ));
257+ if (resultCode == Activity .RESULT_OK ) {
258+ if (data != null && data .getData () != null ) {
259+ rx2Photo .onActivityResult (data .getData ());
260+ removeUnusedFile ();
261+ } else if (data != null && data .getClipData () != null ) {
262+ ClipData mClipData = data .getClipData ();
263+ List <Uri > uris = new ArrayList <>();
264+
265+ for (int i = 0 ; i < mClipData .getItemCount (); i ++) {
266+ uris .add (mClipData .getItemAt (i ).getUri ());
267+ }
268+
269+ rx2Photo .onActivityResult (uris );
270+ } else {
271+ rx2Photo .onActivityResult (fileUri );
272+ }
273+ } else {
274+ removeUnusedFile ();
275+ }
195276 finish ();
196277 }
197278}
0 commit comments