18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera.ui; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 198e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport java.util.Locale; 208e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling 218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Context; 228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.AttributeSet; 238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View; 258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.widget.Button; 267048972374474dfca142856583833d8168d3b1b6Michael Kolbimport android.widget.CheckBox; 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.widget.NumberPicker; 287048972374474dfca142856583833d8168d3b1b6Michael Kolbimport android.widget.NumberPicker.OnValueChangeListener; 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ListPreference; 318e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R; 327048972374474dfca142856583833d8168d3b1b6Michael Kolb 338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/** 347048972374474dfca142856583833d8168d3b1b6Michael Kolb * This is a popup window that allows users to specify a countdown timer 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 377048972374474dfca142856583833d8168d3b1b6Michael Kolbpublic class CountdownTimerPopup extends AbstractSettingPopup { 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final String TAG = "TimerSettingPopup"; 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private NumberPicker mNumberSpinner; 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String[] mDurations; 417048972374474dfca142856583833d8168d3b1b6Michael Kolb private ListPreference mTimer; 427048972374474dfca142856583833d8168d3b1b6Michael Kolb private ListPreference mBeep; 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Listener mListener; 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Button mConfirmButton; 457048972374474dfca142856583833d8168d3b1b6Michael Kolb private View mPickerTitle; 467048972374474dfca142856583833d8168d3b1b6Michael Kolb private CheckBox mTimerSound; 477048972374474dfca142856583833d8168d3b1b6Michael Kolb private View mSoundTitle; 488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb static public interface Listener { 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onListPrefChanged(ListPreference pref); 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setSettingChangedListener(Listener listener) { 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener = listener; 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 577048972374474dfca142856583833d8168d3b1b6Michael Kolb public CountdownTimerPopup(Context context, AttributeSet attrs) { 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(context, attrs); 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 617048972374474dfca142856583833d8168d3b1b6Michael Kolb public void initialize(ListPreference timer, ListPreference beep) { 627048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimer = timer; 637048972374474dfca142856583833d8168d3b1b6Michael Kolb mBeep = beep; 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Set title. 657048972374474dfca142856583833d8168d3b1b6Michael Kolb mTitle.setText(mTimer.getTitle()); 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Duration 687048972374474dfca142856583833d8168d3b1b6Michael Kolb CharSequence[] entries = mTimer.getEntryValues(); 697048972374474dfca142856583833d8168d3b1b6Michael Kolb mDurations = new String[entries.length]; 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Locale locale = getResources().getConfiguration().locale; 717048972374474dfca142856583833d8168d3b1b6Michael Kolb mDurations[0] = getResources().getString(R.string.setting_off); // Off 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 1; i < entries.length; i++) 737048972374474dfca142856583833d8168d3b1b6Michael Kolb mDurations[i] = String.format(locale, "%d", Integer.parseInt(entries[i].toString())); 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int durationCount = mDurations.length; 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner = (NumberPicker) findViewById(R.id.duration); 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner.setMinValue(0); 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner.setMaxValue(durationCount - 1); 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner.setDisplayedValues(mDurations); 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner.setWrapSelectorWheel(false); 807048972374474dfca142856583833d8168d3b1b6Michael Kolb mNumberSpinner.setOnValueChangedListener(new OnValueChangeListener() { 817048972374474dfca142856583833d8168d3b1b6Michael Kolb @Override 827048972374474dfca142856583833d8168d3b1b6Michael Kolb public void onValueChange(NumberPicker picker, int oldValue, int newValue) { 837048972374474dfca142856583833d8168d3b1b6Michael Kolb setTimeSelectionEnabled(newValue != 0); 847048972374474dfca142856583833d8168d3b1b6Michael Kolb } 857048972374474dfca142856583833d8168d3b1b6Michael Kolb }); 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mConfirmButton = (Button) findViewById(R.id.timer_set_button); 877048972374474dfca142856583833d8168d3b1b6Michael Kolb mPickerTitle = findViewById(R.id.set_time_interval_title); 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Disable focus on the spinners to prevent keyboard from coming up 908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mNumberSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mConfirmButton.setOnClickListener(new View.OnClickListener() { 938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onClick(View v) { 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateInputState(); 958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb }); 977048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimerSound = (CheckBox) findViewById(R.id.sound_check_box); 987048972374474dfca142856583833d8168d3b1b6Michael Kolb mSoundTitle = findViewById(R.id.beep_title); 998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void restoreSetting() { 1027048972374474dfca142856583833d8168d3b1b6Michael Kolb int index = mTimer.findIndexOfValue(mTimer.getValue()); 1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (index == -1) { 1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.e(TAG, "Invalid preference value."); 1057048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimer.print(); 1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb throw new IllegalArgumentException(); 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 1087048972374474dfca142856583833d8168d3b1b6Michael Kolb setTimeSelectionEnabled(index != 0); 1097048972374474dfca142856583833d8168d3b1b6Michael Kolb mNumberSpinner.setValue(index); 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1117048972374474dfca142856583833d8168d3b1b6Michael Kolb boolean checked = mBeep.findIndexOfValue(mBeep.getValue()) != 0; 1127048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimerSound.setChecked(checked); 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setVisibility(int visibility) { 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (visibility == View.VISIBLE) { 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (getVisibility() != View.VISIBLE) { 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Set the number pickers and on/off switch to be consistent 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // with the preference 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb restoreSetting(); 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super.setVisibility(visibility); 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected void setTimeSelectionEnabled(boolean enabled) { 1287048972374474dfca142856583833d8168d3b1b6Michael Kolb mPickerTitle.setVisibility(enabled ? VISIBLE : INVISIBLE); 1297048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimerSound.setEnabled(enabled); 1307048972374474dfca142856583833d8168d3b1b6Michael Kolb mSoundTitle.setEnabled(enabled); 1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void reloadPreference() { 1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void updateInputState() { 1387048972374474dfca142856583833d8168d3b1b6Michael Kolb mTimer.setValueIndex(mNumberSpinner.getValue()); 1397048972374474dfca142856583833d8168d3b1b6Michael Kolb mBeep.setValueIndex(mTimerSound.isChecked() ? 1 : 0); 1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener != null) { 1417048972374474dfca142856583833d8168d3b1b6Michael Kolb mListener.onListPrefChanged(mTimer); 1427048972374474dfca142856583833d8168d3b1b6Michael Kolb mListener.onListPrefChanged(mBeep); 1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 146