From 7955cfe71b85f457b10d454313531424b441e679 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 8 Jun 2016 00:30:13 +0100 Subject: [PATCH] Fix storage permission Part of the way there to fixing #117, however location and contacts still need to be fixed. --- commons/app/build.gradle | 10 +-- .../nrw/commons/upload/ShareActivity.java | 72 +++++++++++++------ commons/app/src/main/res/values/strings.xml | 3 + commons/build.gradle | 2 +- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/commons/app/build.gradle b/commons/app/build.gradle index 8bf7f2583..5a6428a72 100644 --- a/commons/app/build.gradle +++ b/commons/app/build.gradle @@ -1,8 +1,7 @@ apply plugin: 'com.android.application' dependencies { - compile fileTree(dir: 'libs', include: '*.jar') - compile 'com.google.code.gson:gson:1.4' + compile fileTree(include: '*.jar', dir: 'libs') compile 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' compile 'in.yuvi:http.fluent:1.3' compile 'com.android.volley:volley:1.0.0' @@ -10,14 +9,17 @@ dependencies { compile 'ch.acra:acra:4.5.0' compile 'org.mediawiki:api:1.3' compile 'de.keyboardsurfer.android.widget:crouton:1.8.5@aar' - compile group: 'commons-codec', name: 'commons-codec', version: '1.10' + compile 'commons-codec:commons-codec:1.10' compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' + //noinspectio GradleDependency - old version has required feature + compile 'com.google.code.gson:gson:1.4' } android { compileSdkVersion 23 - buildToolsVersion "23.0.2" + buildToolsVersion "23.0.3" useLibrary 'org.apache.http.legacy' diff --git a/commons/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/commons/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index d01f4d194..c92c90f6c 100644 --- a/commons/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/commons/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -1,13 +1,19 @@ package fr.free.nrw.commons.upload; +import android.Manifest; import android.content.ContentResolver; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.NavUtils; +import android.support.design.widget.Snackbar; +import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.MenuItem; +import android.view.View; import android.widget.ImageView; import android.widget.Toast; @@ -19,9 +25,9 @@ import java.util.List; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.EventLog; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.auth.*; +import fr.free.nrw.commons.auth.AuthenticatedActivity; +import fr.free.nrw.commons.auth.WikiAccountAuthenticator; import fr.free.nrw.commons.category.CategorizationFragment; -import fr.free.nrw.commons.contributions.*; import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; @@ -33,12 +39,12 @@ import fr.free.nrw.commons.modifications.TemplateRemoveModifier; */ public class ShareActivity extends AuthenticatedActivity - implements SingleUploadFragment.OnUploadActionInitiated, + implements fr.free.nrw.commons.upload.SingleUploadFragment.OnUploadActionInitiated, CategorizationFragment.OnCategoriesSaveHandler { private static final String TAG = ShareActivity.class.getName(); - private SingleUploadFragment shareView; + private fr.free.nrw.commons.upload.SingleUploadFragment shareView; private CategorizationFragment categorizationFragment; private CommonsApplication app; @@ -48,14 +54,14 @@ public class ShareActivity private String mediaUriString; private Uri mediaUri; - private Contribution contribution; + private fr.free.nrw.commons.contributions.Contribution contribution; private ImageView backgroundImageView; - private UploadController uploadController; + private fr.free.nrw.commons.upload.UploadController uploadController; private CommonsApplication cacheObj; private boolean cacheFound; - private GPSExtractor imageObj; + private fr.free.nrw.commons.upload.GPSExtractor imageObj; public ShareActivity() { super(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE); @@ -71,8 +77,8 @@ public class ShareActivity Log.d(TAG, "Cache the categories found"); } - uploadController.startUpload(title, mediaUri, description, mimeType, source, new UploadController.ContributionUploadProgress() { - public void onUploadStarted(Contribution contribution) { + uploadController.startUpload(title, mediaUri, description, mimeType, source, new fr.free.nrw.commons.upload.UploadController.ContributionUploadProgress() { + public void onUploadStarted(fr.free.nrw.commons.contributions.Contribution contribution) { ShareActivity.this.contribution = contribution; showPostUpload(); } @@ -134,7 +140,7 @@ public class ShareActivity } else { EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT) .param("username", app.getCurrentAccount().name) - .param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE)) + .param("source", getIntent().getStringExtra(fr.free.nrw.commons.upload.UploadService.EXTRA_SOURCE)) .param("multiple", true) .param("result", "cancelled") .log(); @@ -147,10 +153,10 @@ public class ShareActivity app.getApi().setAuthCookie(authCookie); - shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); + shareView = (fr.free.nrw.commons.upload.SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); categorizationFragment = (CategorizationFragment) getSupportFragmentManager().findFragmentByTag("categorization"); if(shareView == null && categorizationFragment == null) { - shareView = new SingleUploadFragment(); + shareView = new fr.free.nrw.commons.upload.SingleUploadFragment(); this.getSupportFragmentManager() .beginTransaction() .add(R.id.single_upload_fragment_container, shareView, "shareView") @@ -170,9 +176,9 @@ public class ShareActivity @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - uploadController = new UploadController(this); + uploadController = new fr.free.nrw.commons.upload.UploadController(this); setContentView(R.layout.activity_share); - + app = (CommonsApplication)this.getApplicationContext(); backgroundImageView = (ImageView)findViewById(R.id.backgroundImage); @@ -180,10 +186,10 @@ public class ShareActivity if(intent.getAction().equals(Intent.ACTION_SEND)) { mediaUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); - if(intent.hasExtra(UploadService.EXTRA_SOURCE)) { - source = intent.getStringExtra(UploadService.EXTRA_SOURCE); + if(intent.hasExtra(fr.free.nrw.commons.upload.UploadService.EXTRA_SOURCE)) { + source = intent.getStringExtra(fr.free.nrw.commons.upload.UploadService.EXTRA_SOURCE); } else { - source = Contribution.SOURCE_EXTERNAL; + source = fr.free.nrw.commons.contributions.Contribution.SOURCE_EXTERNAL; } mimeType = intent.getType(); } @@ -210,12 +216,36 @@ public class ShareActivity Log.d(TAG, "Uri: " + mediaUriString); Log.d(TAG, "Ext storage dir: " + Environment.getExternalStorageDirectory()); + + + // Check permissions + if (ContextCompat.checkSelfPermission(this.getApplicationContext(), + Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + + if (ActivityCompat.shouldShowRequestPermissionRationale(this, + Manifest.permission.READ_EXTERNAL_STORAGE)) { + + Log.i(TAG, + "Displaying camera permission rationale to provide additional context."); + Snackbar.make(this.findViewById(android.R.id.content), R.string.storage_permission_rationale, Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok, new View.OnClickListener() { + @Override + public void onClick(View view) { + ActivityCompat.requestPermissions(ShareActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); + } + }).show(); + + } else { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); + } + } + //convert image Uri to file path - String filePath = FileUtils.getPath(this, mediaUri); + String filePath = fr.free.nrw.commons.upload.FileUtils.getPath(this, mediaUri); Log.d(TAG, "Filepath: " + filePath); Log.d(TAG, "Calling GPSExtractor"); - imageObj = new GPSExtractor(filePath, this); + imageObj = new fr.free.nrw.commons.upload.GPSExtractor(filePath, this); imageObj.registerLocationManager(); if (filePath != null && !filePath.equals("")) { @@ -232,7 +262,7 @@ public class ShareActivity app.cacheData.setQtPoint(decLongitude, decLatitude); } - MwVolleyApi apiCall = new MwVolleyApi(this); + fr.free.nrw.commons.upload.MwVolleyApi apiCall = new fr.free.nrw.commons.upload.MwVolleyApi(this); List displayCatList = app.cacheData.findCategory(); boolean catListEmpty = displayCatList.isEmpty(); @@ -246,7 +276,7 @@ public class ShareActivity } else { cacheFound = true; Log.d(TAG, "Cache found, setting categoryList in MwVolleyApi to " + displayCatList.toString()); - MwVolleyApi.setGpsCat(displayCatList); + fr.free.nrw.commons.upload.MwVolleyApi.setGpsCat(displayCatList); } } } diff --git a/commons/app/src/main/res/values/strings.xml b/commons/app/src/main/res/values/strings.xml index 5b53614a7..f0bd2f760 100644 --- a/commons/app/src/main/res/values/strings.xml +++ b/commons/app/src/main/res/values/strings.xml @@ -148,4 +148,7 @@ Unknown license Campaigns Refresh + + Storage permission is needed to access photos + OK diff --git a/commons/build.gradle b/commons/build.gradle index 0a11ca96a..691c8e8d0 100644 --- a/commons/build.gradle +++ b/commons/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' } }