blob: a871c00ceee54aeff8ba18064dd2e384b0e40295 [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
32public class Calculator extends Activity {
33 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
Jacek Surazski1d311752009-08-25 17:33:12 +020044 private static final int HVGA_HEIGHT_PIXELS = 480;
Mihai Predae08c8302009-09-22 14:53:16 +020045 private static final int HVGA_WIDTH_PIXELS = 320;
Jacek Surazski1d311752009-08-25 17:33:12 +020046
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080047 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;
52 private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
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
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080059 setContentView(R.layout.main);
60
61 mPersist = new Persist(this);
62 mHistory = mPersist.history;
63
64 mDisplay = (CalculatorDisplay) findViewById(R.id.display);
65
66 mLogic = new Logic(this, mHistory, mDisplay, (Button) findViewById(R.id.equal));
67 HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
68 mHistory.setObserver(historyAdapter);
Mihai Predacf3ca322010-03-09 12:27:45 +010069
The Android Open Source Projectb301ed22009-03-03 19:32:17 -080070 mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);
Mihai Predacf3ca322010-03-09 12:27:45 +010071 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
72
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;
93
94 item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
95 item.setIcon(R.drawable.clear_history);
96
97 item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
98 item.setIcon(R.drawable.advanced);
99
100 item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
101 item.setIcon(R.drawable.simple);
102
103 return true;
104 }
105
106 @Override
107 public boolean onPrepareOptionsMenu(Menu menu) {
108 super.onPrepareOptionsMenu(menu);
109 menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
110 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
111
112 menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
113 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
114
115 return true;
116 }
117
118 @Override
119 public boolean onOptionsItemSelected(MenuItem item) {
120 switch (item.getItemId()) {
121 case CMD_CLEAR_HISTORY:
122 mHistory.clear();
123 break;
124
125 case CMD_BASIC_PANEL:
126 if (mPanelSwitcher != null &&
127 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
128 mPanelSwitcher.moveRight();
129 }
130 break;
131
132 case CMD_ADVANCED_PANEL:
133 if (mPanelSwitcher != null &&
134 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
135 mPanelSwitcher.moveLeft();
136 }
137 break;
138 }
139 return super.onOptionsItemSelected(item);
140 }
141
142 @Override
Mihai Predacf3ca322010-03-09 12:27:45 +0100143 protected void onSaveInstanceState(Bundle state) {
144 super.onSaveInstanceState(state);
145 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800146 }
147
148 @Override
149 public void onPause() {
150 super.onPause();
151 mLogic.updateHistory();
152 mPersist.save();
153 }
154
Mihai Predabcabcbb2009-08-05 17:07:31 +0200155 @Override
156 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
157 if (keyCode == KeyEvent.KEYCODE_BACK
158 && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
159 mPanelSwitcher.moveRight();
160 return true;
161 } else {
162 return super.onKeyDown(keyCode, keyEvent);
163 }
164 }
165
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800166 static void log(String message) {
167 if (LOG_ENABLED) {
168 Log.v(LOG_TAG, message);
169 }
170 }
Jacek Surazski1d311752009-08-25 17:33:12 +0200171
172 /**
173 * The font sizes in the layout files are specified for a HVGA display.
174 * Adjust the font sizes accordingly if we are running on a different
175 * display.
176 */
177 public void adjustFontSize(TextView view) {
178 float fontPixelSize = view.getTextSize();
179 Display display = getWindowManager().getDefaultDisplay();
Mihai Predae08c8302009-09-22 14:53:16 +0200180 int h = Math.min(display.getWidth(), display.getHeight());
181 float ratio = (float)h/HVGA_WIDTH_PIXELS;
Jacek Surazski1d311752009-08-25 17:33:12 +0200182 view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);
183 }
The Android Open Source Projectb301ed22009-03-03 19:32:17 -0800184}