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