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

Unverified Commit 9f360089 authored by Gokul Swaminathan's avatar Gokul Swaminathan Committed by GitHub
Browse files

Merge pull request #40 from PFayoux/patch-2

Enable opening http and https from intent. Should close #28
parents 3d26529a 9cba1a1c
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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"
+114 −0
Original line number Diff line number Diff line
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.IOException;
import java.io.InputStream;
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.SSLHandshakeException;
import javax.net.ssl.SSLPeerUnverifiedException;

/**
 * This class is used to get a PDF File from an URL
 */
public class DownloadPDFFile extends AsyncTask<String, Void, Object> {

    // a reference to our MainActivity, this is used to be able to call saveFileAndDisplay()
    private WeakReference<MainActivity> mainActivityWR;

    public DownloadPDFFile(MainActivity activity) {
        mainActivityWR = new WeakReference<>(activity);
    }

    @Override
    protected Object doInBackground(String... strings) {
        File file;
        String url = strings [0];
        String filename = strings[1];
        InputStream inputStream;
        MainActivity activity = mainActivityWR.get();
        int responseCode;

        try {
            URL uri = new URL(url);

            if (url.startsWith("https")) {
                Log.i("DownloadPDFFile", "HTTPS CONNECTION");
                HttpsURLConnection urlConnection = (HttpsURLConnection) uri.openConnection();
                urlConnection.connect();
                responseCode = urlConnection.getResponseCode();
                if (responseCode == 200) {
                    Certificate[] certs = urlConnection.getServerCertificates();
                    for (Certificate cert : certs)
                        Log.i("DownloadPDFFile", "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);
                } else {
                    Log.e("DownloadPDFFile", "Error request https, response code : " + responseCode);
                    return responseCode;
                }
                urlConnection.disconnect();

            } else {
                Log.i("DownloadPDFFile", "HTTP CONNECTION");
                HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection();
                urlConnection.connect();
                responseCode = urlConnection.getResponseCode();
                if (responseCode == 200) {
                    inputStream = new BufferedInputStream(urlConnection.getInputStream());
                    file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream);
                } else {
                    Log.e("DownloadPDFFile", "Error request http, response code : " + responseCode);
                    return responseCode;
                }
                urlConnection.disconnect();
            }
        } catch (SSLPeerUnverifiedException e) {
            Log.e("DownloadPDFFile", "Error SSL Peer Unverified Exception");
            return e;
        } catch (SSLHandshakeException e) {
            Log.e("DownloadPDFFile", "Error SSL Handshake Exception");
            return e;
        } catch (IOException e) {
            Log.e("DownloadPDFFile", "Error cannot get file at URL :" + url);
            e.printStackTrace();
            return e;
        }

        return file;
    }

    @Override
    protected void onPostExecute(Object result) {
        MainActivity activity = mainActivityWR.get();

        if (activity != null) {
            // Manage error
            if (result == null) {
                Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show();
            } else if (result instanceof Integer) {
                Toast.makeText(activity.getApplicationContext(), R.string.toast_http_code_error + String.valueOf(result), Toast.LENGTH_SHORT).show();
            } else if (result instanceof SSLPeerUnverifiedException || result instanceof SSLHandshakeException) {
                Toast.makeText(activity.getApplicationContext(), R.string.toast_ssl_error, Toast.LENGTH_SHORT).show();
            } else if (result instanceof IOException) {
                Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show();
            } else if (result instanceof File) {
                activity.saveFileAndDisplay((File) result);
            }
        }
    }
}
+109 −14
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

package com.gsnathan.pdfviewer;

import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
@@ -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;
@@ -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)
@@ -84,10 +93,11 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen
    private PrintManager mgr = null;

    private final static int REQUEST_CODE = 42;
    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;

@@ -95,6 +105,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pdfFileName = "";

        prefManager = PreferenceManager.getDefaultSharedPreferences(this);
        onFirstInstall();
        onFirstUpdate();
@@ -167,15 +178,17 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen

    String pdfFileName;

    String pdfTempFilePath;

    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;
@@ -276,7 +289,13 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen
        SharedPreferences.Editor editor = prefManager.edit();
        editor.putString("uri", uri.toString());
        editor.apply();
        String scheme = uri.getScheme();

        if (scheme != null && scheme.contains("http")) {
            // we will get the pdf asynchronously with the DownloadPDFFile object
            DownloadPDFFile DownloadPDFFile = new DownloadPDFFile(this);
            DownloadPDFFile.execute(uri.toString(), pdfFileName);
        } else {
            pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false));

            pdfView.fromUri(uri)
@@ -295,7 +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


                // request for the permission to write to external storage
                ActivityCompat.requestPermissions(
                        this,
                        new String[] {
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE
                        },
                        PERMISSION_WRITE
                );
                return pdfTempFilePath;
            }
        } catch (IOException e) {
            Log.e(TAG, "Error on file : " + e.getMessage());
            e.printStackTrace();
        }

        return null;
    }

    void navToSettings() {
@@ -318,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()) {
@@ -401,13 +486,23 @@ 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) {
        if (requestCode == PERMISSION_CODE) {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        int indexPermission;
        switch (requestCode) {
            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_WRITE:
                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;
        }
    }

+25 −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;
@@ -33,8 +34,13 @@ 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.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
@@ -98,4 +104,23 @@ 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();
    }

    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;
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@
<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_http_code_error">Seiten-Ladefehler, http error code : </string>
    <string name="toast_io_exception">Aus unbekannten Gründen konnte diese Seite nicht geladen werden.</string>
    <string name="toast_ssl_error">Fehler: Gesicherte Verbindung fehlgeschlagen.</string>
    <string name="action_about">Über</string>
    <string name="version">Version</string>
    <string name="intro">Einführung wiederholen</string>
Loading