summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2022-08-15 22:04:10 -0700
committerXin Li <delphij@google.com>2022-08-15 22:04:10 -0700
commit94f09e9e7a125f4a457cab21ca08986b20a4dc48 (patch)
tree5c9d98fc20e0afdca6102d573541873b03433b2d
parentd62b4a89f9ac77f61095b5d6e2d4f254ff921573 (diff)
parent351b330befaf0a8a2b937896c4a3488d12af294e (diff)
downloadCamera2-94f09e9e7a125f4a457cab21ca08986b20a4dc48.tar.gz
DO NOT MERGE - Merge Android 13
Bug: 242648940 Merged-In: I7ff8a794872917caff27f540a29e77db7e9f5bb2 Change-Id: I25ac445f23c66f561dee9afb0fc0343822236bd7
-rw-r--r--AndroidManifest.xml1
-rw-r--r--src/com/android/camera/CameraActivity.java6
-rw-r--r--src/com/android/camera/PermissionsActivity.java113
-rw-r--r--src/com/android/camera/Thumbnail.java3
-rw-r--r--[-rwxr-xr-x]src/com/android/camera/VideoModule.java0
-rw-r--r--src/com/android/camera/app/FirstRunDialog.java32
-rw-r--r--src/com/android/camera/data/CameraFilmstripDataAdapter.java7
-rw-r--r--src/com/android/camera/data/FilmstripItemUtils.java7
-rw-r--r--src/com/android/camera/data/VideoRotationMetadataLoader.java8
-rw-r--r--src/com/android/camera/settings/CameraSettingsActivity.java6
10 files changed, 83 insertions, 100 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e4b175a87..4d7e17144 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -28,6 +28,7 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<supports-screens
android:anyDensity="true"
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 02090c950..b581c51bf 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -865,7 +865,7 @@ public class CameraActivity extends QuickActivity
if (!Storage.instance().isSessionUri(uri)) {
return;
}
- Optional<SessionItem> newData = SessionItem.create(getApplicationContext(), uri);
+ Optional<SessionItem> newData = SessionItem.create(CameraActivity.this, uri);
if (newData.isPresent()) {
mDataAdapter.addOrUpdate(newData.get());
}
@@ -1581,9 +1581,9 @@ public class CameraActivity extends QuickActivity
ContentResolver appContentResolver = mAppContext.getContentResolver();
GlideFilmstripManager glideManager = new GlideFilmstripManager(mAppContext);
- mPhotoItemFactory = new PhotoItemFactory(mAppContext, glideManager, appContentResolver,
+ mPhotoItemFactory = new PhotoItemFactory(CameraActivity.this, glideManager, appContentResolver,
new PhotoDataFactory());
- mVideoItemFactory = new VideoItemFactory(mAppContext, glideManager, appContentResolver,
+ mVideoItemFactory = new VideoItemFactory(CameraActivity.this, glideManager, appContentResolver,
new VideoDataFactory());
mCameraAppUI.getFilmstripContentPanel().setFilmstripListener(mFilmstripListener);
if (mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
diff --git a/src/com/android/camera/PermissionsActivity.java b/src/com/android/camera/PermissionsActivity.java
index 895d3168c..713f44bf0 100644
--- a/src/com/android/camera/PermissionsActivity.java
+++ b/src/com/android/camera/PermissionsActivity.java
@@ -22,6 +22,9 @@ import com.android.camera.settings.SettingsManager;
import com.android.camera.util.QuickActivity;
import com.android.camera2.R;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Activity that shows permissions request dialogs and handles lack of critical permissions.
* TODO: Convert PermissionsActivity into a dialog to be emitted from
@@ -31,21 +34,8 @@ import com.android.camera2.R;
public class PermissionsActivity extends QuickActivity {
private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
- private static int PERMISSION_REQUEST_CODE = 1;
- private static int RESULT_CODE_OK = 1;
- private static int RESULT_CODE_FAILED = 2;
-
- private int mIndexPermissionRequestCamera;
- private int mIndexPermissionRequestMicrophone;
- private int mIndexPermissionRequestLocation;
- private int mIndexPermissionRequestStorage;
- private int mIndexPermissionRequestWriteStorage;
- private boolean mShouldRequestCameraPermission;
- private boolean mShouldRequestMicrophonePermission;
- private boolean mShouldRequestLocationPermission;
- private int mNumPermissionsToRequest;
- private boolean mFlagHasCameraPermission;
- private boolean mFlagHasMicrophonePermission;
+ private static final int PERMISSION_REQUEST_CODE = 1;
+
private SettingsManager mSettingsManager;
/**
@@ -88,7 +78,6 @@ public class PermissionsActivity extends QuickActivity {
@Override
protected void onResumeTasks() {
- mNumPermissionsToRequest = 0;
checkPermissions();
}
@@ -99,34 +88,31 @@ public class PermissionsActivity extends QuickActivity {
}
private void checkPermissions() {
- if (checkSelfPermission(Manifest.permission.CAMERA)
- != PackageManager.PERMISSION_GRANTED) {
- mNumPermissionsToRequest++;
- mShouldRequestCameraPermission = true;
- } else {
- mFlagHasCameraPermission = true;
+ List<String> permissions = new ArrayList<>();
+
+ if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+ permissions.add(Manifest.permission.CAMERA);
}
if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
- mNumPermissionsToRequest++;
- mShouldRequestMicrophonePermission = true;
- } else {
- mFlagHasMicrophonePermission = true;
+ permissions.add(Manifest.permission.RECORD_AUDIO);
}
- if (mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
- Keys.KEY_RECORD_LOCATION)
- && (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED)) {
- mNumPermissionsToRequest++;
- mShouldRequestLocationPermission = true;
+ if (mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL, Keys.KEY_RECORD_LOCATION)
+ && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED
+ && checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED) {
+ permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
+ permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
- if (mNumPermissionsToRequest != 0) {
+ if (!permissions.isEmpty()) {
if (!isKeyguardLocked() && !mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
- buildPermissionsRequest();
+ Log.v(TAG, "requestPermissions count: " + permissions.size());
+ requestPermissions(permissions.toArray(new String[0]), PERMISSION_REQUEST_CODE);
} else {
// Permissions dialog has already been shown, or we're on
// lockscreen, and we're still missing permissions.
@@ -137,64 +123,31 @@ public class PermissionsActivity extends QuickActivity {
}
}
- private void buildPermissionsRequest() {
- String[] permissionsToRequest = new String[mNumPermissionsToRequest];
- int permissionsRequestIndex = 0;
-
- if (mShouldRequestCameraPermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
- mIndexPermissionRequestCamera = permissionsRequestIndex;
- permissionsRequestIndex++;
- }
- if (mShouldRequestMicrophonePermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
- mIndexPermissionRequestMicrophone = permissionsRequestIndex;
- permissionsRequestIndex++;
- }
- if (mShouldRequestLocationPermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
- mIndexPermissionRequestLocation = permissionsRequestIndex;
- }
-
- Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length);
- requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
- }
-
@Override
public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
+ String[] permissions, int[] grantResults) {
Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length);
mSettingsManager.set(
SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS,
true);
- if (mShouldRequestCameraPermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestCamera] ==
- PackageManager.PERMISSION_GRANTED) {
- mFlagHasCameraPermission = true;
- } else {
+ boolean missingCriticalPermissions = false;
+ for (int i = 0; i < permissions.length; i++) {
+ String permission = permissions[i];
+ int result = grantResults[i];
+ // Show fail dialog if critical permissions are not granted
+ if (Manifest.permission.CAMERA.equals(permission)
+ && result == PackageManager.PERMISSION_DENIED) {
handlePermissionsFailure();
- }
- }
- if (mShouldRequestMicrophonePermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestMicrophone] ==
- PackageManager.PERMISSION_GRANTED) {
- mFlagHasMicrophonePermission = true;
- } else {
+ missingCriticalPermissions = true;
+ } else if (Manifest.permission.RECORD_AUDIO.equals(permission)
+ && result == PackageManager.PERMISSION_DENIED) {
handlePermissionsFailure();
+ missingCriticalPermissions = true;
}
}
- if (mShouldRequestLocationPermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestLocation] ==
- PackageManager.PERMISSION_GRANTED) {
- // Do nothing
- } else {
- // Do nothing
- }
- }
-
- if (mFlagHasCameraPermission && mFlagHasMicrophonePermission) {
+ if (!missingCriticalPermissions) {
handlePermissionsSuccess();
}
}
diff --git a/src/com/android/camera/Thumbnail.java b/src/com/android/camera/Thumbnail.java
index 5f8483d6c..f5db39294 100644
--- a/src/com/android/camera/Thumbnail.java
+++ b/src/com/android/camera/Thumbnail.java
@@ -20,6 +20,7 @@ import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import java.io.FileDescriptor;
+import java.io.IOException;
public class Thumbnail {
public static Bitmap createVideoThumbnailBitmap(FileDescriptor fd, int targetWidth) {
@@ -48,7 +49,7 @@ public class Thumbnail {
} finally {
try {
retriever.release();
- } catch (RuntimeException ex) {
+ } catch (RuntimeException | IOException ex) {
// Ignore failures while cleaning up.
}
}
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index abbae5265..abbae5265 100755..100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
diff --git a/src/com/android/camera/app/FirstRunDialog.java b/src/com/android/camera/app/FirstRunDialog.java
index 58e1fcbba..fa419fd44 100644
--- a/src/com/android/camera/app/FirstRunDialog.java
+++ b/src/com/android/camera/app/FirstRunDialog.java
@@ -44,7 +44,9 @@ public class FirstRunDialog {
public interface FirstRunDialogListener {
public void onFirstRunStateReady();
+
public void onFirstRunDialogCancelled();
+
public void onCameraAccessException();
}
@@ -83,15 +85,14 @@ public class FirstRunDialog {
/**
* Constructs a first run dialog.
- *
*/
public FirstRunDialog(
- AppController appController,
- Context activityContext,
- ResolutionSetting resolutionSetting,
- SettingsManager settingManager,
- OneCameraManager hardwareManager,
- FirstRunDialogListener listener) {
+ AppController appController,
+ Context activityContext,
+ ResolutionSetting resolutionSetting,
+ SettingsManager settingManager,
+ OneCameraManager hardwareManager,
+ FirstRunDialogListener listener) {
mAppController = appController;
mContext = activityContext;
mResolutionSetting = resolutionSetting;
@@ -211,14 +212,19 @@ public class FirstRunDialog {
private void checkLocationPermission() {
if (mContext.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- Activity activity = (Activity) mContext;
- activity.requestPermissions(
- new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
+ == PackageManager.PERMISSION_GRANTED || mContext.checkSelfPermission(
+ Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+
+ Activity activity = (Activity) mContext;
+ activity.requestPermissions(
+ new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_REQUEST_CODE);
- mSettingsManager.set(SettingsManager.SCOPE_GLOBAL,
+ mSettingsManager.set(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS, true);
- }
+
}
/**
diff --git a/src/com/android/camera/data/CameraFilmstripDataAdapter.java b/src/com/android/camera/data/CameraFilmstripDataAdapter.java
index a42f6c5af..c26c4e0fe 100644
--- a/src/com/android/camera/data/CameraFilmstripDataAdapter.java
+++ b/src/com/android/camera/data/CameraFilmstripDataAdapter.java
@@ -241,8 +241,15 @@ public class CameraFilmstripDataAdapter implements LocalFilmstripDataAdapter {
@Override
public void updateItemAt(final int pos, FilmstripItem item) {
+ final Uri uri = item.getData().getUri();
+ int oldPos = findByContentUri(uri);
mFilmstripItems.set(pos, item);
updateMetadataAt(pos, true /* forceItemUpdate */);
+
+ if ((oldPos != -1) && (oldPos != pos)) {
+ Log.v(TAG, "found duplicate data: " + uri);
+ removeAt(oldPos);
+ }
}
private void insertItem(FilmstripItem item) {
diff --git a/src/com/android/camera/data/FilmstripItemUtils.java b/src/com/android/camera/data/FilmstripItemUtils.java
index 654bf49e2..590f96dcb 100644
--- a/src/com/android/camera/data/FilmstripItemUtils.java
+++ b/src/com/android/camera/data/FilmstripItemUtils.java
@@ -24,6 +24,7 @@ import android.media.MediaMetadataRetriever;
import com.android.camera.debug.Log;
+import java.io.IOException;
import java.io.InputStream;
import javax.microedition.khronos.opengles.GL11;
@@ -174,7 +175,11 @@ public class FilmstripItemUtils {
} catch (IllegalArgumentException e) {
Log.e(TAG, "MediaMetadataRetriever.setDataSource() fail:" + e.getMessage());
}
- retriever.release();
+ try {
+ retriever.release();
+ } catch (IOException e) {
+ // We ignore errors occurred while releasing the MediaMetadataRetriever.
+ }
return bitmap;
}
}
diff --git a/src/com/android/camera/data/VideoRotationMetadataLoader.java b/src/com/android/camera/data/VideoRotationMetadataLoader.java
index c5185f38c..59e140212 100644
--- a/src/com/android/camera/data/VideoRotationMetadataLoader.java
+++ b/src/com/android/camera/data/VideoRotationMetadataLoader.java
@@ -20,6 +20,8 @@ import android.media.MediaMetadataRetriever;
import com.android.camera.debug.Log;
+import java.io.IOException;
+
public class VideoRotationMetadataLoader {
private static final Log.Tag TAG = new Log.Tag("VidRotDataLoader");
@@ -52,6 +54,12 @@ public class VideoRotationMetadataLoader {
// setDataSource() can cause RuntimeException beyond
// IllegalArgumentException. e.g: data contain *.avi file.
Log.e(TAG, "MediaMetdataRetriever.setDataSource() fail", ex);
+ } finally {
+ try {
+ retriever.release();
+ } catch (IOException e) {
+ // Ignore errors occurred while releasing the MediaMetadataRetriever.
+ }
}
return true;
}
diff --git a/src/com/android/camera/settings/CameraSettingsActivity.java b/src/com/android/camera/settings/CameraSettingsActivity.java
index 85d13f67b..6c76e961c 100644
--- a/src/com/android/camera/settings/CameraSettingsActivity.java
+++ b/src/com/android/camera/settings/CameraSettingsActivity.java
@@ -353,8 +353,10 @@ public class CameraSettingsActivity extends FragmentActivity {
Context context = this.getActivity().getApplicationContext();
if (context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
- requestPermissions(new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
- PERMISSION_REQUEST_CODE);
+ requestPermissions(
+ new String[] {Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION},
+ PERMISSION_REQUEST_CODE);
}
}
}