blob: 697e46932d7d9f88c9b6569eb5d1821488b17486 [file] [log] [blame]
The Android Open Source Projectb301ed22009-03-03 19:32:17 -08001/*
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.calculator2;
18
19import android.app.Activity;
20import android.os.Bundle;
21import android.util.Log;
22import android.util.Config;
Jacek Surazski1d311752009-08-25 17:33:12 +020023import android.util.TypedValue;
24import android.view.Display;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080025import android.view.Menu;
26import android.view.MenuItem;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080027import android.view.View;
Mihai Predabcabcbb2009-08-05 17:07:31 +020028import android.view.KeyEvent;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080029import android.widget.Button;
Jacek Surazski1d311752009-08-25 17:33:12 +020030import android.widget.TextView;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080031
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080032public class Calculator extends Activity implements PanelSwitcher.Listener {
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080033 EventListener mListener = new EventListener();
34 private CalculatorDisplay mDisplay;
35 private Persist mPersist;
36 private History mHistory;
37 private Logic mLogic;
38 private PanelSwitcher mPanelSwitcher;
39
40 private static final int CMD_CLEAR_HISTORY = 1;
41 private static final int CMD_BASIC_PANEL = 2;
42 private static final int CMD_ADVANCED_PANEL = 3;
43
Mihai Predae08c8302009-09-22 14:53:16 +020044 private static final int HVGA_WIDTH_PIXELS = 320;
Jacek Surazski1d311752009-08-25 17:33:12 +020045
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080046 static final int BASIC_PANEL = 0;
47 static final int ADVANCED_PANEL = 1;
48
49 private static final String LOG_TAG = "Calculator";
50 private static final boolean DEBUG = false;
51 private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
Mihai Predacf3ca322010-03-09 12:27:45 +010052 private static final String STATE_CURRENT_VIEW = "state-current-view";
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080053
54 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +010055 public void onCreate(Bundle state) {
56 super.onCreate(state);
Jeff Hamilton0c464d22009-04-11 01:54:05 -070057
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080058 setContentView(R.layout.main);
59
60 mPersist = new Persist(this);
61 mHistory = mPersist.history;
62
63 mDisplay = (CalculatorDisplay) findViewById(R.id.display);
64
65 mLogic = new Logic(this, mHistory, mDisplay, (Button) findViewById(R.id.equal));
66 HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
67 mHistory.setObserver(historyAdapter);
Mihai Predacf3ca322010-03-09 12:27:45 +010068
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080069 mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);
Dmitri Plotnikove2092452011-01-16 15:27:03 -080070 if (mPanelSwitcher != null) {
71 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
72 mPanelSwitcher.setListener(this);
73 }
Mihai Predacf3ca322010-03-09 12:27:45 +010074
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080075 mListener.setHandler(mLogic, mPanelSwitcher);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080076 mDisplay.setOnKeyListener(mListener);
77
Dmitri Plotnikove2092452011-01-16 15:27:03 -080078 setOnClickListener(R.id.digit0);
79 setOnClickListener(R.id.digit1);
80 setOnClickListener(R.id.digit2);
81 setOnClickListener(R.id.digit3);
82 setOnClickListener(R.id.digit4);
83 setOnClickListener(R.id.digit5);
84 setOnClickListener(R.id.digit6);
85 setOnClickListener(R.id.digit7);
86 setOnClickListener(R.id.digit8);
87 setOnClickListener(R.id.digit9);
88 setOnClickListener(R.id.dot);
89
90 setOnClickListener(R.id.plus);
91 setOnClickListener(R.id.minus);
92 setOnClickListener(R.id.div);
93 setOnClickListener(R.id.mul);
94 setOnClickListener(R.id.leftParen);
95 setOnClickListener(R.id.rightParen);
96 setOnClickListener(R.id.equal);
97
98 setOnClickListener(R.id.sin);
99 setOnClickListener(R.id.ln);
100 setOnClickListener(R.id.cos);
101 setOnClickListener(R.id.lg);
102 setOnClickListener(R.id.tan);
103 setOnClickListener(R.id.e);
104 setOnClickListener(R.id.pi);
105 setOnClickListener(R.id.power);
106 setOnClickListener(R.id.factorial);
107 setOnClickListener(R.id.sqrt);
108
Mihai Predacf3ca322010-03-09 12:27:45 +0100109 View view;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800110 if ((view = findViewById(R.id.del)) != null) {
Jacek Surazski1d311752009-08-25 17:33:12 +0200111// view.setOnClickListener(mListener);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800112 view.setOnLongClickListener(mListener);
113 }
114 /*
115 if ((view = findViewById(R.id.clear)) != null) {
116 view.setOnClickListener(mListener);
117 }
118 */
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800119 }
120
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800121 private void setOnClickListener(int id) {
122 findViewById(id).setOnClickListener(mListener);
123 }
124
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800125 @Override
126 public boolean onCreateOptionsMenu(Menu menu) {
127 super.onCreateOptionsMenu(menu);
128 MenuItem item;
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800129
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800130 item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800131 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800132 item.setIcon(R.drawable.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800133
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800134 item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800135 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800136 item.setIcon(R.drawable.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800137
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800138 item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800139 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800140 item.setIcon(R.drawable.simple);
141
142 return true;
143 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800144
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800145 @Override
146 public boolean onPrepareOptionsMenu(Menu menu) {
147 super.onPrepareOptionsMenu(menu);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800148 menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800149 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800150
151 menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800152 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800153
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800154 return true;
155 }
156
157 @Override
158 public boolean onOptionsItemSelected(MenuItem item) {
159 switch (item.getItemId()) {
160 case CMD_CLEAR_HISTORY:
161 mHistory.clear();
162 break;
163
164 case CMD_BASIC_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800165 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800166 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
167 mPanelSwitcher.moveRight();
168 }
169 break;
170
171 case CMD_ADVANCED_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800172 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800173 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
174 mPanelSwitcher.moveLeft();
175 }
176 break;
177 }
178 return super.onOptionsItemSelected(item);
179 }
180
181 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +0100182 protected void onSaveInstanceState(Bundle state) {
183 super.onSaveInstanceState(state);
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800184 if (mPanelSwitcher != null) {
185 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
186 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800187 }
188
189 @Override
190 public void onPause() {
191 super.onPause();
192 mLogic.updateHistory();
193 mPersist.save();
194 }
195
Mihai Predabcabcbb2009-08-05 17:07:31 +0200196 @Override
197 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800198 if (keyCode == KeyEvent.KEYCODE_BACK
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800199 && mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
Mihai Predabcabcbb2009-08-05 17:07:31 +0200200 mPanelSwitcher.moveRight();
201 return true;
202 } else {
203 return super.onKeyDown(keyCode, keyEvent);
204 }
205 }
206
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800207 static void log(String message) {
208 if (LOG_ENABLED) {
209 Log.v(LOG_TAG, message);
210 }
211 }
Jacek Surazski1d311752009-08-25 17:33:12 +0200212
213 /**
214 * The font sizes in the layout files are specified for a HVGA display.
215 * Adjust the font sizes accordingly if we are running on a different
216 * display.
217 */
218 public void adjustFontSize(TextView view) {
219 float fontPixelSize = view.getTextSize();
220 Display display = getWindowManager().getDefaultDisplay();
Mihai Predae08c8302009-09-22 14:53:16 +0200221 int h = Math.min(display.getWidth(), display.getHeight());
222 float ratio = (float)h/HVGA_WIDTH_PIXELS;
Jacek Surazski1d311752009-08-25 17:33:12 +0200223 view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);
224 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800225
226 @Override
227 public void onChange() {
228 invalidateOptionsMenu();
229 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800230}