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

Commit 5f8f8a6a authored by pfayoux's avatar pfayoux
Browse files

Enable opening Pdf File from http and https Uri

parent 51ec75ec
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.gsnathan.pdfviewer"
        minSdkVersion 21
        minSdkVersion 26
        targetSdkVersion 29
        versionCode 22
        versionName "3.1"
+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"
+104 −7
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,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";
@@ -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);
@@ -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);
@@ -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)
@@ -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));
    }
@@ -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) {
@@ -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) {
+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);
        }
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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();
    }
}