Loading app/build.gradle +2 −16 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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' Loading app/src/main/AndroidManifest.xml +7 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" /> Loading Loading @@ -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" /> Loading @@ -85,7 +86,7 @@ <activity android:name=".AboutActivity" android:label="@string/action_about" android:parentActivityName=".MainActivity_" /> android:parentActivityName=".MainActivity" /> <activity android:name=".MainIntroActivity" Loading @@ -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 app/src/main/java/com/gsnathan/pdfviewer/AboutActivity.java +9 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading Loading @@ -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) { Loading app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +127 −51 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading @@ -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() { Loading @@ -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) { Loading Loading @@ -231,6 +243,9 @@ public class MainActivity extends CyaneaAppCompatActivity { if (uri != null) printDocument(); break; case R.id.fullscreen: toggleFullscreen(); return true; default: break; } Loading Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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(); } } Loading app/src/main/java/com/gsnathan/pdfviewer/MainIntroActivity.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
app/build.gradle +2 −16 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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' Loading
app/src/main/AndroidManifest.xml +7 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" /> Loading Loading @@ -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" /> Loading @@ -85,7 +86,7 @@ <activity android:name=".AboutActivity" android:label="@string/action_about" android:parentActivityName=".MainActivity_" /> android:parentActivityName=".MainActivity" /> <activity android:name=".MainIntroActivity" Loading @@ -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
app/src/main/java/com/gsnathan/pdfviewer/AboutActivity.java +9 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading Loading @@ -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) { Loading
app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +127 −51 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading @@ -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() { Loading @@ -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) { Loading Loading @@ -231,6 +243,9 @@ public class MainActivity extends CyaneaAppCompatActivity { if (uri != null) printDocument(); break; case R.id.fullscreen: toggleFullscreen(); return true; default: break; } Loading Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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(); } } Loading
app/src/main/java/com/gsnathan/pdfviewer/MainIntroActivity.java +1 −1 Original line number Diff line number Diff line Loading @@ -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