Skip to content

Commit 9cff336

Browse files
author
Your Name
committed
adds the possibility to create a pdf from selected images to GalleryGridActivity
1 parent 7828ecc commit 9cff336

File tree

6 files changed

+146
-24
lines changed

6 files changed

+146
-24
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,7 @@ dependencies {
5353
implementation 'com.github.ctodobom:FabToolbar:3c5f0e0ff1b6d5089e20b7da7157a604075ae943'
5454
implementation 'org.piwik.sdk:piwik-sdk:0.0.4'
5555
implementation 'com.github.MikeOrtiz:TouchImageView:1.4.0'
56+
implementation 'com.itextpdf:kernel:7.1.11'
57+
implementation 'com.itextpdf:layout:7.1.11'
58+
implementation 'com.itextpdf:io:7.1.11'
5659
}

app/src/main/java/com/todobom/opennotescanner/GalleryGridActivity.java

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.net.Uri;
1111
import android.os.Bundle;
1212
import android.preference.PreferenceManager;
13+
import android.support.design.widget.FloatingActionButton;
1314
import android.support.v4.app.FragmentManager;
1415
import android.support.v4.content.FileProvider;
1516
import android.support.v7.app.ActionBar;
@@ -30,12 +31,12 @@
3031
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
3132
import com.nostra13.universalimageloader.core.assist.ImageSize;
3233
import com.todobom.opennotescanner.helpers.AboutFragment;
34+
import com.todobom.opennotescanner.helpers.PdfHelper;
3335
import com.todobom.opennotescanner.helpers.Utils;
3436

3537
import java.io.File;
3638
import java.util.ArrayList;
3739

38-
3940
public class GalleryGridActivity extends AppCompatActivity
4041
implements ClickListener, DragSelectRecyclerViewAdapter.SelectionListener {
4142

@@ -70,7 +71,7 @@ public void onLongClick(int index) {
7071
}
7172

7273
private void setSelectionMode(boolean selectionMode) {
73-
if (mShare !=null && mDelete != null ) {
74+
if (mShare != null && mDelete != null) {
7475
mShare.setVisible(selectionMode);
7576
//mTag.setVisible(selectionMode);
7677
mDelete.setVisible(selectionMode);
@@ -80,9 +81,9 @@ private void setSelectionMode(boolean selectionMode) {
8081

8182
@Override
8283
public void onDragSelectionChanged(int i) {
83-
Log.d(TAG, "DragSelectionChanged: "+i);
84+
Log.d(TAG, "DragSelectionChanged: " + i);
8485

85-
setSelectionMode(i>0);
86+
setSelectionMode(i > 0);
8687
}
8788

8889

@@ -97,15 +98,15 @@ protected ThumbAdapter(GalleryGridActivity activity, ArrayList<String> files) {
9798
super();
9899
mCallback = activity;
99100

100-
for (String file : files){
101+
for (String file : files) {
101102
add(file);
102103
}
103104

104105
setSelectionListener(activity);
105106

106107
}
107108

108-
void add(String path){
109+
void add(String path) {
109110
itemList.add(path);
110111
}
111112

@@ -121,13 +122,13 @@ public void onBindViewHolder(ThumbViewHolder holder, int position) {
121122

122123
String filename = itemList.get(position);
123124

124-
if ( !filename.equals(holder.filename)) {
125+
if (!filename.equals(holder.filename)) {
125126

126127
// remove previous image
127128
holder.image.setImageBitmap(null);
128129

129130
// Load image, decode it to Bitmap and return Bitmap to callback
130-
mImageLoader.displayImage("file:///"+filename, holder.image, mTargetSize);
131+
mImageLoader.displayImage("file:///" + filename, holder.image, mTargetSize);
131132

132133
// holder.image.setImageBitmap(decodeSampledBitmapFromUri(filename, 220, 220));
133134

@@ -150,7 +151,7 @@ public ArrayList<String> getSelectedFiles() {
150151

151152
ArrayList<String> selection = new ArrayList<>();
152153

153-
for ( Integer i: getSelectedIndices() ) {
154+
for (Integer i : getSelectedIndices()) {
154155
selection.add(itemList.get(i));
155156
}
156157

@@ -159,7 +160,7 @@ public ArrayList<String> getSelectedFiles() {
159160

160161

161162
public class ThumbViewHolder extends RecyclerView.ViewHolder
162-
implements View.OnClickListener, View.OnLongClickListener{
163+
implements View.OnClickListener, View.OnLongClickListener {
163164

164165
public final ImageView image;
165166
public String filename;
@@ -219,7 +220,7 @@ public void onCreate(Bundle savedInstanceState) {
219220
mTargetSize = new ImageSize(220, 220); // result Bitmap will be fit to this size
220221

221222
ArrayList<String> ab = new ArrayList<>();
222-
myThumbAdapter = new ThumbAdapter(this, ab );
223+
myThumbAdapter = new ThumbAdapter(this, ab);
223224
// new Utils(getApplicationContext()).getFilePaths(););
224225

225226
recyclerView = (DragSelectRecyclerView) findViewById(R.id.recyclerview);
@@ -248,6 +249,15 @@ public void onClick(DialogInterface dialog, int which) {
248249
}
249250
});
250251

252+
final FloatingActionButton pdfButton = (FloatingActionButton) findViewById(R.id.pdfButton);
253+
254+
pdfButton.setOnClickListener(new View.OnClickListener() {
255+
@Override
256+
public void onClick(View v) {
257+
PdfHelper.mergeImagesToPdf(getApplicationContext(), myThumbAdapter.getSelectedFiles());
258+
}
259+
});
260+
251261
}
252262

253263
private void reloadAdapter() {
@@ -270,19 +280,18 @@ public void onResume() {
270280
}
271281

272282
private void deleteImage() {
273-
for ( String filePath: myThumbAdapter.getSelectedFiles() ) {
283+
for (String filePath : myThumbAdapter.getSelectedFiles()) {
274284
final File photoFile = new File(filePath);
275285
if (photoFile.delete()) {
276-
Utils.removeImageFromGallery(filePath,this);
277-
Log.d(TAG,"Removed file: "+filePath);
286+
Utils.removeImageFromGallery(filePath, this);
287+
Log.d(TAG, "Removed file: " + filePath);
278288
}
279289
}
280290

281291
reloadAdapter();
282292

283293
}
284294

285-
286295
@Override
287296
public boolean onCreateOptionsMenu(Menu menu) {
288297
// Inflate the menu; this adds items to the action bar if it is present.
@@ -309,7 +318,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
309318
// as you specify a parent activity in AndroidManifest.xml.
310319
int id = item.getItemId();
311320

312-
switch(id) {
321+
switch (id) {
313322
case android.R.id.home:
314323
finish();
315324
break;
@@ -341,17 +350,17 @@ public void shareImages() {
341350
final Intent shareIntent = new Intent(Intent.ACTION_SEND);
342351
shareIntent.setType("image/jpg");
343352

344-
Uri uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName()+".fileprovider", new File(selectedFiles.get(0)));
353+
Uri uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", new File(selectedFiles.get(0)));
345354
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
346-
Log.d("GalleryGridActivity","uri "+uri);
355+
Log.d("GalleryGridActivity", "uri " + uri);
347356

348357
startActivity(Intent.createChooser(shareIntent, getString(R.string.share_snackbar)));
349358
} else {
350359
ArrayList<Uri> filesUris = new ArrayList<>();
351360
for (String i : myThumbAdapter.getSelectedFiles()) {
352-
Uri uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName()+".fileprovider", new File(i));
361+
Uri uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", new File(i));
353362
filesUris.add(uri);
354-
Log.d("GalleryGridActivity","uri "+uri);
363+
Log.d("GalleryGridActivity", "uri " + uri);
355364
}
356365

357366
final Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
@@ -364,5 +373,4 @@ public void shareImages() {
364373
}
365374

366375

367-
368376
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.todobom.opennotescanner.helpers;
2+
3+
import android.content.Context;
4+
import android.content.SharedPreferences;
5+
import android.preference.PreferenceManager;
6+
import android.widget.Toast;
7+
8+
import com.itextpdf.io.image.ImageData;
9+
import com.itextpdf.io.image.ImageDataFactory;
10+
import com.itextpdf.kernel.geom.PageSize;
11+
import com.itextpdf.kernel.pdf.PdfDocument;
12+
import com.itextpdf.kernel.pdf.PdfWriter;
13+
import com.itextpdf.layout.Document;
14+
import com.itextpdf.layout.element.Image;
15+
import com.todobom.opennotescanner.R;
16+
17+
import java.io.File;
18+
import java.io.FileNotFoundException;
19+
import java.net.MalformedURLException;
20+
import java.text.SimpleDateFormat;
21+
import java.util.ArrayList;
22+
import java.util.Collections;
23+
import java.util.Date;
24+
25+
26+
public class PdfHelper {
27+
28+
public static void mergeImagesToPdf(Context applicationContext, ArrayList<String> files) {
29+
//TODO move this to background thread
30+
if (files.isEmpty()) {
31+
Toast
32+
.makeText(applicationContext, applicationContext.getString(R.string.no_files_selected), Toast.LENGTH_SHORT)
33+
.show();
34+
return;
35+
}
36+
String outputFile = "PDF-"
37+
+ new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date()) + ".pdf";
38+
39+
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
40+
String pdfFilePath = new File(
41+
android.os.Environment.getExternalStorageDirectory()
42+
+ File.separator + sharedPreferences.getString("storage_folder", "OpenNoteScanner")
43+
, outputFile)
44+
.getAbsolutePath();
45+
46+
PdfWriter pdfWriter = null;
47+
try {
48+
pdfWriter = new PdfWriter(pdfFilePath);
49+
} catch (FileNotFoundException e) {
50+
e.printStackTrace();
51+
}
52+
if(pdfWriter == null){
53+
return;
54+
}
55+
56+
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
57+
Document document = new Document(pdfDocument);
58+
59+
Collections.sort(files);
60+
61+
for (String file : files) {
62+
ImageData imageData = null;
63+
try {
64+
imageData = ImageDataFactory.create(file);
65+
} catch (MalformedURLException e) {
66+
e.printStackTrace();
67+
}
68+
if(imageData == null){
69+
return;
70+
}
71+
Image image = new Image(imageData);
72+
pdfDocument.addNewPage(new PageSize(image.getImageWidth(), image.getImageHeight()));
73+
document.add(image);
74+
}
75+
76+
document.close();
77+
78+
Toast
79+
.makeText(applicationContext, pdfFilePath, Toast.LENGTH_SHORT)
80+
.show();
81+
82+
}
83+
84+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!-- Taken from material.io
2+
Apache license version 2.0 applies -->
3+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:width="24dp"
5+
android:height="24dp"
6+
android:viewportWidth="24.0"
7+
android:viewportHeight="24.0">
8+
<path
9+
android:fillColor="#FF000000"
10+
android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM11.5,9.5c0,0.83 -0.67,1.5 -1.5,1.5L9,11v2L7.5,13L7.5,7L10,7c0.83,0 1.5,0.67 1.5,1.5v1zM16.5,11.5c0,0.83 -0.67,1.5 -1.5,1.5h-2.5L12.5,7L15,7c0.83,0 1.5,0.67 1.5,1.5v3zM20.5,8.5L19,8.5v1h1.5L20.5,11L19,11v2h-1.5L17.5,7h3v1.5zM9,9.5h1v-1L9,8.5v1zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM14,11.5h1v-3h-1v3z"/>
11+
</vector>
Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

3-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
45
xmlns:tools="http://schemas.android.com/tools"
56
android:layout_width="match_parent"
67
android:layout_height="match_parent"
7-
android:orientation="vertical"
8+
android:layout_gravity="left|center_vertical"
89
android:background="#FFFFFF">
910

1011
<com.afollestad.dragselectrecyclerview.DragSelectRecyclerView
@@ -13,5 +14,19 @@
1314
android:layout_height="match_parent"
1415
android:scrollbars="vertical" />
1516

17+
<android.support.design.widget.FloatingActionButton
18+
android:id="@+id/pdfButton"
19+
android:layout_width="wrap_content"
20+
android:layout_height="wrap_content"
21+
android:layout_alignParentTop="true"
22+
android:layout_alignParentRight="true"
23+
android:layout_marginTop="30dp"
24+
android:layout_marginRight="30dp"
25+
android:backgroundTint="#A060FF60"
26+
android:src="@drawable/ic_menu_pdf"
27+
android:tint="#ffffff"
28+
app:borderWidth="0dp"
29+
app:elevation="0sp"
30+
app:fabSize="mini" />
1631

17-
</LinearLayout>
32+
</RelativeLayout>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@
6767
<string name="save_png_summary">Save final images to PNG format. Notice that metadata isn\'t supported yet on PNG, so some features will not be available.</string>
6868
<string name="format_not_supported">Format not supported</string>
6969
<string name="format_not_supported_message">Image format doesn\'t support tagging</string>
70+
<string name="no_files_selected">No files selected.</string>
7071
</resources>

0 commit comments

Comments
 (0)