Loading app/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ android { compileSdkVersion 29 defaultConfig { applicationId "com.gsnathan.pdfviewer" minSdkVersion 21 minSdkVersion 26 targetSdkVersion 29 versionCode 22 versionName "3.1" Loading app/src/main/AndroidManifest.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,8 @@ package="com.gsnathan.pdfviewer"> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".App" Loading app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +104 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.Manifest; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; Loading @@ -32,6 +33,7 @@ import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Environment; import android.os.StrictMode; import android.preference.PreferenceManager; import android.print.PrintAttributes; Loading Loading @@ -73,6 +75,13 @@ import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.ViewById; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.List; @EActivity(R.layout.activity_main) Loading @@ -84,6 +93,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private PrintManager mgr = null; private final static int REQUEST_CODE = 42; public static final int PERMISSION_SAVE = 1; public static final int PERMISSION_CODE = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; Loading @@ -91,6 +101,8 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Loading Loading @@ -167,6 +179,8 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen String pdfFileName; String pdfTempFilePath; private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Loading Loading @@ -277,6 +291,11 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen editor.putString("uri", uri.toString()); editor.apply(); if (uri.getScheme().contains("http")) { // we will get the pdf asynchronously with the RetrievePDFStream object RetrievePDFStream retrievePDFStream = new RetrievePDFStream(this); retrievePDFStream.execute(uri.toString(), pdfFileName); } else { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromUri(uri) Loading @@ -295,9 +314,73 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } } void displayFromFile(File file) { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromFile(file) .defaultPage(pageNumber) .onPageChange(this) .enableAnnotationRendering(true) .enableAntialiasing(prefManager.getBoolean("alias_pref", false)) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .spacing(10) // in dp .onPageError(this) .pageFitPolicy(FitPolicy.BOTH) .password(PDF_PASSWORD) .swipeHorizontal(prefManager.getBoolean("scroll_pref", false)) .autoSpacing(prefManager.getBoolean("scroll_pref", false)) .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } public void saveFileAndDisplay (File file) { String filePath = saveTempFileToFile(file); pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); File newFile = new File(filePath); displayFromFile(newFile); } String saveTempFileToFile(File tempFile) { try { // check if the permission to write to external storage is granted if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { InputStream inputStream = new FileInputStream(tempFile); File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), pdfFileName); OutputStream outputStream = new FileOutputStream(newFile); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return tempFile.getPath(); } else { // case if the permission hasn't been granted, we will store the pdf in a temp file //store the temporary file path, to be able to save it when permission will be granted pdfTempFilePath = tempFile.getPath(); // request for the permission to write to external storage requestPermissions( new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_SAVE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "ERROR FILE " + e.getMessage() + e.getStackTrace()); } return null; } void navToSettings() { startActivity(Utils.navIntent(this, SettingsActivity.class)); } Loading @@ -322,7 +405,10 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); int indexDisplayName = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); if(indexDisplayName != -1) { result = cursor.getString(indexDisplayName); } } } finally { if (cursor != null) { Loading Loading @@ -400,13 +486,24 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { if (requestCode == PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { int indexPermission = 0; switch (requestCode) { case PERMISSION_CODE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_SAVE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); saveTempFileToFile(file); } break; } } @Override public void onPageError(int page, Throwable t) { Loading app/src/main/java/com/gsnathan/pdfviewer/RetrievePDFStream.java 0 → 100644 +59 −0 Original line number Diff line number Diff line package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; /** * This class is used to get a Stream from an URL */ public class RetrievePDFStream extends AsyncTask<String, Void, File> { // a reference to our MainActivity, this is used to be able to call displayFromFile() private WeakReference<MainActivity> mainActivityWR; public RetrievePDFStream(MainActivity activity) { mainActivityWR = new WeakReference<>(activity); } @Override protected File doInBackground(String... strings) { File file = null; InputStream inputStream = null; MainActivity activity = mainActivityWR.get(); try{ URL uri = new URL(strings[0]); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); if (urlConnection.getResponseCode() == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); } file = File.createTempFile(strings[1], null, activity.getCacheDir()); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); } catch (IOException e){ Log.e("RetrievePDFStream", "Error cannot get file at URL"); return null; } return file; } @Override protected void onPostExecute(File file) { MainActivity activity = mainActivityWR.get(); if (activity != null) { activity.saveFileAndDisplay(file); } } } app/src/main/java/com/gsnathan/pdfviewer/Utils.java +16 −0 Original line number Diff line number Diff line Loading @@ -33,8 +33,12 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.util.Log; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; Loading Loading @@ -98,4 +102,16 @@ public class Utils { static String getAppVersion() { return BuildConfig.VERSION_NAME; } static void readFromInputStreamToOutputStream (InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[8 * 1024]; int bytesRead = inputStream.read(buffer); while (bytesRead > -1) { outputStream.write(buffer, 0, bytesRead); bytesRead = inputStream.read(buffer); } outputStream.flush(); outputStream.close(); } } Loading
app/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ android { compileSdkVersion 29 defaultConfig { applicationId "com.gsnathan.pdfviewer" minSdkVersion 21 minSdkVersion 26 targetSdkVersion 29 versionCode 22 versionName "3.1" Loading
app/src/main/AndroidManifest.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,8 @@ package="com.gsnathan.pdfviewer"> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".App" Loading
app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +104 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.Manifest; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; Loading @@ -32,6 +33,7 @@ import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Environment; import android.os.StrictMode; import android.preference.PreferenceManager; import android.print.PrintAttributes; Loading Loading @@ -73,6 +75,13 @@ import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.ViewById; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.List; @EActivity(R.layout.activity_main) Loading @@ -84,6 +93,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private PrintManager mgr = null; private final static int REQUEST_CODE = 42; public static final int PERMISSION_SAVE = 1; public static final int PERMISSION_CODE = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; Loading @@ -91,6 +101,8 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Loading Loading @@ -167,6 +179,8 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen String pdfFileName; String pdfTempFilePath; private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Loading Loading @@ -277,6 +291,11 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen editor.putString("uri", uri.toString()); editor.apply(); if (uri.getScheme().contains("http")) { // we will get the pdf asynchronously with the RetrievePDFStream object RetrievePDFStream retrievePDFStream = new RetrievePDFStream(this); retrievePDFStream.execute(uri.toString(), pdfFileName); } else { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromUri(uri) Loading @@ -295,9 +314,73 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } } void displayFromFile(File file) { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromFile(file) .defaultPage(pageNumber) .onPageChange(this) .enableAnnotationRendering(true) .enableAntialiasing(prefManager.getBoolean("alias_pref", false)) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .spacing(10) // in dp .onPageError(this) .pageFitPolicy(FitPolicy.BOTH) .password(PDF_PASSWORD) .swipeHorizontal(prefManager.getBoolean("scroll_pref", false)) .autoSpacing(prefManager.getBoolean("scroll_pref", false)) .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } public void saveFileAndDisplay (File file) { String filePath = saveTempFileToFile(file); pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); File newFile = new File(filePath); displayFromFile(newFile); } String saveTempFileToFile(File tempFile) { try { // check if the permission to write to external storage is granted if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { InputStream inputStream = new FileInputStream(tempFile); File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), pdfFileName); OutputStream outputStream = new FileOutputStream(newFile); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return tempFile.getPath(); } else { // case if the permission hasn't been granted, we will store the pdf in a temp file //store the temporary file path, to be able to save it when permission will be granted pdfTempFilePath = tempFile.getPath(); // request for the permission to write to external storage requestPermissions( new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_SAVE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "ERROR FILE " + e.getMessage() + e.getStackTrace()); } return null; } void navToSettings() { startActivity(Utils.navIntent(this, SettingsActivity.class)); } Loading @@ -322,7 +405,10 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); int indexDisplayName = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); if(indexDisplayName != -1) { result = cursor.getString(indexDisplayName); } } } finally { if (cursor != null) { Loading Loading @@ -400,13 +486,24 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { if (requestCode == PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { int indexPermission = 0; switch (requestCode) { case PERMISSION_CODE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_SAVE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); saveTempFileToFile(file); } break; } } @Override public void onPageError(int page, Throwable t) { Loading
app/src/main/java/com/gsnathan/pdfviewer/RetrievePDFStream.java 0 → 100644 +59 −0 Original line number Diff line number Diff line package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; /** * This class is used to get a Stream from an URL */ public class RetrievePDFStream extends AsyncTask<String, Void, File> { // a reference to our MainActivity, this is used to be able to call displayFromFile() private WeakReference<MainActivity> mainActivityWR; public RetrievePDFStream(MainActivity activity) { mainActivityWR = new WeakReference<>(activity); } @Override protected File doInBackground(String... strings) { File file = null; InputStream inputStream = null; MainActivity activity = mainActivityWR.get(); try{ URL uri = new URL(strings[0]); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); if (urlConnection.getResponseCode() == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); } file = File.createTempFile(strings[1], null, activity.getCacheDir()); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); } catch (IOException e){ Log.e("RetrievePDFStream", "Error cannot get file at URL"); return null; } return file; } @Override protected void onPostExecute(File file) { MainActivity activity = mainActivityWR.get(); if (activity != null) { activity.saveFileAndDisplay(file); } } }
app/src/main/java/com/gsnathan/pdfviewer/Utils.java +16 −0 Original line number Diff line number Diff line Loading @@ -33,8 +33,12 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.util.Log; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; Loading Loading @@ -98,4 +102,16 @@ public class Utils { static String getAppVersion() { return BuildConfig.VERSION_NAME; } static void readFromInputStreamToOutputStream (InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[8 * 1024]; int bytesRead = inputStream.read(buffer); while (bytesRead > -1) { outputStream.write(buffer, 0, bytesRead); bytesRead = inputStream.read(buffer); } outputStream.flush(); outputStream.close(); } }