/*
* 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.numix.calculator;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Display;
import android.view.KeyEvent;
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.view.animation.AccelerateInterpolator;
import android.widget.AdapterView;
import android.support.v4.widget.SlidingPaneLayout;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import com.numix.calculator.view.AdvancedDisplay;
import com.numix.calculator.view.CalculatorDisplay;
import com.numix.calculator.view.CalculatorViewPager;
import com.numix.calculator.view.HistoryLine;
import com.xlythe.slider.Slider;
import com.xlythe.slider.Slider.Direction;
public class Calculator extends Activity implements Logic.Listener, OnClickListener, OnMenuItemClickListener, CalculatorViewPager.OnPageChangeListener {
public EventListener mListener = new EventListener();
private CalculatorDisplay mDisplay;
private Persist mPersist;
private History mHistory;
private ListView mHistoryView;
private BaseAdapter mHistoryAdapter;
private Logic mLogic;
private CalculatorViewPager mPager;
private CalculatorViewPager mSmallPager;
private CalculatorViewPager mLargePager;
private View mClearButton;
private View mBackspaceButton;
private View mOverflowMenuButton;
private Slider mPulldown;
private Graph mGraph;
EventListener cls2= new EventListener();
public static GoogleAnalytics analytics;
public static Tracker tracker;
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
private boolean clingActive = false;
public enum Panel {
GRAPH, FUNCTION, HEX, BASIC, ADVANCED, MATRIX;
int order;
public void setOrder(int order) {
this.order = order;
}
public int getOrder() {
return order;
}
}
public enum SmallPanel {
HEX, ADVANCED, FUNCTION;
int order;
public void setOrder(int order) {
this.order = order;
}
public int getOrder() {
return order;
}
}
public enum LargePanel {
GRAPH, BASIC, MATRIX;
int order;
public void setOrder(int order) {
this.order = order;
}
public int getOrder() {
return order;
}
}
private static final String STATE_CURRENT_VIEW = "state-current-view";
private static final String STATE_CURRENT_VIEW_SMALL = "state-current-view-small";
private static final String STATE_CURRENT_VIEW_LARGE = "state-current-view-large";
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(1800);
tracker = analytics.newTracker("UA-63953479-3");
tracker.enableExceptionReporting(true);
tracker.enableAdvertisingIdCollection(true);
tracker.enableAutoActivityTracking(true);
// Disable IME for this application
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
int sliderBackground = R.color.background_light;
super.setTheme(R.style.Theme_Calculator_Light);
setContentView(R.layout.main);
mPager = (CalculatorViewPager) findViewById(R.id.panelswitch);
Logic mHandler;
mPersist = new Persist(this);
mPersist.load();
mHistory = mPersist.mHistory;
mDisplay = (CalculatorDisplay) findViewById(R.id.display);
mLogic = new Logic(this, mHistory, mDisplay);
mLogic.setListener(this);
if(mPersist.getMode() != null) mLogic.mBaseModule.setMode(mPersist.getMode());
mLogic.setLineLength(mDisplay.getMaxDigits());
mHistoryAdapter = new HistoryAdapter(this, mHistory);
mHistory.setObserver(mHistoryAdapter);
mGraph = new Graph(mLogic);
if(mPager != null) {
mPager.setAdapter(new PageAdapter(mPager, mListener, mGraph, mLogic));
mPager.setCurrentItem(state == null ? Panel.BASIC.getOrder() : state.getInt(STATE_CURRENT_VIEW, Panel.BASIC.getOrder()));
mPager.setOnPageChangeListener(this);
mListener.setHandler(this, mLogic, mPager);
}
else if(mSmallPager != null && mLargePager != null) {
// Expanded UI
mSmallPager.setAdapter(new SmallPageAdapter(mSmallPager, mLogic));
mLargePager.setAdapter(new LargePageAdapter(mLargePager, mGraph, mLogic));
mSmallPager.setCurrentItem(state == null ? SmallPanel.ADVANCED.getOrder() : state.getInt(STATE_CURRENT_VIEW_SMALL, SmallPanel.ADVANCED.getOrder()));
mLargePager.setCurrentItem(state == null ? LargePanel.BASIC.getOrder() : state.getInt(STATE_CURRENT_VIEW_LARGE, LargePanel.BASIC.getOrder()));
mSmallPager.setOnPageChangeListener(this);
mLargePager.setOnPageChangeListener(this);
mListener.setHandler(this, mLogic, mSmallPager, mLargePager);
}
mDisplay.setOnKeyListener(mListener);
if(!ViewConfiguration.get(this).hasPermanentMenuKey()) {
createFakeMenu();
}
mLogic.resumeWithHistory();
}
@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);
MenuItem mMatrixPanel = menu.findItem(R.id.matrix);
if(mMatrixPanel != null) mMatrixPanel.setVisible(!getMatrixVisibility() && CalculatorSettings.matrixPanel(getContext()));
MenuItem mGraphPanel = menu.findItem(R.id.graph);
if(mGraphPanel != null) mGraphPanel.setVisible(!getGraphVisibility() && CalculatorSettings.graphPanel(getContext()));
MenuItem mFunctionPanel = menu.findItem(R.id.function);
if(mFunctionPanel != null) mFunctionPanel.setVisible(!getFunctionVisibility() && CalculatorSettings.functionPanel(getContext())
);
MenuItem mBasicPanel = menu.findItem(R.id.basic);
if(mBasicPanel != null) mBasicPanel.setVisible(!getBasicVisibility() && CalculatorSettings.basicPanel(getContext()));
MenuItem mAdvancedPanel = menu.findItem(R.id.advanced);
if(mAdvancedPanel != null) mAdvancedPanel.setVisible(!getAdvancedVisibility() && CalculatorSettings.advancedPanel(getContext())
);
MenuItem mHexPanel = menu.findItem(R.id.hex);
if(mHexPanel != null) mHexPanel.setVisible(!getHexVisibility() && CalculatorSettings.hexPanel(getContext()));
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;
}
}
public void deleteAnimation(){
TextView colorView = (TextView) findViewById(R.id.deleteColor);
}
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 getGraphVisibility() {
if(mPager != null) {
return mPager.getCurrentItem() == Panel.GRAPH.getOrder() && CalculatorSettings.graphPanel(getContext());
}
else if(mLargePager != null) {
return mLargePager.getCurrentItem() == LargePanel.GRAPH.getOrder() && CalculatorSettings.graphPanel(getContext());
}
return false;
}
private boolean getFunctionVisibility() {
// if(mPager != null) {
// return mPager.getCurrentItem() == Panel.FUNCTION.getOrder() &&
// CalculatorSettings.functionPanel(getContext());
// }
// else if(mSmallPager != null) {
// return mSmallPager.getCurrentItem() == SmallPanel.FUNCTION.getOrder()
// && CalculatorSettings.functionPanel(getContext());
// }
return false;
}
private boolean getBasicVisibility() {
if(mPager != null) {
return mPager.getCurrentItem() == Panel.BASIC.getOrder() && CalculatorSettings.basicPanel(getContext());
}
else if(mLargePager != null) {
return mLargePager.getCurrentItem() == LargePanel.BASIC.getOrder() && CalculatorSettings.basicPanel(getContext());
}
return false;
}
private boolean getAdvancedVisibility() {
if(mPager != null) {
return mPager.getCurrentItem() == Panel.ADVANCED.getOrder() && CalculatorSettings.advancedPanel(getContext());
}
else if(mSmallPager != null) {
return mSmallPager.getCurrentItem() == SmallPanel.ADVANCED.getOrder() && CalculatorSettings.advancedPanel(getContext());
}
return false;
}
private boolean getHexVisibility() {
if(mPager != null) {
return mPager.getCurrentItem() == Panel.HEX.getOrder() && CalculatorSettings.hexPanel(getContext());
}
else if(mSmallPager != null) {
return mSmallPager.getCurrentItem() == SmallPanel.HEX.getOrder() && CalculatorSettings.hexPanel(getContext());
}
return false;
}
private boolean getMatrixVisibility() {
if(mPager != null) {
return mPager.getCurrentItem() == Panel.MATRIX.getOrder() && CalculatorSettings.matrixPanel(getContext());
}
else if(mLargePager != null) {
return mLargePager.getCurrentItem() == LargePanel.MATRIX.getOrder() && CalculatorSettings.matrixPanel(getContext());
}
return false;
}
public void onClickListenerSettings(View v) {
Intent preferencesintent = (Intent) new Intent(this,
Preferences.class);
if (currentapiVersion >= android.os.Build.VERSION_CODES.LOLLIPOP){
startActivity(preferencesintent,
ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
} else{
startActivity(preferencesintent);
}
}
public void onClickListenerDel(View v) {
}
public void onClickListenerHistory(View v) {
Toast.makeText(this, R.string.history, Toast.LENGTH_SHORT).show();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.basic:
if(!getBasicVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.BASIC.getOrder());
else if(mLargePager != null) mLargePager.setCurrentItem(LargePanel.BASIC.getOrder());
}
break;
case R.id.advanced:
if(!getAdvancedVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.ADVANCED.getOrder());
else if(mSmallPager != null) mSmallPager.setCurrentItem(SmallPanel.ADVANCED.getOrder());
}
break;
case R.id.function:
if(!getFunctionVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.FUNCTION.getOrder());
else if(mSmallPager != null) mSmallPager.setCurrentItem(SmallPanel.FUNCTION.getOrder());
}
break;
case R.id.graph:
if(!getGraphVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.GRAPH.getOrder());
else if(mLargePager != null) mLargePager.setCurrentItem(LargePanel.GRAPH.getOrder());
}
break;
case R.id.matrix:
if(!getMatrixVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.MATRIX.getOrder());
else if(mLargePager != null) mLargePager.setCurrentItem(LargePanel.MATRIX.getOrder());
}
break;
case R.id.hex:
if(!getHexVisibility()) {
if(mPager != null) mPager.setCurrentItem(Panel.HEX.getOrder());
else if(mSmallPager != null) mSmallPager.setCurrentItem(SmallPanel.HEX.getOrder());
}
break;
case R.id.settings:
startActivity(new Intent(this, Preferences.class));
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
if(mPager != null) {
state.putInt(STATE_CURRENT_VIEW, mPager.getCurrentItem());
}
if(mSmallPager != null) {
state.putInt(STATE_CURRENT_VIEW_SMALL, mSmallPager.getCurrentItem());
}
if(mLargePager != null) {
state.putInt(STATE_CURRENT_VIEW_LARGE, mLargePager.getCurrentItem());
}
}
@Override
public void onPause() {
super.onPause();
mLogic.updateHistory();
mPersist.setDeleteMode(mLogic.getDeleteMode());
mPersist.setMode(mLogic.mBaseModule.getMode());
mPersist.save();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
if(keyCode == KeyEvent.KEYCODE_BACK && mPager != null && !getBasicVisibility() && CalculatorSettings.basicPanel(getContext()) && !clingActive) {
mPager.setCurrentItem(Panel.BASIC.getOrder());
return true;
}
else if(keyCode == KeyEvent.KEYCODE_BACK && mSmallPager != null && mLargePager != null && !(getAdvancedVisibility() && getBasicVisibility())
&& CalculatorSettings.basicPanel(getContext()) && CalculatorSettings.advancedPanel(getContext()) && !clingActive) {
mSmallPager.setCurrentItem(SmallPanel.ADVANCED.getOrder());
mLargePager.setCurrentItem(LargePanel.BASIC.getOrder());
return true;
}
else if(keyCode == KeyEvent.KEYCODE_BACK) {
finish();
}
return super.onKeyDown(keyCode, keyEvent);
}
@Override
public void onDeleteModeChange() {
}
private void setUpHistory() {
registerForContextMenu(mHistoryView);
mHistoryView.setAdapter(mHistoryAdapter);
mHistoryView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
mHistoryView.setStackFromBottom(true);
mHistoryView.setFocusable(false);
mHistoryView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(mDisplay.getText().isEmpty())
mDisplay.insert(((HistoryLine) view).getHistoryEntry().getEdited());
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
View history = mHistoryAdapter.getView(info.position, null, null);
if(history instanceof HistoryLine) ((HistoryLine) history).onCreateContextMenu(menu);
}
private Context getContext() {
return Calculator.this;
}
/* Cling related */
private boolean isClingsEnabled() {
// disable clings when running in a test harness
if(ActivityManager.isRunningInTestHarness()) return false;
return true;
}
private void removeCling(int id) {
setPagingEnabled(true);
clingActive = false;
final View cling = findViewById(id);
if(cling != null) {
final ViewGroup parent = (ViewGroup) cling.getParent();
parent.post(new Runnable() {
@Override
public void run() {
parent.removeView(cling);
}
});
}
}
private void setPagingEnabled(boolean enabled) {
if(mPager != null) mPager.setPagingEnabled(enabled);
if(mSmallPager != null) mSmallPager.setPagingEnabled(enabled);
if(mLargePager != null) mLargePager.setPagingEnabled(enabled);
}
private boolean getPagingEnabled() {
if(mPager != null) return mPager.getPagingEnabled();
if(mSmallPager != null) return mSmallPager.getPagingEnabled();
if(mLargePager != null) return mLargePager.getPagingEnabled();
return true;
}
@Override
public void onPageScrollStateChanged(int state) {
if(state == 0) {
setPagingEnabled(true);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {}
}