163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson/*
263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * Copyright (C) 2008 The Android Open Source Project
363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson *
463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License");
563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * you may not use this file except in compliance with the License.
663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * You may obtain a copy of the License at
763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson *
863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson *      http://www.apache.org/licenses/LICENSE-2.0
963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson *
1063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * Unless required by applicable law or agreed to in writing, software
1163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS,
1263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * See the License for the specific language governing permissions and
1463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson * limitations under the License.
1563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson */
1663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
1763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonpackage com.android.deskclock;
1863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
1963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.content.Context;
20da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultasimport android.os.Bundle;
2163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.util.AttributeSet;
2263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.view.LayoutInflater;
2363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.view.View;
2463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.widget.Button;
2563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.widget.ImageButton;
2663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.widget.LinearLayout;
2763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
287c71fbab5ecd558e60edff636a149ff3bf73ec57Isaac Katzenelsonimport com.android.deskclock.timer.TimerView;
297c71fbab5ecd558e60edff636a149ff3bf73ec57Isaac Katzenelson
3063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
31eb4781af67d44098d12d64ae474e431572702d37Sam Blitzsteinpublic class TimerSetupView extends LinearLayout implements Button.OnClickListener,
32eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        Button.OnLongClickListener{
3363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
34bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected int mInputSize = 5;
3563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
36bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected final Button mNumbers [] = new Button [10];
37bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected int mInput [] = new int [mInputSize];
38bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected int mInputPointer = -1;
39bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected Button mLeft, mRight;
40eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    protected Button mStart;
41bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected ImageButton mDelete;
42bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected TimerView mEnteredTime;
43bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected final Context mContext;
4463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
4563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public TimerSetupView(Context context) {
4663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        this(context, null);
4763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
4863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
4963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public TimerSetupView(Context context, AttributeSet attrs) {
5063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        super(context, attrs);
5163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mContext = context;
5263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        LayoutInflater layoutInflater =
5363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
54bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson        layoutInflater.inflate(getLayoutId(), this);
55bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    }
56bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson
57bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected int getLayoutId() {
58bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson        return R.layout.time_setup_view;
5963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
6063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
6163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    @Override
6263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    protected void onFinishInflate() {
6363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        super.onFinishInflate();
6463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
6563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        View v1 = findViewById(R.id.first);
6663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        View v2 = findViewById(R.id.second);
6763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        View v3 = findViewById(R.id.third);
6863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        View v4 = findViewById(R.id.fourth);
6963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mEnteredTime = (TimerView)findViewById(R.id.timer_time_text);
7063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mDelete = (ImageButton)findViewById(R.id.delete);
7163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mDelete.setOnClickListener(this);
72eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        mDelete.setOnLongClickListener(this);
7363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
7463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[1] = (Button)v1.findViewById(R.id.key_left);
7563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[2] = (Button)v1.findViewById(R.id.key_middle);
7663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[3] = (Button)v1.findViewById(R.id.key_right);
7763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
7863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[4] = (Button)v2.findViewById(R.id.key_left);
7963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[5] = (Button)v2.findViewById(R.id.key_middle);
8063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[6] = (Button)v2.findViewById(R.id.key_right);
8163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
8263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[7] = (Button)v3.findViewById(R.id.key_left);
8363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[8] = (Button)v3.findViewById(R.id.key_middle);
8463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[9] = (Button)v3.findViewById(R.id.key_right);
8563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
8663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mLeft = (Button)v4.findViewById(R.id.key_left);
8763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mNumbers[0] = (Button)v4.findViewById(R.id.key_middle);
8863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mRight = (Button)v4.findViewById(R.id.key_right);
89644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson        setLeftRightEnabled(false);
9063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
9163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        for (int i = 0; i < 10; i++) {
9263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            mNumbers[i].setOnClickListener(this);
93b8f330f90756451102f347d8ffd6f3c9b18f00dbIsaac Katzenelson            mNumbers [i].setText(String.format("%d",i));
9463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            mNumbers [i].setTag(R.id.numbers_key,new Integer(i));
9563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        }
9663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        updateTime();
9763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
9863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
99eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    public void registerStartButton(Button start) {
100eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        mStart = start;
101eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    }
102eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein
103eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    public void updateStartButton() {
104eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        boolean enabled = mInputPointer != -1;
105eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        if (mStart != null) {
106eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            mStart.setEnabled(enabled);
107eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        }
108eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    }
109eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein
110eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    public void updateDeleteButton() {
111eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        boolean enabled = mInputPointer != -1;
112eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        if (mDelete != null) {
113eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            mDelete.setEnabled(enabled);
114eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        }
115eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    }
11663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
11763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    @Override
11863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public void onClick(View v) {
119bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson        doOnClick(v);
120eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        updateStartButton();
121eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        updateDeleteButton();
122bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    }
123bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson
124bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected void doOnClick(View v) {
12563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
12663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        Integer val = (Integer) v.getTag(R.id.numbers_key);
12763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        // A number was pressed
12863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        if (val != null) {
12963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            // pressing "0" as the first digit does nothing
13063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            if (mInputPointer == -1 && val == 0) {
13163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                return;
13263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            }
133bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson            if (mInputPointer < mInputSize - 1) {
13463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                for (int i = mInputPointer; i >= 0; i--) {
13563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                    mInput[i+1] = mInput[i];
13663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                }
13763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                mInputPointer++;
13863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                mInput [0] = val;
13963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                updateTime();
14063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            }
14163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            return;
14263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        }
14363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
14463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        // other keys
14563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        if (v == mDelete) {
14663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            if (mInputPointer >= 0) {
14763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                for (int i = 0; i < mInputPointer; i++) {
14863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                    mInput[i] = mInput[i + 1];
14963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                }
15063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                mInput[mInputPointer] = 0;
15163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                mInputPointer--;
15263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                updateTime();
15363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            }
15463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        }
15563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
15663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
157eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    @Override
158eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    public boolean onLongClick(View v) {
159eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        if (v == mDelete) {
160eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            reset();
161eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            updateStartButton();
162eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            updateDeleteButton();
163eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein            return true;
164eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        }
165eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein        return false;
166eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein    }
167eb4781af67d44098d12d64ae474e431572702d37Sam Blitzstein
168bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson    protected void updateTime() {
169b8f330f90756451102f347d8ffd6f3c9b18f00dbIsaac Katzenelson        mEnteredTime.setTime(-1, mInput[4], mInput[3], mInput[2],
170b8f330f90756451102f347d8ffd6f3c9b18f00dbIsaac Katzenelson                mInput[1] * 10 + mInput[0]);
17163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
17263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
17363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public void reset() {
174bed1a89f743ec8b343803a44b938aad97ba0f16eIsaac Katzenelson        for (int i = 0; i < mInputSize; i ++) {
17563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            mInput[i] = 0;
17663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        }
17763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        mInputPointer = -1;
17863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        updateTime();
17963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
18063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
18163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public int getTime() {
18263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        return mInput[4] * 3600 + mInput[3] * 600 + mInput[2] * 60 + mInput[1] * 10 + mInput[0];
18363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
184644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson
185da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas    public void saveEntryState(Bundle outState, String key) {
186da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas        outState.putIntArray(key, mInput);
187da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas    }
188da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas
189da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas    public void restoreEntryState(Bundle inState, String key) {
190da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas        int[] input = inState.getIntArray(key);
191da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas        if (input != null && mInputSize == input.length) {
192da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas            for (int i = 0; i < mInputSize; i++) {
193da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas                mInput[i] = input[i];
194da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas                if (mInput[i] != 0) {
195da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas                    mInputPointer = i;
196da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas                }
197da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas            }
198da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas            updateTime();
199da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas        }
200da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas    }
201da56b596b065fdfc4e74ff2c34ec26263a2ea76dRobyn Coultas
202644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson    protected void setLeftRightEnabled(boolean enabled) {
203644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson        mLeft.setEnabled(enabled);
204644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson        mRight.setEnabled(enabled);
20561cdc8425fc9a3ee818b71a77dac8ffde83f9617Isaac Katzenelson        if (!enabled) {
20661cdc8425fc9a3ee818b71a77dac8ffde83f9617Isaac Katzenelson            mLeft.setContentDescription(null);
20761cdc8425fc9a3ee818b71a77dac8ffde83f9617Isaac Katzenelson            mRight.setContentDescription(null);
20861cdc8425fc9a3ee818b71a77dac8ffde83f9617Isaac Katzenelson        }
209644a5d887d7033e669ac362a8ed6e79197d13c72Itzhak Katzenelson    }
21063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson}
211