/* * Copyright (c) 2014, The Linux Foundation. All rights reserved. * Not a Contribution. * * Copyright (C) 2010 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 java.util.ArrayList; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import com.android.camera.ListPreference; import com.android.camera.PreferenceGroup; import org.codeaurora.snapcam.R; /* A popup window that contains several camera settings. */ public class ListMenu extends ListView implements ListMenuItem.Listener, AdapterView.OnItemClickListener { @SuppressWarnings("unused") private static final String TAG = "ListMenu"; private Listener mListener; private ArrayList mListItem = new ArrayList(); // Keep track of which setting items are disabled // e.g. White balance will be disabled when scene mode is set to non-auto private boolean[] mEnabled; static public interface Listener { public void onSettingChanged(ListPreference pref); public void onPreferenceClicked(ListPreference pref); public void onPreferenceClicked(ListPreference pref, int y); public void onListMenuTouched(); } private class MoreSettingAdapter extends ArrayAdapter { LayoutInflater mInflater; String mOnString; String mOffString; MoreSettingAdapter() { super(ListMenu.this.getContext(), 0, mListItem); Context context = getContext(); mInflater = LayoutInflater.from(context); mOnString = context.getString(R.string.setting_on); mOffString = context.getString(R.string.setting_off); } private int getSettingLayoutId(ListPreference pref) { return R.layout.list_menu_item; } @Override public View getView(int position, View convertView, ViewGroup parent) { ListPreference pref = mListItem.get(position); int viewLayoutId = getSettingLayoutId(pref); ListMenuItem view = (ListMenuItem) convertView; view = (ListMenuItem) mInflater.inflate(viewLayoutId, parent, false); view.initialize(pref); // no init for restore one view.setSettingChangedListener(ListMenu.this); if (position >= 0 && position < mEnabled.length) { view.setEnabled(mEnabled[position]); } else { Log.w(TAG, "Invalid input: enabled list length, " + mEnabled.length + " position " + position); } return view; } @Override public boolean isEnabled(int position) { if (position >= 0 && position < mEnabled.length) { return mEnabled[position]; } return true; } } public void setSettingChangedListener(Listener listener) { mListener = listener; } public ListMenu(Context context, AttributeSet attrs) { super(context, attrs); } public void initialize(PreferenceGroup group, String[] keys) { // Prepare the setting items. for (int i = 0; i < keys.length; ++i) { ListPreference pref = group.findPreference(keys[i]); if (pref != null) mListItem.add(pref); } ArrayAdapter mListItemAdapter = new MoreSettingAdapter(); setAdapter(mListItemAdapter); setOnItemClickListener(this); // Initialize mEnabled mEnabled = new boolean[mListItem.size()]; for (int i = 0; i < mEnabled.length; i++) { mEnabled[i] = true; } } // When preferences are disabled, we will display them grayed out. Users // will not be able to change the disabled preferences, but they can still // see // the current value of the preferences public void setPreferenceEnabled(String key, boolean enable) { int count = mEnabled == null ? 0 : mEnabled.length; for (int j = 0; j < count; j++) { ListPreference pref = mListItem.get(j); if (pref != null && key.equals(pref.getKey())) { mEnabled[j] = enable; break; } } } public void onSettingChanged(ListPreference pref) { if (mListener != null) { mListener.onSettingChanged(pref); } } // Scene mode can override other camera settings (ex: flash mode). public void overrideSettings(final String... keyvalues) { int count = mEnabled == null ? 0 : mEnabled.length; for (int i = 0; i < keyvalues.length; i += 2) { String key = keyvalues[i]; String value = keyvalues[i + 1]; for (int j = 0; j < count; j++) { ListPreference pref = mListItem.get(j); if (pref != null && key.equals(pref.getKey())) { // Change preference if (value != null) pref.setValue(value); // If the preference is overridden, disable the preference boolean enable = value == null; mEnabled[j] = enable; int offset = getFirstVisiblePosition(); if (offset >= 0) { int indexInView = j - offset; if (getChildCount() > indexInView && indexInView >= 0) { getChildAt(indexInView).setEnabled(enable); } } } } } reloadPreference(); } public void resetHighlight() { int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).setActivated(false); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_MOVE) { mListener.onListMenuTouched(); resetHighlight(); } return super.onTouchEvent(ev); } @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if (mListener != null) { resetHighlight(); ListPreference pref = mListItem.get(position); view.setActivated(true); mListener.onPreferenceClicked(pref, (int) view.getY()); } } public void reloadPreference() { int count = getChildCount(); for (int i = 0; i < count; i++) { ListPreference pref = mListItem.get(i); if (pref != null) { ListMenuItem listMenuItem = (ListMenuItem) getChildAt(i); listMenuItem.reloadPreference(); } } } }