Skip to content

Commit 8bd6c4b

Browse files
committed
- Refactor: Move persistent permission functions to View Model
- Add toast message string
1 parent 5b54506 commit 8bd6c4b

4 files changed

Lines changed: 50 additions & 60 deletions

File tree

app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ fun applySystemBarMargins(view: View, applyBottom: Boolean = false) {
1717
v.layoutParams = mlp
1818
windowInsets
1919
}
20-
}
20+
}

app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@
4646
import java.util.Arrays;
4747
import java.util.HashMap;
4848
import java.util.List;
49-
import java.util.concurrent.ExecutionException;
50-
import java.util.concurrent.TimeUnit;
51-
import java.util.concurrent.TimeoutException;
5249

5350
import app.grapheneos.pdfviewer.databinding.PdfviewerBinding;
5451
import app.grapheneos.pdfviewer.fragment.DocumentPropertiesFragment;
@@ -158,10 +155,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
158155
mEncryptedDocumentPassword = "";
159156
viewModel.clearOutline();
160157
if (mUri != null && PreferenceHelper.INSTANCE.isResumeLastDocumentEnabled(this)) {
161-
if (takePersistableUriPermission()) {
162-
viewModel.savePdfState(mUri.toString(), mPage, false);
163-
}
164-
viewModel.calculateHash(mUri);
158+
viewModel.prepareNewPdf(mUri, mPage);
165159
}
166160
loadPdf();
167161
invalidateOptionsMenu();
@@ -531,17 +525,14 @@ public void onZoomEnd() {
531525
mEncryptedDocumentPassword = savedInstanceState.getString(STATE_ENCRYPTED_DOCUMENT_PASSWORD);
532526
} else {
533527
if (mUri != null && PreferenceHelper.INSTANCE.isResumeLastDocumentEnabled(this)) {
534-
if (takePersistableUriPermission()) {
535-
viewModel.savePdfState(mUri.toString(), mPage, false);
536-
}
537-
viewModel.calculateHash(mUri);
528+
viewModel.prepareNewPdf(mUri, mPage);
538529
} else {
539530
PdfPreferencesRepository.PdfState state =
540-
viewModel.maybeLoadPdfBlocking();
531+
viewModel.maybeLoadPdfStateBlocking();
541532

542533
if (state != null && state.getLastOpenedUri() != null) {
543534
Uri uri = Uri.parse(state.getLastOpenedUri());
544-
if (hasUriPermission(uri)) {
535+
if (viewModel.hasUriPermission(uri)) {
545536
try {
546537
getContentResolver().openInputStream(uri).close();
547538
mUri = uri;
@@ -551,7 +542,7 @@ public void onZoomEnd() {
551542
} catch (SecurityException | IOException e) {
552543
viewModel.clearLastOpened();
553544
Toast.makeText(this,
554-
"Previous document is no longer accessible. Please reopen it.",
545+
R.string.msg_previous_document_unavailable,
555546
Toast.LENGTH_LONG).show();
556547
}
557548
}
@@ -945,27 +936,6 @@ private void saveDocumentAs(final Uri uri) {
945936
}
946937
}
947938

948-
private boolean takePersistableUriPermission() {
949-
try {
950-
getContentResolver().takePersistableUriPermission(
951-
mUri,
952-
Intent.FLAG_GRANT_READ_URI_PERMISSION
953-
);
954-
return true;
955-
} catch (SecurityException e) {
956-
Log.e(TAG, "Failed to take persistable URI permission", e);
957-
return false;
958-
}
959-
}
960-
961-
private boolean hasUriPermission(Uri uri) {
962-
return getContentResolver().getPersistedUriPermissions()
963-
.stream()
964-
.anyMatch(permission ->
965-
permission.getUri().equals(uri) && permission.isReadPermission()
966-
);
967-
}
968-
969939
private void maybeJumpToPage(int targetPage) {
970940
if (mNumPages > 0) {
971941
onJumpToPageInDocument(targetPage);

app/src/main/java/app/grapheneos/pdfviewer/viewModel/PdfViewModel.kt

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package app.grapheneos.pdfviewer.viewModel
33
import android.app.Application
44
import android.content.ContentResolver
55
import android.content.Intent
6+
import android.content.UriPermission
67
import android.net.Uri
78
import android.util.Log
89
import androidx.core.net.toUri
@@ -119,7 +120,7 @@ class PdfViewModel(application: Application) : AndroidViewModel(application) {
119120
/**
120121
* Load initial PDF state if preference is enabled
121122
*/
122-
fun maybeLoadPdfBlocking(): PdfPreferencesRepository.PdfState? {
123+
fun maybeLoadPdfStateBlocking(): PdfPreferencesRepository.PdfState? {
123124
return runBlocking {
124125
if (PreferenceHelper.isResumeLastDocumentEnabled(getApplication())) {
125126
repository.pdfStateFlow.first()
@@ -170,19 +171,7 @@ class PdfViewModel(application: Application) : AndroidViewModel(application) {
170171
*/
171172
fun savePdfState(uriString: String, page: Int, includeHashMapping: Boolean) {
172173
viewModelScope.launch {
173-
val oldState = repository.pdfStateFlow.first()
174-
val oldUri = oldState.lastOpenedUri
175-
176-
repository.saveLastOpened(uriString, page)
177-
178-
// Release old permission if it's different from new URI
179-
if (oldUri != null && oldUri != uriString) {
180-
releaseUriPermissionIfHeld(oldUri.toUri())
181-
}
182-
183-
if (includeHashMapping && currentFileHash != null) {
184-
repository.updatePagePosition(currentFileHash!!, page)
185-
}
174+
savePdfStateCommon(uriString, page, includeHashMapping)
186175
}
187176
}
188177

@@ -196,19 +185,23 @@ class PdfViewModel(application: Application) : AndroidViewModel(application) {
196185
*/
197186
fun savePdfStateBlocking(uriString: String, page: Int, includeHashMapping: Boolean) {
198187
runBlocking {
199-
val oldState = repository.pdfStateFlow.first()
200-
val oldUri = oldState.lastOpenedUri
188+
savePdfStateCommon(uriString, page, includeHashMapping)
189+
}
190+
}
201191

202-
repository.saveLastOpened(uriString, page)
192+
private suspend fun savePdfStateCommon(uriString: String, page: Int, includeHashMapping: Boolean) {
193+
val oldState = repository.pdfStateFlow.first()
194+
val oldUri = oldState.lastOpenedUri
203195

204-
// Release old permission if it's different from new URI
205-
if (oldUri != null && oldUri != uriString) {
206-
releaseUriPermissionIfHeld(oldUri.toUri())
207-
}
196+
repository.saveLastOpened(uriString, page)
208197

209-
if (includeHashMapping && currentFileHash != null) {
210-
repository.updatePagePosition(currentFileHash!!, page)
211-
}
198+
// Release old permission if it's different from new URI
199+
if (oldUri != null && oldUri != uriString) {
200+
releaseUriPermissionIfHeld(oldUri.toUri())
201+
}
202+
203+
if (includeHashMapping && currentFileHash != null) {
204+
repository.updatePagePosition(currentFileHash!!, page)
212205
}
213206
}
214207

@@ -225,6 +218,13 @@ class PdfViewModel(application: Application) : AndroidViewModel(application) {
225218
}
226219
}
227220

221+
fun prepareNewPdf(uri: Uri, page: Int) {
222+
if (takePersistableUriPermission(uri)) {
223+
savePdfState(uri.toString(), page, false)
224+
}
225+
calculateHash(uri)
226+
}
227+
228228
private fun releaseUriPermissionIfHeld(uri: Uri) {
229229
try {
230230
// Find if we have persisted permission for this URI
@@ -251,4 +251,22 @@ class PdfViewModel(application: Application) : AndroidViewModel(application) {
251251
Log.w(TAG, "Permission release failed", e)
252252
}
253253
}
254+
255+
private fun takePersistableUriPermission(uri: Uri): Boolean {
256+
try {
257+
contentResolver.takePersistableUriPermission(
258+
uri,
259+
Intent.FLAG_GRANT_READ_URI_PERMISSION
260+
)
261+
return true
262+
} catch (_: SecurityException) {
263+
return false
264+
}
265+
}
266+
267+
fun hasUriPermission(uri: Uri?): Boolean {
268+
return contentResolver.persistedUriPermissions
269+
.stream()
270+
.anyMatch { permission: UriPermission? -> permission!!.uri == uri && permission.isReadPermission }
271+
}
254272
}

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,6 @@
6060

6161
<string name="settings">Settings</string>
6262
<string name="resume_last_document">Resume last document</string>
63+
64+
<string name="msg_previous_document_unavailable">Previous document is no longer accessible. Please reopen it.</string>
6365
</resources>

0 commit comments

Comments
 (0)