Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.camera.ui;
     18 
     19 import com.android.camera.CameraSettings;
     20 import com.android.camera.ListPreference;
     21 import com.android.camera.PreferenceGroup;
     22 import com.android.camera.R;
     23 import com.android.camera.RecordLocationPreference;
     24 
     25 import android.content.Context;
     26 import android.util.AttributeSet;
     27 import android.view.View;
     28 import android.view.LayoutInflater;
     29 import android.view.ViewGroup;
     30 import android.widget.AdapterView;
     31 import android.widget.ListView;
     32 import android.widget.ArrayAdapter;
     33 
     34 import java.util.ArrayList;
     35 import java.util.List;
     36 
     37 /* A popup window that contains several camera settings. */
     38 public class OtherSettingsPopup extends AbstractSettingPopup
     39         implements InLineSettingItem.Listener,
     40         AdapterView.OnItemClickListener {
     41     private static final String TAG = "OtherSettingsPopup";
     42 
     43     private Listener mListener;
     44     private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>();
     45 
     46     static public interface Listener {
     47         public void onSettingChanged();
     48         public void onRestorePreferencesClicked();
     49     }
     50 
     51     private class OtherSettingsAdapter extends ArrayAdapter {
     52         LayoutInflater mInflater;
     53 
     54         OtherSettingsAdapter() {
     55             super(OtherSettingsPopup.this.getContext(), 0, mListItem);
     56             mInflater = LayoutInflater.from(getContext());
     57         }
     58 
     59         private int getSettingLayoutId(ListPreference pref) {
     60             // If the preference is null, it will be the only item , i.e.
     61             // 'Restore setting' in the popup window.
     62             if (pref == null) return R.layout.in_line_setting_restore;
     63 
     64             // Currently, the RecordLocationPreference is the only setting
     65             // which applies the on/off switch.
     66             if (CameraSettings.KEY_RECORD_LOCATION.equals(pref.getKey())) {
     67                 return R.layout.in_line_setting_switch;
     68             }
     69             return R.layout.in_line_setting_knob;
     70         }
     71 
     72         @Override
     73         public View getView(int position, View convertView, ViewGroup parent) {
     74             if (convertView != null) return convertView;
     75 
     76             ListPreference pref = mListItem.get(position);
     77 
     78             int viewLayoutId = getSettingLayoutId(pref);
     79             InLineSettingItem view = (InLineSettingItem)
     80                     mInflater.inflate(viewLayoutId, parent, false);
     81 
     82             view.initialize(pref); // no init for restore one
     83             view.setSettingChangedListener(OtherSettingsPopup.this);
     84             return view;
     85         }
     86     }
     87 
     88     public void setSettingChangedListener(Listener listener) {
     89         mListener = listener;
     90     }
     91 
     92     public OtherSettingsPopup(Context context, AttributeSet attrs) {
     93         super(context, attrs);
     94     }
     95 
     96     public void initialize(PreferenceGroup group, String[] keys) {
     97         // Prepare the setting items.
     98         for (int i = 0; i < keys.length; ++i) {
     99             ListPreference pref = group.findPreference(keys[i]);
    100             if (pref != null) mListItem.add(pref);
    101         }
    102 
    103         // Prepare the restore setting line.
    104         mListItem.add(null);
    105 
    106         ArrayAdapter mListItemAdapter = new OtherSettingsAdapter();
    107         ((ListView) mSettingList).setAdapter(mListItemAdapter);
    108         ((ListView) mSettingList).setOnItemClickListener(this);
    109         ((ListView) mSettingList).setSelector(android.R.color.transparent);
    110     }
    111 
    112     @Override
    113     public void onSettingChanged() {
    114         if (mListener != null) {
    115             mListener.onSettingChanged();
    116         }
    117     }
    118 
    119     // Scene mode can override other camera settings (ex: flash mode).
    120     public void overrideSettings(final String ... keyvalues) {
    121         int count = mSettingList.getChildCount();
    122         for (int i = 0; i < keyvalues.length; i += 2) {
    123             String key = keyvalues[i];
    124             String value = keyvalues[i + 1];
    125             for (int j = 0; j < count; j++) {
    126                 ListPreference pref = (ListPreference) mListItem.get(j);
    127                 if (pref != null && key.equals(pref.getKey())) {
    128                     InLineSettingItem settingItem =
    129                             (InLineSettingItem) mSettingList.getChildAt(j);
    130                     settingItem.overrideSettings(value);
    131                 }
    132             }
    133         }
    134     }
    135 
    136     @Override
    137     public void onItemClick(AdapterView<?> parent, View view, int position,
    138             long id) {
    139         if ((position == mListItem.size() - 1) && (mListener != null)) {
    140             mListener.onRestorePreferencesClicked();
    141         }
    142     }
    143 
    144     @Override
    145     public void reloadPreference() {
    146         int count = mSettingList.getChildCount();
    147         for (int i = 0; i < count; i++) {
    148             ListPreference pref = (ListPreference) mListItem.get(i);
    149             if (pref != null) {
    150                 InLineSettingItem settingItem =
    151                         (InLineSettingItem) mSettingList.getChildAt(i);
    152                 settingItem.reloadPreference();
    153             }
    154         }
    155     }
    156 }
    157