diff options
author | Xin Li <delphij@google.com> | 2022-08-15 22:04:10 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2022-08-15 22:04:10 -0700 |
commit | 94f09e9e7a125f4a457cab21ca08986b20a4dc48 (patch) | |
tree | 5c9d98fc20e0afdca6102d573541873b03433b2d | |
parent | d62b4a89f9ac77f61095b5d6e2d4f254ff921573 (diff) | |
parent | 351b330befaf0a8a2b937896c4a3488d12af294e (diff) | |
download | Camera2-94f09e9e7a125f4a457cab21ca08986b20a4dc48.tar.gz |
DO NOT MERGE - Merge Android 13
Bug: 242648940
Merged-In: I7ff8a794872917caff27f540a29e77db7e9f5bb2
Change-Id: I25ac445f23c66f561dee9afb0fc0343822236bd7
-rw-r--r-- | AndroidManifest.xml | 1 | ||||
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 6 | ||||
-rw-r--r-- | src/com/android/camera/PermissionsActivity.java | 113 | ||||
-rw-r--r-- | src/com/android/camera/Thumbnail.java | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | src/com/android/camera/VideoModule.java | 0 | ||||
-rw-r--r-- | src/com/android/camera/app/FirstRunDialog.java | 32 | ||||
-rw-r--r-- | src/com/android/camera/data/CameraFilmstripDataAdapter.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/data/FilmstripItemUtils.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/data/VideoRotationMetadataLoader.java | 8 | ||||
-rw-r--r-- | src/com/android/camera/settings/CameraSettingsActivity.java | 6 |
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); } } } |