blob: 51aa38a90fd1733ab6373770248f9258e658c81a [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.calculator2;
import android.app.Activity;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
public class Calculator extends Activity implements PanelSwitcher.Listener, Logic.Listener,
OnClickListener, OnMenuItemClickListener {
EventListener mListener = new EventListener();
private CalculatorDisplay mDisplay;
private Persist mPersist;
private History mHistory;
private Logic mLogic;
private ViewPager mPager;
private View mClearButton;
private View mBackspaceButton;
private View mOverflowMenuButton;
static final int BASIC_PANEL = 0;
static final int ADVANCED_PANEL = 1;
private static final String LOG_TAG = "Calculator";
private static final boolean DEBUG = false;
private static final boolean LOG_ENABLED = false;
private static final String STATE_CURRENT_VIEW = "state-current-view";
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
// Disable IME for this application
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
setContentView(R.layout.main);
mPager = (ViewPager) findViewById(R.id.panelswitch);
if (mPager != null) {
mPager.setAdapter(new PageAdapter(mPager));
} else {
// Single page UI
final TypedArray buttons = getResources().obtainTypedArray(R.array.buttons);
for (int i = 0; i < buttons.length(); i++) {
setOnClickListener(null, buttons.getResourceId(i, 0));
}
buttons.recycle();
}
if (mClearButton == null) {
mClearButton = findViewById(R.id.clear);
mClearButton.setOnClickListener(mListener);
mClearButton.setOnLongClickListener(mListener);
}
if (mBackspaceButton == null) {
mBackspaceButton = findViewById(R.id.del);
mBackspaceButton.setOnClickListener(mListener);
mBackspaceButton.setOnLongClickListener(mListener);
}
mPersist = new Persist(this);
mPersist.load();
mHistory = mPersist.history;
mDisplay = (CalculatorDisplay) findViewById(R.id.display);
mLogic = new Logic(this, mHistory, mDisplay);
mLogic.setListener(this);
mLogic.setDeleteMode(mPersist.getDeleteMode());
mLogic.setLineLength(mDisplay.getMaxDigits());
HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);
mHistory.setObserver(historyAdapter);
if (mPager != null) {
mPager.setCurrentItem(state == null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0));
}
mListener.setHandler(mLogic, mPager);
mDisplay.setOnKeyListener(mListener);
if (!ViewConfiguration.get(this).hasPermanentMenuKey()) {
createFakeMenu();
}
mLogic.resumeWithHistory();
updateDeleteMode();
}
private void updateDeleteMode() {
if (mLogic.getDeleteMode() == Logic.DELETE_MODE_BACKSPACE) {
mClearButton.setVisibility(View.GONE);
mBackspaceButton.setVisibility(View.VISIBLE);
} else {
mClearButton.setVisibility(View.VISIBLE);
mBackspaceButton.setVisibility(View.GONE);
}
}
void setOnClickListener(View root, int id) {
final View target = root != null ? root.findViewById(id) : findViewById(id);
target.setOnClickListener(mListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.basic).setVisible(!getBasicVisibility());
menu.findItem(R.id.advanced).setVisible(!getAdvancedVisibility());
return true;
}
private void createFakeMenu() {
mOverflowMenuButton = findViewById(R.id.overflow_menu);
if (mOverflowMenuButton != null) {
mOverflowMenuButton.setVisibility(View.VISIBLE);
mOverflowMenuButton.setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.overflow_menu:
PopupMenu menu = constructPopupMenu();
if (menu != null) {
menu.show();
}
break;
}
}
private PopupMenu constructPopupMenu() {
final PopupMenu popupMenu = new PopupMenu(this, mOverflowMenuButton);
final Menu menu = popupMenu.getMenu();
popupMenu.inflate(R.menu.menu);
popupMenu.setOnMenuItemClickListener(this);
onPrepareOptionsMenu(menu);
return popupMenu;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
private boolean getBasicVisibility() {
return mPager != null && mPager.getCurrentItem() == BASIC_PANEL;
}
private boolean getAdvancedVisibility() {
return mPager != null && mPager.getCurrentItem() == ADVANCED_PANEL;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.clear_history:
mHistory.clear();
mLogic.onClear();
break;
case R.id.basic:
if (!getBasicVisibility()) {
mPager.setCurrentItem(BASIC_PANEL);
}
break;
case R.id.advanced:
if (!getAdvancedVisibility()) {
mPager.setCurrentItem(ADVANCED_PANEL);
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
if (mPager != null) {
state.putInt(STATE_CURRENT_VIEW, mPager.getCurrentItem());
}
}
@Override
public void onPause() {
super.onPause();
mLogic.updateHistory();
mPersist.setDeleteMode(mLogic.getDeleteMode());
mPersist.save();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK && getAdvancedVisibility()) {
mPager.setCurrentItem(BASIC_PANEL);
return true;
} else {
return super.onKeyDown(keyCode, keyEvent);
}
}
static void log(String message) {
if (LOG_ENABLED) {
Log.v(LOG_TAG, message);
}
}
@Override
public void onChange() {
invalidateOptionsMenu();
}
@Override
public void onDeleteModeChange() {
updateDeleteMode();
}
class PageAdapter extends PagerAdapter {
private View mSimplePage;
private View mAdvancedPage;
public PageAdapter(ViewPager parent) {
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final View simplePage = inflater.inflate(R.layout.simple_pad, parent, false);
final View advancedPage = inflater.inflate(R.layout.advanced_pad, parent, false);
mSimplePage = simplePage;
mAdvancedPage = advancedPage;
final Resources res = getResources();
final TypedArray simpleButtons = res.obtainTypedArray(R.array.simple_buttons);
for (int i = 0; i < simpleButtons.length(); i++) {
setOnClickListener(simplePage, simpleButtons.getResourceId(i, 0));
}
simpleButtons.recycle();
final TypedArray advancedButtons = res.obtainTypedArray(R.array.advanced_buttons);
for (int i = 0; i < advancedButtons.length(); i++) {
setOnClickListener(advancedPage, advancedButtons.getResourceId(i, 0));
}
advancedButtons.recycle();
final View clearButton = simplePage.findViewById(R.id.clear);
if (clearButton != null) {
mClearButton = clearButton;
}
final View backspaceButton = simplePage.findViewById(R.id.del);
if (backspaceButton != null) {
mBackspaceButton = backspaceButton;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public void startUpdate(View container) {
}
@Override
public Object instantiateItem(View container, int position) {
final View page = position == 0 ? mSimplePage : mAdvancedPage;
((ViewGroup) container).addView(page);
return page;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewGroup) container).removeView((View) object);
}
@Override
public void finishUpdate(View container) {
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
}
}