blob: d06a374f82cb9c85043c750003eca57b522a8137 [file] [log] [blame]
Jeff Brownd82487b2011-06-02 03:10:28 -07001/*
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.settings;
18
19import android.content.ContentResolver;
20import android.content.Context;
21import android.database.ContentObserver;
Jeff Brownb4765ac2012-04-05 18:50:14 -070022import android.hardware.input.InputManager;
Jeff Brownd82487b2011-06-02 03:10:28 -070023import android.os.Handler;
24import android.os.Parcel;
25import android.os.Parcelable;
Jeff Brownd82487b2011-06-02 03:10:28 -070026import android.provider.Settings;
Jeff Brownd82487b2011-06-02 03:10:28 -070027import android.util.AttributeSet;
Jeff Brownd82487b2011-06-02 03:10:28 -070028import android.view.View;
29import android.widget.SeekBar;
30
John Reckc2ad2e42011-06-15 16:49:16 -070031public class PointerSpeedPreference extends SeekBarDialogPreference implements
Jeff Brownd82487b2011-06-02 03:10:28 -070032 SeekBar.OnSeekBarChangeListener {
Jeff Brownb4765ac2012-04-05 18:50:14 -070033 private final InputManager mIm;
Jeff Brownd82487b2011-06-02 03:10:28 -070034 private SeekBar mSeekBar;
35
36 private int mOldSpeed;
37 private boolean mRestoredOldState;
38
39 private boolean mTouchInProgress;
40
Jeff Brownd82487b2011-06-02 03:10:28 -070041 private ContentObserver mSpeedObserver = new ContentObserver(new Handler()) {
42 @Override
43 public void onChange(boolean selfChange) {
44 onSpeedChanged();
45 }
46 };
47
48 public PointerSpeedPreference(Context context, AttributeSet attrs) {
49 super(context, attrs);
Jeff Brownb4765ac2012-04-05 18:50:14 -070050 mIm = (InputManager)getContext().getSystemService(Context.INPUT_SERVICE);
Jeff Brownd82487b2011-06-02 03:10:28 -070051 }
52
53 @Override
Jason Monk783718ff2015-10-13 16:45:28 -040054 protected void onClick() {
55 super.onClick();
Jeff Brownd82487b2011-06-02 03:10:28 -070056
57 getContext().getContentResolver().registerContentObserver(
58 Settings.System.getUriFor(Settings.System.POINTER_SPEED), true,
59 mSpeedObserver);
60
61 mRestoredOldState = false;
62 }
63
64 @Override
65 protected void onBindDialogView(View view) {
66 super.onBindDialogView(view);
67
68 mSeekBar = getSeekBar(view);
Jeff Brownb4765ac2012-04-05 18:50:14 -070069 mSeekBar.setMax(InputManager.MAX_POINTER_SPEED - InputManager.MIN_POINTER_SPEED);
Jeff Brown4397f402012-04-09 13:24:34 -070070 mOldSpeed = mIm.getPointerSpeed(getContext());
Jeff Brownb4765ac2012-04-05 18:50:14 -070071 mSeekBar.setProgress(mOldSpeed - InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -070072 mSeekBar.setOnSeekBarChangeListener(this);
73 }
74
75 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
76 if (!mTouchInProgress) {
Jeff Brownb4765ac2012-04-05 18:50:14 -070077 mIm.tryPointerSpeed(progress + InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -070078 }
79 }
80
81 public void onStartTrackingTouch(SeekBar seekBar) {
82 mTouchInProgress = true;
83 }
84
85 public void onStopTrackingTouch(SeekBar seekBar) {
86 mTouchInProgress = false;
Jeff Brownb4765ac2012-04-05 18:50:14 -070087 mIm.tryPointerSpeed(seekBar.getProgress() + InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -070088 }
89
90 private void onSpeedChanged() {
Jeff Brown4397f402012-04-09 13:24:34 -070091 int speed = mIm.getPointerSpeed(getContext());
Jeff Brownb4765ac2012-04-05 18:50:14 -070092 mSeekBar.setProgress(speed - InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -070093 }
94
95 @Override
96 protected void onDialogClosed(boolean positiveResult) {
97 super.onDialogClosed(positiveResult);
98
99 final ContentResolver resolver = getContext().getContentResolver();
100
101 if (positiveResult) {
Jeff Brown4397f402012-04-09 13:24:34 -0700102 mIm.setPointerSpeed(getContext(),
103 mSeekBar.getProgress() + InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -0700104 } else {
105 restoreOldState();
106 }
107
108 resolver.unregisterContentObserver(mSpeedObserver);
109 }
110
111 private void restoreOldState() {
112 if (mRestoredOldState) return;
113
Jeff Brownb4765ac2012-04-05 18:50:14 -0700114 mIm.tryPointerSpeed(mOldSpeed);
Jeff Brownd82487b2011-06-02 03:10:28 -0700115 mRestoredOldState = true;
116 }
117
Jeff Brownd82487b2011-06-02 03:10:28 -0700118 @Override
119 protected Parcelable onSaveInstanceState() {
120 final Parcelable superState = super.onSaveInstanceState();
121 if (getDialog() == null || !getDialog().isShowing()) return superState;
122
123 // Save the dialog state
124 final SavedState myState = new SavedState(superState);
125 myState.progress = mSeekBar.getProgress();
126 myState.oldSpeed = mOldSpeed;
127
128 // Restore the old state when the activity or dialog is being paused
129 restoreOldState();
130 return myState;
131 }
132
133 @Override
134 protected void onRestoreInstanceState(Parcelable state) {
135 if (state == null || !state.getClass().equals(SavedState.class)) {
136 // Didn't save state for us in onSaveInstanceState
137 super.onRestoreInstanceState(state);
138 return;
139 }
140
141 SavedState myState = (SavedState) state;
142 super.onRestoreInstanceState(myState.getSuperState());
143 mOldSpeed = myState.oldSpeed;
Jeff Brownb4765ac2012-04-05 18:50:14 -0700144 mIm.tryPointerSpeed(myState.progress + InputManager.MIN_POINTER_SPEED);
Jeff Brownd82487b2011-06-02 03:10:28 -0700145 }
146
147 private static class SavedState extends BaseSavedState {
148 int progress;
149 int oldSpeed;
150
151 public SavedState(Parcel source) {
152 super(source);
153 progress = source.readInt();
154 oldSpeed = source.readInt();
155 }
156
157 @Override
158 public void writeToParcel(Parcel dest, int flags) {
159 super.writeToParcel(dest, flags);
160 dest.writeInt(progress);
161 dest.writeInt(oldSpeed);
162 }
163
164 public SavedState(Parcelable superState) {
165 super(superState);
166 }
167
168 public static final Parcelable.Creator<SavedState> CREATOR =
169 new Parcelable.Creator<SavedState>() {
170
171 public SavedState createFromParcel(Parcel in) {
172 return new SavedState(in);
173 }
174
175 public SavedState[] newArray(int size) {
176 return new SavedState[size];
177 }
178 };
179 }
180}
181