blob: b3056617830d13ba20deb62772251dacc1f17595 [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;
Dmitri Plotnikov9476df22011-01-17 14:46:51 -080021import android.util.Log;
22import android.view.KeyEvent;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080023import android.view.Menu;
Mindy Pereira0a1148f2011-08-22 17:30:05 -070024import android.view.MenuInflater;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080025import android.view.MenuItem;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080026import android.view.View;
Mindy Pereira0a1148f2011-08-22 17:30:05 -070027import android.view.ViewConfiguration;
Gilles Debunne92ccd212011-08-12 09:29:15 -070028import android.view.WindowManager;
Mindy Pereira0a1148f2011-08-22 17:30:05 -070029import android.view.View.OnClickListener;
30import android.widget.PopupMenu;
31import android.widget.PopupMenu.OnMenuItemClickListener;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080032
Mindy Pereira0a1148f2011-08-22 17:30:05 -070033import java.util.ArrayList;
34
35public class Calculator extends Activity implements PanelSwitcher.Listener, Logic.Listener,
36 OnClickListener, OnMenuItemClickListener {
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080037 EventListener mListener = new EventListener();
38 private CalculatorDisplay mDisplay;
39 private Persist mPersist;
40 private History mHistory;
41 private Logic mLogic;
42 private PanelSwitcher mPanelSwitcher;
Dmitri Plotnikov25018112011-01-17 16:32:39 -080043 private View mClearButton;
44 private View mBackspaceButton;
Mindy Pereira0a1148f2011-08-22 17:30:05 -070045 private View mOverflowMenuButton;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080046
47 static final int BASIC_PANEL = 0;
48 static final int ADVANCED_PANEL = 1;
49
50 private static final String LOG_TAG = "Calculator";
51 private static final boolean DEBUG = false;
Joe Onorato6bef2f82011-04-07 18:41:10 -070052 private static final boolean LOG_ENABLED = false;
Mihai Predacf3ca322010-03-09 12:27:45 +010053 private static final String STATE_CURRENT_VIEW = "state-current-view";
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080054
55 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +010056 public void onCreate(Bundle state) {
57 super.onCreate(state);
Jeff Hamilton0c464d22009-04-11 01:54:05 -070058
Gilles Debunne92ccd212011-08-12 09:29:15 -070059 // Disable IME for this application
60 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
61 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
62
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080063 setContentView(R.layout.main);
64
65 mPersist = new Persist(this);
Dmitri Plotnikov25018112011-01-17 16:32:39 -080066 mPersist.load();
67
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080068 mHistory = mPersist.history;
69
70 mDisplay = (CalculatorDisplay) findViewById(R.id.display);
71
Dmitri Plotnikov25018112011-01-17 16:32:39 -080072 mClearButton = findViewById(R.id.clear);
73 mClearButton.setOnClickListener(mListener);
74 mClearButton.setOnLongClickListener(mListener);
75
76 mBackspaceButton = findViewById(R.id.del);
77 mBackspaceButton.setOnClickListener(mListener);
78 mBackspaceButton.setOnLongClickListener(mListener);
79
80 mLogic = new Logic(this, mHistory, mDisplay);
81 mLogic.setListener(this);
82
83 mLogic.setDeleteMode(mPersist.getDeleteMode());
Dmitri Plotnikov582273d2011-01-21 15:55:40 -080084 mLogic.setLineLength(mDisplay.getMaxDigits());
Dmitri Plotnikov25018112011-01-17 16:32:39 -080085
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080086 HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
87 mHistory.setObserver(historyAdapter);
Mihai Predacf3ca322010-03-09 12:27:45 +010088
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080089 mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);
Dmitri Plotnikove2092452011-01-16 15:27:03 -080090 if (mPanelSwitcher != null) {
91 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
92 mPanelSwitcher.setListener(this);
93 }
Mihai Predacf3ca322010-03-09 12:27:45 +010094
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080095 mListener.setHandler(mLogic, mPanelSwitcher);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080096 mDisplay.setOnKeyListener(mListener);
97
Mindy Pereira0a1148f2011-08-22 17:30:05 -070098 if (!ViewConfiguration.get(this).hasPermanentMenuKey()) {
99 createFakeMenu();
100 }
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800101 setOnClickListener(R.id.digit0);
102 setOnClickListener(R.id.digit1);
103 setOnClickListener(R.id.digit2);
104 setOnClickListener(R.id.digit3);
105 setOnClickListener(R.id.digit4);
106 setOnClickListener(R.id.digit5);
107 setOnClickListener(R.id.digit6);
108 setOnClickListener(R.id.digit7);
109 setOnClickListener(R.id.digit8);
110 setOnClickListener(R.id.digit9);
111 setOnClickListener(R.id.dot);
112
113 setOnClickListener(R.id.plus);
114 setOnClickListener(R.id.minus);
115 setOnClickListener(R.id.div);
116 setOnClickListener(R.id.mul);
117 setOnClickListener(R.id.leftParen);
118 setOnClickListener(R.id.rightParen);
119 setOnClickListener(R.id.equal);
120
121 setOnClickListener(R.id.sin);
122 setOnClickListener(R.id.ln);
123 setOnClickListener(R.id.cos);
124 setOnClickListener(R.id.lg);
125 setOnClickListener(R.id.tan);
126 setOnClickListener(R.id.e);
127 setOnClickListener(R.id.pi);
128 setOnClickListener(R.id.power);
129 setOnClickListener(R.id.factorial);
130 setOnClickListener(R.id.sqrt);
131
Dmitri Plotnikov582273d2011-01-21 15:55:40 -0800132 mLogic.resumeWithHistory();
Dmitri Plotnikov25018112011-01-17 16:32:39 -0800133 updateDeleteMode();
134 }
135
136 private void updateDeleteMode() {
137 if (mLogic.getDeleteMode() == Logic.DELETE_MODE_BACKSPACE) {
138 mClearButton.setVisibility(View.GONE);
139 mBackspaceButton.setVisibility(View.VISIBLE);
140 } else {
141 mClearButton.setVisibility(View.VISIBLE);
142 mBackspaceButton.setVisibility(View.GONE);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800143 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800144 }
145
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800146 private void setOnClickListener(int id) {
147 findViewById(id).setOnClickListener(mListener);
148 }
149
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800150 @Override
151 public boolean onCreateOptionsMenu(Menu menu) {
152 super.onCreateOptionsMenu(menu);
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700153 getMenuInflater().inflate(R.menu.menu, menu);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800154 return true;
155 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800156
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800157 @Override
158 public boolean onPrepareOptionsMenu(Menu menu) {
159 super.onPrepareOptionsMenu(menu);
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700160 menu.findItem(R.id.basic).setVisible(getBasicVisibility());
161 menu.findItem(R.id.advanced).setVisible(getAdvancedVisibility());
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800162 return true;
163 }
164
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700165
166 private void createFakeMenu() {
167 mOverflowMenuButton = findViewById(R.id.overflow_menu);
168 if (mOverflowMenuButton != null) {
169 mOverflowMenuButton.setVisibility(View.VISIBLE);
170 mOverflowMenuButton.setOnClickListener(this);
171 }
172 }
173
174 @Override
175 public void onClick(View v) {
176 switch (v.getId()) {
177 case R.id.overflow_menu:
178 PopupMenu menu = constructPopupMenu();
179 if (menu != null) {
180 menu.show();
181 }
182 break;
183 }
184 }
185
186 private PopupMenu constructPopupMenu() {
187 final PopupMenu popupMenu = new PopupMenu(this, mOverflowMenuButton);
188 final Menu menu = popupMenu.getMenu();
189 popupMenu.inflate(R.menu.menu);
190 popupMenu.setOnMenuItemClickListener(this);
191 onPrepareOptionsMenu(menu);
192 return popupMenu;
193 }
194
195
196 @Override
197 public boolean onMenuItemClick(MenuItem item) {
198 return onOptionsItemSelected(item);
199 }
200
201 private boolean getBasicVisibility() {
202 return mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL;
203 }
204
205 private boolean getAdvancedVisibility() {
206 return mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == BASIC_PANEL;
207 }
208
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800209 @Override
210 public boolean onOptionsItemSelected(MenuItem item) {
211 switch (item.getItemId()) {
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700212 case R.id.clear_history:
213 mHistory.clear();
Mindy Pereiradf54c1e2011-08-22 17:30:05 -0700214 mLogic.onClear();
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700215 break;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800216
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700217 case R.id.basic:
218 if (mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
219 mPanelSwitcher.moveRight();
220 }
221 break;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800222
Mindy Pereira0a1148f2011-08-22 17:30:05 -0700223 case R.id.advanced:
224 if (mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
225 mPanelSwitcher.moveLeft();
226 }
227 break;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800228 }
229 return super.onOptionsItemSelected(item);
230 }
231
232 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +0100233 protected void onSaveInstanceState(Bundle state) {
234 super.onSaveInstanceState(state);
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800235 if (mPanelSwitcher != null) {
236 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
237 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800238 }
239
240 @Override
241 public void onPause() {
242 super.onPause();
243 mLogic.updateHistory();
Dmitri Plotnikov25018112011-01-17 16:32:39 -0800244 mPersist.setDeleteMode(mLogic.getDeleteMode());
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800245 mPersist.save();
246 }
247
Mihai Predabcabcbb2009-08-05 17:07:31 +0200248 @Override
249 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800250 if (keyCode == KeyEvent.KEYCODE_BACK
Dmitri Plotnikove2092452011-01-16 15:27:03 -0800251 && mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
Mihai Predabcabcbb2009-08-05 17:07:31 +0200252 mPanelSwitcher.moveRight();
253 return true;
254 } else {
255 return super.onKeyDown(keyCode, keyEvent);
256 }
257 }
258
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800259 static void log(String message) {
260 if (LOG_ENABLED) {
261 Log.v(LOG_TAG, message);
262 }
263 }
Jacek Surazski1d311752009-08-25 17:33:12 +0200264
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800265 @Override
266 public void onChange() {
267 invalidateOptionsMenu();
268 }
Dmitri Plotnikov25018112011-01-17 16:32:39 -0800269
270 @Override
271 public void onDeleteModeChange() {
272 updateDeleteMode();
273 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800274}