13984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu/* 23984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Copyright (C) 2012 The Android Open Source Project 33984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * 43984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 53984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * you may not use this file except in compliance with the License. 63984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * You may obtain a copy of the License at 73984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * 83984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * http://www.apache.org/licenses/LICENSE-2.0 93984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * 103984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Unless required by applicable law or agreed to in writing, software 113984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * distributed under the License is distributed on an "AS IS" BASIS, 123984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * See the License for the specific language governing permissions and 143984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * limitations under the License. 153984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu */ 163984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liupackage com.android.camera.ui; 173984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 183984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.content.Context; 193984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.content.res.Resources; 203984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.util.AttributeSet; 213984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.util.Log; 223984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.view.View; 233984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.Button; 243984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.CompoundButton; 253984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.NumberPicker; 26e687bdffc9ec121f6a24696aa2bf5d98d6416e49Doris Liuimport android.widget.Switch; 273984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.TextView; 283984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 293984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport com.android.camera.IconListPreference; 30f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.ListPreference; 313984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport com.android.camera.R; 323984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 333984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu/** 343984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * This is a popup window that allows users to turn on/off time lapse feature, 353984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * and to select a time interval for taking a time lapse video. 363984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu */ 373984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liupublic class TimeIntervalPopup extends AbstractSettingPopup { 383984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private static final String TAG = "TimeIntervalPopup"; 393984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private NumberPicker mNumberSpinner; 403984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private NumberPicker mUnitSpinner; 413984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private Switch mTimeLapseSwitch; 423984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private final String[] mUnits; 433984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private final String[] mDurations; 443984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private IconListPreference mPreference; 453984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private Listener mListener; 463984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private Button mConfirmButton; 473984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private TextView mHelpText; 483984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private View mTimePicker; 493984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 503984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu static public interface Listener { 51f04692066fc7087560248b003c49e0377c056edfDoris Liu public void onListPrefChanged(ListPreference pref); 523984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 533984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 543984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public void setSettingChangedListener(Listener listener) { 553984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mListener = listener; 563984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 573984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 583984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public TimeIntervalPopup(Context context, AttributeSet attrs) { 593984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu super(context, attrs); 603984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 613984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu Resources res = context.getResources(); 623984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnits = res.getStringArray(R.array.pref_video_time_lapse_frame_interval_units); 633984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mDurations = res 643984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu .getStringArray(R.array.pref_video_time_lapse_frame_interval_duration_values); 653984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 663984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 673984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public void initialize(IconListPreference preference) { 683984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mPreference = preference; 693984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 703984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // Set title. 713984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTitle.setText(mPreference.getTitle()); 723984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 733984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // Duration 743984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu int durationCount = mDurations.length; 753984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mNumberSpinner = (NumberPicker) findViewById(R.id.duration); 76e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu mNumberSpinner.setMinValue(0); 77e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu mNumberSpinner.setMaxValue(durationCount - 1); 783984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mNumberSpinner.setDisplayedValues(mDurations); 793984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mNumberSpinner.setWrapSelectorWheel(false); 803984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 813984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // Units for duration (i.e. seconds, minutes, etc) 823984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner = (NumberPicker) findViewById(R.id.duration_unit); 833984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setMinValue(0); 843984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setMaxValue(mUnits.length - 1); 853984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setDisplayedValues(mUnits); 863984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setWrapSelectorWheel(false); 873984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 883984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimePicker = findViewById(R.id.time_interval_picker); 893984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimeLapseSwitch = (Switch) findViewById(R.id.time_lapse_switch); 903984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mHelpText = (TextView) findViewById(R.id.set_time_interval_help_text); 913984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mConfirmButton = (Button) findViewById(R.id.time_lapse_interval_set_button); 923984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 933984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // Disable focus on the spinners to prevent keyboard from coming up 943984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mNumberSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 953984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 963984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 973984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimeLapseSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 98ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 993984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu setTimeSelectionEnabled(isChecked); 1003984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1013984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu }); 1023984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mConfirmButton.setOnClickListener(new View.OnClickListener() { 1033984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public void onClick(View v) { 1043984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu updateInputState(); 1053984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1063984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu }); 1073984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1083984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1093984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private void restoreSetting() { 1103984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu int index = mPreference.findIndexOfValue(mPreference.getValue()); 1113984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu if (index == -1) { 1123984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu Log.e(TAG, "Invalid preference value."); 1133984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mPreference.print(); 1143984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu throw new IllegalArgumentException(); 1153984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } else if (index == 0) { 1163984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // default choice: time lapse off 1173984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimeLapseSwitch.setChecked(false); 1183984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu setTimeSelectionEnabled(false); 1193984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } else { 1203984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimeLapseSwitch.setChecked(true); 1213984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu setTimeSelectionEnabled(true); 122e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu int durationCount = mNumberSpinner.getMaxValue() + 1; 123e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu int unit = (index - 1) / durationCount; 124e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu int number = (index - 1) % durationCount; 1253984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mUnitSpinner.setValue(unit); 1263984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mNumberSpinner.setValue(number); 1273984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1283984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1293984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1303984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu @Override 1313984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public void setVisibility(int visibility) { 1323984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu if (visibility == View.VISIBLE) { 1333984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu if (getVisibility() != View.VISIBLE) { 1343984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // Set the number pickers and on/off switch to be consistent 1353984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu // with the preference 1363984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu restoreSetting(); 1373984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1383984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1393984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu super.setVisibility(visibility); 1403984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1413984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1423984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu protected void setTimeSelectionEnabled(boolean enabled) { 1433984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mHelpText.setVisibility(enabled ? GONE : VISIBLE); 1443984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mTimePicker.setVisibility(enabled ? VISIBLE : GONE); 1453984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1463984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1473984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu @Override 1483984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu public void reloadPreference() { 1493984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1503984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1513984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu private void updateInputState() { 1523984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu if (mTimeLapseSwitch.isChecked()) { 153e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu int newId = mUnitSpinner.getValue() * (mNumberSpinner.getMaxValue() + 1) 154e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu + mNumberSpinner.getValue() + 1; 155e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu mPreference.setValueIndex(newId); 1563984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } else { 1573984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu mPreference.setValueIndex(0); 1583984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1593984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu 1603984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu if (mListener != null) { 161f04692066fc7087560248b003c49e0377c056edfDoris Liu mListener.onListPrefChanged(mPreference); 1623984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1633984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu } 1643984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu} 165