• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.calculator2;
18 
19 import android.app.Activity;
20 import android.content.res.Resources;
21 import android.content.res.TypedArray;
22 import android.os.Bundle;
23 import android.os.Parcelable;
24 import android.support.v4.view.PagerAdapter;
25 import android.support.v4.view.ViewPager;
26 import android.util.Log;
27 import android.view.KeyEvent;
28 import android.view.LayoutInflater;
29 import android.view.Menu;
30 import android.view.MenuItem;
31 import android.view.View;
32 import android.view.View.OnClickListener;
33 import android.view.ViewConfiguration;
34 import android.view.ViewGroup;
35 import android.view.WindowManager;
36 import android.widget.PopupMenu;
37 import android.widget.PopupMenu.OnMenuItemClickListener;
38 
39 public class Calculator extends Activity implements PanelSwitcher.Listener, Logic.Listener,
40         OnClickListener, OnMenuItemClickListener {
41     EventListener mListener = new EventListener();
42     private CalculatorDisplay mDisplay;
43     private Persist mPersist;
44     private History mHistory;
45     private Logic mLogic;
46     private ViewPager mPager;
47     private View mClearButton;
48     private View mBackspaceButton;
49     private View mOverflowMenuButton;
50 
51     static final int BASIC_PANEL    = 0;
52     static final int ADVANCED_PANEL = 1;
53 
54     private static final String LOG_TAG = "Calculator";
55     private static final boolean DEBUG  = false;
56     private static final boolean LOG_ENABLED = false;
57     private static final String STATE_CURRENT_VIEW = "state-current-view";
58 
59     @Override
onCreate(Bundle state)60     public void onCreate(Bundle state) {
61         super.onCreate(state);
62 
63         // Disable IME for this application
64         getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
65                 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
66 
67         setContentView(R.layout.main);
68         mPager = (ViewPager) findViewById(R.id.panelswitch);
69         if (mPager != null) {
70             mPager.setAdapter(new PageAdapter(mPager));
71         } else {
72             // Single page UI
73             final TypedArray buttons = getResources().obtainTypedArray(R.array.buttons);
74             for (int i = 0; i < buttons.length(); i++) {
75                 setOnClickListener(null, buttons.getResourceId(i, 0));
76             }
77             buttons.recycle();
78         }
79 
80         if (mClearButton == null) {
81             mClearButton = findViewById(R.id.clear);
82             mClearButton.setOnClickListener(mListener);
83             mClearButton.setOnLongClickListener(mListener);
84         }
85         if (mBackspaceButton == null) {
86             mBackspaceButton = findViewById(R.id.del);
87             mBackspaceButton.setOnClickListener(mListener);
88             mBackspaceButton.setOnLongClickListener(mListener);
89         }
90 
91         mPersist = new Persist(this);
92         mPersist.load();
93 
94         mHistory = mPersist.history;
95 
96         mDisplay = (CalculatorDisplay) findViewById(R.id.display);
97 
98         mLogic = new Logic(this, mHistory, mDisplay);
99         mLogic.setListener(this);
100 
101         mLogic.setDeleteMode(mPersist.getDeleteMode());
102         mLogic.setLineLength(mDisplay.getMaxDigits());
103 
104         HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
105         mHistory.setObserver(historyAdapter);
106 
107         if (mPager != null) {
108             mPager.setCurrentItem(state == null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
109         }
110 
111         mListener.setHandler(mLogic, mPager);
112         mDisplay.setOnKeyListener(mListener);
113 
114         if (!ViewConfiguration.get(this).hasPermanentMenuKey()) {
115             createFakeMenu();
116         }
117 
118         mLogic.resumeWithHistory();
119         updateDeleteMode();
120     }
121 
updateDeleteMode()122     private void updateDeleteMode() {
123         if (mLogic.getDeleteMode() == Logic.DELETE_MODE_BACKSPACE) {
124             mClearButton.setVisibility(View.GONE);
125             mBackspaceButton.setVisibility(View.VISIBLE);
126         } else {
127             mClearButton.setVisibility(View.VISIBLE);
128             mBackspaceButton.setVisibility(View.GONE);
129         }
130     }
131 
setOnClickListener(View root, int id)132     void setOnClickListener(View root, int id) {
133         final View target = root != null ? root.findViewById(id) : findViewById(id);
134         target.setOnClickListener(mListener);
135     }
136 
137     @Override
onCreateOptionsMenu(Menu menu)138     public boolean onCreateOptionsMenu(Menu menu) {
139         super.onCreateOptionsMenu(menu);
140         getMenuInflater().inflate(R.menu.menu, menu);
141         return true;
142     }
143 
144     @Override
onPrepareOptionsMenu(Menu menu)145     public boolean onPrepareOptionsMenu(Menu menu) {
146         super.onPrepareOptionsMenu(menu);
147         menu.findItem(R.id.basic).setVisible(!getBasicVisibility());
148         menu.findItem(R.id.advanced).setVisible(!getAdvancedVisibility());
149         return true;
150     }
151 
152 
createFakeMenu()153     private void createFakeMenu() {
154         mOverflowMenuButton = findViewById(R.id.overflow_menu);
155         if (mOverflowMenuButton != null) {
156             mOverflowMenuButton.setVisibility(View.VISIBLE);
157             mOverflowMenuButton.setOnClickListener(this);
158         }
159     }
160 
161     @Override
onClick(View v)162     public void onClick(View v) {
163         switch (v.getId()) {
164             case R.id.overflow_menu:
165                 PopupMenu menu = constructPopupMenu();
166                 if (menu != null) {
167                     menu.show();
168                 }
169                 break;
170         }
171     }
172 
constructPopupMenu()173     private PopupMenu constructPopupMenu() {
174         final PopupMenu popupMenu = new PopupMenu(this, mOverflowMenuButton);
175         final Menu menu = popupMenu.getMenu();
176         popupMenu.inflate(R.menu.menu);
177         popupMenu.setOnMenuItemClickListener(this);
178         onPrepareOptionsMenu(menu);
179         return popupMenu;
180     }
181 
182 
183     @Override
onMenuItemClick(MenuItem item)184     public boolean onMenuItemClick(MenuItem item) {
185         return onOptionsItemSelected(item);
186     }
187 
getBasicVisibility()188     private boolean getBasicVisibility() {
189         return mPager != null && mPager.getCurrentItem() == BASIC_PANEL;
190     }
191 
getAdvancedVisibility()192     private boolean getAdvancedVisibility() {
193         return mPager != null && mPager.getCurrentItem() == ADVANCED_PANEL;
194     }
195 
196     @Override
onOptionsItemSelected(MenuItem item)197     public boolean onOptionsItemSelected(MenuItem item) {
198         switch (item.getItemId()) {
199             case R.id.clear_history:
200                 mHistory.clear();
201                 mLogic.onClear();
202                 break;
203 
204             case R.id.basic:
205                 if (!getBasicVisibility()) {
206                     mPager.setCurrentItem(BASIC_PANEL);
207                 }
208                 break;
209 
210             case R.id.advanced:
211                 if (!getAdvancedVisibility()) {
212                     mPager.setCurrentItem(ADVANCED_PANEL);
213                 }
214                 break;
215         }
216         return super.onOptionsItemSelected(item);
217     }
218 
219     @Override
onSaveInstanceState(Bundle state)220     protected void onSaveInstanceState(Bundle state) {
221         super.onSaveInstanceState(state);
222         if (mPager != null) {
223             state.putInt(STATE_CURRENT_VIEW, mPager.getCurrentItem());
224         }
225     }
226 
227     @Override
onPause()228     public void onPause() {
229         super.onPause();
230         mLogic.updateHistory();
231         mPersist.setDeleteMode(mLogic.getDeleteMode());
232         mPersist.save();
233     }
234 
235     @Override
onKeyDown(int keyCode, KeyEvent keyEvent)236     public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
237         if (keyCode == KeyEvent.KEYCODE_BACK && getAdvancedVisibility()) {
238             mPager.setCurrentItem(BASIC_PANEL);
239             return true;
240         } else {
241             return super.onKeyDown(keyCode, keyEvent);
242         }
243     }
244 
log(String message)245     static void log(String message) {
246         if (LOG_ENABLED) {
247             Log.v(LOG_TAG, message);
248         }
249     }
250 
251     @Override
onChange()252     public void onChange() {
253         invalidateOptionsMenu();
254     }
255 
256     @Override
onDeleteModeChange()257     public void onDeleteModeChange() {
258         updateDeleteMode();
259     }
260 
261     class PageAdapter extends PagerAdapter {
262         private View mSimplePage;
263         private View mAdvancedPage;
264 
PageAdapter(ViewPager parent)265         public PageAdapter(ViewPager parent) {
266             final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
267             final View simplePage = inflater.inflate(R.layout.simple_pad, parent, false);
268             final View advancedPage = inflater.inflate(R.layout.advanced_pad, parent, false);
269             mSimplePage = simplePage;
270             mAdvancedPage = advancedPage;
271 
272             final Resources res = getResources();
273             final TypedArray simpleButtons = res.obtainTypedArray(R.array.simple_buttons);
274             for (int i = 0; i < simpleButtons.length(); i++) {
275                 setOnClickListener(simplePage, simpleButtons.getResourceId(i, 0));
276             }
277             simpleButtons.recycle();
278 
279             final TypedArray advancedButtons = res.obtainTypedArray(R.array.advanced_buttons);
280             for (int i = 0; i < advancedButtons.length(); i++) {
281                 setOnClickListener(advancedPage, advancedButtons.getResourceId(i, 0));
282             }
283             advancedButtons.recycle();
284 
285             final View clearButton = simplePage.findViewById(R.id.clear);
286             if (clearButton != null) {
287                 mClearButton = clearButton;
288             }
289 
290             final View backspaceButton = simplePage.findViewById(R.id.del);
291             if (backspaceButton != null) {
292                 mBackspaceButton = backspaceButton;
293             }
294         }
295 
296         @Override
getCount()297         public int getCount() {
298             return 2;
299         }
300 
301         @Override
startUpdate(View container)302         public void startUpdate(View container) {
303         }
304 
305         @Override
instantiateItem(View container, int position)306         public Object instantiateItem(View container, int position) {
307             final View page = position == 0 ? mSimplePage : mAdvancedPage;
308             ((ViewGroup) container).addView(page);
309             return page;
310         }
311 
312         @Override
destroyItem(View container, int position, Object object)313         public void destroyItem(View container, int position, Object object) {
314             ((ViewGroup) container).removeView((View) object);
315         }
316 
317         @Override
finishUpdate(View container)318         public void finishUpdate(View container) {
319         }
320 
321         @Override
isViewFromObject(View view, Object object)322         public boolean isViewFromObject(View view, Object object) {
323             return view == object;
324         }
325 
326         @Override
saveState()327         public Parcelable saveState() {
328             return null;
329         }
330 
331         @Override
restoreState(Parcelable state, ClassLoader loader)332         public void restoreState(Parcelable state, ClassLoader loader) {
333         }
334     }
335 }
336