added feature to save document
This commit is contained in:
parent
c1a1263bd5
commit
eb6eb8046c
25
app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt
Normal file
25
app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package app.grapheneos.pdfviewer
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
|
import java.io.FileNotFoundException
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.io.OutputStream
|
||||||
|
|
||||||
|
@Throws(FileNotFoundException::class, IOException::class)
|
||||||
|
fun saveAs(context: Context, existingUri: Uri, saveAs: Uri) {
|
||||||
|
|
||||||
|
context.asInputStream(existingUri)?.use { inputStream ->
|
||||||
|
context.asOutputStream(saveAs)?.use { outputStream ->
|
||||||
|
outputStream.write(inputStream.readBytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(FileNotFoundException::class)
|
||||||
|
private fun Context.asInputStream(uri: Uri): InputStream? = contentResolver.openInputStream(uri)
|
||||||
|
|
||||||
|
@Throws(FileNotFoundException::class)
|
||||||
|
private fun Context.asOutputStream(uri: Uri): OutputStream? = contentResolver.openOutputStream(uri)
|
@ -132,6 +132,19 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
private final ActivityResultLauncher<Intent> saveAsLauncher = registerForActivityResult(
|
||||||
|
new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||||
|
if (result == null) return;
|
||||||
|
if (result.getResultCode() != RESULT_OK) return;
|
||||||
|
Intent resultData = result.getData();
|
||||||
|
if (resultData != null) {
|
||||||
|
Uri path = resultData.getData();
|
||||||
|
if (path != null) {
|
||||||
|
saveDocumentAs(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
private class Channel {
|
private class Channel {
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public int getPage() {
|
public int getPage() {
|
||||||
@ -517,7 +530,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
|||||||
final int[] ids = {R.id.action_zoom_in, R.id.action_zoom_out, R.id.action_jump_to_page,
|
final int[] ids = {R.id.action_zoom_in, R.id.action_zoom_out, R.id.action_jump_to_page,
|
||||||
R.id.action_next, R.id.action_previous, R.id.action_first, R.id.action_last,
|
R.id.action_next, R.id.action_previous, R.id.action_first, R.id.action_last,
|
||||||
R.id.action_rotate_clockwise, R.id.action_rotate_counterclockwise,
|
R.id.action_rotate_clockwise, R.id.action_rotate_counterclockwise,
|
||||||
R.id.action_view_document_properties, R.id.action_share };
|
R.id.action_view_document_properties, R.id.action_share, R.id.action_save_as};
|
||||||
if (mDocumentState < STATE_LOADED) {
|
if (mDocumentState < STATE_LOADED) {
|
||||||
for (final int id : ids) {
|
for (final int id : ids) {
|
||||||
final MenuItem item = menu.findItem(id);
|
final MenuItem item = menu.findItem(id);
|
||||||
@ -541,6 +554,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
|||||||
enableDisableMenuItem(menu.findItem(R.id.action_share), mUri != null);
|
enableDisableMenuItem(menu.findItem(R.id.action_share), mUri != null);
|
||||||
enableDisableMenuItem(menu.findItem(R.id.action_next), mPage < mNumPages);
|
enableDisableMenuItem(menu.findItem(R.id.action_next), mPage < mNumPages);
|
||||||
enableDisableMenuItem(menu.findItem(R.id.action_previous), mPage > 1);
|
enableDisableMenuItem(menu.findItem(R.id.action_previous), mPage > 1);
|
||||||
|
enableDisableMenuItem(menu.findItem(R.id.action_save_as), mUri != null);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -587,8 +601,42 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
|||||||
} else if (itemId == R.id.action_share) {
|
} else if (itemId == R.id.action_share) {
|
||||||
shareDocument();
|
shareDocument();
|
||||||
return true;
|
return true;
|
||||||
|
} else if (itemId == R.id.action_save_as) {
|
||||||
|
saveDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveDocument() {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
intent.setType("application/pdf");
|
||||||
|
intent.putExtra(Intent.EXTRA_TITLE, getCurrentDocumentName());
|
||||||
|
saveAsLauncher.launch(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCurrentDocumentName() {
|
||||||
|
if (mDocumentProperties == null || mDocumentProperties.isEmpty()) return "";
|
||||||
|
String fileName = "";
|
||||||
|
String title = "";
|
||||||
|
for (CharSequence property : mDocumentProperties) {
|
||||||
|
if (property.toString().startsWith("File name:")) {
|
||||||
|
fileName = property.toString().replace("File name:", "");
|
||||||
|
}
|
||||||
|
if (property.toString().startsWith("Title:-")) {
|
||||||
|
title = property.toString().replace("Title:-", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fileName.length() > 2 ? fileName : title;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveDocumentAs(Uri uri) {
|
||||||
|
try {
|
||||||
|
KtUtilsKt.saveAs(this, mUri, uri);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
snackbar.setText(R.string.error_while_saving).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
10
app/src/main/res/drawable/ic_save_24dp.xml
Normal file
10
app/src/main/res/drawable/ic_save_24dp.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM19,19L5,19L5,5h11.17L19,7.83L19,19zM12,12c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3zM6,6h9v4L6,10z"/>
|
||||||
|
</vector>
|
@ -73,6 +73,12 @@
|
|||||||
android:title="@string/action_rotate_counterclockwise"
|
android:title="@string/action_rotate_counterclockwise"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_save_as"
|
||||||
|
android:icon="@drawable/ic_save_24dp"
|
||||||
|
android:title="@string/action_save_as"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_view_document_properties"
|
android:id="@+id/action_view_document_properties"
|
||||||
android:title="@string/action_view_document_properties"
|
android:title="@string/action_view_document_properties"
|
||||||
|
@ -20,8 +20,10 @@
|
|||||||
<string name="invalid_mime_type">Cannot open file with invalid MIME type</string>
|
<string name="invalid_mime_type">Cannot open file with invalid MIME type</string>
|
||||||
<string name="legacy_file_uri">Cannot open legacy file paths from insecure apps</string>
|
<string name="legacy_file_uri">Cannot open legacy file paths from insecure apps</string>
|
||||||
<string name="io_error">Received I/O error trying to open content</string>
|
<string name="io_error">Received I/O error trying to open content</string>
|
||||||
|
<string name="error_while_saving">Error encountered while saving</string>
|
||||||
|
|
||||||
<string name="webview_out_of_date_title">WebView out-of-date</string>
|
<string name="webview_out_of_date_title">WebView out-of-date</string>
|
||||||
<string name="webview_out_of_date_message">Your current WebView version is %d. The WebView should be at least version %d for the PDF Viewer to work.</string>
|
<string name="webview_out_of_date_message">Your current WebView version is %d. The WebView should be at least version %d for the PDF Viewer to work.</string>
|
||||||
<string name="action_share">Share</string>
|
<string name="action_share">Share</string>
|
||||||
|
<string name="action_save_as">Save as</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user