InLineSettingKnob.java revision 26d88fce15a24362644123af5f0cce79ea572e7b
1/*
2 * Copyright (C) 2011 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 com.android.camera.ListPreference;
20import com.android.camera.R;
21
22import android.content.Context;
23import android.os.Handler;
24import android.util.AttributeSet;
25import android.util.Log;
26import android.view.MotionEvent;
27import android.view.View;
28import android.view.View.OnTouchListener;
29import android.view.accessibility.AccessibilityEvent;
30import android.widget.Button;
31import android.widget.TextView;
32
33/* A knob setting control. */
34public class InLineSettingKnob extends InLineSettingItem {
35    private final String TAG = "InLineSettingKnob";
36    private boolean mNext, mPrevious;
37    private Button mPrevButton, mNextButton;
38    private Handler mHandler;
39    // The view that shows the current selected setting. Ex: 5MP
40    private TextView mEntry;
41
42    private final Runnable mRunnable = new Runnable() {
43        public void run() {
44            if (mNext) {
45                if (changeIndex(mIndex - 1)) {
46                    mHandler.postDelayed(this, 100);
47                }
48            } else if (mPrevious) {
49                if (changeIndex(mIndex + 1)) {
50                    mHandler.postDelayed(this, 100);
51                }
52            }
53        }
54    };
55
56    public InLineSettingKnob(Context context, AttributeSet attrs) {
57        super(context, attrs);
58        mHandler = new Handler();
59    }
60
61    OnTouchListener mNextTouchListener = new OnTouchListener() {
62        public boolean onTouch(View v, MotionEvent event) {
63            if (mOverrideValue != null) return true;
64            if (event.getAction() == MotionEvent.ACTION_DOWN) {
65                if (!mNext && changeIndex(mIndex - 1)) {
66                    mNext = true;
67                    // Give bigger delay so users can change only one step.
68                    mHandler.postDelayed(mRunnable, 300);
69                }
70            } else if (event.getAction() == MotionEvent.ACTION_UP
71                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
72                mNext = false;
73            }
74            return false;
75        }
76    };
77
78    OnTouchListener mPreviousTouchListener = new OnTouchListener() {
79        public boolean onTouch(View v, MotionEvent event) {
80            if (mOverrideValue != null) return true;
81            if (event.getAction() == MotionEvent.ACTION_DOWN) {
82                if (!mPrevious && changeIndex(mIndex + 1)) {
83                    mPrevious = true;
84                    // Give bigger delay so users can change only one step.
85                    mHandler.postDelayed(mRunnable, 300);
86                }
87            } else if (event.getAction() == MotionEvent.ACTION_UP
88                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
89                mPrevious = false;
90            }
91            return false;
92        }
93    };
94
95    @Override
96    protected void onFinishInflate() {
97        super.onFinishInflate();
98        mNextButton = (Button) findViewById(R.id.increment);
99        mNextButton.setOnTouchListener(mNextTouchListener);
100        mPrevButton = (Button) findViewById(R.id.decrement);
101        mPrevButton.setOnTouchListener(mPreviousTouchListener);
102        mEntry = (TextView) findViewById(R.id.current_setting);
103    }
104
105    @Override
106    public void initialize(ListPreference preference) {
107        super.initialize(preference);
108        // Add content descriptions for the increment and decrement buttons.
109        mNextButton.setContentDescription(getResources().getString(
110                R.string.accessibility_increment, mPreference.getTitle()));
111        mPrevButton.setContentDescription(getResources().getString(
112                R.string.accessibility_decrement, mPreference.getTitle()));
113    }
114
115    protected void updateView() {
116        if (mOverrideValue == null) {
117            mEntry.setText(mPreference.getEntry());
118            mNextButton.setVisibility(mIndex == 0 ? View.INVISIBLE : View.VISIBLE);
119            mPrevButton.setVisibility(mIndex == mPreference.getEntryValues().length - 1
120                    ? View.INVISIBLE : View.VISIBLE);
121        } else {
122            int index = mPreference.findIndexOfValue(mOverrideValue);
123            if (index != -1) {
124                mEntry.setText(mPreference.getEntries()[index]);
125            } else {
126                // Avoid the crash if camera driver has bugs.
127                Log.e(TAG, "Fail to find override value=" + mOverrideValue);
128                mPreference.print();
129            }
130            mNextButton.setVisibility(View.INVISIBLE);
131            mPrevButton.setVisibility(View.INVISIBLE);
132        }
133    }
134
135    @Override
136    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
137        onPopulateAccessibilityEvent(event);
138        return true;
139    }
140
141    @Override
142    public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
143        super.onPopulateAccessibilityEvent(event);
144        event.getText().add(mPreference.getTitle() + mPreference.getEntry());
145    }
146}
147