Loading app/src/main/java/com/gsnathan/pdfviewer/App.java +8 −0 Original line number Diff line number Diff line Loading @@ -5,12 +5,20 @@ import android.content.res.Configuration; import com.jaredrummler.cyanea.Cyanea; import java.util.Properties; public class App extends Application { @Override public void onCreate() { super.onCreate(); Cyanea.init(this, getResources()); Properties system = System.getProperties(); system.put("http.proxyHost", "localhost"); system.put("http.proxyPort", "80"); system.put("https.proxyHost", "localhost"); system.put("https.proxyPort", "80"); } @Override Loading app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +23 −22 Original line number Diff line number Diff line Loading @@ -93,20 +93,19 @@ 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 int PERMISSION_WRITE = 42041; public static final int PERMISSION_READ = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE"; private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pdfFileName = ""; prefManager = PreferenceManager.getDefaultSharedPreferences(this); onFirstInstall(); onFirstUpdate(); Loading Loading @@ -183,13 +182,13 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{READ_EXTERNAL_STORAGE}, PERMISSION_CODE new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_READ ); return; Loading Loading @@ -290,8 +289,9 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen SharedPreferences.Editor editor = prefManager.edit(); editor.putString("uri", uri.toString()); editor.apply(); String scheme = uri.getScheme(); if (uri.getScheme().contains("http")) { if (scheme != null && scheme.contains("http")) { // we will get the pdf asynchronously with the RetrievePDFStream object RetrievePDFStream retrievePDFStream = new RetrievePDFStream(this); retrievePDFStream.execute(uri.toString(), pdfFileName); Loading Loading @@ -362,20 +362,22 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } 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( ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_SAVE PERMISSION_WRITE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "ERROR FILE " + e.getMessage() + e.getStackTrace()); Log.e(TAG, "Error on file : " + e.getMessage()); e.printStackTrace(); } return null; Loading @@ -401,7 +403,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen public String getFileName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { if (uri.getScheme() != null && uri.getScheme().equals("content")) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { Loading Loading @@ -484,17 +486,17 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { int indexPermission = 0; int indexPermission; switch (requestCode) { case PERMISSION_CODE: case PERMISSION_READ: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_SAVE: case PERMISSION_WRITE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); Loading @@ -504,7 +506,6 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } } @Override public void onPageError(int page, Throwable t) { Log.e(TAG, "Cannot load page " + page); Loading app/src/main/java/com/gsnathan/pdfviewer/RetrievePDFStream.java +47 −15 Original line number Diff line number Diff line Loading @@ -2,23 +2,26 @@ package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; 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; import java.security.cert.Certificate; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLPeerUnverifiedException; /** * 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() // a reference to our MainActivity, this is used to be able to call displayFromStream() private WeakReference<MainActivity> mainActivityWR; public RetrievePDFStream(MainActivity activity) { Loading @@ -28,20 +31,49 @@ public class RetrievePDFStream extends AsyncTask<String, Void, File> { @Override protected File doInBackground(String... strings) { File file = null; String url = strings [0]; String filename = strings[1]; InputStream inputStream = null; MainActivity activity = mainActivityWR.get(); try { URL uri = new URL(strings[0]); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); URL uri = new URL(url); if (url.startsWith("https")) { Log.i("RetrievePDFStream", "HTTPS CONNECTION"); HttpsURLConnection urlConnection = (HttpsURLConnection) uri.openConnection(); urlConnection.connect(); if (urlConnection.getResponseCode() == 200) { Certificate[] certs = urlConnection.getServerCertificates(); for (Certificate cert : certs) Log.i("RetrievePDFStream", "Certificate : " + "\n - Type : " + cert.getType() + "\n - Hash Code : " + cert.hashCode() + "\n - Public Key Algorithm : " + cert.getPublicKey().getAlgorithm() + "\n - Public Key Format : " + cert.getPublicKey().getFormat() ); inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } urlConnection.disconnect(); file = File.createTempFile(strings[1], null, activity.getCacheDir()); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); } else { Log.i("RetrievePDFStream", "HTTP CONNECTION"); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); urlConnection.connect(); if (urlConnection.getResponseCode() == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } urlConnection.disconnect(); } } catch (SSLPeerUnverifiedException e) { Log.e("RetrievePDFStream", "Error SSL"); Toast.makeText(activity, R.string.toast_pick_file_error, Toast.LENGTH_SHORT).show(); return null; } catch (IOException e) { Log.e("RetrievePDFStream", "Error cannot get file at URL"); Log.e("RetrievePDFStream", "Error cannot get file at URL :" + url); e.printStackTrace(); return null; } Loading @@ -52,7 +84,7 @@ public class RetrievePDFStream extends AsyncTask<String, Void, File> { protected void onPostExecute(File file) { MainActivity activity = mainActivityWR.get(); if (activity != null) { if (activity != null && file != null) { activity.saveFileAndDisplay(file); } } Loading app/src/main/java/com/gsnathan/pdfviewer/Utils.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading @@ -36,6 +37,7 @@ import android.os.Build; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; Loading Loading @@ -114,4 +116,11 @@ public class Utils { outputStream.flush(); outputStream.close(); } static File createFileFromInputStream (File cacheDir, String fileName, InputStream inputStream) throws IOException { File file = File.createTempFile(fileName, null, cacheDir); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return file; } } app/src/main/res/values-de/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ <resources> <string name="pick_file">Datei auswählen</string> <string name="toast_pick_file_error">Datei konnte nicht ausgewählt werden. Bitte überprüfen Sie Ihren Dateimanager.</string> <string name="toast_ssl_error">Sichere Verbindung fehlgeschlagen.</string> <string name="action_about">Über</string> <string name="version">Version</string> <string name="intro">Einführung wiederholen</string> Loading Loading
app/src/main/java/com/gsnathan/pdfviewer/App.java +8 −0 Original line number Diff line number Diff line Loading @@ -5,12 +5,20 @@ import android.content.res.Configuration; import com.jaredrummler.cyanea.Cyanea; import java.util.Properties; public class App extends Application { @Override public void onCreate() { super.onCreate(); Cyanea.init(this, getResources()); Properties system = System.getProperties(); system.put("http.proxyHost", "localhost"); system.put("http.proxyPort", "80"); system.put("https.proxyHost", "localhost"); system.put("https.proxyPort", "80"); } @Override Loading
app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +23 −22 Original line number Diff line number Diff line Loading @@ -93,20 +93,19 @@ 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 int PERMISSION_WRITE = 42041; public static final int PERMISSION_READ = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE"; private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pdfFileName = ""; prefManager = PreferenceManager.getDefaultSharedPreferences(this); onFirstInstall(); onFirstUpdate(); Loading Loading @@ -183,13 +182,13 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{READ_EXTERNAL_STORAGE}, PERMISSION_CODE new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_READ ); return; Loading Loading @@ -290,8 +289,9 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen SharedPreferences.Editor editor = prefManager.edit(); editor.putString("uri", uri.toString()); editor.apply(); String scheme = uri.getScheme(); if (uri.getScheme().contains("http")) { if (scheme != null && scheme.contains("http")) { // we will get the pdf asynchronously with the RetrievePDFStream object RetrievePDFStream retrievePDFStream = new RetrievePDFStream(this); retrievePDFStream.execute(uri.toString(), pdfFileName); Loading Loading @@ -362,20 +362,22 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } 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( ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_SAVE PERMISSION_WRITE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "ERROR FILE " + e.getMessage() + e.getStackTrace()); Log.e(TAG, "Error on file : " + e.getMessage()); e.printStackTrace(); } return null; Loading @@ -401,7 +403,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen public String getFileName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { if (uri.getScheme() != null && uri.getScheme().equals("content")) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { Loading Loading @@ -484,17 +486,17 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { int indexPermission = 0; int indexPermission; switch (requestCode) { case PERMISSION_CODE: case PERMISSION_READ: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_SAVE: case PERMISSION_WRITE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); Loading @@ -504,7 +506,6 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } } @Override public void onPageError(int page, Throwable t) { Log.e(TAG, "Cannot load page " + page); Loading
app/src/main/java/com/gsnathan/pdfviewer/RetrievePDFStream.java +47 −15 Original line number Diff line number Diff line Loading @@ -2,23 +2,26 @@ package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; 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; import java.security.cert.Certificate; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLPeerUnverifiedException; /** * 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() // a reference to our MainActivity, this is used to be able to call displayFromStream() private WeakReference<MainActivity> mainActivityWR; public RetrievePDFStream(MainActivity activity) { Loading @@ -28,20 +31,49 @@ public class RetrievePDFStream extends AsyncTask<String, Void, File> { @Override protected File doInBackground(String... strings) { File file = null; String url = strings [0]; String filename = strings[1]; InputStream inputStream = null; MainActivity activity = mainActivityWR.get(); try { URL uri = new URL(strings[0]); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); URL uri = new URL(url); if (url.startsWith("https")) { Log.i("RetrievePDFStream", "HTTPS CONNECTION"); HttpsURLConnection urlConnection = (HttpsURLConnection) uri.openConnection(); urlConnection.connect(); if (urlConnection.getResponseCode() == 200) { Certificate[] certs = urlConnection.getServerCertificates(); for (Certificate cert : certs) Log.i("RetrievePDFStream", "Certificate : " + "\n - Type : " + cert.getType() + "\n - Hash Code : " + cert.hashCode() + "\n - Public Key Algorithm : " + cert.getPublicKey().getAlgorithm() + "\n - Public Key Format : " + cert.getPublicKey().getFormat() ); inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } urlConnection.disconnect(); file = File.createTempFile(strings[1], null, activity.getCacheDir()); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); } else { Log.i("RetrievePDFStream", "HTTP CONNECTION"); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); urlConnection.connect(); if (urlConnection.getResponseCode() == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } urlConnection.disconnect(); } } catch (SSLPeerUnverifiedException e) { Log.e("RetrievePDFStream", "Error SSL"); Toast.makeText(activity, R.string.toast_pick_file_error, Toast.LENGTH_SHORT).show(); return null; } catch (IOException e) { Log.e("RetrievePDFStream", "Error cannot get file at URL"); Log.e("RetrievePDFStream", "Error cannot get file at URL :" + url); e.printStackTrace(); return null; } Loading @@ -52,7 +84,7 @@ public class RetrievePDFStream extends AsyncTask<String, Void, File> { protected void onPostExecute(File file) { MainActivity activity = mainActivityWR.get(); if (activity != null) { if (activity != null && file != null) { activity.saveFileAndDisplay(file); } } Loading
app/src/main/java/com/gsnathan/pdfviewer/Utils.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading @@ -36,6 +37,7 @@ import android.os.Build; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; Loading Loading @@ -114,4 +116,11 @@ public class Utils { outputStream.flush(); outputStream.close(); } static File createFileFromInputStream (File cacheDir, String fileName, InputStream inputStream) throws IOException { File file = File.createTempFile(fileName, null, cacheDir); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return file; } }
app/src/main/res/values-de/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ <resources> <string name="pick_file">Datei auswählen</string> <string name="toast_pick_file_error">Datei konnte nicht ausgewählt werden. Bitte überprüfen Sie Ihren Dateimanager.</string> <string name="toast_ssl_error">Sichere Verbindung fehlgeschlagen.</string> <string name="action_about">Über</string> <string name="version">Version</string> <string name="intro">Einführung wiederholen</string> Loading