Browse Source
Remove read/write storage permissions.
Remove read/write storage permissions.
Add an activity to select directory.renovate/org.robolectric-robolectric-4.x
24 changed files with 652 additions and 340 deletions
-
5app/src/main/AndroidManifest.xml
-
4app/src/main/java/awais/instagrabber/InstaGrabberApplication.java
-
11app/src/main/java/awais/instagrabber/activities/DirectDownload.java
-
128app/src/main/java/awais/instagrabber/activities/DirectorySelectActivity.java
-
16app/src/main/java/awais/instagrabber/activities/MainActivity.java
-
2app/src/main/java/awais/instagrabber/dialogs/CreateBackupDialogFragment.java
-
9app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java
-
36app/src/main/java/awais/instagrabber/fragments/CollectionPostsFragment.java
-
29app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java
-
27app/src/main/java/awais/instagrabber/fragments/LocationFragment.java
-
11app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java
-
23app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java
-
8app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java
-
24app/src/main/java/awais/instagrabber/fragments/TopicPostsFragment.java
-
11app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java
-
24app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java
-
23app/src/main/java/awais/instagrabber/fragments/main/ProfileFragment.java
-
124app/src/main/java/awais/instagrabber/fragments/settings/DownloadsPreferencesFragment.java
-
2app/src/main/java/awais/instagrabber/utils/Constants.java
-
24app/src/main/java/awais/instagrabber/utils/DirectoryChooser.java
-
111app/src/main/java/awais/instagrabber/utils/DownloadUtils.java
-
89app/src/main/java/awais/instagrabber/utils/Utils.java
-
2app/src/main/java/awais/instagrabber/viewmodels/DirectThreadViewModel.java
-
39app/src/main/res/layout/activity_directory_select.xml
@ -0,0 +1,128 @@ |
|||||
|
package awais.instagrabber.activities; |
||||
|
|
||||
|
import android.content.Intent; |
||||
|
import android.content.UriPermission; |
||||
|
import android.net.Uri; |
||||
|
import android.os.Build; |
||||
|
import android.os.Bundle; |
||||
|
import android.os.Parcelable; |
||||
|
import android.provider.DocumentsContract; |
||||
|
import android.util.Log; |
||||
|
|
||||
|
import androidx.annotation.Nullable; |
||||
|
import androidx.documentfile.provider.DocumentFile; |
||||
|
|
||||
|
import java.io.File; |
||||
|
import java.io.UnsupportedEncodingException; |
||||
|
import java.net.URLDecoder; |
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
import java.util.List; |
||||
|
|
||||
|
import awais.instagrabber.databinding.ActivityDirectorySelectBinding; |
||||
|
import awais.instagrabber.utils.AppExecutors; |
||||
|
import awais.instagrabber.utils.Constants; |
||||
|
import awais.instagrabber.utils.Utils; |
||||
|
|
||||
|
public class DirectorySelectActivity extends BaseLanguageActivity { |
||||
|
private static final String TAG = DirectorySelectActivity.class.getSimpleName(); |
||||
|
|
||||
|
public static final int SELECT_DIR_REQUEST_CODE = 1090; |
||||
|
|
||||
|
private Uri initialUri; |
||||
|
private ActivityDirectorySelectBinding binding; |
||||
|
|
||||
|
@Override |
||||
|
protected void onCreate(@Nullable final Bundle savedInstanceState) { |
||||
|
super.onCreate(savedInstanceState); |
||||
|
binding = ActivityDirectorySelectBinding.inflate(getLayoutInflater()); |
||||
|
setContentView(binding.getRoot()); |
||||
|
binding.selectDir.setOnClickListener(v -> openDirectoryChooser()); |
||||
|
setInitialUri(); |
||||
|
} |
||||
|
|
||||
|
private void setInitialUri() { |
||||
|
AppExecutors.getInstance().mainThread().execute(() -> { |
||||
|
final Intent intent = getIntent(); |
||||
|
if (intent == null) { |
||||
|
setMessage(); |
||||
|
return; |
||||
|
} |
||||
|
final Parcelable initialUriParcelable = intent.getParcelableExtra(Constants.EXTRA_INITIAL_URI); |
||||
|
if (!(initialUriParcelable instanceof Uri)) { |
||||
|
setMessage(); |
||||
|
return; |
||||
|
} |
||||
|
initialUri = (Uri) initialUriParcelable; |
||||
|
setMessage(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private void setMessage() { |
||||
|
if (initialUri == null) { |
||||
|
// default message |
||||
|
binding.message.setText("Select a directory which Barinsta will use for downloads and temp files"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (!initialUri.toString().startsWith("content")) { |
||||
|
final String message = String.format("Android has changed the way apps can access files and directories on storage.\n\n" + |
||||
|
"Please re-select the directory '%s' after clicking the button below", |
||||
|
initialUri.toString()); |
||||
|
binding.message.setText(message); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
final List<UriPermission> existingPermissions = getContentResolver().getPersistedUriPermissions(); |
||||
|
final boolean anyMatch = existingPermissions.stream().anyMatch(uriPermission -> uriPermission.getUri().equals(initialUri)); |
||||
|
if (!anyMatch) { |
||||
|
// permission revoked message |
||||
|
final String message = "Permissions for the previously selected directory '%s' were revoked by the system.\n\n" + |
||||
|
"Re-select the directory or select a new directory."; |
||||
|
final DocumentFile documentFile = DocumentFile.fromSingleUri(this, initialUri); |
||||
|
String path; |
||||
|
try { |
||||
|
path = URLDecoder.decode(initialUri.toString(), StandardCharsets.UTF_8.toString()); |
||||
|
} catch (UnsupportedEncodingException e) { |
||||
|
path = initialUri.toString(); |
||||
|
} |
||||
|
if (documentFile != null) { |
||||
|
try { |
||||
|
final File file = Utils.getDocumentFileRealPath(this, documentFile); |
||||
|
if (file != null) { |
||||
|
path = file.getAbsolutePath(); |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "setMessage: ", e); |
||||
|
} |
||||
|
} |
||||
|
binding.message.setText(String.format(message, path)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void openDirectoryChooser() { |
||||
|
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); |
||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && initialUri != null) { |
||||
|
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, initialUri); |
||||
|
} |
||||
|
startActivityForResult(intent, SELECT_DIR_REQUEST_CODE); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) { |
||||
|
super.onActivityResult(requestCode, resultCode, data); |
||||
|
if (requestCode != SELECT_DIR_REQUEST_CODE) return; |
||||
|
if (resultCode != RESULT_OK) { |
||||
|
// Show error |
||||
|
return; |
||||
|
} |
||||
|
if (data == null || data.getData() == null) { |
||||
|
// show error |
||||
|
return; |
||||
|
} |
||||
|
try { |
||||
|
Utils.setupSelectedDir(this, data); |
||||
|
} catch (Exception e) { |
||||
|
// show error |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
|
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="match_parent" |
||||
|
android:padding="16dp"> |
||||
|
|
||||
|
<androidx.appcompat.widget.AppCompatTextView |
||||
|
android:id="@+id/title" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:text="@string/app_name" |
||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4" |
||||
|
app:layout_constraintEnd_toEndOf="parent" |
||||
|
app:layout_constraintStart_toStartOf="parent" |
||||
|
app:layout_constraintTop_toTopOf="parent" /> |
||||
|
|
||||
|
<androidx.appcompat.widget.AppCompatTextView |
||||
|
android:id="@+id/message" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" |
||||
|
app:layout_constraintEnd_toEndOf="parent" |
||||
|
app:layout_constraintStart_toStartOf="parent" |
||||
|
app:layout_constraintTop_toBottomOf="@id/title" /> |
||||
|
|
||||
|
<com.google.android.material.button.MaterialButton |
||||
|
android:id="@+id/select_dir" |
||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:text="Select Directory" |
||||
|
app:layout_constraintBottom_toBottomOf="parent" |
||||
|
app:layout_constraintEnd_toEndOf="parent" |
||||
|
app:layout_constraintStart_toStartOf="parent" |
||||
|
app:layout_constraintTop_toBottomOf="@id/message" |
||||
|
app:layout_constraintVertical_bias="1" /> |
||||
|
|
||||
|
</androidx.constraintlayout.widget.ConstraintLayout> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue