1/*
2 * Copyright (C) 2008 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.deskclock;
18
19import android.content.Context;
20import android.content.res.Configuration;
21import android.os.Bundle;
22import android.util.AttributeSet;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.widget.Button;
26import android.widget.ImageButton;
27import android.widget.LinearLayout;
28
29import com.android.deskclock.timer.TimerView;
30
31
32public class TimerSetupView extends LinearLayout implements Button.OnClickListener,
33        Button.OnLongClickListener{
34
35    protected int mInputSize = 5;
36
37    protected final Button mNumbers [] = new Button [10];
38    protected int mInput [] = new int [mInputSize];
39    protected int mInputPointer = -1;
40    protected Button mLeft, mRight;
41    protected Button mStart;
42    protected ImageButton mDelete;
43    protected TimerView mEnteredTime;
44    protected final Context mContext;
45
46    public TimerSetupView(Context context) {
47        this(context, null);
48    }
49
50    public TimerSetupView(Context context, AttributeSet attrs) {
51        super(context, attrs);
52        mContext = context;
53        LayoutInflater layoutInflater =
54                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
55        layoutInflater.inflate(R.layout.time_setup_view, this);
56    }
57
58    @Override
59    protected void onFinishInflate() {
60        super.onFinishInflate();
61
62        View v1 = findViewById(R.id.first);
63        View v2 = findViewById(R.id.second);
64        View v3 = findViewById(R.id.third);
65        View v4 = findViewById(R.id.fourth);
66        mEnteredTime = (TimerView)findViewById(R.id.timer_time_text);
67        mDelete = (ImageButton)findViewById(R.id.delete);
68        mDelete.setOnClickListener(this);
69        mDelete.setOnLongClickListener(this);
70
71        mNumbers[1] = (Button)v1.findViewById(R.id.key_left);
72        mNumbers[2] = (Button)v1.findViewById(R.id.key_middle);
73        mNumbers[3] = (Button)v1.findViewById(R.id.key_right);
74
75        mNumbers[4] = (Button)v2.findViewById(R.id.key_left);
76        mNumbers[5] = (Button)v2.findViewById(R.id.key_middle);
77        mNumbers[6] = (Button)v2.findViewById(R.id.key_right);
78
79        mNumbers[7] = (Button)v3.findViewById(R.id.key_left);
80        mNumbers[8] = (Button)v3.findViewById(R.id.key_middle);
81        mNumbers[9] = (Button)v3.findViewById(R.id.key_right);
82
83        mLeft = (Button)v4.findViewById(R.id.key_left);
84        mNumbers[0] = (Button)v4.findViewById(R.id.key_middle);
85        mRight = (Button)v4.findViewById(R.id.key_right);
86        setLeftRightEnabled(false);
87
88        for (int i = 0; i < 10; i++) {
89            mNumbers[i].setOnClickListener(this);
90            mNumbers [i].setText(String.format("%d",i));
91            mNumbers [i].setTag(R.id.numbers_key,new Integer(i));
92        }
93        updateTime();
94    }
95
96    @Override
97    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
98        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
99        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
100            setMarginsAfterMeasure();
101        }
102    }
103
104    /**
105     * To properly center the TimerView across from the dial pad, append a bottom margin that
106     * matches the measured height of the start button that is below the dial pad.
107     */
108    protected void setMarginsAfterMeasure() {
109        View timerStart = findViewById(R.id.timer_start);
110        View timerDisplay = findViewById(R.id.timer_time_display);
111        if (timerStart != null && timerDisplay != null) {
112            MarginLayoutParams marginLayoutParams =
113                    (MarginLayoutParams) timerDisplay.getLayoutParams();
114            marginLayoutParams.bottomMargin = timerStart.getMeasuredHeight();
115        }
116    }
117
118    public void registerStartButton(Button start) {
119        mStart = start;
120    }
121
122    public void updateStartButton() {
123        boolean enabled = mInputPointer != -1;
124        if (mStart != null) {
125            mStart.setEnabled(enabled);
126        }
127    }
128
129    public void updateDeleteButton() {
130        boolean enabled = mInputPointer != -1;
131        if (mDelete != null) {
132            mDelete.setEnabled(enabled);
133        }
134    }
135
136    @Override
137    public void onClick(View v) {
138        doOnClick(v);
139        updateStartButton();
140        updateDeleteButton();
141    }
142
143    protected void doOnClick(View v) {
144
145        Integer val = (Integer) v.getTag(R.id.numbers_key);
146        // A number was pressed
147        if (val != null) {
148            // pressing "0" as the first digit does nothing
149            if (mInputPointer == -1 && val == 0) {
150                return;
151            }
152            if (mInputPointer < mInputSize - 1) {
153                for (int i = mInputPointer; i >= 0; i--) {
154                    mInput[i+1] = mInput[i];
155                }
156                mInputPointer++;
157                mInput [0] = val;
158                updateTime();
159            }
160            return;
161        }
162
163        // other keys
164        if (v == mDelete) {
165            if (mInputPointer >= 0) {
166                for (int i = 0; i < mInputPointer; i++) {
167                    mInput[i] = mInput[i + 1];
168                }
169                mInput[mInputPointer] = 0;
170                mInputPointer--;
171                updateTime();
172            }
173        }
174    }
175
176    @Override
177    public boolean onLongClick(View v) {
178        if (v == mDelete) {
179            reset();
180            updateStartButton();
181            updateDeleteButton();
182            return true;
183        }
184        return false;
185    }
186
187    protected void updateTime() {
188        mEnteredTime.setTime(mInput[4], mInput[3], mInput[2],
189                mInput[1] * 10 + mInput[0]);
190    }
191
192    public void reset() {
193        for (int i = 0; i < mInputSize; i ++) {
194            mInput[i] = 0;
195        }
196        mInputPointer = -1;
197        updateTime();
198    }
199
200    public int getTime() {
201        return mInput[4] * 3600 + mInput[3] * 600 + mInput[2] * 60 + mInput[1] * 10 + mInput[0];
202    }
203
204    public void saveEntryState(Bundle outState, String key) {
205        outState.putIntArray(key, mInput);
206    }
207
208    public void restoreEntryState(Bundle inState, String key) {
209        int[] input = inState.getIntArray(key);
210        if (input != null && mInputSize == input.length) {
211            for (int i = 0; i < mInputSize; i++) {
212                mInput[i] = input[i];
213                if (mInput[i] != 0) {
214                    mInputPointer = i;
215                }
216            }
217            updateTime();
218        }
219    }
220
221    protected void setLeftRightEnabled(boolean enabled) {
222        mLeft.setEnabled(enabled);
223        mRight.setEnabled(enabled);
224        if (!enabled) {
225            mLeft.setContentDescription(null);
226            mRight.setContentDescription(null);
227        }
228    }
229}
230