1a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang/* 2a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * Copyright (C) 2011 The Android Open Source Project 3a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * 4a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * you may not use this file except in compliance with the License. 6a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * You may obtain a copy of the License at 7a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * 8a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * http://www.apache.org/licenses/LICENSE-2.0 9a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * 10a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * Unless required by applicable law or agreed to in writing, software 11a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS, 12a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * See the License for the specific language governing permissions and 14a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang * limitations under the License. 15a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang */ 16a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 17a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangpackage com.android.camera.ui; 18a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 1926d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wangimport com.android.camera.ListPreference; 20a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport com.android.camera.R; 21a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 22a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.content.Context; 23a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.os.Handler; 24a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.util.AttributeSet; 25a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.util.Log; 26a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.view.MotionEvent; 27a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.view.View; 28a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.view.View.OnTouchListener; 2926d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wangimport android.view.accessibility.AccessibilityEvent; 30a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.widget.Button; 31a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.widget.TextView; 32a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 33a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang/* A knob setting control. */ 34a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangpublic class InLineSettingKnob extends InLineSettingItem { 35a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private final String TAG = "InLineSettingKnob"; 36a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private boolean mNext, mPrevious; 37a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private Button mPrevButton, mNextButton; 38a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private Handler mHandler; 39a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang // The view that shows the current selected setting. Ex: 5MP 40a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private TextView mEntry; 41a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 42a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang private final Runnable mRunnable = new Runnable() { 43a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang public void run() { 44a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (mNext) { 45a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (changeIndex(mIndex - 1)) { 46a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mHandler.postDelayed(this, 100); 47a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 48a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } else if (mPrevious) { 49a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (changeIndex(mIndex + 1)) { 50a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mHandler.postDelayed(this, 100); 51a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 52a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 53a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 54a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang }; 55a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 56a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang public InLineSettingKnob(Context context, AttributeSet attrs) { 57a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang super(context, attrs); 58a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mHandler = new Handler(); 59a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 60a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 61a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang OnTouchListener mNextTouchListener = new OnTouchListener() { 62a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang public boolean onTouch(View v, MotionEvent event) { 63a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (mOverrideValue != null) return true; 64a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (event.getAction() == MotionEvent.ACTION_DOWN) { 65a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (!mNext && changeIndex(mIndex - 1)) { 66a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNext = true; 67a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang // Give bigger delay so users can change only one step. 68a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mHandler.postDelayed(mRunnable, 300); 69a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 70a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } else if (event.getAction() == MotionEvent.ACTION_UP 71a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang || event.getAction() == MotionEvent.ACTION_CANCEL) { 72a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNext = false; 73a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 74a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang return false; 75a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 76a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang }; 77a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 78a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang OnTouchListener mPreviousTouchListener = new OnTouchListener() { 79a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang public boolean onTouch(View v, MotionEvent event) { 80a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (mOverrideValue != null) return true; 81a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (event.getAction() == MotionEvent.ACTION_DOWN) { 82a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (!mPrevious && changeIndex(mIndex + 1)) { 83a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevious = true; 84a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang // Give bigger delay so users can change only one step. 85a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mHandler.postDelayed(mRunnable, 300); 86a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 87a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } else if (event.getAction() == MotionEvent.ACTION_UP 88a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang || event.getAction() == MotionEvent.ACTION_CANCEL) { 89a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevious = false; 90a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 91a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang return false; 92a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 93a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang }; 94a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 95a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang @Override 96a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang protected void onFinishInflate() { 97a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang super.onFinishInflate(); 98a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNextButton = (Button) findViewById(R.id.increment); 99a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNextButton.setOnTouchListener(mNextTouchListener); 100a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevButton = (Button) findViewById(R.id.decrement); 101a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevButton.setOnTouchListener(mPreviousTouchListener); 102a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mEntry = (TextView) findViewById(R.id.current_setting); 103a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 104a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 10526d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang @Override 10626d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang public void initialize(ListPreference preference) { 10726d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang super.initialize(preference); 10826d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang // Add content descriptions for the increment and decrement buttons. 10926d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang mNextButton.setContentDescription(getResources().getString( 11026d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang R.string.accessibility_increment, mPreference.getTitle())); 11126d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang mPrevButton.setContentDescription(getResources().getString( 11226d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang R.string.accessibility_decrement, mPreference.getTitle())); 11326d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang } 11426d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang 115a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang protected void updateView() { 116a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (mOverrideValue == null) { 117a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mEntry.setText(mPreference.getEntry()); 118a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNextButton.setVisibility(mIndex == 0 ? View.INVISIBLE : View.VISIBLE); 119a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevButton.setVisibility(mIndex == mPreference.getEntryValues().length - 1 120a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang ? View.INVISIBLE : View.VISIBLE); 121a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } else { 122a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang int index = mPreference.findIndexOfValue(mOverrideValue); 123a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang if (index != -1) { 124a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mEntry.setText(mPreference.getEntries()[index]); 125a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } else { 126a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang // Avoid the crash if camera driver has bugs. 127a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang Log.e(TAG, "Fail to find override value=" + mOverrideValue); 128a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPreference.print(); 129a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 130a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mNextButton.setVisibility(View.INVISIBLE); 131a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang mPrevButton.setVisibility(View.INVISIBLE); 132a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 133a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang } 134a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang 13526d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang @Override 13626d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 13726d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang onPopulateAccessibilityEvent(event); 13826d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang return true; 13926d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang } 14026d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang 14126d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang @Override 14226d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 14326d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang super.onPopulateAccessibilityEvent(event); 14426d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang event.getText().add(mPreference.getTitle() + mPreference.getEntry()); 14526d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang } 146a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang} 147