Skip to content

Commit 94a8add

Browse files
committed
replaced icafe with metadata extractor
1 parent 7480d00 commit 94a8add

File tree

5 files changed

+74
-22
lines changed

5 files changed

+74
-22
lines changed

app/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ dependencies {
9090
//swipe_layout
9191
implementation 'com.daimajia.swipelayout:library:1.2.0@aar'
9292
implementation 'com.nineoldandroids:library:2.4.0'
93+
//metadata extractor
94+
implementation 'com.drewnoakes:metadata-extractor:2.11.0'
9395
implementation files('libs/icafe-1.1-SNAPSHOT.jar')
9496
}
9597

app/libs/icafe-1.1-SNAPSHOT.jar

-988 KB
Binary file not shown.

app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package fr.free.nrw.commons.upload;
22

3+
import android.content.Context;
4+
import android.net.Uri;
5+
36
import java.io.IOException;
47

58
import javax.inject.Inject;
@@ -20,7 +23,10 @@
2023

2124
/**
2225
* Methods for pre-processing images to be uploaded
23-
*/
26+
*//*if (dataInBytes[0] == 70 && dataInBytes[1] == 66 && dataInBytes[2] == 77 && dataInBytes[3] == 68) {
27+
Timber.d("Contains FBMD");
28+
return Single.just(ImageUtils.FILE_FBMD);
29+
}*/
2430
@Singleton
2531
public class ImageProcessingService {
2632
private final FileUtilsWrapper fileUtilsWrapper;
@@ -56,11 +62,13 @@ Single<Integer> validateImage(UploadModel.UploadItem uploadItem, boolean checkTi
5662
}
5763
Timber.d("Checking the validity of image");
5864
String filePath = uploadItem.getMediaUri().getPath();
65+
Uri contentUri=uploadItem.getContentUri();
66+
Context context=uploadItem.getContext();
5967
Single<Integer> duplicateImage = checkDuplicateImage(filePath);
6068
Single<Integer> wrongGeoLocation = checkImageGeoLocation(uploadItem.getPlace(), filePath);
6169
Single<Integer> darkImage = checkDarkImage(filePath);
6270
Single<Integer> itemTitle = checkTitle ? validateItemTitle(uploadItem) : Single.just(ImageUtils.IMAGE_OK);
63-
Single<Integer> checkFBMD = checkFBMD(filePath);
71+
Single<Integer> checkFBMD = checkFBMD(context,contentUri);
6472

6573
Single<Integer> zipResult = Single.zip(duplicateImage, wrongGeoLocation, darkImage, itemTitle,
6674
(duplicate, wrongGeo, dark, title) -> {
@@ -84,9 +92,9 @@ Single<Integer> validateImage(UploadModel.UploadItem uploadItem, boolean checkTi
8492
* Thus we successfully protect common's from Facebook's copyright violation
8593
*/
8694

87-
public Single<Integer> checkFBMD(String filePath) {
95+
public Single<Integer> checkFBMD(Context context,Uri contentUri) {
8896
try {
89-
return readFBMD.processMetadata(filePath);
97+
return readFBMD.processMetadata(context,contentUri);
9098
} catch (IOException e) {
9199
return Single.just(ImageUtils.FILE_FBMD);
92100
}

app/src/main/java/fr/free/nrw/commons/upload/ReadFBMD.java

+28-17
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,54 @@
11
package fr.free.nrw.commons.upload;
22

3-
import com.icafe4j.image.meta.Metadata;
4-
import com.icafe4j.image.meta.MetadataType;
5-
import com.icafe4j.image.meta.iptc.IPTC;
3+
import android.content.Context;
4+
import android.net.Uri;
5+
6+
import com.drew.imaging.ImageMetadataReader;
7+
import com.drew.imaging.ImageProcessingException;
8+
import com.drew.metadata.Metadata;
9+
import com.drew.metadata.Tag;
10+
import com.drew.metadata.iptc.IptcDirectory;
611

712
import java.io.IOException;
8-
import java.util.Map;
913

1014
import javax.inject.Inject;
1115
import javax.inject.Singleton;
1216

1317
import fr.free.nrw.commons.utils.ImageUtils;
1418
import io.reactivex.Single;
15-
import timber.log.Timber;
1619

1720
@Singleton
1821
public class ReadFBMD {
1922

2023
@Inject
21-
public ReadFBMD(){
24+
public ReadFBMD() {
2225

2326
}
24-
public Single<Integer> processMetadata(String path) throws IOException {
25-
Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(path);
26-
Metadata metadata = metadataMap.get(MetadataType.IPTC);
27-
byte[] dataInBytes = new byte[0];
27+
28+
public Single<Integer> processMetadata(Context context, Uri contentUri) throws IOException {
29+
Metadata readMetadata = null;
2830
try {
29-
dataInBytes = ((IPTC) metadata).getDataSets().get("SpecialInstructions").get(0).getData();
30-
} catch (NullPointerException e) {
31+
readMetadata = ImageMetadataReader.readMetadata(context.getContentResolver().openInputStream(contentUri));
32+
} catch (ImageProcessingException e) {
33+
e.printStackTrace();
34+
} catch (IOException e) {
35+
e.printStackTrace();
36+
}
37+
38+
IptcDirectory iptcDirectory = readMetadata != null ? readMetadata.getFirstDirectoryOfType(IptcDirectory.class) : null;
39+
if (iptcDirectory == null) {
3140
return Single.just(ImageUtils.IMAGE_OK);
3241
}
3342
/**
34-
* The byte array so obtained is used is tested to contain FBMD data
35-
* Note: Any image downloaded from Facebook contains the ASCII code of the letters 'FBMD' in this bytecode extracted from it's IPTC metadata
36-
* */
37-
if (dataInBytes[0] == 70 && dataInBytes[1] == 66 && dataInBytes[2] == 77 && dataInBytes[3] == 68) {
38-
Timber.d("Contains FBMD");
43+
* We parse through all the tags in the IPTC directory if the tagname equals "Special Instructions".
44+
* And the description string starts with FBMD.
45+
* Then the source of image is facebook
46+
* */
47+
for (Tag tag : iptcDirectory.getTags()) {
48+
if (tag.getTagName().equals("Special Instructions") && tag.getDescription().substring(0, 4).equals("FBMD")) {
3949
return Single.just(ImageUtils.FILE_FBMD);
4050
}
51+
}
4152
return Single.just(ImageUtils.IMAGE_OK);
4253
}
4354
}

app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package fr.free.nrw.commons.upload;
22

33
import android.annotation.SuppressLint;
4+
import android.content.ContentValues;
45
import android.content.Context;
6+
import android.database.Cursor;
57
import android.net.Uri;
8+
import android.provider.MediaStore;
69
import android.support.annotation.NonNull;
710
import android.support.annotation.Nullable;
811

@@ -54,7 +57,7 @@ public class UploadModel {
5457
private boolean bottomCardState = true;
5558
private boolean rightCardState = true;
5659
private int currentStepIndex = 0;
57-
private Context context;
60+
public static Context context;
5861
private Disposable badImageSubscription;
5962

6063
private SessionManager sessionManager;
@@ -428,6 +431,34 @@ public String getFileName() {
428431
public Place getPlace() {
429432
return place;
430433
}
434+
435+
public Uri getContentUri() {
436+
return generateContentUri(UploadModel.context,getMediaUri().getPath());
437+
}
438+
private Uri generateContentUri(Context context,String path){
439+
Cursor cursor = context.getContentResolver().query(
440+
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
441+
, new String[] { MediaStore.Images.Media._ID }
442+
, MediaStore.Images.Media.DATA + "=? "
443+
, new String[] { path }, null);
444+
445+
if (cursor != null && cursor.moveToFirst()) {
446+
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
447+
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , Integer.toString(id));
448+
449+
} else if (!path.isEmpty()) {
450+
ContentValues values = new ContentValues();
451+
values.put(MediaStore.Images.Media.DATA, path);
452+
return context.getContentResolver().insert(
453+
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
454+
} else {
455+
return null;
456+
}
457+
}
458+
459+
public Context getContext(){
460+
return UploadModel.context;
461+
}
431462
}
432463

433464
}

0 commit comments

Comments
 (0)