Calculator.java revision e2092454e13850c551550db9879fa4fa93218c75
1/*
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;
23import android.util.TypedValue;
24import android.view.Display;
25import android.view.Menu;
26import android.view.MenuItem;
27import android.view.View;
28import android.view.KeyEvent;
29import android.widget.Button;
30import android.widget.TextView;
31
32public class Calculator extends Activity implements PanelSwitcher.Listener {
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
44    private static final int HVGA_WIDTH_PIXELS  = 320;
45
46    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;
52    private static final String STATE_CURRENT_VIEW = "state-current-view";
53
54    @Override
55    public void onCreate(Bundle state) {
56        super.onCreate(state);
57
58        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);
68
69        mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);
70        if (mPanelSwitcher != null) {
71            mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
72            mPanelSwitcher.setListener(this);
73        }
74
75        mListener.setHandler(mLogic, mPanelSwitcher);
76        mDisplay.setOnKeyListener(mListener);
77
78        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
109        View view;
110        if ((view = findViewById(R.id.del)) != null) {
111//            view.setOnClickListener(mListener);
112            view.setOnLongClickListener(mListener);
113        }
114        /*
115        if ((view = findViewById(R.id.clear)) != null) {
116            view.setOnClickListener(mListener);
117        }
118        */
119    }
120
121    private void setOnClickListener(int id) {
122        findViewById(id).setOnClickListener(mListener);
123    }
124
125    @Override
126    public boolean onCreateOptionsMenu(Menu menu) {
127        super.onCreateOptionsMenu(menu);
128        MenuItem item;
129
130        item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
131        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
132        item.setIcon(R.drawable.clear_history);
133
134        item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
135        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
136        item.setIcon(R.drawable.advanced);
137
138        item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
139        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
140        item.setIcon(R.drawable.simple);
141
142        return true;
143    }
144
145    @Override
146    public boolean onPrepareOptionsMenu(Menu menu) {
147        super.onPrepareOptionsMenu(menu);
148        menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
149                          mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
150
151        menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
152                          mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
153
154        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:
165            if (mPanelSwitcher != null &&
166                mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
167                mPanelSwitcher.moveRight();
168            }
169            break;
170
171        case CMD_ADVANCED_PANEL:
172            if (mPanelSwitcher != null &&
173                mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
174                mPanelSwitcher.moveLeft();
175            }
176            break;
177        }
178        return super.onOptionsItemSelected(item);
179    }
180
181    @Override
182    protected void onSaveInstanceState(Bundle state) {
183        super.onSaveInstanceState(state);
184        if (mPanelSwitcher != null) {
185            state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex());
186        }
187    }
188
189    @Override
190    public void onPause() {
191        super.onPause();
192        mLogic.updateHistory();
193        mPersist.save();
194    }
195
196    @Override
197    public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
198        if (keyCode == KeyEvent.KEYCODE_BACK
199            && mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
200            mPanelSwitcher.moveRight();
201            return true;
202        } else {
203            return super.onKeyDown(keyCode, keyEvent);
204        }
205    }
206
207    static void log(String message) {
208        if (LOG_ENABLED) {
209            Log.v(LOG_TAG, message);
210        }
211    }
212
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();
221        int h = Math.min(display.getWidth(), display.getHeight());
222        float ratio = (float)h/HVGA_WIDTH_PIXELS;
223        view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);
224    }
225
226    @Override
227    public void onChange() {
228        invalidateOptionsMenu();
229    }
230}
231