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