Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 911284c6 authored by pfayoux's avatar pfayoux
Browse files

Make Pdf Viewer able to do http and https request to download pdf files.

parent 31de383e
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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
+23 −22
Original line number Diff line number Diff line
@@ -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();
@@ -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;
@@ -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);
@@ -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;
@@ -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()) {
@@ -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);
@@ -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);
+47 −15
Original line number Diff line number Diff line
@@ -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) {
@@ -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;
        }

@@ -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);
        }
    }
+9 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

package com.gsnathan.pdfviewer;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -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;
@@ -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;
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -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