From e4351d696b66d5a7e74dd76ede26c477cfd98aec Mon Sep 17 00:00:00 2001 From: mhutti1 Date: Wed, 6 Apr 2016 22:31:24 +0100 Subject: [PATCH] More marshmallow permission support --- res/values/strings.xml | 3 +- .../kiwixmobile/KiwixMobileActivity.java | 117 ++++++++++++------ .../kiwixmobile/ZimFileSelectActivity.java | 45 ++++--- 3 files changed, 102 insertions(+), 63 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 4f45e58f4..eb4d6da58 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -56,6 +56,5 @@ No bookmarks! Bookmarks No Content Headers Found - To search for zim files we need access to your storage - Warning + To access zim files we need access to your storage \ No newline at end of file diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index a030bdfa7..e11f883b5 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -19,12 +19,14 @@ package org.kiwix.kiwixmobile; +import android.Manifest; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.PorterDuff; @@ -37,6 +39,8 @@ import android.os.Handler; import android.os.Looper; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; @@ -74,7 +78,17 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; - +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; import org.json.JSONArray; import org.kiwix.kiwixmobile.settings.Constants; import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity; @@ -89,18 +103,6 @@ import org.kiwix.kiwixmobile.views.BookmarksActivity; import org.kiwix.kiwixmobile.views.CompatFindActionModeCallback; import org.kiwix.kiwixmobile.views.KiwixWebView; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; - public class KiwixMobileActivity extends AppCompatActivity { public static final String TAG_KIWIX = "kiwix"; @@ -199,6 +201,8 @@ public class KiwixMobileActivity extends AppCompatActivity { private AnimatedProgressBar mProgressBar; + private File mFile; + // Initialized when onActionModeStarted is triggered. private ActionMode mActionMode = null; @@ -816,41 +820,72 @@ public class KiwixMobileActivity extends AppCompatActivity { } public boolean openZimFile(File file, boolean clearHistory) { - if (file.exists()) { - if (ZimContentProvider.setZimFile(file.getAbsolutePath()) != null) { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.READ_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED) { + if (file.exists()) { + if (ZimContentProvider.setZimFile(file.getAbsolutePath()) != null) { - // Apparently with webView.clearHistory() only history before currently (fully) - // loaded page is cleared -> request clear, actual clear done after load. - // Probably not working in all corners (e.g. zim file openend - // while load in progress, mainpage of new zim file invalid, ... - // but should be good enough. - // Actually probably redundant if no zim file openend before in session, - // but to be on save side don't clear history in such cases. - if (clearHistory) { - requestClearHistoryAfterLoad = true; - } - if (menu != null) { - initAllMenuItems(); + // Apparently with webView.clearHistory() only history before currently (fully) + // loaded page is cleared -> request clear, actual clear done after load. + // Probably not working in all corners (e.g. zim file openend + // while load in progress, mainpage of new zim file invalid, ... + // but should be good enough. + // Actually probably redundant if no zim file openend before in session, + // but to be on save side don't clear history in such cases. + if (clearHistory) { + requestClearHistoryAfterLoad = true; + } + if (menu != null) { + initAllMenuItems(); + } else { + // Menu may not be initialized yet. In this case + // signal to menu create to show + requestInitAllMenuItems = true; + } + + openMainPage(); + refreshBookmarks(); + return true; } else { - // Menu may not be initialized yet. In this case - // signal to menu create to show - requestInitAllMenuItems = true; + Toast.makeText(this, getResources().getString(R.string.error_fileinvalid), + Toast.LENGTH_LONG).show(); } - - openMainPage(); - refreshBookmarks(); - return true; } else { - Toast.makeText(this, getResources().getString(R.string.error_fileinvalid), - Toast.LENGTH_LONG).show(); - } - } else { - Log.e(TAG_KIWIX, "ZIM file doesn't exist at " + file.getAbsolutePath()); + Log.e(TAG_KIWIX, "ZIM file doesn't exist at " + file.getAbsolutePath()); - Toast.makeText(this, getResources().getString(R.string.error_filenotfound), Toast.LENGTH_LONG) + Toast.makeText(this, getResources().getString(R.string.error_filenotfound), Toast.LENGTH_LONG) + .show(); + } + return false; + } else { + mFile = file; + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + KiwixMobileActivity.REQUEST_STORAGE_PERMISSION); + Toast.makeText(this, getResources().getString(R.string.request_storage), Toast.LENGTH_LONG) .show(); + return false; + } + } + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case KiwixMobileActivity.REQUEST_STORAGE_PERMISSION: { + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + finish(); + Intent newZimFile = new Intent(KiwixMobileActivity.this, KiwixMobileActivity.class); + newZimFile.setData(Uri.fromFile(mFile)); + startActivity(newZimFile); + } else { + finish(); + } + return; + } + } - return false; } private void initAllMenuItems() { diff --git a/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java b/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java index 4f1c6d336..722533c5a 100644 --- a/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java +++ b/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java @@ -35,7 +35,6 @@ import android.support.v4.content.ContextCompat; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; -import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; @@ -52,6 +51,7 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -112,13 +112,34 @@ public class ZimFileSelectActivity extends AppCompatActivity public void checkPermissions(){ if (ContextCompat.checkSelfPermission(this, - Manifest.permission.READ_CONTACTS) + Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - + Toast.makeText(this, getResources().getString(R.string.request_storage), Toast.LENGTH_LONG) + .show(); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, KiwixMobileActivity.REQUEST_STORAGE_PERMISSION); + } else { + getFiles(); + } + } + + public void getFiles(){ + + mProgressBar = (ProgressBar) findViewById(R.id.progressBar); + mProgressBarMessage = (TextView) findViewById(R.id.progressbar_message); + mZimFileList = (ListView) findViewById(R.id.zimfilelist); + + mZimFileList.setOnItemClickListener(this); + + mProgressBar.setVisibility(View.VISIBLE); + setAlpha(true); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + startQuery(); + } else { + new RescanFileSystem().execute(); } } @@ -129,23 +150,7 @@ public class ZimFileSelectActivity extends AppCompatActivity case KiwixMobileActivity.REQUEST_STORAGE_PERMISSION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - - - mProgressBar = (ProgressBar) findViewById(R.id.progressBar); - mProgressBarMessage = (TextView) findViewById(R.id.progressbar_message); - mZimFileList = (ListView) findViewById(R.id.zimfilelist); - - mZimFileList.setOnItemClickListener(this); - - mProgressBar.setVisibility(View.VISIBLE); - setAlpha(true); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - startQuery(); - } else { - new RescanFileSystem().execute(); - } - + getFiles(); } else { finish(); }