com.numix.calculator.Calculator.java Source code

Java tutorial

Introduction

Here is the source code for com.numix.calculator.Calculator.java

Source

/*
 * 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) {
    }
}