Merge "bugfix 5422126 Panorama needs to load the thumbnail from the file"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 61088ec..23114db 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -65,6 +65,7 @@
</intent-filter>
</activity>
<activity android:name="com.android.camera.panorama.PanoramaActivity"
+ android:label="@string/pano_dialog_title"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
diff --git a/res/drawable-hdpi/dialog_full_holo_dark.9.png b/res/drawable-hdpi/dialog_full_holo_dark.9.png
new file mode 100644
index 0000000..79e56f5
--- /dev/null
+++ b/res/drawable-hdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-hdpi/list_pressed_holo.9.png b/res/drawable-hdpi/list_pressed_holo.9.png
deleted file mode 100644
index 9eae8f4..0000000
--- a/res/drawable-hdpi/list_pressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/dialog_full_holo_dark.9.png b/res/drawable-mdpi/dialog_full_holo_dark.9.png
new file mode 100644
index 0000000..fb3660e
--- /dev/null
+++ b/res/drawable-mdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-mdpi/list_pressed_holo.9.png b/res/drawable-mdpi/list_pressed_holo.9.png
deleted file mode 100644
index e3344b6..0000000
--- a/res/drawable-mdpi/list_pressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/dialog_full_holo_dark.9.png b/res/drawable-xhdpi/dialog_full_holo_dark.9.png
new file mode 100644
index 0000000..f4970ad
--- /dev/null
+++ b/res/drawable-xhdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/res/drawable/border_preview.xml b/res/drawable/border_preview.xml
index 8cac1fc..5835e2f 100644
--- a/res/drawable/border_preview.xml
+++ b/res/drawable/border_preview.xml
@@ -16,6 +16,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@drawable/ic_snapshot_border" />
- <item android:drawable="@android:color/transparent" />
+ <item android:drawable="@android:color/black" />
</selector>
diff --git a/res/drawable/setting_picker.xml b/res/drawable/setting_picker.xml
index de225e3..a286d09 100644
--- a/res/drawable/setting_picker.xml
+++ b/res/drawable/setting_picker.xml
@@ -16,6 +16,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
- android:drawable="@drawable/list_pressed_holo" />
+ android:drawable="@drawable/list_pressed_holo_light" />
<item android:drawable="@android:color/transparent" />
</selector>
diff --git a/res/layout/bg_replacement_training_message.xml b/res/layout/bg_replacement_training_message.xml
new file mode 100644
index 0000000..ee0464e
--- /dev/null
+++ b/res/layout/bg_replacement_training_message.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/bg_replace_message_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:onClick="onProtectiveCurtainClick"
+ android:background="#77000000">
+ <com.android.camera.ui.RotateLayout
+ android:id="@+id/bg_replace_message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true">
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="@drawable/dialog_full_holo_dark">
+ <TextView
+ android:layout_width="300dp"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/bg_replacement_message"
+ android:padding="32dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:background="#aaaaaa" />
+
+ <Button android:id="@+id/bg_replace_cancel_button"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:layout_gravity="center"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ style="?android:attr/borderlessButtonStyle"
+ android:text="@android:string/cancel"
+ android:onClick="onCancelBgTraining"/>
+ </LinearLayout>
+ </com.android.camera.ui.RotateLayout>
+</RelativeLayout>
diff --git a/res/layout/camera_control.xml b/res/layout/camera_control.xml
index 6aba493..366393d 100644
--- a/res/layout/camera_control.xml
+++ b/res/layout/camera_control.xml
@@ -29,6 +29,7 @@
android:scaleType="center"
android:clickable="true"
android:focusable="true"
+ android:contentDescription="@string/accessibility_shutter_button"
android:background="@drawable/btn_shutter" />
<include layout="@layout/mode_picker" />
</com.android.camera.ui.ControlPanelLayout>
diff --git a/res/layout/indicator_bar.xml b/res/layout/indicator_bar.xml
index 4fe6d45..764d6d6 100644
--- a/res/layout/indicator_bar.xml
+++ b/res/layout/indicator_bar.xml
@@ -41,6 +41,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
+ android:contentDescription="@string/accessibility_second_level_indicators"
android:src="@drawable/ic_settings_holo_light" />
</com.android.camera.ui.IndicatorControlBar>
@@ -63,6 +64,12 @@
android:layout_height="0dp"
android:background="@color/mode_selection_border"
android:visibility="gone" />
+ <com.android.camera.ui.ColorFilterImageView
+ android:id="@+id/back_to_first_level"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/accessibility_back_to_first_level"
+ android:src="@drawable/btn_close_settings" />
</com.android.camera.ui.SecondLevelIndicatorControlBar>
</RelativeLayout>
diff --git a/res/layout/mode_picker.xml b/res/layout/mode_picker.xml
index 5cbc882..12c9618 100644
--- a/res/layout/mode_picker.xml
+++ b/res/layout/mode_picker.xml
@@ -24,12 +24,14 @@
android:layout_alignBottom="@+id/mode_selection"
android:layout_width="match_parent"
android:layout_height="55dp"
+ android:contentDescription="@string/accessibility_mode_picker"
android:background="@drawable/bg_mode_picker">
<View android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/white"/>
<RelativeLayout
android:orientation="horizontal"
+ android:contentDescription="@string/empty"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.android.camera.ui.RotateImageView android:id="@+id/mode_0"
@@ -39,12 +41,14 @@
android:layout_alignParentLeft="true"
android:layout_marginLeft="8dp"
android:scaleType="fitCenter"
+ android:contentDescription="@string/empty"
android:src="@drawable/ic_switch_video_holo_light" />
<com.android.camera.ui.RotateImageView android:id="@+id/mode_1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:scaleType="fitCenter"
+ android:contentDescription="@string/empty"
android:src="@drawable/ic_switch_camera_holo_light" />
<com.android.camera.ui.RotateImageView android:id="@+id/mode_2"
android:layout_width="32dp"
@@ -53,6 +57,7 @@
android:layout_alignParentRight="true"
android:layout_marginRight="8dp"
android:scaleType="fitCenter"
+ android:contentDescription="@string/empty"
android:src="@drawable/ic_switch_pan_holo_light" />
</RelativeLayout>
</RelativeLayout>
@@ -72,6 +77,7 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true">
<com.android.camera.ui.RotateImageView android:id="@+id/mode_camera"
+ android:contentDescription="@string/switch_to_camera_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
@@ -79,6 +85,7 @@
android:background="@drawable/bg_pressed"
android:src="@drawable/ic_switch_camera_holo_light" />
<com.android.camera.ui.RotateImageView android:id="@+id/mode_video"
+ android:contentDescription="@string/switch_to_video_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
@@ -86,6 +93,7 @@
android:background="@drawable/bg_pressed"
android:src="@drawable/ic_switch_video_holo_light" />
<com.android.camera.ui.RotateImageView android:id="@+id/mode_panorama"
+ android:contentDescription="@string/switch_to_panorama_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="center"
diff --git a/res/layout/preview_frame_video.xml b/res/layout/preview_frame_video.xml
index c2823ee..5e27169 100644
--- a/res/layout/preview_frame_video.xml
+++ b/res/layout/preview_frame_video.xml
@@ -44,16 +44,6 @@
android:src="@drawable/ic_gallery_play"
android:visibility="gone"
android:onClick="onReviewPlayClicked"/>
- <TextView android:id="@+id/bg_replace_message"
- android:layout_width="300dp"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:padding="32dp"
- android:layout_margin="24dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:background="@drawable/bg_text_on_preview"
- android:visibility="gone"
- android:text="@string/bg_replacement_message" />
</com.android.camera.PreviewFrameLayout>
<!-- Fill up the space below preview frame with black. -->
diff --git a/res/layout/review_thumbnail.xml b/res/layout/review_thumbnail.xml
index 1d80687..1f94e27 100644
--- a/res/layout/review_thumbnail.xml
+++ b/res/layout/review_thumbnail.xml
@@ -21,5 +21,6 @@
android:clickable="true"
android:focusable="false"
android:visibility="gone"
+ android:contentDescription="@string/accessibility_review_thumbnail"
android:background="@drawable/border_last_picture">
</com.android.camera.ui.RotateImageView>
diff --git a/res/layout/video_camera.xml b/res/layout/video_camera.xml
index c8c24c2..809c7a5 100644
--- a/res/layout/video_camera.xml
+++ b/res/layout/video_camera.xml
@@ -14,12 +14,17 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:camera="http://schemas.android.com/apk/res/com.android.camera"
android:id="@+id/app_root"
- android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/preview_frame_video"/>
- <include layout="@layout/camera_control"/>
-</LinearLayout>
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <include layout="@layout/preview_frame_video"/>
+ <include layout="@layout/camera_control"/>
+ </LinearLayout>
+ <include layout="@layout/bg_replacement_training_message"/>
+</RelativeLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0bdb819..7cc61f4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -329,4 +329,28 @@
<!-- Title of category for background replacement effects. [CHAR LIMIT=26] -->
<string name="effect_background">Background</string>
+
+ <!-- The shutter button. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_shutter_button">Shutter button</string>
+ <!-- The button to review the thumbnail. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_review_thumbnail">Most recent photo</string>
+ <!-- The front/back camera switch. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_camera_picker">Front and back camera switch</string>
+ <!-- The mode picker to switch between camera, video and panorama. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_mode_picker">Camera, video or panorama selector</string>
+ <!-- The button to switch to the second-level indicators of the camera settings. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_second_level_indicators">More setting controls</string>
+ <!-- The button to back to the first-level indicators of the camera settings. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_back_to_first_level">Close setting controls</string>
+ <!-- The zoom control button. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_zoom_control">Zoom control</string>
+ <!-- The decrement button in camera preference such as exposure, picture size. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_decrement">Decrease %1$s</string>
+ <!-- The increment button in camera preference such as exposure, picture size. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_increment">Increase %1$s</string>
+ <!-- The on/off switch in camera settings, such as store location. [CHAR LIMIT = NONE] -->
+ <string name="accessibility_switch">%1$s switch</string>
+
+ <!-- TODO: remove the string as it is a work-around solution to bypass the default speak of the element type. -->
+ <string name="empty" translatable="false">" "</string>
</resources>
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index cac446c..cd8a0b3 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -1675,7 +1675,6 @@
private void closeCamera() {
if (mCameraDevice != null) {
- mCameraDevice.cancelAutoFocus(); // Reset the focus.
CameraHolder.instance().release();
mCameraDevice.setZoomChangeListener(null);
mCameraDevice.setFaceDetectionListener(null);
@@ -1745,6 +1744,7 @@
private void stopPreview() {
if (mCameraDevice != null && mCameraState != PREVIEW_STOPPED) {
Log.v(TAG, "stopPreview");
+ mCameraDevice.cancelAutoFocus(); // Reset the focus.
mCameraDevice.stopPreview();
}
mCameraState = PREVIEW_STOPPED;
diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java
index 61a55dd..768bf27 100644
--- a/src/com/android/camera/Util.java
+++ b/src/com/android/camera/Util.java
@@ -79,7 +79,7 @@
private static boolean sIsTabletUI;
private static float sPixelDensity = 1;
- private static String sImageFileNameFormat;
+ private static ImageFileNamer sImageFileNamer;
private Util() {
}
@@ -92,8 +92,8 @@
context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
sPixelDensity = metrics.density;
-
- sImageFileNameFormat = context.getString(R.string.image_file_name_format);
+ sImageFileNamer = new ImageFileNamer(
+ context.getString(R.string.image_file_name_format));
}
public static boolean isTabletUI() {
@@ -517,9 +517,9 @@
}
public static String createJpegName(long dateTaken) {
- Date date = new Date(dateTaken);
- SimpleDateFormat dateFormat = new SimpleDateFormat(sImageFileNameFormat);
- return dateFormat.format(date);
+ synchronized (sImageFileNamer) {
+ return sImageFileNamer.generateName(dateTaken);
+ }
}
public static void broadcastNewPicture(Context context, Uri uri) {
@@ -615,4 +615,35 @@
win.setAttributes(winParams);
}
}
+
+ private static class ImageFileNamer {
+ private SimpleDateFormat mFormat;
+
+ // The date (in milliseconds) used to generate the last name.
+ private long mLastDate;
+
+ // Number of names generated for the same second.
+ private int mSameSecondCount;
+
+ public ImageFileNamer(String format) {
+ mFormat = new SimpleDateFormat(format);
+ }
+
+ public String generateName(long dateTaken) {
+ Date date = new Date(dateTaken);
+ String result = mFormat.format(date);
+
+ // If the last name was generated for the same second,
+ // we append _1, _2, etc to the name.
+ if (dateTaken / 1000 == mLastDate / 1000) {
+ mSameSecondCount++;
+ result += "_" + mSameSecondCount;
+ } else {
+ mLastDate = dateTaken;
+ mSameSecondCount = 0;
+ }
+
+ return result;
+ }
+ }
}
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
old mode 100644
new mode 100755
index a880a01..77e163e
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -165,7 +165,8 @@
private ModePicker mModePicker;
private ShutterButton mShutterButton;
private TextView mRecordingTimeView;
- private TextView mBgLearningMessage;
+ private RotateLayout mBgLearningMessageRotater;
+ private View mBgLearningMessageFrame;
private LinearLayout mLabelsLinearLayout;
private boolean mIsVideoCaptureIntent;
@@ -418,7 +419,8 @@
// R.id.labels_w1024. That is, mLabelsLinearLayout should be null in tablet layout.
mLabelsLinearLayout = (LinearLayout) findViewById(R.id.labels);
- mBgLearningMessage = (TextView) findViewById(R.id.bg_replace_message);
+ mBgLearningMessageRotater = (RotateLayout) findViewById(R.id.bg_replace_message);
+ mBgLearningMessageFrame = findViewById(R.id.bg_replace_message_frame);
mLocationManager = new LocationManager(this, null);
@@ -540,6 +542,7 @@
if (mThumbnailView != null) mThumbnailView.setDegree(degree);
if (mModePicker != null) mModePicker.setDegree(degree);
if (mSharePopup != null) mSharePopup.setOrientation(degree);
+ if (mBgLearningMessageRotater != null) mBgLearningMessageRotater.setOrientation(degree);
if (mIndicatorControlContainer != null) mIndicatorControlContainer.setDegree(degree);
if (mReviewDoneButton != null) mReviewDoneButton.setOrientation(degree);
if (mReviewPlayButton != null) mReviewPlayButton.setOrientation(degree);
@@ -611,6 +614,10 @@
}
}
+ public void onProtectiveCurtainClick(View v) {
+ // Consume clicks
+ }
+
public void onShutterButtonClick(ShutterButton button) {
switch (button.getId()) {
case R.id.shutter_button:
@@ -711,10 +718,7 @@
Log.w(TAG, "No URI from gallery, resetting to no effect");
mEffectType = EffectsRecorder.EFFECT_NONE;
mEffectParameter = null;
- ComboPreferences.Editor editor = mPreferences.edit();
- editor.putString(CameraSettings.KEY_VIDEO_EFFECT,
- getString(R.string.pref_video_effect_default));
- editor.apply();
+ writeDefaultEffectToPrefs();
if (mIndicatorControlContainer != null) {
mIndicatorControlContainer.overrideSettings(
CameraSettings.KEY_VIDEO_QUALITY,
@@ -753,6 +757,13 @@
getDesiredPreviewSize();
}
+ private void writeDefaultEffectToPrefs() {
+ ComboPreferences.Editor editor = mPreferences.edit();
+ editor.putString(CameraSettings.KEY_VIDEO_EFFECT,
+ getString(R.string.pref_video_effect_default));
+ editor.apply();
+ }
+
private void getDesiredPreviewSize() {
mParameters = mCameraDevice.getParameters();
if (mParameters.getSupportedVideoSizes() == null || effectsActive()) {
@@ -1599,6 +1610,8 @@
for (int id : pickIds) {
Util.fadeIn(findViewById(id));
}
+
+ showTimeLapseUI(false);
}
private void hideAlert() {
@@ -1902,21 +1915,32 @@
if (effectMsg == EffectsRecorder.EFFECT_MSG_EFFECTS_STOPPED) {
// Effects have shut down. Hide learning message if any,
// and restart regular preview.
- mBgLearningMessage.setVisibility(View.GONE);
+ mBgLearningMessageFrame.setVisibility(View.GONE);
checkQualityAndStartPreview();
} else if (effectId == EffectsRecorder.EFFECT_BACKDROPPER) {
switch (effectMsg) {
case EffectsRecorder.EFFECT_MSG_STARTED_LEARNING:
- mBgLearningMessage.setVisibility(View.VISIBLE);
+ mBgLearningMessageFrame.setVisibility(View.VISIBLE);
break;
case EffectsRecorder.EFFECT_MSG_DONE_LEARNING:
case EffectsRecorder.EFFECT_MSG_SWITCHING_EFFECT:
- mBgLearningMessage.setVisibility(View.GONE);
+ mBgLearningMessageFrame.setVisibility(View.GONE);
break;
}
}
}
+ public void onCancelBgTraining(View v) {
+ // Remove training message
+ mBgLearningMessageFrame.setVisibility(View.GONE);
+ // Write default effect out to shared prefs
+ writeDefaultEffectToPrefs();
+ // Tell the indicator controller to redraw based on new shared pref values
+ mIndicatorControlContainer.reloadPreferences();
+ // Tell VideoCamer to re-init based on new shared pref values.
+ onSharedPreferenceChanged();
+ }
+
@Override
public synchronized void onEffectsError(Exception exception, String fileName) {
// TODO: Eventually we may want to show the user an error dialog, and then restart the
@@ -1998,6 +2022,7 @@
finish();
} else {
readVideoPreferences();
+ showTimeLapseUI(mCaptureTimeLapse);
// We need to restart the preview if preview size is changed.
Size size = mParameters.getPreviewSize();
if (size.width != mDesiredPreviewWidth
@@ -2013,7 +2038,6 @@
setCameraParameters();
}
}
- showTimeLapseUI(mCaptureTimeLapse);
}
}
@@ -2060,6 +2084,7 @@
// preview. If not, resets the surface holder and resizes the view.
private void checkQualityAndStartPreview() {
readVideoPreferences();
+ showTimeLapseUI(mCaptureTimeLapse);
Size size = mParameters.getPreviewSize();
if (size.width != mDesiredPreviewWidth
|| size.height != mDesiredPreviewHeight) {
diff --git a/src/com/android/camera/ui/AbstractIndicatorButton.java b/src/com/android/camera/ui/AbstractIndicatorButton.java
index 037a273..a661586 100644
--- a/src/com/android/camera/ui/AbstractIndicatorButton.java
+++ b/src/com/android/camera/ui/AbstractIndicatorButton.java
@@ -50,6 +50,8 @@
HIGHLIGHT_COLOR = context.getResources().getColor(R.color.review_control_pressed_color);
setScaleType(ImageView.ScaleType.CENTER);
PopupManager.getInstance(context).setOnOtherPopupShowedListener(this);
+ // Set the click listener to help the comprehension of the accessibility.
+ setClickable(true);
}
@Override
diff --git a/src/com/android/camera/ui/CameraPicker.java b/src/com/android/camera/ui/CameraPicker.java
index 78e2b27..ac8b8a8 100644
--- a/src/com/android/camera/ui/CameraPicker.java
+++ b/src/com/android/camera/ui/CameraPicker.java
@@ -38,6 +38,8 @@
public CameraPicker(Context context) {
super(context);
setImageResource(mImageResource);
+ setContentDescription(getResources().getString(
+ R.string.accessibility_camera_picker));
}
public static void setImageResourceId(int imageResource) {
diff --git a/src/com/android/camera/ui/EffectSettingPopup.java b/src/com/android/camera/ui/EffectSettingPopup.java
index 6005c8d..606524b 100644
--- a/src/com/android/camera/ui/EffectSettingPopup.java
+++ b/src/com/android/camera/ui/EffectSettingPopup.java
@@ -133,8 +133,8 @@
public void reloadPreference() {
int index = mPreference.findIndexOfValue(mPreference.getValue());
if (index >= 0) {
- mBackgroundGrid.clearChoices();
- mSillyFacesGrid.clearChoices();
+ mBackgroundGrid.setItemChecked(mBackgroundGrid.getCheckedItemPosition(), false);
+ mSillyFacesGrid.setItemChecked(mSillyFacesGrid.getCheckedItemPosition(), false);
if (index >= 1 && index < EffectsRecorder.NUM_OF_GF_EFFECTS + 1) {
mSillyFacesGrid.setItemChecked(index - 1, true);
} else if (index >= EffectsRecorder.NUM_OF_GF_EFFECTS + 1) {
diff --git a/src/com/android/camera/ui/InLineSettingItem.java b/src/com/android/camera/ui/InLineSettingItem.java
index 6f84e6f..bf6bdb2 100644
--- a/src/com/android/camera/ui/InLineSettingItem.java
+++ b/src/com/android/camera/ui/InLineSettingItem.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.util.AttributeSet;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -70,6 +71,7 @@
mListener.onSettingChanged();
}
updateView();
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
return true;
}
diff --git a/src/com/android/camera/ui/InLineSettingKnob.java b/src/com/android/camera/ui/InLineSettingKnob.java
index 9bb771c..99a3b66 100644
--- a/src/com/android/camera/ui/InLineSettingKnob.java
+++ b/src/com/android/camera/ui/InLineSettingKnob.java
@@ -16,6 +16,7 @@
package com.android.camera.ui;
+import com.android.camera.ListPreference;
import com.android.camera.R;
import android.content.Context;
@@ -25,6 +26,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
import android.widget.TextView;
@@ -100,6 +102,16 @@
mEntry = (TextView) findViewById(R.id.current_setting);
}
+ @Override
+ public void initialize(ListPreference preference) {
+ super.initialize(preference);
+ // Add content descriptions for the increment and decrement buttons.
+ mNextButton.setContentDescription(getResources().getString(
+ R.string.accessibility_increment, mPreference.getTitle()));
+ mPrevButton.setContentDescription(getResources().getString(
+ R.string.accessibility_decrement, mPreference.getTitle()));
+ }
+
protected void updateView() {
if (mOverrideValue == null) {
mEntry.setText(mPreference.getEntry());
@@ -120,4 +132,15 @@
}
}
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ onPopulateAccessibilityEvent(event);
+ return true;
+ }
+
+ @Override
+ public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEvent(event);
+ event.getText().add(mPreference.getTitle() + mPreference.getEntry());
+ }
}
diff --git a/src/com/android/camera/ui/InLineSettingSwitch.java b/src/com/android/camera/ui/InLineSettingSwitch.java
index 8663a05..8fc37da 100644
--- a/src/com/android/camera/ui/InLineSettingSwitch.java
+++ b/src/com/android/camera/ui/InLineSettingSwitch.java
@@ -16,11 +16,13 @@
package com.android.camera.ui;
+import com.android.camera.ListPreference;
import com.android.camera.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -47,6 +49,14 @@
mSwitch.setOnCheckedChangeListener(mCheckedChangeListener);
}
+ @Override
+ public void initialize(ListPreference preference) {
+ super.initialize(preference);
+ // Add content descriptions for the increment and decrement buttons.
+ mSwitch.setContentDescription(getContext().getResources().getString(
+ R.string.accessibility_switch, mPreference.getTitle()));
+ }
+
protected void updateView() {
if (mOverrideValue == null) {
mSwitch.setChecked(mIndex == 1);
@@ -55,4 +65,16 @@
mSwitch.setChecked(index == 1);
}
}
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ onPopulateAccessibilityEvent(event);
+ return true;
+ }
+
+ @Override
+ public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEvent(event);
+ event.getText().add(mPreference.getTitle());
+ }
}
diff --git a/src/com/android/camera/ui/IndicatorControl.java b/src/com/android/camera/ui/IndicatorControl.java
index 03003d8..86b0cc9 100644
--- a/src/com/android/camera/ui/IndicatorControl.java
+++ b/src/com/android/camera/ui/IndicatorControl.java
@@ -125,6 +125,7 @@
public IndicatorButton addIndicator(Context context, IconListPreference pref) {
IndicatorButton b = new IndicatorButton(context, pref);
b.setSettingChangedListener(this);
+ b.setContentDescription(pref.getTitle());
addView(b);
mIndicators.add(b);
return b;
@@ -135,6 +136,8 @@
OtherSettingIndicatorButton b = new OtherSettingIndicatorButton(
context, resId, mPreferenceGroup, keys);
b.setSettingChangedListener(this);
+ b.setContentDescription(getResources().getString(
+ R.string.pref_camera_settings_category));
addView(b);
mIndicators.add(b);
return b;
diff --git a/src/com/android/camera/ui/IndicatorControlBar.java b/src/com/android/camera/ui/IndicatorControlBar.java
index 4297528..6c2151d 100644
--- a/src/com/android/camera/ui/IndicatorControlBar.java
+++ b/src/com/android/camera/ui/IndicatorControlBar.java
@@ -83,9 +83,7 @@
@Override
protected void onLayout(
boolean changed, int left, int top, int right, int bottom) {
- // Layout the static components.
int padding = getPaddingTop();
- super.onLayout(changed, left, top, right, bottom);
int count = getChildCount();
if (count == 0) return;
diff --git a/src/com/android/camera/ui/SecondLevelIndicatorControlBar.java b/src/com/android/camera/ui/SecondLevelIndicatorControlBar.java
index 8fce8a7..c9037d9 100644
--- a/src/com/android/camera/ui/SecondLevelIndicatorControlBar.java
+++ b/src/com/android/camera/ui/SecondLevelIndicatorControlBar.java
@@ -35,7 +35,7 @@
View.OnClickListener, AbstractIndicatorButton.IndicatorChangeListener {
private static final String TAG = "SecondLevelIndicatorControlBar";
private static int ICON_SPACING = Util.dpToPixel(16);
- private ImageView mCloseIcon;
+ private View mCloseIcon;
private View mDivider; // the divider line
private View mIndicatorHighlight; // the side highlight bar
private View mPopupedIndicator;
@@ -54,16 +54,13 @@
protected void onFinishInflate() {
mDivider = findViewById(R.id.divider);
mIndicatorHighlight = findViewById(R.id.indicator_highlight);
+ mCloseIcon = findViewById(R.id.back_to_first_level);
+ mCloseIcon.setOnClickListener(this);
}
public void initialize(Context context, PreferenceGroup group,
String[] keys, String[] otherSettingKeys) {
- if (mCloseIcon == null) {
- mCloseIcon = new ColorFilterImageView(context);
- mCloseIcon.setImageResource(R.drawable.btn_close_settings);
- mCloseIcon.setOnClickListener(this);
- addView(mCloseIcon);
- }
+
setPreferenceGroup(group);
mNonIndicatorButtonCount = getChildCount();
addControls(keys, otherSettingKeys);
diff --git a/src/com/android/camera/ui/ZoomControl.java b/src/com/android/camera/ui/ZoomControl.java
index 60964a4..1809d18 100644
--- a/src/com/android/camera/ui/ZoomControl.java
+++ b/src/com/android/camera/ui/ZoomControl.java
@@ -88,6 +88,13 @@
protected ImageView addImageView(Context context, int iconResourceId) {
ImageView image = new RotateImageView(context);
image.setImageResource(iconResourceId);
+ if (iconResourceId == R.drawable.ic_zoom_slider) {
+ image.setContentDescription(getResources().getString(
+ R.string.accessibility_zoom_control));
+ } else {
+ image.setContentDescription(getResources().getString(
+ R.string.empty));
+ }
addView(image);
return image;
}
diff --git a/src/com/android/camera/ui/ZoomControlBar.java b/src/com/android/camera/ui/ZoomControlBar.java
index 0784b3f..08042d4 100644
--- a/src/com/android/camera/ui/ZoomControlBar.java
+++ b/src/com/android/camera/ui/ZoomControlBar.java
@@ -36,6 +36,9 @@
private View mBar;
private boolean mStartChanging;
private int mSliderLength;
+ private int mHeight;
+ private int mIconHeight;
+ private int mTotalIconHeight;
public ZoomControlBar(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -55,16 +58,11 @@
// For left-hand users, as the device is rotated for 180 degree for
// landscape mode, the zoom-in bottom should be on the top, so the
// position should be reversed.
- int totalIconHeight = mZoomIn.getHeight() + ICON_SPACING;
- int height = getHeight();
int pos; // the relative position in the zoom slider bar
if (mDegree == 180) {
- pos = y - totalIconHeight;
+ pos = y - mTotalIconHeight;
} else {
- pos = height - totalIconHeight - y;
- }
- if (mSliderLength == 0) {
- mSliderLength = height - (2 * totalIconHeight);
+ pos = mHeight - mTotalIconHeight - y;
}
if (pos < 0) pos = 0;
if (pos > mSliderLength) pos = mSliderLength;
@@ -72,11 +70,17 @@
}
@Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (!onFilterTouchEventForSecurity(event)) return false;
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ mHeight = h;
+ mIconHeight = mZoomIn.getMeasuredHeight();
+ mTotalIconHeight = mIconHeight + ICON_SPACING;
+ mSliderLength = mHeight - (2 * mTotalIconHeight);
+ }
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ if (!isEnabled() || (mHeight == 0)) return false;
int action = event.getAction();
- if (!isEnabled() || (getHeight() == 0)) return false;
switch (action) {
case MotionEvent.ACTION_OUTSIDE:
@@ -90,12 +94,15 @@
setActivated(true);
mStartChanging = false;
case MotionEvent.ACTION_MOVE:
- // Make sure the movement is large enough before we start
- // changing the zoom.
int pos = getSliderPosition((int) event.getY());
- if (!mStartChanging && (Math.abs(mSliderPosition - pos)
- > THRESHOLD_FIRST_MOVE)) {
- mStartChanging = true;
+ if (!mStartChanging) {
+ // Make sure the movement is large enough before we start
+ // changing the zoom.
+ int delta = mSliderPosition - pos;
+ if ((delta > THRESHOLD_FIRST_MOVE) ||
+ (delta < -THRESHOLD_FIRST_MOVE)) {
+ mStartChanging = true;
+ }
}
if (mStartChanging) {
performZoom(1.0d * pos / mSliderLength);
@@ -118,10 +125,7 @@
boolean changed, int left, int top, int right, int bottom) {
if (mZoomMax == 0) return;
int width = right - left;
- int height = bottom - top;
- int iconHeight = mZoomIn.getMeasuredHeight();
- mBar.layout(0, iconHeight + ICON_SPACING,
- width, height - iconHeight - ICON_SPACING);
+ mBar.layout(0, mTotalIconHeight, width, mHeight - mTotalIconHeight);
// For left-hand users, as the device is rotated for 180 degree,
// the zoom-in button should be on the top.
int pos; // slider position
@@ -132,12 +136,12 @@
sliderPosition = (int) ((double) mSliderLength * mZoomIndex / mZoomMax);
}
if (mDegree == 180) {
- mZoomOut.layout(0, 0, width, iconHeight);
- mZoomIn.layout(0, height - iconHeight, width, height);
+ mZoomOut.layout(0, 0, width, mIconHeight);
+ mZoomIn.layout(0, mHeight - mIconHeight, width, mHeight);
pos = mBar.getTop() + sliderPosition;
} else {
- mZoomIn.layout(0, 0, width, iconHeight);
- mZoomOut.layout(0, height - iconHeight, width, height);
+ mZoomIn.layout(0, 0, width, mIconHeight);
+ mZoomOut.layout(0, mHeight - mIconHeight, width, mHeight);
pos = mBar.getBottom() - sliderPosition;
}
int sliderHeight = mZoomSlider.getMeasuredHeight();