1/*
2 * Copyright (C) 2012 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
17package com.android.camera.ui;
18
19import java.util.Locale;
20
21import android.content.Context;
22import android.util.AttributeSet;
23import android.util.Log;
24import android.view.View;
25import android.widget.Button;
26import android.widget.CheckBox;
27import android.widget.NumberPicker;
28import android.widget.NumberPicker.OnValueChangeListener;
29
30import com.android.camera.ListPreference;
31import com.android.camera2.R;
32
33/**
34 * This is a popup window that allows users to specify a countdown timer
35 */
36
37public class CountdownTimerPopup extends AbstractSettingPopup {
38    private static final String TAG = "TimerSettingPopup";
39    private NumberPicker mNumberSpinner;
40    private String[] mDurations;
41    private ListPreference mTimer;
42    private ListPreference mBeep;
43    private Listener mListener;
44    private Button mConfirmButton;
45    private View mPickerTitle;
46    private CheckBox mTimerSound;
47    private View mSoundTitle;
48
49    static public interface Listener {
50        public void onListPrefChanged(ListPreference pref);
51    }
52
53    public void setSettingChangedListener(Listener listener) {
54        mListener = listener;
55    }
56
57    public CountdownTimerPopup(Context context, AttributeSet attrs) {
58        super(context, attrs);
59    }
60
61    public void initialize(ListPreference timer, ListPreference beep) {
62        mTimer = timer;
63        mBeep = beep;
64        // Set title.
65        mTitle.setText(mTimer.getTitle());
66
67        // Duration
68        CharSequence[] entries = mTimer.getEntryValues();
69        mDurations = new String[entries.length];
70        Locale locale = getResources().getConfiguration().locale;
71        mDurations[0] = getResources().getString(R.string.setting_off); // Off
72        for (int i = 1; i < entries.length; i++)
73            mDurations[i] =  String.format(locale, "%d", Integer.parseInt(entries[i].toString()));
74        int durationCount = mDurations.length;
75        mNumberSpinner = (NumberPicker) findViewById(R.id.duration);
76        mNumberSpinner.setMinValue(0);
77        mNumberSpinner.setMaxValue(durationCount - 1);
78        mNumberSpinner.setDisplayedValues(mDurations);
79        mNumberSpinner.setWrapSelectorWheel(false);
80        mNumberSpinner.setOnValueChangedListener(new OnValueChangeListener() {
81            @Override
82            public void onValueChange(NumberPicker picker, int oldValue, int newValue) {
83                setTimeSelectionEnabled(newValue != 0);
84            }
85        });
86        mConfirmButton = (Button) findViewById(R.id.timer_set_button);
87        mPickerTitle = findViewById(R.id.set_time_interval_title);
88
89        // Disable focus on the spinners to prevent keyboard from coming up
90        mNumberSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
91
92        mConfirmButton.setOnClickListener(new View.OnClickListener() {
93            public void onClick(View v) {
94                updateInputState();
95            }
96        });
97        mTimerSound = (CheckBox) findViewById(R.id.sound_check_box);
98        mSoundTitle = findViewById(R.id.beep_title);
99    }
100
101    private void restoreSetting() {
102        int index = mTimer.findIndexOfValue(mTimer.getValue());
103        if (index == -1) {
104            Log.e(TAG, "Invalid preference value.");
105            mTimer.print();
106            throw new IllegalArgumentException();
107        } else {
108            setTimeSelectionEnabled(index != 0);
109            mNumberSpinner.setValue(index);
110        }
111        boolean checked = mBeep.findIndexOfValue(mBeep.getValue()) != 0;
112        mTimerSound.setChecked(checked);
113    }
114
115    @Override
116    public void setVisibility(int visibility) {
117        if (visibility == View.VISIBLE) {
118            if (getVisibility() != View.VISIBLE) {
119                // Set the number pickers and on/off switch to be consistent
120                // with the preference
121                restoreSetting();
122            }
123        }
124        super.setVisibility(visibility);
125    }
126
127    protected void setTimeSelectionEnabled(boolean enabled) {
128        mPickerTitle.setVisibility(enabled ? VISIBLE : INVISIBLE);
129        mTimerSound.setEnabled(enabled);
130        mSoundTitle.setEnabled(enabled);
131    }
132
133    @Override
134    public void reloadPreference() {
135    }
136
137    private void updateInputState() {
138        mTimer.setValueIndex(mNumberSpinner.getValue());
139        mBeep.setValueIndex(mTimerSound.isChecked() ? 1 : 0);
140        if (mListener != null) {
141            mListener.onListPrefChanged(mTimer);
142            mListener.onListPrefChanged(mBeep);
143        }
144    }
145}
146