diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c00e4bea..f16cdb54 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -23,6 +23,9 @@ + + diff --git a/res/layout-land/main.xml b/res/layout-land/main.xml index 72a3b525..f6172c11 100644 --- a/res/layout-land/main.xml +++ b/res/layout-land/main.xml @@ -17,15 +17,27 @@ - + - + + - + - + diff --git a/res/layout/calc_history_button.xml b/res/layout/calc_history_button.xml index ee4bacc1..210556c0 100644 --- a/res/layout/calc_history_button.xml +++ b/res/layout/calc_history_button.xml @@ -8,7 +8,10 @@ \ No newline at end of file + style="@style/control_button_style" + a:textSize="18dp" + a:textStyle="bold" + a:onClick="historyButtonClickHandler"/> \ No newline at end of file diff --git a/res/layout/history.xml b/res/layout/history.xml new file mode 100644 index 00000000..4330976e --- /dev/null +++ b/res/layout/history.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/history_activity.xml b/res/layout/history_activity.xml new file mode 100644 index 00000000..48b190c0 --- /dev/null +++ b/res/layout/history_activity.xml @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/layout/var.xml b/res/layout/var.xml index 0c6b0707..8dbc7a6a 100644 --- a/res/layout/var.xml +++ b/res/layout/var.xml @@ -20,6 +20,7 @@ a:layout_width="match_parent" a:layout_height="match_parent" a:textSize="20dp" + a:textColor="@android:color/white" a:paddingBottom="3dp" a:paddingLeft="6dp" a:paddingRight="6dp" diff --git a/res/menu/main_menu.xml b/res/menu/main_menu.xml index 511a8f1b..16d64fa0 100644 --- a/res/menu/main_menu.xml +++ b/res/menu/main_menu.xml @@ -5,6 +5,9 @@ + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6dcb2b49..9907aab4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -70,4 +70,9 @@ http://paypal.com\n + История + M + История пуста! + История + diff --git a/res/values/strings.xml b/res/values/strings.xml index 682052b0..fb303679 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -70,4 +70,8 @@ You can thank the author of this program by email\n\n se.solovyev@gmail.com\n\n or donate money via\n\nhttp://paypal.com\n + History + M + History is empty! + History diff --git a/src/main/java/org/solovyev/android/calculator/AbstractHistoryState.java b/src/main/java/org/solovyev/android/calculator/AbstractHistoryState.java new file mode 100644 index 00000000..d702df76 --- /dev/null +++ b/src/main/java/org/solovyev/android/calculator/AbstractHistoryState.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; + +import java.util.Date; + +/** + * User: serso + * Date: 10/15/11 + * Time: 1:45 PM + */ +public class AbstractHistoryState { + + @NotNull + private final Date time = new Date(); + + @NotNull + public Date getTime() { + return time; + } +} diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java b/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java index 5bf0fdc2..dd4a1bcf 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java @@ -37,6 +37,10 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh public static final String INSERT_TEXT_INTENT = "org.solovyev.android.calculator.CalculatorActivity.insertText"; public static final String INSERT_TEXT_INTENT_EXTRA_STRING = "org.solovyev.android.calculator.CalculatorActivity.insertText.extraString"; + public static final String SET_TEXT_INTENT = "org.solovyev.android.calculator.CalculatorActivity.setText"; + public static final String SET_TEXT_INTENT_EXTRA_STRING = "org.solovyev.android.calculator.CalculatorActivity.settText.extraString"; + + private static final int HVGA_WIDTH_PIXELS = 320; @NotNull @@ -46,7 +50,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh private CalculatorView calculatorView; @NotNull - private BroadcastReceiver insertTextReceiver; + private BroadcastReceiver textReceiver; private volatile boolean initialized; @@ -106,7 +110,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh calculatorView = new CalculatorView(this, CalculatorModel.instance); - insertTextReceiver = new BroadcastReceiver() { + textReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (INSERT_TEXT_INTENT.equals(intent.getAction())) { @@ -119,11 +123,22 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh } }); } + } else if (SET_TEXT_INTENT.equals(intent.getAction())) { + final String s = intent.getStringExtra(SET_TEXT_INTENT_EXTRA_STRING); + if (!StringUtils.isEmpty(s)) { + calculatorView.doTextOperation(new CalculatorView.TextOperation() { + @Override + public void doOperation(@NotNull EditText editor) { + editor.setText(s); + } + }); + } } } }; - registerReceiver(insertTextReceiver, new IntentFilter(INSERT_TEXT_INTENT)); + registerReceiver(textReceiver, new IntentFilter(INSERT_TEXT_INTENT)); + registerReceiver(textReceiver, new IntentFilter(SET_TEXT_INTENT)); } private synchronized void firstTimeInit() { @@ -140,7 +155,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh @Override protected void onDestroy() { - unregisterReceiver(insertTextReceiver); + unregisterReceiver(textReceiver); super.onDestroy(); } @@ -154,6 +169,11 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh this.calculatorView.evaluate(); } + @SuppressWarnings({"UnusedDeclaration"}) + public void historyButtonClickHandler(@NotNull View v) { + this.showHistory(); + } + @SuppressWarnings({"UnusedDeclaration"}) public void eraseButtonClickHandler(@NotNull View v) { calculatorView.doTextOperation(new CalculatorView.TextOperation() { @@ -267,6 +287,10 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh showSettings(); result = true; break; + case R.id.main_menu_item_history: + showHistory(); + result = true; + break; case R.id.main_menu_item_about: showAbout(); result = true; @@ -282,6 +306,10 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh return result; } + private void showHistory() { + startActivity(new Intent(this, CalculatorHistoryActivity.class)); + } + private void showSettings() { startActivity(new Intent(this, CalculatorPreferencesActivity.class)); } diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorDisplayHistoryState.java b/src/main/java/org/solovyev/android/calculator/CalculatorDisplayHistoryState.java index 83106328..da058f3e 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorDisplayHistoryState.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorDisplayHistoryState.java @@ -42,6 +42,7 @@ public class CalculatorDisplayHistoryState { this.valid = valid; } + @NotNull public EditorHistoryState getEditorHistoryState() { return editorHistoryState; } diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorHistory.java b/src/main/java/org/solovyev/android/calculator/CalculatorHistory.java index b0deb3b0..0aaa110f 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorHistory.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorHistory.java @@ -12,6 +12,8 @@ import org.solovyev.common.utils.history.HistoryAction; import org.solovyev.common.utils.history.HistoryHelper; import org.solovyev.common.utils.history.SimpleHistoryHelper; +import java.util.List; + /** * User: serso * Date: 10/9/11 @@ -68,5 +70,9 @@ public enum CalculatorHistory implements HistoryHelper { historyHelper.addState(currentState); } - + @NotNull + @Override + public List getStates() { + return historyHelper.getStates(); + } } diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorHistoryActivity.java b/src/main/java/org/solovyev/android/calculator/CalculatorHistoryActivity.java new file mode 100644 index 00000000..09e156d0 --- /dev/null +++ b/src/main/java/org/solovyev/android/calculator/CalculatorHistoryActivity.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.calculator; + +import android.app.ListActivity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.*; +import org.jetbrains.annotations.NotNull; +import org.solovyev.common.utils.Filter; +import org.solovyev.common.utils.FilterRule; +import org.solovyev.common.utils.FilterRulesChain; +import org.solovyev.common.utils.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +/** + * User: serso + * Date: 10/15/11 + * Time: 1:13 PM + */ +public class CalculatorHistoryActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.history_activity); + + final List historyList = getHistoryList(); + if ( historyList.isEmpty() ) { + Toast.makeText(this, R.string.c_history_is_empty, Toast.LENGTH_SHORT).show(); + this.finish(); + } + + setListAdapter(new HistoryArrayAdapter(this, R.layout.history, R.id.history_item, historyList)); + + final ListView lv = getListView(); + lv.setTextFilterEnabled(true); + + lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView parent, View view, + int position, long id) { + final Intent intent = new Intent(CalculatorActivity.SET_TEXT_INTENT); + intent.putExtra(CalculatorActivity.SET_TEXT_INTENT_EXTRA_STRING, ((CalculatorHistoryState) parent.getItemAtPosition(position)).getEditorState().getText()); + sendOrderedBroadcast(intent, null); + + CalculatorHistoryActivity.this.finish(); + } + }); + } + + private static List getHistoryList() { + final List calculatorHistoryStates = new ArrayList(CalculatorHistory.instance.getStates()); + + final FilterRulesChain filterRulesChain = new FilterRulesChain(); + filterRulesChain.addFilterRule(new FilterRule() { + @Override + public boolean isFiltered(CalculatorHistoryState object) { + return object == null || StringUtils.isEmpty(object.getEditorState().getText()); + } + }); + + new Filter(filterRulesChain).filter(calculatorHistoryStates.iterator()); + + return calculatorHistoryStates; + } + + private static class HistoryArrayAdapter extends ArrayAdapter { + + private HistoryArrayAdapter(Context context, int resource, int textViewResourceId, @NotNull List historyList) { + super(context, resource, textViewResourceId, historyList); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewGroup result = (ViewGroup) super.getView(position, convertView, parent); + + final CalculatorHistoryState state = getItem(position); + + final TextView time = (TextView) result.findViewById(R.id.history_time); + time.setText(new SimpleDateFormat().format(state.getTime())); + + final TextView editor = (TextView) result.findViewById(R.id.history_item); + editor.setText(state.getEditorState().getText() + "=" + state.getDisplayState().getEditorHistoryState().getText()); + + return result; + } + } +} diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorHistoryState.java b/src/main/java/org/solovyev/android/calculator/CalculatorHistoryState.java index 3e7136bf..545d2b02 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorHistoryState.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorHistoryState.java @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; * Date: 9/11/11 * Time: 12:16 AM */ -public class CalculatorHistoryState { +public class CalculatorHistoryState extends AbstractHistoryState{ @NotNull private EditorHistoryState editorState; @@ -20,7 +20,8 @@ public class CalculatorHistoryState { @NotNull private CalculatorDisplayHistoryState displayState; - public CalculatorHistoryState(@NotNull EditorHistoryState editorState, @NotNull CalculatorDisplayHistoryState displayState) { + public CalculatorHistoryState(@NotNull EditorHistoryState editorState, + @NotNull CalculatorDisplayHistoryState displayState) { this.editorState = editorState; this.displayState = displayState; } diff --git a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java b/src/main/java/org/solovyev/android/view/widgets/ColorButton.java index bcdc87fc..caa10219 100644 --- a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java +++ b/src/main/java/org/solovyev/android/view/widgets/ColorButton.java @@ -167,7 +167,7 @@ public class ColorButton extends Button { if (topDr != null) { canvas.save(); canvas.translate(scrollX + compoundPaddingLeft + (hspace - topDr.getBounds().width()) / 2, - scrollY + getPaddingTop() + vspace / 2); + scrollY + getPaddingTop() + vspace / 2); topDr.draw(canvas); canvas.restore(); }