Skip to content

Commit 849c20b

Browse files
authored
Merge 69233d0 into fe657de
2 parents fe657de + 69233d0 commit 849c20b

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

firebase-appdistribution/src/main/java/com/google/firebase/appdistribution/impl/FeedbackActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ private Bitmap readThumbnail() {
8686
thumbnail =
8787
ImageUtils.readScaledImage(
8888
getContentResolver(), screenshotUri, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT);
89-
} catch (IOException e) {
89+
} catch (IOException | SecurityException e) {
9090
LogWrapper.getInstance()
9191
.e(TAG, "Could not read screenshot image from URI: " + screenshotUri, e);
9292
return null;

firebase-appdistribution/src/main/java/com/google/firebase/appdistribution/impl/ImageUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static ImageSize read(InputStream inputStream) {
5353
*
5454
* @return the image, or null if it could not be decoded
5555
* @throws IllegalArgumentException if target height or width are less than or equal to zero
56+
* @throws SecurityException if the app does not have access to the image
57+
* @throws IOException if the image can't be read
5658
*/
5759
@Nullable
5860
public static Bitmap readScaledImage(

firebase-appdistribution/test-app/src/main/java/com/googletest/firebase/appdistribution/testapp/ScreenshotDetectionFeedbackTrigger.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@ class ScreenshotDetectionFeedbackTrigger extends ContentObserver {
4545
private static final boolean SHOULD_CHECK_IF_PENDING = Build.VERSION.SDK_INT >= 29;
4646
private static final String[] PROJECTION =
4747
SHOULD_CHECK_IF_PENDING
48-
? new String[] {MediaStore.Images.Media.DATA}
49-
: new String[] {
50-
MediaStore.Images.Media.DATA, android.provider.MediaStore.MediaColumns.IS_PENDING
51-
};
48+
? new String[] {MediaStore.Images.Media.DATA, MediaStore.MediaColumns.IS_PENDING}
49+
: new String[] {MediaStore.Images.Media.DATA};
5250
private final Set<Uri> seenImages = new HashSet<>();
5351

5452
private final AppCompatActivity activity;
@@ -58,6 +56,8 @@ class ScreenshotDetectionFeedbackTrigger extends ContentObserver {
5856

5957
private Uri currentUri;
6058

59+
private boolean hasRequestedPermission = false;
60+
6161
/**
6262
* Creates a FeedbackTriggers instance for an activity.
6363
*
@@ -102,13 +102,25 @@ void unRegisterScreenshotObserver() {
102102
@Override
103103
public void onChange(boolean selfChange, Uri uri) {
104104
if (!uri.toString().matches(String.format("%s/[0-9]+", Media.EXTERNAL_CONTENT_URI))
105-
|| !seenImages.add(uri)) {
105+
|| seenImages.contains(uri)) {
106106
return;
107107
}
108108

109109
if (ContextCompat.checkSelfPermission(activity, PERMISSION_TO_REQUEST) == PERMISSION_GRANTED) {
110110
maybeStartFeedbackForScreenshot(uri);
111-
} else if (activity.shouldShowRequestPermissionRationale(PERMISSION_TO_REQUEST)) {
111+
} else if (hasRequestedPermission) {
112+
Log.i(
113+
TAG,
114+
"We've already request permission. Not requesting again for the life of the activity.");
115+
} else {
116+
// Set an in memory flag so we don't ask them again right away
117+
hasRequestedPermission = true;
118+
requestReadPermission(uri);
119+
}
120+
}
121+
122+
private void requestReadPermission(Uri uri) {
123+
if (activity.shouldShowRequestPermissionRationale(PERMISSION_TO_REQUEST)) {
112124
Log.i(TAG, "Showing customer rationale for requesting permission.");
113125
new AlertDialog.Builder(activity)
114126
.setMessage(
@@ -122,7 +134,7 @@ public void onChange(boolean selfChange, Uri uri) {
122134
})
123135
.show();
124136
} else {
125-
Log.i(TAG, "Does not have permission. Launching request.");
137+
Log.i(TAG, "Launching request for permission without rationale.");
126138
currentUri = uri;
127139
requestPermissionLauncher.launch(PERMISSION_TO_REQUEST);
128140
}
@@ -133,8 +145,13 @@ private void maybeStartFeedbackForScreenshot(Uri uri) {
133145
try {
134146
cursor = activity.getContentResolver().query(uri, PROJECTION, null, null, null);
135147
if (cursor != null && cursor.moveToFirst()) {
136-
// TODO: check if it's pending
137-
// (http://google3/lens/screenshots/demo/java/com/google/android/lensonscreenshots/ScreenshotDetector.java?l=184)
148+
if (SHOULD_CHECK_IF_PENDING
149+
&& cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.IS_PENDING))
150+
== 1) {
151+
Log.i(TAG, "Ignoring pending image: " + uri);
152+
return;
153+
}
154+
seenImages.add(uri);
138155
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
139156
Log.i(TAG, "Path: " + path);
140157
if (path.toLowerCase().contains("screenshot")) {

0 commit comments

Comments
 (0)