Skip to content

Commit a5b2590

Browse files
authored
Merge pull request #10 from GeniusRUS/combine_branch
Combine image picker
2 parents 7e352c1 + 1f2d0e6 commit a5b2590

File tree

15 files changed

+420
-69
lines changed

15 files changed

+420
-69
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
package="com.github.oliveiradev.rxphoto">
44

55
<application
6-
android:allowBackup="true"
76
android:icon="@mipmap/ic_launcher"
87
android:label="@string/app_name"
9-
android:supportsRtl="true"
108
android:theme="@style/AppTheme">
119
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|screenLayout">
1210
<intent-filter>

app/src/main/java/com/github/oliveiradev/rxphoto/MainActivity.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ protected void onCreate(Bundle savedInstanceState) {
2626
super.onCreate(savedInstanceState);
2727
setContentView(R.layout.activity_main);
2828

29-
final LinearLayout thumbsContent = (LinearLayout) findViewById(R.id.thumbs);
30-
final ImageView image = (ImageView) findViewById(R.id.image);
29+
final LinearLayout thumbsContent = findViewById(R.id.thumbs);
30+
final ImageView image = findViewById(R.id.image);
3131

3232
findViewById(R.id.get).setOnClickListener(new View.OnClickListener() {
3333
@Override
@@ -71,6 +71,48 @@ public void accept(Bitmap bitmap) throws Exception {
7171
}
7272
});
7373

74+
findViewById(R.id.combine).setOnClickListener(new View.OnClickListener() {
75+
@Override
76+
public void onClick(View v) {
77+
image.setImageBitmap(null);
78+
thumbsContent.removeAllViews();
79+
80+
Rx2Photo.with(v.getContext())
81+
.titleCombine("Custom chooser title")
82+
.requestBitmap(TypeRequest.COMBINE)
83+
.observeOn(AndroidSchedulers.mainThread())
84+
.doOnNext(new Consumer<Bitmap>() {
85+
@Override
86+
public void accept(Bitmap bitmap) throws Exception {
87+
image.setImageBitmap(bitmap);
88+
}
89+
})
90+
.subscribe();
91+
92+
}
93+
});
94+
95+
findViewById(R.id.combine_multiple).setOnClickListener(new View.OnClickListener() {
96+
@Override
97+
public void onClick(View v) {
98+
image.setImageBitmap(null);
99+
thumbsContent.removeAllViews();
100+
if (disposable != null) {
101+
disposable.dispose();
102+
}
103+
disposable = Rx2Photo.with(v.getContext())
104+
.requestBitmap(TypeRequest.COMBINE_MULTIPLE)
105+
.observeOn(AndroidSchedulers.mainThread())
106+
.doOnNext(new Consumer<Bitmap>() {
107+
@Override
108+
public void accept(Bitmap bitmap) throws Exception {
109+
image.setImageBitmap(bitmap);
110+
}
111+
})
112+
.subscribe();
113+
}
114+
});
115+
74116
findViewById(R.id.get_thumb).setOnClickListener(new View.OnClickListener() {
75117
@Override
76118
public void onClick(View v) {

app/src/main/res/layout/activity_main.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,26 @@
4141
android:orientation="horizontal">
4242

4343

44+
<Button
45+
android:id="@+id/combine"
46+
android:layout_width="wrap_content"
47+
android:layout_height="wrap_content"
48+
android:text="@string/label_combine" />
49+
50+
<Button
51+
android:id="@+id/combine_multiple"
52+
android:layout_width="wrap_content"
53+
android:layout_height="wrap_content"
54+
android:text="@string/label_combine_multiple" />
55+
56+
</LinearLayout>
57+
58+
<LinearLayout
59+
android:layout_width="match_parent"
60+
android:layout_height="wrap_content"
61+
android:orientation="horizontal">
62+
63+
4464
<Button
4565
android:id="@+id/transform"
4666
android:layout_width="wrap_content"

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
<string name="label_gallery">GALLERY</string>
44
<string name="label_camera">CAMERA</string>
55
<string name="label_thumb">THUMB</string>
6+
<string name="label_combine">COMBINE</string>
7+
<string name="label_combine_multiple">COMBINE MULTIPLE</string>
68

79
<string name="label_compress">COMPRESS</string>
810
<string name="label_transformations">TRANSFORM TO THUMBS</string>

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66
google()
77
}
88
dependencies {
9-
classpath 'com.android.tools.build:gradle:3.0.0'
9+
classpath 'com.android.tools.build:gradle:3.0.1'
1010
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
1111
}
1212
}

lib/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ repositories {
2929
dependencies {
3030
// compile fileTree(dir: 'libs', include: ['*.jar'])
3131
// testCompile 'junit:junit:4.12'
32-
implementation "io.reactivex.rxjava2:rxjava:2.1.4"
32+
implementation "io.reactivex.rxjava2:rxjava:2.1.6"
3333
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
3434
compileOnly 'com.android.support:appcompat-v7:27.0.1'
3535
}

lib/src/main/AndroidManifest.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,12 @@
55
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
66
<uses-permission android:name="android.permission.CAMERA"/>
77

8-
98
<application
10-
android:allowBackup="true"
11-
android:label="@string/app_name"
12-
android:supportsRtl="true">
9+
android:label="@string/app_name">
1310
<activity
1411
android:name=".OverlapActivity"
1512
android:launchMode="singleTop"
1613
android:theme="@android:style/Theme.Translucent.NoTitleBar"
1714
/>
1815
</application>
19-
2016
</manifest>

lib/src/main/java/com/github/oliveiradev/lib/OverlapActivity.java

Lines changed: 120 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.Manifest;
44
import android.app.Activity;
5+
import android.content.ClipData;
56
import android.content.ContentResolver;
67
import android.content.ContentValues;
78
import android.content.Context;
@@ -12,15 +13,22 @@
1213
import android.os.Build;
1314
import android.os.Bundle;
1415
import android.os.IBinder;
16+
import android.os.Parcelable;
1517
import android.provider.MediaStore;
18+
import android.support.annotation.NonNull;
19+
import android.support.annotation.RequiresApi;
1620
import 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;
1924
import com.github.oliveiradev.lib.shared.Constants;
2025
import com.github.oliveiradev.lib.shared.TypeRequest;
26+
import com.github.oliveiradev.lib.util.Utils;
2127

2228
import java.text.SimpleDateFormat;
29+
import java.util.ArrayList;
2330
import java.util.Date;
31+
import java.util.List;
2432
import 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

Comments
 (0)