summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Wang <jaywang@codeaurora.org>2016-07-19 18:11:05 -0700
committerJay Wang <jaywang@codeaurora.org>2016-07-19 18:33:27 -0700
commit56aabdf703779b97ef40cbef8fcde2620a379028 (patch)
tree6710a435e25aff3cda02545658f023151e93f896
parentd8f8770adb894d7ccdedde05512be91885fec07f (diff)
downloadandroid_packages_apps_Snap-56aabdf703779b97ef40cbef8fcde2620a379028.tar.gz
android_packages_apps_Snap-56aabdf703779b97ef40cbef8fcde2620a379028.tar.bz2
android_packages_apps_Snap-56aabdf703779b97ef40cbef8fcde2620a379028.zip
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
-rw-r--r--src/com/android/camera/CameraActivity.java34
-rw-r--r--src/com/android/camera/CameraModule.java4
-rw-r--r--src/com/android/camera/CaptureModule.java20
-rw-r--r--src/com/android/camera/CaptureUI.java11
-rw-r--r--src/com/android/camera/LocationManager.java45
-rw-r--r--src/com/android/camera/PhotoMenu.java4
-rw-r--r--src/com/android/camera/PhotoModule.java25
-rw-r--r--src/com/android/camera/PhotoUI.java42
-rw-r--r--src/com/android/camera/VideoMenu.java5
-rw-r--r--src/com/android/camera/VideoModule.java27
-rw-r--r--src/com/android/camera/WideAnglePanoramaModule.java18
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,
@@ -1464,16 +1463,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI,
}
@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
@@ -896,6 +896,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;
if (mLocationManager != null) mLocationManager.recordLocation(false);