diff options
Diffstat (limited to 'src/com/android/camera/ui/ListMenuItem.java')
-rw-r--r-- | src/com/android/camera/ui/ListMenuItem.java | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/com/android/camera/ui/ListMenuItem.java b/src/com/android/camera/ui/ListMenuItem.java new file mode 100644 index 000000000..f3c7f017e --- /dev/null +++ b/src/com/android/camera/ui/ListMenuItem.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * 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. + */ +package com.android.camera.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.view.accessibility.AccessibilityEvent; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.ImageView; + +import com.android.camera.ListPreference; +import com.android.camera.IconListPreference; +import org.codeaurora.snapcam.R; + +/** + * A one-line camera setting could be one of three types: knob, switch or + * restore preference button. The setting includes a title for showing the + * preference title which is initialized in the SimpleAdapter. A knob also + * includes (ex: Picture size), a previous button, the current value (ex: 5MP), + * and a next button. A switch, i.e. the preference RecordLocationPreference, + * has only two values on and off which will be controlled in a switch button. + * Other setting popup window includes several InLineSettingItem items with + * different types if possible. + */ +public class ListMenuItem extends RelativeLayout { + private static final String TAG = "ListMenuItem"; + private Listener mListener; + protected ListPreference mPreference; + protected int mIndex; + // Scene mode can override the original preference value. + protected String mOverrideValue; + protected TextView mTitle; + private TextView mEntry; + private ImageView mIcon; + + static public interface Listener { + public void onSettingChanged(ListPreference pref); + } + + public ListMenuItem(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mEntry = (TextView) findViewById(R.id.current_setting); + mIcon = (ImageView) findViewById(R.id.list_image); + } + + protected void setTitle(ListPreference preference) { + mTitle = ((TextView) findViewById(R.id.title)); + mTitle.setText(preference.getTitle()); + } + + protected void setIcon(ListPreference preference) { + if (preference instanceof IconListPreference) { + int resId = ((IconListPreference) preference).getSingleIcon(); + mIcon.setImageResource(resId); + } + + } + + public void initialize(ListPreference preference) { + setTitle(preference); + if (preference == null) + return; + setIcon(preference); + mPreference = preference; + reloadPreference(); + } + + protected void updateView() { + if (mOverrideValue == null) { + mEntry.setText(mPreference.getEntry()); + } else { + int index = mPreference.findIndexOfValue(mOverrideValue); + if (index != -1) { + mEntry.setText(mPreference.getEntries()[index]); + } else { + // Avoid the crash if camera driver has bugs. + Log.e(TAG, "Fail to find override value=" + mOverrideValue); + mPreference.print(); + } + } + } + + protected boolean changeIndex(int index) { + if (index >= mPreference.getEntryValues().length || index < 0) + return false; + mIndex = index; + mPreference.setValueIndex(mIndex); + if (mListener != null) { + mListener.onSettingChanged(mPreference); + } + updateView(); + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + return true; + } + + // The value of the preference may have changed. Update the UI. + public void reloadPreference() { + mIndex = mPreference.findIndexOfValue(mPreference.getValue()); + updateView(); + } + + public void setSettingChangedListener(Listener listener) { + mListener = listener; + } + + public void overrideSettings(String value) { + mOverrideValue = value; + updateView(); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + event.getText().add(mPreference.getTitle() + mPreference.getEntry()); + return true; + } + + @Override + public void setEnabled(boolean enable) { + super.setEnabled(enable); + if (enable) + setAlpha(1f); + else + setAlpha(0.3f); + if (mTitle != null) { + mTitle.setEnabled(enable); + if (enable) + setAlpha(1f); + else + setAlpha(0.3f); + } + if (mEntry != null) { + mEntry.setEnabled(enable); + if (enable) + setAlpha(1f); + else + setAlpha(0.3f); + } + } +} |