blob: e6993a2656c3c1015ad935228f987e81d4183550 [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;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080021import android.util.Config;
Dmitri Plotnikov9476df22011-01-17 14:46:51 -080022import android.util.Log;
23import android.view.KeyEvent;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080024import android.view.Menu;
25import android.view.MenuItem;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080026import android.view.View;
27import android.widget.Button;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080028
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080029public class Calculator extends Activity implements PanelSwitcher.Listener {
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080030 EventListener mListener = new EventListener();
31 private CalculatorDisplay mDisplay;
32 private Persist mPersist;
33 private History mHistory;
34 private Logic mLogic;
35 private PanelSwitcher mPanelSwitcher;
36
37 private static final int CMD_CLEAR_HISTORY = 1;
38 private static final int CMD_BASIC_PANEL = 2;
39 private static final int CMD_ADVANCED_PANEL = 3;
40
41 static final int BASIC_PANEL = 0;
42 static final int ADVANCED_PANEL = 1;
43
44 private static final String LOG_TAG = "Calculator";
45 private static final boolean DEBUG = false;
46 private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
Mihai Predacf3ca322010-03-09 12:27:45 +010047 private static final String STATE_CURRENT_VIEW = "state-current-view";
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080048
49 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +010050 public void onCreate(Bundle state) {
51 super.onCreate(state);
Jeff Hamilton0c464d22009-04-11 01:54:05 -070052
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080053 setContentView(R.layout.main);
54
55 mPersist = new Persist(this);
56 mHistory = mPersist.history;
57
58 mDisplay = (CalculatorDisplay) findViewById(R.id.display);
59
60 mLogic = new Logic(this, mHistory, mDisplay, (Button) findViewById(R.id.equal));
61 HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
62 mHistory.setObserver(historyAdapter);
Mihai Predacf3ca322010-03-09 12:27:45 +010063
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080064 mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);
Dmitri Plotnikove2092452011-01-16 15:27:03 -080065 if (mPanelSwitcher != null) {
66 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
67 mPanelSwitcher.setListener(this);
68 }
Mihai Predacf3ca322010-03-09 12:27:45 +010069
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080070 mListener.setHandler(mLogic, mPanelSwitcher);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080071 mDisplay.setOnKeyListener(mListener);
72
Dmitri Plotnikove2092452011-01-16 15:27:03 -080073 setOnClickListener(R.id.digit0);
74 setOnClickListener(R.id.digit1);
75 setOnClickListener(R.id.digit2);
76 setOnClickListener(R.id.digit3);
77 setOnClickListener(R.id.digit4);
78 setOnClickListener(R.id.digit5);
79 setOnClickListener(R.id.digit6);
80 setOnClickListener(R.id.digit7);
81 setOnClickListener(R.id.digit8);
82 setOnClickListener(R.id.digit9);
83 setOnClickListener(R.id.dot);
84
85 setOnClickListener(R.id.plus);
86 setOnClickListener(R.id.minus);
87 setOnClickListener(R.id.div);
88 setOnClickListener(R.id.mul);
89 setOnClickListener(R.id.leftParen);
90 setOnClickListener(R.id.rightParen);
91 setOnClickListener(R.id.equal);
92
93 setOnClickListener(R.id.sin);
94 setOnClickListener(R.id.ln);
95 setOnClickListener(R.id.cos);
96 setOnClickListener(R.id.lg);
97 setOnClickListener(R.id.tan);
98 setOnClickListener(R.id.e);
99 setOnClickListener(R.id.pi);
100 setOnClickListener(R.id.power);
101 setOnClickListener(R.id.factorial);
102 setOnClickListener(R.id.sqrt);
103
Mihai Predacf3ca322010-03-09 12:27:45 +0100104 View view;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800105 if ((view = findViewById(R.id.del)) != null) {
Dmitri Plotnikov9476df22011-01-17 14:46:51 -0800106 view.setOnClickListener(mListener);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800107 view.setOnLongClickListener(mListener);
108 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800109 }
110
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800111 private void setOnClickListener(int id) {
112 findViewById(id).setOnClickListener(mListener);
113 }
114
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800115 @Override
116 public boolean onCreateOptionsMenu(Menu menu) {
117 super.onCreateOptionsMenu(menu);
118 MenuItem item;
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800119
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800120 item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800121 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800122 item.setIcon(R.drawable.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800123
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800124 item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800125 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800126 item.setIcon(R.drawable.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800127
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800128 item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800129 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800130 item.setIcon(R.drawable.simple);
131
132 return true;
133 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800134
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800135 @Override
136 public boolean onPrepareOptionsMenu(Menu menu) {
137 super.onPrepareOptionsMenu(menu);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800138 menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800139 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800140
141 menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800142 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800143
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800144 return true;
145 }
146
147 @Override
148 public boolean onOptionsItemSelected(MenuItem item) {
149 switch (item.getItemId()) {
150 case CMD_CLEAR_HISTORY:
151 mHistory.clear();
152 break;
153
154 case CMD_BASIC_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800155 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800156 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
157 mPanelSwitcher.moveRight();
158 }
159 break;
160
161 case CMD_ADVANCED_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800162 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800163 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
164 mPanelSwitcher.moveLeft();
165 }
166 break;
167 }
168 return super.onOptionsItemSelected(item);
169 }
170
171 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +0100172 protected void onSaveInstanceState(Bundle state) {
173 super.onSaveInstanceState(state);
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800174 if (mPanelSwitcher != null) {
175 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
176 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800177 }
178
179 @Override
180 public void onPause() {
181 super.onPause();
182 mLogic.updateHistory();
183 mPersist.save();
184 }
185
Mihai Predabcabcbb2009-08-05 17:07:31 +0200186 @Override
187 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800188 if (keyCode == KeyEvent.KEYCODE_BACK
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800189 && mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
Mihai Predabcabcbb2009-08-05 17:07:31 +0200190 mPanelSwitcher.moveRight();
191 return true;
192 } else {
193 return super.onKeyDown(keyCode, keyEvent);
194 }
195 }
196
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800197 static void log(String message) {
198 if (LOG_ENABLED) {
199 Log.v(LOG_TAG, message);
200 }
201 }
Jacek Surazski1d311752009-08-25 17:33:12 +0200202
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800203 @Override
204 public void onChange() {
205 invalidateOptionsMenu();
206 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800207}