From 56aabdf703779b97ef40cbef8fcde2620a379028 Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Tue, 19 Jul 2016 18:11:05 -0700 Subject: SnapdragonCamera: Remove custom location permission request window When user enables the GPS locaion setting, use Android's run-time permission request interface to get the permission. Change-Id: Ib17171aeff5ccf20e2b00da08243dee1a3383611 CRs-Fixed: 1038039 --- src/com/android/camera/CameraActivity.java | 34 ++++++++++++++++ src/com/android/camera/CameraModule.java | 4 ++ src/com/android/camera/CaptureModule.java | 20 ++++++++-- src/com/android/camera/CaptureUI.java | 11 ------ src/com/android/camera/LocationManager.java | 45 ++++++++++++---------- src/com/android/camera/PhotoMenu.java | 4 ++ src/com/android/camera/PhotoModule.java | 25 ++++++++++-- src/com/android/camera/PhotoUI.java | 42 -------------------- src/com/android/camera/VideoMenu.java | 5 +++ src/com/android/camera/VideoModule.java | 27 ++++++++++++- .../android/camera/WideAnglePanoramaModule.java | 18 +++++++++ 11 files changed, 154 insertions(+), 81 deletions(-) diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index e3b4573d1..a9fd5560b 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -158,6 +158,9 @@ public class CameraActivity extends Activity private static final int HIDE_ACTION_BAR = 1; private static final long SHOW_ACTION_BAR_TIMEOUT_MS = 3000; + /** Permission request code */ + private static final int PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1; + /** Whether onResume should reset the view to the preview. */ private boolean mResetToPreviewOnResume = true; @@ -1868,6 +1871,37 @@ public class CameraActivity extends Activity return mSecureCamera; } + public void requestLocationPermission() { + if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + Log.v(TAG, "Request Location permission"); + mCurrentModule.waitingLocationPermissionResult(true); + requestPermissions( + new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, + PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION: { + // If request is cancelled, the result arrays are empty. + mCurrentModule.waitingLocationPermissionResult(false); + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.v(TAG, "Location permission is granted"); + mCurrentModule.enableRecordingLocation(true); + } else { + Log.w(TAG, "Location permission is denied"); + mCurrentModule.enableRecordingLocation(false); + } + break; + } + } + } + @Override public void onModuleSelected(int moduleIndex) { boolean cam2on = SettingsManager.getInstance().isCamera2On(); diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java index 2c8f5a91b..9de16746d 100644 --- a/src/com/android/camera/CameraModule.java +++ b/src/com/android/camera/CameraModule.java @@ -70,4 +70,8 @@ public interface CameraModule { public void resizeForPreviewAspectRatio(); public void onSwitchSavePath(); + + public void waitingLocationPermissionResult(boolean waiting); + + public void enableRecordingLocation(boolean enable); } diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index a7448aedb..baf8b843c 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -102,7 +102,8 @@ import java.util.concurrent.TimeUnit; public class CaptureModule implements CameraModule, PhotoController, MediaSaveService.Listener, ClearSightImageProcessor.Callback, - SettingsManager.Listener, CountDownView.OnCountDownFinishedListener { + SettingsManager.Listener, LocationManager.Listener, + CountDownView.OnCountDownFinishedListener { public static final int DUAL_MODE = 0; public static final int BAYER_MODE = 1; public static final int MONO_MODE = 2; @@ -806,7 +807,7 @@ public class CaptureModule implements CameraModule, PhotoController, mUI.initializeControlByIntent(); mFocusStateListener = new FocusStateListener(mUI); - mLocationManager = new LocationManager(mActivity, mUI); + mLocationManager = new LocationManager(mActivity, this); Storage.setSaveSDCard(mSettingsManager.getValue(SettingsManager .KEY_CAMERA_SAVEPATH).equals("1")); } @@ -1859,8 +1860,16 @@ public class CaptureModule implements CameraModule, PhotoController, } @Override - public void enableRecordingLocation(boolean enable) { + public void waitingLocationPermissionResult(boolean result) { + mLocationManager.waitingLocationPermissionResult(result); + } + @Override + public void enableRecordingLocation(boolean enable) { + String value = (enable ? RecordLocationPreference.VALUE_ON + : RecordLocationPreference.VALUE_OFF); + mSettingsManager.setValue(SettingsManager.KEY_RECORD_LOCATION, value); + mLocationManager.recordLocation(enable); } @Override @@ -3080,4 +3089,9 @@ public class CaptureModule implements CameraModule, PhotoController, } } } + + @Override + public void onErrorListener(int error) { + enableRecordingLocation(false); + } } diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java index f5f23fa18..e5c39e74c 100644 --- a/src/com/android/camera/CaptureUI.java +++ b/src/com/android/camera/CaptureUI.java @@ -65,7 +65,6 @@ import java.util.Locale; public class CaptureUI implements FocusOverlayManager.FocusUI, PreviewGestures.SingleTapListener, - LocationManager.Listener, CameraManager.CameraFaceDetectionCallback, SettingsManager.Listener, ListMenu.Listener, @@ -1463,16 +1462,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, return mOrientation; } - @Override - public void showGpsOnScreenIndicator(boolean hasSignal) { - - } - - @Override - public void hideGpsOnScreenIndicator() { - - } - @Override public void onSingleTapUp(View view, int x, int y) { mModule.onSingleTapUp(view, x, y); diff --git a/src/com/android/camera/LocationManager.java b/src/com/android/camera/LocationManager.java index fcf21b60f..49009d7d8 100644 --- a/src/com/android/camera/LocationManager.java +++ b/src/com/android/camera/LocationManager.java @@ -26,12 +26,14 @@ import android.util.Log; * A class that handles everything about location. */ public class LocationManager { - private static final String TAG = "LocationManager"; + public static final int LOC_MNGR_ERR_PERM_DENY = 1; + private static final String TAG = "LocationManager"; private Context mContext; private Listener mListener; private android.location.LocationManager mLocationManager; private boolean mRecordLocation; + private boolean mWaitingLocPermResult = false; LocationListener [] mLocationListeners = new LocationListener[] { new LocationListener(android.location.LocationManager.GPS_PROVIDER), @@ -39,9 +41,8 @@ public class LocationManager { }; public interface Listener { - public void showGpsOnScreenIndicator(boolean hasSignal); - public void hideGpsOnScreenIndicator(); - } + public void onErrorListener(int error); + } public LocationManager(Context context, Listener listener) { mContext = context; @@ -62,15 +63,23 @@ public class LocationManager { public void recordLocation(boolean recordLocation) { if (mRecordLocation != recordLocation) { - mRecordLocation = recordLocation; - if (recordLocation) { - startReceivingLocationUpdates(); - } else { - stopReceivingLocationUpdates(); + /* Don't change the location until permission request + result is received */ + if (!mWaitingLocPermResult) { + mRecordLocation = recordLocation; + if (recordLocation) { + startReceivingLocationUpdates(); + } else { + stopReceivingLocationUpdates(); + } } } } + public void waitingLocationPermissionResult(boolean waitingResult) { + mWaitingLocPermResult = waitingResult; + } + private void startReceivingLocationUpdates() { if (mLocationManager == null) { mLocationManager = (android.location.LocationManager) @@ -85,6 +94,9 @@ public class LocationManager { mLocationListeners[1]); } catch (SecurityException ex) { Log.i(TAG, "fail to request location update, ignore", ex); + if (mListener != null) mListener.onErrorListener(LOC_MNGR_ERR_PERM_DENY); + recordLocation(false); + return; } catch (IllegalArgumentException ex) { Log.d(TAG, "provider does not exist " + ex.getMessage()); } @@ -94,9 +106,11 @@ public class LocationManager { 1000, 0F, mLocationListeners[0]); - if (mListener != null) mListener.showGpsOnScreenIndicator(false); } catch (SecurityException ex) { Log.i(TAG, "fail to request location update, ignore", ex); + if (mListener != null) mListener.onErrorListener(LOC_MNGR_ERR_PERM_DENY); + recordLocation(false); + return; } catch (IllegalArgumentException ex) { Log.d(TAG, "provider does not exist " + ex.getMessage()); } @@ -115,7 +129,6 @@ public class LocationManager { } Log.d(TAG, "stopReceivingLocationUpdates"); } - if (mListener != null) mListener.hideGpsOnScreenIndicator(); } private class LocationListener @@ -136,12 +149,6 @@ public class LocationManager { // Hack to filter out 0.0,0.0 locations return; } - // If GPS is available before start camera, we won't get status - // update so update GPS indicator when we receive data. - if (mListener != null && mRecordLocation && - android.location.LocationManager.GPS_PROVIDER.equals(mProvider)) { - mListener.showGpsOnScreenIndicator(true); - } if (!mValid) { Log.d(TAG, "Got first location."); } @@ -165,10 +172,6 @@ public class LocationManager { case LocationProvider.OUT_OF_SERVICE: case LocationProvider.TEMPORARILY_UNAVAILABLE: { mValid = false; - if (mListener != null && mRecordLocation && - android.location.LocationManager.GPS_PROVIDER.equals(provider)) { - mListener.showGpsOnScreenIndicator(false); - } break; } } diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java index 6a1f08597..8988e8e2a 100644 --- a/src/com/android/camera/PhotoMenu.java +++ b/src/com/android/camera/PhotoMenu.java @@ -1471,6 +1471,10 @@ public class PhotoMenu extends MenuController } updateFilterModeIcon(pref, pref); + if (same(pref, CameraSettings.KEY_RECORD_LOCATION, "on")) { + mActivity.requestLocationPermission(); + } + super.onSettingChanged(pref); if (same(pref, SettingsManager.KEY_CAMERA2, "enable")) { mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX); diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 6f116ab24..0a2cf181a 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -112,6 +112,7 @@ public class PhotoModule ShutterButton.OnShutterButtonListener, MediaSaveService.Listener, OnCountDownFinishedListener, + LocationManager.Listener, SensorEventListener, MakeupLevelListener { private static final String TAG = "CAM_PhotoModule"; @@ -582,7 +583,7 @@ public class PhotoModule } initializeControlByIntent(); mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false); - mLocationManager = new LocationManager(mActivity, mUI); + mLocationManager = new LocationManager(mActivity, this); mSensorManager = (SensorManager)(mActivity.getSystemService(Context.SENSOR_SERVICE)); brightnessProgressBar = (ProgressBar)mRootView.findViewById(R.id.progress); @@ -635,13 +636,23 @@ public class PhotoModule } mLocationPromptTriggered = true; - mUI.showLocationDialog(); + + /* Enable the location at the begining, always. + If the user denies the permission, it will be disabled + right away due to exception */ + enableRecordingLocation(true); + } + + @Override + public void waitingLocationPermissionResult(boolean result) { + mLocationManager.waitingLocationPermissionResult(result); } @Override public void enableRecordingLocation(boolean enable) { setLocationPreference(enable ? RecordLocationPreference.VALUE_ON : RecordLocationPreference.VALUE_OFF); + mLocationManager.recordLocation(enable); } @Override @@ -687,7 +698,9 @@ public class PhotoModule .apply(); // TODO: Fix this to use the actual onSharedPreferencesChanged listener // instead of invoking manually - onSharedPreferenceChanged(); + if (mUI.mMenuInitialized) { + onSharedPreferenceChanged(); + } } private void onCameraOpened() { @@ -4854,6 +4867,12 @@ public class PhotoModule mCameraDevice.setParameters(mParameters); mParameters = mCameraDevice.getParameters(); } + + @Override + public void onErrorListener(int error) { + enableRecordingLocation(false); + } + } /* Below is no longer needed, except to get rid of compile error diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 7c715d9fd..3878d443d 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -84,7 +84,6 @@ public class PhotoUI implements PieListener, PreviewGestures.SingleTapListener, FocusUI, SurfaceHolder.Callback, - LocationManager.Listener, CameraRootView.MyDisplayListener, CameraManager.CameraFaceDetectionCallback { @@ -686,41 +685,6 @@ public class PhotoUI implements PieListener, muteButton.setVisibility(View.GONE); } - public void showLocationDialog() { - mLocationDialog = new AlertDialog.Builder(mActivity) - .setTitle(R.string.remember_location_title) - .setMessage(R.string.remember_location_prompt) - .setPositiveButton(R.string.remember_location_yes, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int arg1) { - mController.enableRecordingLocation(true); - mLocationDialog = null; - } - }) - .setNegativeButton(R.string.remember_location_no, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int arg1) { - dialog.cancel(); - } - }) - .setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - mController.enableRecordingLocation(false); - mLocationDialog = null; - } - }) - .setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - mActivity.setSystemBarsVisibility(false); - } - }) - .show(); - } - public void initializeZoom(Camera.Parameters params) { if ((params == null) || !params.isZoomSupported() || (mZoomRenderer == null)) return; @@ -736,12 +700,6 @@ public class PhotoUI implements PieListener, } } - @Override - public void showGpsOnScreenIndicator(boolean hasSignal) { } - - @Override - public void hideGpsOnScreenIndicator() { } - public void overrideSettings(final String ... keyvalues) { if (mMenu == null) return; diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java index 670572774..ac123a290 100644 --- a/src/com/android/camera/VideoMenu.java +++ b/src/com/android/camera/VideoMenu.java @@ -897,6 +897,11 @@ public class VideoMenu extends MenuController setPreference(CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL, defaultValue); } + if (notSame(pref, CameraSettings.KEY_RECORD_LOCATION, "off")) { + mActivity.requestLocationPermission(); + } + + super.onSettingChanged(pref); } diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 0f40702ce..50f3f3216 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -84,6 +84,7 @@ public class VideoModule implements CameraModule, VideoController, CameraPreference.OnPreferenceChangedListener, ShutterButton.OnShutterButtonListener, + LocationManager.Listener, MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener { @@ -512,7 +513,7 @@ public class VideoModule implements CameraModule, mUI.setPrefChangedListener(this); mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false); - mLocationManager = new LocationManager(mActivity, null); + mLocationManager = new LocationManager(mActivity, this); mUI.setOrientationIndicator(0, false); setDisplayOrientation(); @@ -525,6 +526,23 @@ public class VideoModule implements CameraModule, mPendingSwitchCameraId = -1; } + @Override + public void waitingLocationPermissionResult(boolean result) { + mLocationManager.waitingLocationPermissionResult(result); + } + + @Override + public void enableRecordingLocation(boolean enable) { + String value = (enable ? RecordLocationPreference.VALUE_ON + : RecordLocationPreference.VALUE_OFF); + if (mPreferences != null) { + mPreferences.edit() + .putString(CameraSettings.KEY_RECORD_LOCATION, value) + .apply(); + } + mLocationManager.recordLocation(enable); + } + // SingleTapListener // Preview area is touched. Take a picture. @Override @@ -3037,4 +3055,11 @@ public class VideoModule implements CameraModule, mUI.onStopFaceDetection(); } } + + @Override + public void onErrorListener(int error) { + enableRecordingLocation(false); + } + } + diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java index 3f825dd39..210fe3600 100644 --- a/src/com/android/camera/WideAnglePanoramaModule.java +++ b/src/com/android/camera/WideAnglePanoramaModule.java @@ -895,6 +895,24 @@ public class WideAnglePanoramaModule } } + @Override + public void waitingLocationPermissionResult(boolean result) { + mLocationManager.waitingLocationPermissionResult(result); + } + + @Override + public void enableRecordingLocation(boolean enable) { + String value = (enable ? RecordLocationPreference.VALUE_ON + : RecordLocationPreference.VALUE_OFF); + if (mPreferences != null) { + mPreferences.edit() + .putString(CameraSettings.KEY_RECORD_LOCATION, value) + .apply(); + } + + mLocationManager.recordLocation(enable); + } + @Override public void onPauseBeforeSuper() { mPaused = true; -- cgit v1.2.3