Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Storage access issue resolved for all android versions (Including Android 10 and 11 +) #1007

Merged
merged 40 commits into from Nov 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0de0dd5
Updated build.gradle, gradle.properties,gradle-wrapper.properties
codegsaini Mar 21, 2021
69f2914
Update Navigation Drawer UI
codegsaini Mar 22, 2021
6d3fc43
Updated buildToolsVersion from 28.0.3 to 29.0.3
codegsaini Mar 22, 2021
edc638b
Update build.gradle
codegsaini Mar 22, 2021
eedda25
Update build.gradle
codegsaini Mar 22, 2021
5dfd3cb
Update build.gradle
codegsaini Mar 22, 2021
e390269
Update build.gradle
codegsaini Mar 23, 2021
4df98cd
Added Sdk licenses files
codegsaini Mar 23, 2021
78149e1
Update .travis.yml
codegsaini Mar 23, 2021
4b36fe0
Update .travis.yml
codegsaini Mar 23, 2021
82400d1
Update .travis.yml
codegsaini Mar 23, 2021
5852220
Update .travis.yml
codegsaini Mar 23, 2021
bc21abe
Update .travis.yml
codegsaini Mar 23, 2021
df76b8d
Updated license folder and .travis.yml file
codegsaini Mar 23, 2021
a5ab2c1
Optimized code for licensing
codegsaini Mar 23, 2021
d17bf63
Deleted license folder and Updated travis.yml file
codegsaini Mar 23, 2021
1079c4b
Update travis.yml file
codegsaini Mar 23, 2021
6f7da56
Update .travis.yml
codegsaini Mar 23, 2021
eaa5667
Updated UI
codegsaini Mar 24, 2021
d25c385
Merge branch 'master' into master
codegsaini Mar 24, 2021
1b82c4f
Updated targetSdkVersion and compileSdkVersion to 30 and Migrated fro…
codegsaini Mar 25, 2021
232be44
Merge branch 'master' into master@codegsaini
codegsaini Mar 25, 2021
2a8deff
Added updated UI gif
codegsaini Mar 25, 2021
234bcc3
Delete image_to_pdf.gif
codegsaini Mar 25, 2021
01c1886
Merge branch 'master@codegsaini' of https://github.com/codegsaini/Ima…
codegsaini Mar 25, 2021
8abe0c2
Update README.md
codegsaini Mar 25, 2021
a5b916a
Solved scoped storage related issue in android 10 or higher ( api 29+)
codegsaini Apr 14, 2021
2a29334
Added storage permission in QRBarcodeScanFragment
codegsaini Apr 15, 2021
e7d5729
Automatic system theme detection feature added
codegsaini May 12, 2021
6a85f23
Merge branch 'master' into master@codegsaini
codegsaini May 12, 2021
039201b
Dark theme enhancement
codegsaini May 13, 2021
44ffc33
Updated add_pgnum_dialog.xml
codegsaini May 13, 2021
c92c7bc
Requested Changes
codegsaini May 15, 2021
b827725
Requested Changes
codegsaini May 15, 2021
bb0f976
Merge branch 'Swati4star:master' into master@codegsaini
codegsaini May 16, 2021
84a1b63
Merge branch 'Swati4star:master' into master@codegsaini
codegsaini Oct 21, 2021
510c5a1
Storage Access Issue Solved for All Android Versions
codegsaini Oct 21, 2021
c9a9c74
Merge branch 'master@codegsaini' of https://github.com/codegsaini/Ima…
codegsaini Oct 21, 2021
e9f8a88
Added string resource for hardcoded string
codegsaini Oct 21, 2021
69229cd
Added String resources for hardcoded string
codegsaini Oct 21, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle
Expand Up @@ -77,6 +77,7 @@ dependencies {

// butterknife
implementation 'com.jakewharton:butterknife:10.1.0'
implementation 'androidx.test.ext:junit:1.1.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

// persistence room library - for db operations
Expand Down
@@ -1,6 +1,6 @@
package swati4star.createpdf.util;

import android.support.test.InstrumentationRegistry;
import androidx.test.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import org.junit.After;
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -3,10 +3,10 @@
xmlns:tools="http://schemas.android.com/tools"
package="swati4star.createpdf">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="scopedStorage"/>

<uses-feature android:name="android.hardware.camera" />
<uses-feature
Expand All @@ -20,6 +20,7 @@
android:allowBackup="true"
android:fullBackupContent="@xml/backup_descriptor"
android:hardwareAccelerated="true"
android:requestLegacyExternalStorage="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
Expand Down
68 changes: 60 additions & 8 deletions app/src/main/java/swati4star/createpdf/activity/MainActivity.java
@@ -1,21 +1,20 @@
package swati4star.createpdf.activity;

import android.Manifest;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import androidx.annotation.NonNull;

import com.google.android.material.card.MaterialCardView;
import com.google.android.material.navigation.NavigationView;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
Expand All @@ -24,6 +23,7 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.provider.Settings;
import android.util.SparseIntArray;
import android.view.Menu;
import android.view.MenuItem;
Expand All @@ -38,16 +38,19 @@
import swati4star.createpdf.util.Constants;
import swati4star.createpdf.util.FeedbackUtils;
import swati4star.createpdf.util.DirectoryUtils;
import swati4star.createpdf.util.PermissionsUtils;
import swati4star.createpdf.util.ThemeUtils;
import swati4star.createpdf.util.WhatsNewUtils;

import static swati4star.createpdf.util.Constants.IS_WELCOME_ACTIVITY_SHOWN;
import static swati4star.createpdf.util.Constants.LAUNCH_COUNT;
import static swati4star.createpdf.util.Constants.REQUEST_CODE_FOR_WRITE_PERMISSION;
import static swati4star.createpdf.util.Constants.THEME_BLACK;
import static swati4star.createpdf.util.Constants.THEME_DARK;
import static swati4star.createpdf.util.Constants.THEME_SYSTEM;
import static swati4star.createpdf.util.Constants.THEME_WHITE;
import static swati4star.createpdf.util.Constants.VERSION_NAME;
import static swati4star.createpdf.util.Constants.WRITE_PERMISSIONS;

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Expand All @@ -58,6 +61,8 @@ public class MainActivity extends AppCompatActivity
private SparseIntArray mFragmentSelectedMap;
private FragmentManagement mFragmentManagement;

private boolean mSettingsActivityOpenedForManageStoragePermission = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -69,6 +74,8 @@ protected void onCreate(Bundle savedInstanceState) {

setThemeOnActivityExclusiveComponents();

checkAndAskForStoragePermission();

Toolbar toolbar = findViewById(R.id.toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
setSupportActionBar(toolbar);
Expand Down Expand Up @@ -135,14 +142,22 @@ private void displayFeedBackAndWhatsNew() {
@Override
protected void onDestroy() {
super.onDestroy();
if (isStoragePermissionGranted()) {
if (PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS)) {
DirectoryUtils.makeAndClearTemp();
}
}

@Override
protected void onResume() {
super.onResume();
if (mSettingsActivityOpenedForManageStoragePermission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
askStorageManagerPermission();
}
}
}

ActionBar actionBar = getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
if (actionBar != null)
Expand Down Expand Up @@ -262,13 +277,50 @@ public void setNavigationViewSelection(int id) {
mNavigationView.setCheckedItem(id);
}

private boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 29) {
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
private void checkAndAskForStoragePermission() {
if (!PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS)) {
getRuntimePermissions();
} else {
return true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
askStorageManagerPermission();
}
}
}
}

private void getRuntimePermissions() {
PermissionsUtils.getInstance().requestRuntimePermissions(this,
WRITE_PERMISSIONS,
REQUEST_CODE_FOR_WRITE_PERMISSION);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionsUtils.getInstance().handleRequestPermissionsResult(this, grantResults,
requestCode, REQUEST_CODE_FOR_WRITE_PERMISSION, this::askStorageManagerPermission);
}

private void askStorageManagerPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
new AlertDialog.Builder(this)
.setTitle(R.string.one_more_thing_text)
.setMessage(R.string.storage_manager_permission_rationale)
.setCancelable(false)
.setPositiveButton(R.string.allow_text, (dialog, which) -> {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
mSettingsActivityOpenedForManageStoragePermission = true;
startActivity(intent);
dialog.dismiss();
}).setNegativeButton(R.string.close_app_text, ((dialog, which) -> finishAndRemoveTask()))
.show();
}
}
}

/**
* puts image uri's in a bundle and start ImageToPdf fragment with this bundle
* as argument
Expand Down
@@ -1,16 +1,12 @@
package swati4star.createpdf.fragment;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -156,19 +152,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

private boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 29) {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
private void getRuntimePermissions() {
if (Build.VERSION.SDK_INT < 29) {
PermissionsUtils.getInstance().requestRuntimePermissions(this,
PermissionsUtils.getInstance().requestRuntimePermissions(this,
WRITE_PERMISSIONS,
REQUEST_CODE_FOR_WRITE_PERMISSION);
}
}

@Override
Expand Down Expand Up @@ -240,7 +227,7 @@ private void resetValues() {
*/
@OnClick(R.id.addImages)
void startAddingImages() {
if (isStoragePermissionGranted())
if (PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS))
selectImages();
else {
getRuntimePermissions();
Expand Down
@@ -1,19 +1,15 @@
package swati4star.createpdf.fragment;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import androidx.annotation.NonNull;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.GridLayoutManager;
Expand Down Expand Up @@ -90,7 +86,6 @@ public class AddTextFragment extends Fragment implements MergeFilesAdapter.OnCli
private int mFontSize = 0;
private static final int INTENT_REQUEST_PICK_PDF_FILE_CODE = 10;
private static final int INTENT_REQUEST_PICK_TEXT_FILE_CODE = 0;
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE_RESULT = 1;
private BottomSheetBehavior mSheetBehavior;

@BindView(R.id.select_pdf_file)
Expand Down Expand Up @@ -190,7 +185,7 @@ public void showTextFileChooser() {

@OnClick(R.id.create_pdf_added_text)
public void openPdfNameDialog() {
if (isStoragePermissionGranted()) {
if (PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS)) {
openPdfNameDialog_();
} else {
getRuntimePermissions();
Expand Down Expand Up @@ -318,19 +313,10 @@ private void addText(String fileName, int fontSize, Font.FontFamily fontFamily)
}
}

private boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 29) {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
private void getRuntimePermissions() {
if (Build.VERSION.SDK_INT < 29) {
PermissionsUtils.getInstance().requestRuntimePermissions(this,
PermissionsUtils.getInstance().requestRuntimePermissions(this,
WRITE_PERMISSIONS,
REQUEST_CODE_FOR_WRITE_PERMISSION);
}
}

@Override
Expand Down
@@ -1,19 +1,15 @@
package swati4star.createpdf.fragment;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import androidx.annotation.NonNull;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.GridLayoutManager;
Expand Down Expand Up @@ -165,7 +161,7 @@ public void selectExcelFile() {
*/
@OnClick(R.id.create_excel_to_pdf)
public void openExcelToPdf() {
if (isStoragePermissionGranted()) {
if (PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS)) {
openExcelToPdf_();
} else {
getRuntimePermissions();
Expand Down Expand Up @@ -212,19 +208,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

private boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 29) {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
private void getRuntimePermissions() {
if (Build.VERSION.SDK_INT < 29) {
PermissionsUtils.getInstance().requestRuntimePermissions(this,
PermissionsUtils.getInstance().requestRuntimePermissions(this,
WRITE_PERMISSIONS,
REQUEST_CODE_FOR_WRITE_PERMISSION);
}
}

@Override
Expand Down
@@ -1,19 +1,15 @@
package swati4star.createpdf.fragment;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import androidx.annotation.NonNull;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
Expand Down Expand Up @@ -89,7 +85,6 @@ public class ExtractTextFragment extends Fragment implements MergeFilesAdapter.O

private SharedPreferences mSharedPreferences;
private MorphButtonUtility mMorphButtonUtility;
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE_RESULT = 1;
private boolean mButtonClicked = false;
private String mFileName;
private final int mFileSelectCode = 0;
Expand Down Expand Up @@ -164,19 +159,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

private boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 29) {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
private void getRuntimePermissions() {
if (Build.VERSION.SDK_INT < 29) {
PermissionsUtils.getInstance().requestRuntimePermissions(this,
PermissionsUtils.getInstance().requestRuntimePermissions(this,
WRITE_PERMISSIONS,
REQUEST_CODE_FOR_WRITE_PERMISSION);
}
}

@Override
Expand All @@ -192,7 +178,7 @@ public void onRequestPermissionsResult(int requestCode,
*/
@OnClick(R.id.extract_text)
public void openExtractText() {
if (isStoragePermissionGranted()) {
if (PermissionsUtils.getInstance().checkRuntimePermissions(this, WRITE_PERMISSIONS)) {
openText();
} else {
getRuntimePermissions();
Expand Down