blob: f1c17cd9d93b44ec1910957b418646240522be81 [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);
Mihai Predacf3ca322010-03-09 12:27:45 +010070 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080071 mPanelSwitcher.setListener(this);
Mihai Predacf3ca322010-03-09 12:27:45 +010072
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080073 mListener.setHandler(mLogic, mPanelSwitcher);
74
75 mDisplay.setOnKeyListener(mListener);
76
Mihai Predacf3ca322010-03-09 12:27:45 +010077 View view;
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080078 if ((view = findViewById(R.id.del)) != null) {
Jacek Surazski1d311752009-08-25 17:33:12 +020079// view.setOnClickListener(mListener);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080080 view.setOnLongClickListener(mListener);
81 }
82 /*
83 if ((view = findViewById(R.id.clear)) != null) {
84 view.setOnClickListener(mListener);
85 }
86 */
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080087 }
88
89 @Override
90 public boolean onCreateOptionsMenu(Menu menu) {
91 super.onCreateOptionsMenu(menu);
92 MenuItem item;
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080093
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080094 item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080095 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080096 item.setIcon(R.drawable.clear_history);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080097
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080098 item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -080099 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800100 item.setIcon(R.drawable.advanced);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800101
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800102 item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800103 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800104 item.setIcon(R.drawable.simple);
105
106 return true;
107 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800108
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800109 @Override
110 public boolean onPrepareOptionsMenu(Menu menu) {
111 super.onPrepareOptionsMenu(menu);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800112 menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800113 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800114
115 menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800116 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800117
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800118 return true;
119 }
120
121 @Override
122 public boolean onOptionsItemSelected(MenuItem item) {
123 switch (item.getItemId()) {
124 case CMD_CLEAR_HISTORY:
125 mHistory.clear();
126 break;
127
128 case CMD_BASIC_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800129 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800130 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
131 mPanelSwitcher.moveRight();
132 }
133 break;
134
135 case CMD_ADVANCED_PANEL:
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800136 if (mPanelSwitcher != null &&
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800137 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
138 mPanelSwitcher.moveLeft();
139 }
140 break;
141 }
142 return super.onOptionsItemSelected(item);
143 }
144
145 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +0100146 protected void onSaveInstanceState(Bundle state) {
147 super.onSaveInstanceState(state);
148 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800149 }
150
151 @Override
152 public void onPause() {
153 super.onPause();
154 mLogic.updateHistory();
155 mPersist.save();
156 }
157
Mihai Predabcabcbb2009-08-05 17:07:31 +0200158 @Override
159 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800160 if (keyCode == KeyEvent.KEYCODE_BACK
Mihai Predabcabcbb2009-08-05 17:07:31 +0200161 && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
162 mPanelSwitcher.moveRight();
163 return true;
164 } else {
165 return super.onKeyDown(keyCode, keyEvent);
166 }
167 }
168
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800169 static void log(String message) {
170 if (LOG_ENABLED) {
171 Log.v(LOG_TAG, message);
172 }
173 }
Jacek Surazski1d311752009-08-25 17:33:12 +0200174
175 /**
176 * The font sizes in the layout files are specified for a HVGA display.
177 * Adjust the font sizes accordingly if we are running on a different
178 * display.
179 */
180 public void adjustFontSize(TextView view) {
181 float fontPixelSize = view.getTextSize();
182 Display display = getWindowManager().getDefaultDisplay();
Mihai Predae08c8302009-09-22 14:53:16 +0200183 int h = Math.min(display.getWidth(), display.getHeight());
184 float ratio = (float)h/HVGA_WIDTH_PIXELS;
Jacek Surazski1d311752009-08-25 17:33:12 +0200185 view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);
186 }
Dmitri Plotnikov052c92a2011-01-10 18:30:42 -0800187
188 @Override
189 public void onChange() {
190 invalidateOptionsMenu();
191 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800192}