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

Unverified Commit d6d90985 authored by gokul swaminathan's avatar gokul swaminathan Committed by GitHub
Browse files

Merge pull request #123 from JavaCafe01/dev

3.7 Release
parents 0ae81139 380c8b8a
Loading
Loading
Loading
Loading
+2 −16
Original line number Diff line number Diff line
@@ -37,18 +37,9 @@ android {
        applicationId "com.gsnathan.pdfviewer"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 27
        versionName "3.6"
        versionCode 28
        versionName "3.7"
        vectorDrawables.useSupportLibrary = true

        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath = true
                arguments = [
                        "androidManifestFile": "$projectDir/src/main/AndroidManifest.xml".toString()
                ]
            }
        }
    }

    buildFeatures {
@@ -87,11 +78,6 @@ dependencies {
    //Pdf Viewer Library (Proguard config done)
    implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

    //Android Annotations Library (Proguard config not needed)
    //compileOnly
    annotationProcessor 'org.androidannotations:androidannotations:4.6.0'
    implementation 'org.androidannotations:androidannotations-api:4.6.0'

    //License Presenter Library (Proguard config not needed)
    implementation 'com.github.franmontiel:AttributionPresenter:1.0.1'

+7 −6
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gsnathan.pdfviewer">

    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
@@ -14,10 +14,11 @@
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.Cyanea.Light.DarkActionBar">

        <activity
            android:name=".MainActivity_"
            android:name=".MainActivity"
            android:documentLaunchMode="intoExisting">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
@@ -74,7 +75,7 @@
        <activity-alias
            android:name=".LauncherAlias"
            android:enabled="true"
            android:targetActivity=".MainActivity_">
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

@@ -85,7 +86,7 @@
        <activity
            android:name=".AboutActivity"
            android:label="@string/action_about"
            android:parentActivityName=".MainActivity_" />
            android:parentActivityName=".MainActivity" />

        <activity
            android:name=".MainIntroActivity"
@@ -95,7 +96,7 @@
        <activity
            android:name=".SettingsActivity"
            android:label="@string/settings"
            android:parentActivityName=".MainActivity_" />
            android:parentActivityName=".MainActivity" />
    </application>

</manifest>
 No newline at end of file
+9 −10
Original line number Diff line number Diff line
@@ -24,10 +24,12 @@

package com.gsnathan.pdfviewer;

import android.content.ActivityNotFoundException;
import android.os.Bundle;

import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.franmontiel.attributionpresenter.AttributionPresenter;
import com.franmontiel.attributionpresenter.entities.Attribution;
@@ -92,17 +94,9 @@ public class AboutActivity extends CyaneaAppCompatActivity {
                                .setWebsite("https://github.com/barteksc/AndroidPdfViewer")
                                .build()
                )
                .addAttributions(
                        new Attribution.Builder("AndroidAnnotations")
                                .addCopyrightNotice("Copyright 2012-2016 eBusiness Information\n" +
                                        "Copyright 2016-2017 the AndroidAnnotations project")
                                .addLicense(License.APACHE)
                                .setWebsite("https://github.com/androidannotations/androidannotations")
                                .build()
                )
                .addAttributions(
                        new Attribution.Builder("AppIntro")
                                .addCopyrightNotice("Copyright 2018 paorotolo")
                                .addCopyrightNotice("Copyright 2018 Paolo Rotolo")
                                .addLicense(License.APACHE)
                                .setWebsite("https://github.com/paolorotolo/AppIntro")
                                .build()
@@ -149,7 +143,12 @@ public class AboutActivity extends CyaneaAppCompatActivity {
    }

    public void emailDev(View v) {
        startActivity(Utils.emailIntent("gokulswamilive@gmail.com", "Pdf Viewer Plus", APP_VERSION_RELEASE, "Send email..."));
        String email = "gokulswamilive@gmail.com";
        try {
            startActivity(Utils.emailIntent(email, "Pdf Viewer Plus", APP_VERSION_RELEASE));
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, email, Toast.LENGTH_SHORT).show();
        }
    }

    public void navToGit(View v) {
+127 −51
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
@@ -41,10 +40,12 @@ import android.preference.PreferenceManager;
import android.print.PrintManager;
import android.provider.OpenableColumns;
import android.util.Log;
import android.view.WindowManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
@@ -63,29 +64,36 @@ import com.github.barteksc.pdfviewer.util.Constants;
import com.github.barteksc.pdfviewer.util.FitPolicy;
import com.gsnathan.pdfviewer.databinding.ActivityMainBinding;
import com.gsnathan.pdfviewer.databinding.PasswordDialogBinding;
import com.jaredrummler.cyanea.Cyanea;
import com.jaredrummler.cyanea.app.CyaneaAppCompatActivity;
import com.jaredrummler.cyanea.prefs.CyaneaSettingsActivity;
import com.shockwave.pdfium.PdfDocument;
import com.shockwave.pdfium.PdfPasswordException;

import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.NonConfigurationInstance;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

@EActivity
public class MainActivity extends CyaneaAppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final String TAG = "MainActivity";

    private PrintManager mgr;
    private SharedPreferences prefManager;

    private Uri uri;
    private int pageNumber = 0;
    private String pdfPassword;
    private String pdfFileName = "";

    private byte[] downloadedPdfFileContent;

    private boolean isBottomNavigationHidden = false;
    private boolean isFullscreenToggled = false;

    private ActivityMainBinding viewBinding;

@@ -99,6 +107,16 @@ public class MainActivity extends CyaneaAppCompatActivity {
        this::saveDownloadedFileAfterPermissionRequest
    );

    private final ActivityResultLauncher<String> readFileErrorPermissionLauncher = registerForActivityResult(
        new RequestPermission(),
        this::restartAppIfGranted
    );

    private final ActivityResultLauncher<Intent> settingsLauncher = registerForActivityResult(
        new StartActivityForResult(),
        result -> displayFromUri(uri)
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
@@ -118,13 +136,25 @@ public class MainActivity extends CyaneaAppCompatActivity {
        onFirstInstall();
        onFirstUpdate();

        readUriFromIntent(getIntent());
        if (uri == null) {
            pickFile();
            setTitle("");
        if (savedInstanceState != null) {
            restoreInstanceState(savedInstanceState);
        } else {
            uri = getIntent().getData();
            if (uri == null)
                pickFile();
        }
        displayFromUri(uri);
    }

    @Override
    public void onResume() {
        super.onResume();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        if (prefManager.getBoolean("screen_on_pref", false)) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        // Workaround for android:background XML attribute not being applied on all devices
        viewBinding.bottomNavigation.setBackgroundColor(Cyanea.getInstance().getPrimary());
    }

    private void onFirstInstall() {
@@ -147,46 +177,28 @@ public class MainActivity extends CyaneaAppCompatActivity {
        }
    }

    private void readUriFromIntent(Intent intent) {
        Uri intentUri = intent.getData();
        if (intentUri == null) {
            return;
        }

        // Happens when the content provider URI used to open the document expires
        if ("content".equals(intentUri.getScheme()) &&
            checkCallingOrSelfUriPermission(intentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION) == PERMISSION_DENIED) {
            Log.w(TAG, "No read permission for URI " + intentUri);
            uri = null;
            return;
        }

        uri = intentUri;
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putParcelable("uri", uri);
        outState.putInt("pageNumber", pageNumber);
        outState.putString("pdfPassword", pdfPassword);
        super.onSaveInstanceState(outState);
    }

    @NonConfigurationInstance
    Uri uri;

    @NonConfigurationInstance
    Integer pageNumber = 0;

    @NonConfigurationInstance
    String pdfPassword;

    private String pdfFileName = "";

    private byte[] downloadedPdfFileContent;

    private final ActivityResultLauncher<Intent> settingsLauncher = registerForActivityResult(
            new StartActivityForResult(),
            result -> {
                if (uri != null)
                    displayFromUri(uri);
    private void restoreInstanceState(Bundle savedState) {
        uri = savedState.getParcelable("uri");
        pageNumber = savedState.getInt("pageNumber");
        pdfPassword = savedState.getString("pdfPassword");
    }
    );

    void shareFile() {
        startActivity(Utils.emailIntent(pdfFileName, "", getResources().getString(R.string.share), uri));
        Intent sharingIntent;
        if (uri.getScheme() != null && uri.getScheme().startsWith("http")) {
            sharingIntent = Utils.plainTextShareIntent(getString(R.string.share), uri.toString());
        } else {
            sharingIntent = Utils.fileShareIntent(getString(R.string.share), pdfFileName, uri);
        }
        startActivity(sharingIntent);
    }

    private void openSelectedDocument(Uri selectedDocumentUri) {
@@ -231,6 +243,9 @@ public class MainActivity extends CyaneaAppCompatActivity {
                    if (uri != null)
                        printDocument();
                    break;
                case R.id.fullscreen:
                    toggleFullscreen();
                    return true;
                default:
                    break;
            }
@@ -276,12 +291,34 @@ public class MainActivity extends CyaneaAppCompatActivity {
                pdfPassword = null;  // prevent the toast from being shown again if the user rotates the screen
            }
            askForPdfPassword();
        } else if (couldNotOpenFileDueToMissingPermission(exception)) {
            readFileErrorPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
        } else {
            Toast.makeText(this, R.string.file_opening_error, Toast.LENGTH_LONG).show();
            Log.e(TAG, "Error when opening file", exception);
        }
    }

    private boolean couldNotOpenFileDueToMissingPermission(Throwable e) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED)
            return false;

        String exceptionMessage = e.getMessage();
        return e instanceof FileNotFoundException &&
            exceptionMessage != null && exceptionMessage.contains("Permission denied");
    }

    private void restartAppIfGranted(boolean isPermissionGranted) {
        if (isPermissionGranted) {
            // This is a quick and dirty way to make the system restart the current activity *and the current app process*.
            // This is needed because on Android 6 storage permission grants do not take effect until
            // the app process is restarted.
            System.exit(0);
        } else {
            Toast.makeText(this, R.string.file_opening_error, Toast.LENGTH_LONG).show();
        }
    }

    private void toggleBottomNavigationAccordingToPosition(int page, float positionOffset) {
        if (positionOffset == 0) {
            showBottomNavigationView();
@@ -313,22 +350,59 @@ public class MainActivity extends CyaneaAppCompatActivity {
                .setDuration(100);
    }

    private void toggleFullscreen() {
        final View view = viewBinding.pdfView;
        if (!isFullscreenToggled) {
            getSupportActionBar().hide();
            isFullscreenToggled = true;
            view.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        } else {
            getSupportActionBar().show();
            isFullscreenToggled = false;
            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        }
    }

    void displayFromUri(Uri uri) {
        if (uri == null) {
            setTitle("");
            return;
        }

        pdfFileName = getFileName(uri);
        setTitle(pdfFileName);
        setTaskDescription(new ActivityManager.TaskDescription(pdfFileName));

        String scheme = uri.getScheme();
        if (scheme != null && scheme.contains("http")) {
            downloadOrShowDownloadedFile(uri);
        } else {
            configurePdfViewAndLoad(viewBinding.pdfView.fromUri(uri));
        }
    }

    private void downloadOrShowDownloadedFile(Uri uri) {
        if (downloadedPdfFileContent == null) {
            downloadedPdfFileContent = (byte[]) getLastCustomNonConfigurationInstance();
        }
        if (downloadedPdfFileContent != null) {
            configurePdfViewAndLoad(viewBinding.pdfView.fromBytes(downloadedPdfFileContent));
        } else {
            // we will get the pdf asynchronously with the DownloadPDFFile object
            viewBinding.progressBar.setVisibility(View.VISIBLE);
            DownloadPDFFile downloadPDFFile = new DownloadPDFFile(this);
            downloadPDFFile.execute(uri.toString());
        } else {
            configurePdfViewAndLoad(viewBinding.pdfView.fromUri(uri));
        }
    }

    @Override
    public Object onRetainCustomNonConfigurationInstance() {
        return downloadedPdfFileContent;
    }

    public void hideProgressBar() {
        viewBinding.progressBar.setVisibility(View.GONE);
    }
@@ -340,7 +414,7 @@ public class MainActivity extends CyaneaAppCompatActivity {
    }

    private void saveToDownloadFolderIfAllowed(byte[] fileContent) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        if (Utils.canWriteToDownloadFolder(this)) {
            trySaveToDownloadFolder(fileContent, false);
        } else {
            saveToDownloadPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
@@ -387,6 +461,8 @@ public class MainActivity extends CyaneaAppCompatActivity {
                        result = cursor.getString(indexDisplayName);
                    }
                }
            } catch (Exception e) {
                Log.w(TAG, "Couldn't retrieve file name", e);
            }
        }
        if (result == null) {
@@ -465,7 +541,7 @@ public class MainActivity extends CyaneaAppCompatActivity {
                            getString(R.string.pdf_author, getArguments().getString(AUTHOR_ARGUMENT)) + "\n" +
                            getString(R.string.pdf_creation_date, getArguments().getString(CREATION_DATE_ARGUMENT)))
                    .setPositiveButton(R.string.ok, (dialog, which) -> {})
                    .setIcon(R.drawable.alert_icon)
                    .setIcon(R.drawable.info_icon)
                    .create();
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ public class MainIntroActivity extends AppIntro {
            third.setImageDrawable(R.drawable.patterns_permissions);
            third.setBgColor(bg);
            addSlide(AppIntroFragment.newInstance(third));
            askForPermissions(new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 3);
            askForPermissions(new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE }, 3);
        }

        showSkipButton(false);
Loading