This commit is contained in:
serso 2016-01-16 15:32:21 +01:00
parent 4323c688c5
commit 45a71817c8
35 changed files with 384 additions and 354 deletions

View File

@ -101,6 +101,7 @@ dependencies {
compile 'commons-cli:commons-cli:1.2'
compile 'com.squareup:otto:1.3.8'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'org.solovyev.android.views:linear-layout-manager:0.5@aar'
compile 'com.google.dagger:dagger:2.0.2'
apt "com.google.dagger:dagger-compiler:2.0.2"

View File

@ -50,8 +50,8 @@ public enum CalculatorFragmentType {
editor(CalculatorEditorFragment.class, R.layout.cpp_app_editor, R.string.editor),
//display(CalculatorHistoryFragment.class, "history", R.layout.fragment_history, R.string.c_history),
//keyboard(CalculatorHistoryFragment.class, "history", R.layout.fragment_history, R.string.c_history),
history(RecentHistoryFragment.class, R.layout.fragment_history, R.string.c_history),
saved_history(SavedHistoryFragment.class, R.layout.fragment_history, R.string.c_saved_history),
history(RecentHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_recent),
saved_history(SavedHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_saved),
variables(CalculatorVarsFragment.class, R.layout.vars_fragment, R.string.c_vars),
functions(CalculatorFunctionsFragment.class, R.layout.math_entities_fragment, R.string.c_functions),
operators(CalculatorOperatorsFragment.class, R.layout.math_entities_fragment, R.string.c_operators),

View File

@ -26,36 +26,53 @@ import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.ListFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.ClipboardManager;
import android.text.format.DateUtils;
import android.view.*;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import com.melnykov.fab.FloatingActionButton;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.jscl.JsclOperation;
import org.solovyev.android.views.llm.DividerItemDecoration;
import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseHistoryFragment extends ListFragment {
import static android.view.Menu.NONE;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
public abstract class BaseHistoryFragment extends Fragment {
private final boolean recentHistory;
@Inject
History history;
@Inject
Bus bus;
private HistoryArrayAdapter adapter;
@Bind(R.id.history_recyclerview)
RecyclerView recyclerView;
@Bind(R.id.history_fab)
FloatingActionButton fab;
@Nonnull
private FragmentUi ui;
private HistoryAdapter adapter;
protected BaseHistoryFragment(@Nonnull CalculatorFragmentType type) {
recentHistory = type == CalculatorFragmentType.history;
ui = new FragmentUi(type.getDefaultLayoutId(), type.getDefaultTitleResId(), false);
}
@ -81,46 +98,33 @@ public abstract class BaseHistoryFragment extends ListFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((CalculatorApplication) getActivity().getApplication()).getComponent().inject(this);
bus.register(this);
ui.onCreate(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return ui.onCreateView(this, inflater, container);
}
@Override
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
ui.onViewCreated(this, root);
adapter = new HistoryArrayAdapter(this.getActivity(), getItemLayoutId(), R.id.history_item, new ArrayList<HistoryState>());
setListAdapter(adapter);
final ListView lv = getListView();
lv.setTextFilterEnabled(true);
final FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.fab);
fab.attachToListView(lv);
final View view = ui.onCreateView(this, inflater, container);
ButterKnife.bind(this, view);
final Context context = inflater.getContext();
adapter = new HistoryAdapter(context);
bus.register(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerItemDecoration(context, null));
fab.attachToRecyclerView(recyclerView);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showClearHistoryDialog();
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(final AdapterView<?> parent,
final View view,
final int position,
final long id) {
useState((HistoryState) parent.getItemAtPosition(position));
return view;
}
});
registerForContextMenu(lv);
@Override
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
ui.onViewCreated(this, root);
}
private void showClearHistoryDialog() {
@ -130,7 +134,11 @@ public abstract class BaseHistoryFragment extends ListFragment {
.setPositiveButton(R.string.cpp_clear_history, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearHistory();
if (recentHistory) {
history.clearRecent();
} else {
history.clearSaved();
}
}
})
.setNegativeButton(R.string.c_cancel, null)
@ -142,33 +150,8 @@ public abstract class BaseHistoryFragment extends ListFragment {
public void onResume() {
super.onResume();
ui.onResume(this);
updateAdapter();
}
@Override
public final void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
final HistoryState state = (HistoryState) getListView().getItemAtPosition(info.position);
onCreateContextMenu(menu, state);
}
protected abstract void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull HistoryState state);
@Override
public final boolean onContextItemSelected(MenuItem item) {
final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final HistoryState state = (HistoryState) getListView().getItemAtPosition(info.position);
if (onContextItemSelected(item, state)) {
return true;
}
return super.onContextItemSelected(item);
}
protected abstract boolean onContextItemSelected(@Nonnull MenuItem item, @Nonnull HistoryState state);
@SuppressWarnings("deprecation")
protected final void copyResult(@Nonnull HistoryState state) {
final Context context = getActivity();
@ -203,53 +186,188 @@ public abstract class BaseHistoryFragment extends ListFragment {
@Override
public void onDestroyView() {
bus.unregister(adapter);
ui.onDestroyView(this);
super.onDestroyView();
}
@Override
public void onDestroy() {
bus.unregister(this);
ui.onDestroy(this);
super.onDestroy();
}
protected abstract int getItemLayoutId();
public class HistoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener, MenuItem.OnMenuItemClickListener {
private void updateAdapter() {
final List<HistoryState> historyList = getHistoryItems();
private static final int DATETIME_FORMAT = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_ABBREV_TIME;
@Bind(R.id.history_item_value)
TextView valueView;
@Bind(R.id.history_item_comment)
TextView commentView;
@Bind(R.id.history_item_time)
TextView timeView;
@Nullable
private HistoryState state;
final ArrayAdapter<HistoryState> adapter = getAdapter();
try {
adapter.setNotifyOnChange(false);
adapter.clear();
for (HistoryState historyState : historyList) {
adapter.add(historyState);
}
} finally {
adapter.setNotifyOnChange(true);
public HistoryViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnCreateContextMenuListener(this);
view.setOnClickListener(this);
}
adapter.notifyDataSetChanged();
void bind(@Nonnull HistoryState state) {
this.state = state;
valueView.setText(BaseHistoryFragment.getHistoryText(state));
timeView.setText(DateUtils.formatDateTime(getContext(), state.getTime(), DATETIME_FORMAT));
final String comment = state.getComment();
if (!Strings.isEmpty(comment)) {
commentView.setText(comment);
commentView.setVisibility(VISIBLE);
} else {
commentView.setText(null);
commentView.setVisibility(GONE);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
Check.isNotNull(state);
if (recentHistory) {
addMenu(menu, R.string.c_use);
addMenu(menu, R.string.c_copy_expression);
if (shouldHaveCopyResult(state)) {
addMenu(menu, R.string.c_copy_result);
}
addMenu(menu, R.string.c_save);
} else {
addMenu(menu, R.string.c_use);
addMenu(menu, R.string.c_copy_expression);
if (shouldHaveCopyResult(state)) {
addMenu(menu, R.string.c_copy_result);
}
addMenu(menu, R.string.c_edit);
addMenu(menu, R.string.c_remove);
}
}
@Nonnull
protected abstract List<HistoryState> getHistoryItems();
private MenuItem addMenu(@Nonnull ContextMenu menu, @StringRes int label) {
return menu.add(NONE, label, NONE, label).setOnMenuItemClickListener(this);
}
protected abstract void clearHistory();
@Override
public void onClick(View v) {
Check.isNotNull(state);
useState(state);
}
@Nonnull
protected HistoryArrayAdapter getAdapter() {
return adapter;
@Override
public boolean onMenuItemClick(MenuItem item) {
Check.isNotNull(state);
switch (item.getItemId()) {
case R.string.c_use:
useState(state);
return true;
case R.string.c_copy_expression:
copyExpression(state);
return true;
case R.string.c_copy_result:
copyResult(state);
return true;
case R.string.c_edit:
EditHistoryFragment.show(state, false, getFragmentManager());
return true;
case R.string.c_save:
EditHistoryFragment.show(state, true, getFragmentManager());
return true;
case R.string.c_remove:
history.removeSaved(state);
return true;
}
return false;
}
}
public class HistoryAdapter extends RecyclerView.Adapter<HistoryViewHolder> {
@NonNull
private final LayoutInflater inflater;
@NonNull
private final List<HistoryState> list;
public HistoryAdapter(@NonNull Context context) {
inflater = LayoutInflater.from(context);
list = loadHistory();
setHasStableIds(true);
}
@NonNull
private List<HistoryState> loadHistory() {
return recentHistory ? history.getRecent() : history.getSaved();
}
@Override
public HistoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new HistoryViewHolder(inflater.inflate(R.layout.fragment_history_item, parent, false));
}
@Override
public void onBindViewHolder(HistoryViewHolder holder, int position) {
holder.bind(list.get(position));
}
@Override
public long getItemId(int position) {
return list.get(position).hashCode();
}
@Override
public int getItemCount() {
return list.size();
}
@Subscribe
void onHistoryChanged(@Nonnull History.ChangedEvent e) {
if (e.recent != isRecentHistory()) {
public void onHistoryCleared(@Nonnull History.ClearedEvent e) {
if (e.recent != recentHistory) {
return;
}
updateAdapter();
list.clear();
notifyDataSetChanged();
}
protected abstract boolean isRecentHistory();
@Subscribe
public void onHistoryAdded(@Nonnull History.AddedEvent e) {
if (e.recent != recentHistory) {
return;
}
list.add(e.state);
notifyItemInserted(0);
}
@Subscribe
public void onHistoryUpdated(@Nonnull History.UpdatedEvent e) {
if (e.recent != recentHistory) {
return;
}
final int i = list.indexOf(e.state);
if (i >= 0) {
list.set(i, e.state);
notifyItemChanged(i);
}
}
@Subscribe
public void onHistoryRemoved(@Nonnull History.RemovedEvent e) {
if (e.recent != recentHistory) {
return;
}
final int i = list.indexOf(e.state);
if (i >= 0) {
list.remove(i);
notifyItemRemoved(i);
}
}
}
}

View File

@ -78,11 +78,8 @@ public class EditHistoryFragment extends BaseDialogFragment {
builder.setPositiveButton(R.string.c_save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final HistoryState.Builder b = HistoryState.builder(state)
final HistoryState.Builder b = HistoryState.builder(state, newState)
.withComment(commentView.getText().toString());
if (newState) {
b.withNowTime();
}
history.updateSaved(b.build());
}
});

View File

@ -27,25 +27,22 @@ import android.content.SharedPreferences;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import com.google.common.base.Strings;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import org.json.JSONArray;
import org.json.JSONException;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.AppModule;
import org.solovyev.android.calculator.Display;
import org.solovyev.android.calculator.DisplayState;
import org.solovyev.android.calculator.Editor;
import org.solovyev.android.calculator.EditorState;
import org.solovyev.android.calculator.ErrorReporter;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences;
import org.solovyev.android.io.FileLoader;
import org.solovyev.android.io.FileSaver;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@ -54,12 +51,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import static android.text.TextUtils.isEmpty;
@Singleton
@ -67,8 +58,8 @@ public class History {
public static final String TAG = App.subTag("History");
public static final String OLD_HISTORY_PREFS_KEY = "org.solovyev.android.calculator.CalculatorModel_history";
private static final ChangedEvent CHANGED_EVENT_RECENT = new ChangedEvent(true);
private static final ChangedEvent CHANGED_EVENT_SAVED = new ChangedEvent(false);
private static final ClearedEvent CLEARED_EVENT_RECENT = new ClearedEvent(true);
private static final ClearedEvent CLEARED_EVENT_SAVED = new ClearedEvent(false);
private static final int MAX_INTERMEDIATE_STREAK = 5;
@NonNull
private final Runnable writeRecent = new WriteTask(true);
@ -246,7 +237,7 @@ public class History {
public void addRecent(@Nonnull HistoryState state) {
Check.isMainThread();
recent.add(state);
onRecentChanged();
onRecentChanged(new AddedEvent(state, true));
}
public void updateSaved(@Nonnull HistoryState state) {
@ -254,22 +245,23 @@ public class History {
final int i = saved.indexOf(state);
if(i >= 0) {
saved.set(i, state);
onSavedChanged(new UpdatedEvent(state, false));
} else {
saved.add(state);
onSavedChanged(new AddedEvent(state, false));
}
onSavedChanged();
}
private void onRecentChanged() {
private void onRecentChanged(@Nonnull Object event) {
handler.removeCallbacks(writeRecent);
handler.postDelayed(writeRecent, 500);
bus.post(CHANGED_EVENT_RECENT);
bus.post(event);
}
private void onSavedChanged() {
private void onSavedChanged(@Nonnull Object event) {
handler.removeCallbacks(writeSaved);
handler.postDelayed(writeSaved, 500);
bus.post(CHANGED_EVENT_SAVED);
bus.post(event);
}
@Nonnull
@ -314,13 +306,13 @@ public class History {
public void clearRecent() {
Check.isMainThread();
recent.clear();
onRecentChanged();
onRecentChanged(CLEARED_EVENT_RECENT);
}
public void clearSaved() {
Check.isMainThread();
saved.clear();
onSavedChanged();
onSavedChanged(CLEARED_EVENT_SAVED);
}
public void undo() {
@ -347,13 +339,13 @@ public class History {
public void removeSaved(@Nonnull HistoryState state) {
Check.isMainThread();
saved.remove(state);
onSavedChanged();
onSavedChanged(new RemovedEvent(state, false));
}
public void removeRecent(@Nonnull HistoryState state) {
Check.isMainThread();
recent.remove(state);
onRecentChanged();
onSavedChanged(new RemovedEvent(state, true));
}
@Subscribe
@ -366,10 +358,39 @@ public class History {
addRecent(HistoryState.builder(editorState, displayState).build());
}
public static class ChangedEvent {
public static class ClearedEvent {
public final boolean recent;
public ChangedEvent(boolean recent) {
ClearedEvent(boolean recent) {
this.recent = recent;
}
}
public static class RemovedEvent extends StateEvent {
RemovedEvent(@Nonnull HistoryState state, boolean recent) {
super(state, recent);
}
}
public static class AddedEvent extends StateEvent {
AddedEvent(@Nonnull HistoryState state, boolean recent) {
super(state, recent);
}
}
public static class UpdatedEvent extends StateEvent {
UpdatedEvent(@Nonnull HistoryState state, boolean recent) {
super(state, recent);
}
}
public abstract static class StateEvent {
@Nonnull
public final HistoryState state;
public final boolean recent;
protected StateEvent(@Nonnull HistoryState state, boolean recent) {
this.state = state;
this.recent = recent;
}
}

View File

@ -51,10 +51,10 @@ public class HistoryArrayAdapter extends ArrayAdapter<HistoryState> {
final HistoryState state = getItem(position);
final TextView time = (TextView) result.findViewById(R.id.history_time);
final TextView time = (TextView) result.findViewById(R.id.history_item_time);
time.setText(DateUtils.formatDateTime(getContext(), state.getTime(), DATETIME_FORMAT));
final TextView editor = (TextView) result.findViewById(R.id.history_item);
final TextView editor = (TextView) result.findViewById(R.id.history_item_value);
editor.setText(BaseHistoryFragment.getHistoryText(state));
final TextView commentView = (TextView) result.findViewById(R.id.history_item_comment);

View File

@ -3,7 +3,6 @@ package org.solovyev.android.calculator.history;
import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
import org.json.JSONException;
import org.json.JSONObject;
import org.solovyev.android.Check;
@ -37,7 +36,7 @@ public class HistoryState implements Parcelable {
public final EditorState editor;
@Nonnull
public final DisplayState display;
protected long time;
protected long time = now();
@Nonnull
protected String comment = "";
@ -47,8 +46,8 @@ public class HistoryState implements Parcelable {
this.display = display;
}
private HistoryState(@Nonnull HistoryState state) {
this.id = state.id;
private HistoryState(@Nonnull HistoryState state, boolean newState) {
this.id = newState ? System.identityHashCode(this) : state.id;
this.editor = state.editor;
this.display = state.display;
this.time = state.time;
@ -75,8 +74,8 @@ public class HistoryState implements Parcelable {
}
@Nonnull
public static Builder builder(@Nonnull HistoryState state) {
return new Builder(state);
public static Builder builder(@Nonnull HistoryState state, boolean newState) {
return new Builder(state, newState);
}
@Nonnull
@ -84,6 +83,10 @@ public class HistoryState implements Parcelable {
return new HistoryState(json);
}
private static long now() {
return System.currentTimeMillis();
}
@Nonnull
public JSONObject toJson() throws JSONException {
final JSONObject json = new JSONObject();
@ -122,7 +125,7 @@ public class HistoryState implements Parcelable {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (o == null || !(o instanceof HistoryState)) return false;
final HistoryState that = (HistoryState) o;
@ -167,16 +170,13 @@ public class HistoryState implements Parcelable {
private Builder(@Nonnull EditorState editor, @Nonnull DisplayState display) {
super(editor, display);
withNowTime();
}
private Builder(@Nonnull HistoryState state) {
super(state);
private Builder(@Nonnull HistoryState state, boolean newState) {
super(state, newState);
if (newState) {
withTime(now());
}
@Nonnull
public Builder withNowTime() {
return withTime(System.currentTimeMillis());
}
@Nonnull

View File

@ -37,53 +37,4 @@ public class RecentHistoryFragment extends BaseHistoryFragment {
public RecentHistoryFragment() {
super(CalculatorFragmentType.history);
}
@Override
protected int getItemLayoutId() {
return R.layout.fragment_history_item;
}
@Nonnull
@Override
protected List<HistoryState> getHistoryItems() {
return history.getRecent();
}
@Override
protected void clearHistory() {
history.clearRecent();
getAdapter().clear();
}
@Override
protected boolean isRecentHistory() {
return true;
}
protected void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull HistoryState state) {
menu.add(NONE, R.string.c_use, NONE, R.string.c_use);
menu.add(NONE, R.string.c_copy_expression, NONE, R.string.c_copy_expression);
if (shouldHaveCopyResult(state)) {
menu.add(NONE, R.string.c_copy_result, NONE, R.string.c_copy_result);
}
menu.add(NONE, R.string.c_save, NONE, R.string.c_save);
}
protected boolean onContextItemSelected(@Nonnull MenuItem item, @Nonnull HistoryState state) {
switch (item.getItemId()) {
case R.string.c_use:
useState(state);
return true;
case R.string.c_copy_expression:
copyExpression(state);
return true;
case R.string.c_copy_result:
copyResult(state);
return true;
case R.string.c_save:
EditHistoryFragment.show(state, true, getFragmentManager());
return true;
}
return false;
}
}

View File

@ -22,73 +22,11 @@
package org.solovyev.android.calculator.history;
import android.view.ContextMenu;
import android.view.MenuItem;
import org.solovyev.android.calculator.CalculatorFragmentType;
import org.solovyev.android.calculator.R;
import javax.annotation.Nonnull;
import java.util.List;
import static android.view.Menu.NONE;
public class SavedHistoryFragment extends BaseHistoryFragment {
public SavedHistoryFragment() {
super(CalculatorFragmentType.saved_history);
}
@Override
protected int getItemLayoutId() {
return R.layout.saved_history_item;
}
@Nonnull
@Override
protected List<HistoryState> getHistoryItems() {
return history.getSaved();
}
@Override
protected void clearHistory() {
history.clearSaved();
getAdapter().clear();
}
@Override
protected boolean isRecentHistory() {
return false;
}
protected void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull HistoryState state) {
menu.add(NONE, R.string.c_use, NONE, R.string.c_use);
menu.add(NONE, R.string.c_copy_expression, NONE, R.string.c_copy_expression);
if (shouldHaveCopyResult(state)) {
menu.add(NONE, R.string.c_copy_result, NONE, R.string.c_copy_result);
}
menu.add(NONE, R.string.c_edit, NONE, R.string.c_edit);
menu.add(NONE, R.string.c_remove, NONE, R.string.c_remove);
}
protected boolean onContextItemSelected(@Nonnull MenuItem item, @Nonnull HistoryState state) {
switch (item.getItemId()) {
case R.string.c_use:
useState(state);
return true;
case R.string.c_copy_expression:
copyExpression(state);
return true;
case R.string.c_copy_result:
copyResult(state);
return true;
case R.string.c_edit:
EditHistoryFragment.show(state, false, getFragmentManager());
return true;
case R.string.c_remove:
history.removeSaved(state);
return true;
}
return false;
}
}

View File

@ -23,9 +23,9 @@
-->
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
a:id="@+id/main_fragment_layout"
style="@style/CppFragment"
xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="match_parent"
a:layout_height="match_parent">
@ -41,10 +41,13 @@
a:layout_width="match_parent"
a:layout_height="match_parent">
<ListView style="@style/CppListView" />
<android.support.v7.widget.RecyclerView
a:id="@+id/history_recyclerview"
a:layout_width="match_parent"
a:layout_height="match_parent" />
<com.melnykov.fab.FloatingActionButton
a:id="@+id/fab"
a:id="@+id/history_fab"
style="@style/CppFab"
a:src="@drawable/ic_delete_white_36dp" />
</FrameLayout>

View File

@ -23,20 +23,29 @@
-->
<LinearLayout
style="@style/CppListItem.TwoLines"
xmlns:a="http://schemas.android.com/apk/res/android"
style="@style/CppListViewItem"
a:orientation="vertical">
<TextView
a:id="@+id/history_item"
style="@style/CppListViewItemTextPrimary.History"
a:layout_width="fill_parent"
a:layout_height="fill_parent" />
a:id="@+id/history_item_value"
style="@style/CppListItemText.Primary"
a:layout_width="match_parent"
a:layout_height="wrap_content"
a:ellipsize="end"
a:maxLines="2" />
<TextView
a:id="@+id/history_time"
style="@style/CppListViewItemTextSecondary"
a:layout_width="fill_parent"
a:layout_height="fill_parent" />
a:id="@+id/history_item_comment"
style="@style/CppListItemText.Secondary.OneLine"
a:layout_width="match_parent"
a:layout_height="wrap_content" />
<TextView
a:id="@+id/history_item_time"
style="@style/CppListItemText.Secondary.OneLine"
a:layout_width="match_parent"
a:layout_height="wrap_content"
a:textSize="@dimen/list_item_text_size_small"
a:gravity="center_vertical|end"/>
</LinearLayout>

View File

@ -24,14 +24,14 @@
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
style="@style/CppListViewItem"
style="@style/CppListItem"
a:layout_width="match_parent"
a:layout_height="wrap_content"
a:orientation="vertical">
<TextView
a:id="@+id/math_entity_text"
style="@style/CppListViewItemTextPrimary"
style="@style/CppListItemText.Primary"
a:layout_width="match_parent"
a:layout_height="wrap_content" />

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2013 serso aka se.solovyev
~
~ 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.
~
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Contact details
~
~ Email: se.solovyev@gmail.com
~ Site: http://se.solovyev.org
-->
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
style="@style/CppListViewItem"
a:orientation="vertical">
<TextView
a:id="@+id/history_item"
style="@style/CppListViewItemTextPrimary.History"
a:layout_width="fill_parent"
a:layout_height="fill_parent" />
<TextView
a:id="@+id/history_item_comment"
style="@style/CppListViewItemTextSecondary"
a:layout_width="fill_parent"
a:layout_height="fill_parent" />
<TextView
a:id="@+id/history_time"
style="@style/CppListViewItemTextSecondary"
a:layout_width="fill_parent"
a:layout_height="fill_parent" />
</LinearLayout>

View File

@ -104,7 +104,7 @@
<string name="c_save_history">سجل المحفوظات</string>
<string name="c_edit_history">سجل التعديلات</string>
<string name="c_edit">تعديل</string>
<string name="c_saved_history">السجل المحفوظ</string>
<string name="cpp_history_tab_saved">السجل المحفوظ</string>
<string name="c_history_already_saved">السجل محفوظ مسبقاً!</string>
<string name="c_history_must_be_saved">يجب أن يتم حفظ السجل قبل التعديل!</string>
<string name="c_history_was_removed">تمت إزالة السجل بنجاح!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Uložit historii</string>
<string name="c_edit_history">Upravit historii</string>
<string name="c_edit">Upravit</string>
<string name="c_saved_history">Uložená historie</string>
<string name="cpp_history_tab_saved">Uložená historie</string>
<string name="c_history_already_saved">Historie již byla uložena!</string>
<string name="c_history_must_be_saved">Historie musí být uložena před úpravou!</string>
<string name="c_history_was_removed">Historie byla úspěšně odebrána!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Verlauf speichern</string>
<string name="c_edit_history">Verlauf ändern</string>
<string name="c_edit">Ändern</string>
<string name="c_saved_history">Gespeicherter Verlauf</string>
<string name="cpp_history_tab_saved">Gespeicherter Verlauf</string>
<string name="c_history_already_saved">Verlauf wurde bereits gespeichert!</string>
<string name="c_history_must_be_saved">Verlauf muss vor der Bearbeitung gespeichert werden!</string>
<string name="c_history_was_removed">Verlauf wurde erfolgreich gelöscht!</string>

View File

@ -106,7 +106,7 @@
<string name="c_save_history">Guardar el historial de</string>
<string name="c_edit_history">Modificar la historia</string>
<string name="c_edit">modificar</string>
<string name="c_saved_history">La historia guardada</string>
<string name="cpp_history_tab_saved">La historia guardada</string>
<string name="c_history_already_saved">La historia se salvó ya!</string>
<string name="c_history_must_be_saved">La historia debe ser salvado antes de editar!</string>
<string name="c_history_was_removed">¡El historial se ha eliminado satisfactoriamente!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Tallenna historia</string>
<string name="c_edit_history">Muokkaa historia</string>
<string name="c_edit">Mukauta</string>
<string name="c_saved_history">Tallenna historia</string>
<string name="cpp_history_tab_saved">Tallenna historia</string>
<string name="c_history_already_saved">Historia on jo tallennettu!</string>
<string name="c_history_must_be_saved">Historia on tallennettava ennen muokkaamista!</string>
<string name="c_history_was_removed">Historia on poistettu!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Enregistrer l\'historique</string>
<string name="c_edit_history">Modifier l\'historique</string>
<string name="c_edit">Modifier</string>
<string name="c_saved_history">Historique enregistré</string>
<string name="cpp_history_tab_saved">Historique enregistré</string>
<string name="c_history_already_saved">L\'historique est déjà enregistré !</string>
<string name="c_history_must_be_saved">L\'historique doit être enregistré avant modification !</string>
<string name="c_history_was_removed">L\'historique a été supprimé avec succès !</string>

View File

@ -110,7 +110,7 @@
<string name="c_save_history">Salva storia</string>
<string name="c_edit_history">Modificare la storia</string>
<string name="c_edit">Modificare</string>
<string name="c_saved_history">Storia salvati</string>
<string name="cpp_history_tab_saved">Storia salvati</string>
<string name="c_history_already_saved">La storia era già salvato!</string>
<string name="c_history_must_be_saved">La storia deve essere salvato prima di modificare!</string>
<string name="c_history_was_removed">La cronologia è stata rimossa con successo!</string>

View File

@ -106,7 +106,7 @@
<string name="c_save_history">履歴を保存</string>
<string name="c_edit_history">履歴を編集</string>
<string name="c_edit">編集</string>
<string name="c_saved_history">保存された履歴</string>
<string name="cpp_history_tab_saved">保存された履歴</string>
<string name="c_history_already_saved">履歴はすでに保存されています!</string>
<string name="c_history_must_be_saved">履歴を編集する前に保存してください!</string>
<string name="c_history_was_removed">履歴は正常に削除されました!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Geschiedenis opslaan</string>
<string name="c_edit_history">Geschiedenis wijzigen</string>
<string name="c_edit">Wijzigen</string>
<string name="c_saved_history">Opgeslagen geschiedenis</string>
<string name="cpp_history_tab_saved">Opgeslagen geschiedenis</string>
<string name="c_history_already_saved">Geschiedenis was al opgeslaan!</string>
<string name="c_history_must_be_saved">Geschiedenis moet eerst worden opgeslagen om te bewerken!</string>
<string name="c_history_was_removed">Geschiedenis is succesvol verwijderd!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Zapisz historię</string>
<string name="c_edit_history">Modyfikuj historię</string>
<string name="c_edit">Modyfikuj</string>
<string name="c_saved_history">Zapisana historia</string>
<string name="cpp_history_tab_saved">Zapisana historia</string>
<string name="c_history_already_saved">Historia została już zachowana!</string>
<string name="c_history_must_be_saved">Historia musi być zapisana przed edycją!</string>
<string name="c_history_was_removed">Historia została pomyślnie usunięta!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Salvar histórico</string>
<string name="c_edit_history">Modificar histórico</string>
<string name="c_edit">Modificar</string>
<string name="c_saved_history">Salvar no histórico</string>
<string name="cpp_history_tab_saved">Salvar no histórico</string>
<string name="c_history_already_saved">O histórico já foi salvo!</string>
<string name="c_history_must_be_saved">O histórico deve ser salvo antes de ser editado!</string>
<string name="c_history_was_removed">O histórico foi removido com sucesso!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Guardar histórico</string>
<string name="c_edit_history">Modificar histórico</string>
<string name="c_edit">Modificar</string>
<string name="c_saved_history">Histórico guardado</string>
<string name="cpp_history_tab_saved">Histórico guardado</string>
<string name="c_history_already_saved">O histórico já foi guardado!</string>
<string name="c_history_must_be_saved">O histórico deve ser guardado antes de ser alterado!</string>
<string name="c_history_was_removed">O histórico foi removido com sucesso!</string>

View File

@ -117,7 +117,7 @@
<string name="c_save_history">Сохранить</string>
<string name="c_edit_history">Изменить</string>
<string name="c_edit">Изменить</string>
<string name="c_saved_history">Сохранённая история</string>
<string name="cpp_history_tab_saved">Сохранённая история</string>
<string name="c_history_already_saved">История уже была сохранена!</string>
<string name="c_history_must_be_saved">История должна быть сохранена перед редактированием!</string>
<string name="c_history_was_removed">История успешно удалена!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Geçmişi kaydet</string>
<string name="c_edit_history">Geçmişi düzenle</string>
<string name="c_edit">Düzenle</string>
<string name="c_saved_history">Kayıtlı geçmiş</string>
<string name="cpp_history_tab_saved">Kayıtlı geçmiş</string>
<string name="c_history_already_saved">Geçmiş zaten kaydedildi!</string>
<string name="c_history_must_be_saved">Geçmiş düzenlenmeden önce kaydedilmelidir!</string>
<string name="c_history_was_removed">Geçmiş başarıyla silindi!</string>

View File

@ -108,7 +108,7 @@
<string name="c_save_history">Зберегти історію</string>
<string name="c_edit_history">Змінити історію</string>
<string name="c_edit">Змінити</string>
<string name="c_saved_history">Збережена історія</string>
<string name="cpp_history_tab_saved">Збережена історія</string>
<string name="c_history_already_saved">Історія вже збережена!</string>
<string name="c_history_must_be_saved">Історію необхідно зберегти перед редагуванням!</string>
<string name="c_history_was_removed">Історія успішно видалена!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">Lưu lịch sử</string>
<string name="c_edit_history">Sửa đổi lịch sử</string>
<string name="c_edit">Điều chỉnh</string>
<string name="c_saved_history">Lịch sử đã lưu</string>
<string name="cpp_history_tab_saved">Lịch sử đã lưu</string>
<string name="c_history_already_saved">Lịch sử đã được lưu!</string>
<string name="c_history_must_be_saved">Lịch sử phải được lưu trước khi chỉnh sửa!</string>
<string name="c_history_was_removed">Lịch sử đã được loại bỏ thành công!</string>

View File

@ -104,7 +104,7 @@
<string name="c_save_history">保存历史记录</string>
<string name="c_edit_history">修改历史记录</string>
<string name="c_edit">修改</string>
<string name="c_saved_history">已保存历史记录</string>
<string name="cpp_history_tab_saved">已保存历史记录</string>
<string name="c_history_already_saved">记录已保存!</string>
<string name="c_history_must_be_saved">编辑之前必须先保存!</string>
<string name="c_history_was_removed">已成功删除历史记录!</string>

View File

@ -103,7 +103,7 @@
<string name="c_save_history">儲存歷史紀錄</string>
<string name="c_edit_history">修改歷史紀錄</string>
<string name="c_edit">修改</string>
<string name="c_saved_history">已儲存的歷史紀錄</string>
<string name="cpp_history_tab_saved">已儲存的歷史紀錄</string>
<string name="c_history_already_saved">歷史紀錄已經儲存!</string>
<string name="c_history_must_be_saved">編輯歷史紀錄之前必須先儲存!</string>
<string name="c_history_was_removed">成功刪除歷史紀錄!</string>

View File

@ -29,14 +29,14 @@
<color name="cpp_button_text">#ffffffff</color>
<color name="cpp_button_text_operator">#ffffff99</color>
<color name="cpp_selected_angle_unit_text">#ffffff99</color>
<color name="cpp_main_bg">#101010</color>
<color name="cpp_main_bg">@color/grey_950</color>
<color name="cpp_main_bg_light">#fff6f1ef</color>
<color name="cpp_wizard_button_normal">#424242</color>
<color name="cpp_wizard_button_disabled">#616161</color>
<color name="cpp_wizard_button_pressed">#757575</color>
<color name="cpp_metro_button_dark">#ff000000</color>
<color name="cpp_metro_button">@color/cpp_material_grey</color>
<color name="cpp_metro_button_light">@color/cpp_material_grey_light</color>
<color name="cpp_metro_button">@color/grey_900</color>
<color name="cpp_metro_button_light">@color/grey_800</color>
<color name="cpp_metro_blue">#10648c</color>
<color name="cpp_material_blue">#ff0d4663</color>
<color name="cpp_material_blue_lighter">#ff0d668d</color>
@ -53,12 +53,15 @@
<color name="cpp_wizard_disabled_text">#66ffffff</color>
<color name="cpp_material_accent">#FAFAFA</color>
<color name="cpp_material_grey">#212121</color>
<color name="cpp_material_grey_light">#393939</color>
<color name="cpp_material_actionbar">@color/cpp_material_grey</color>
<color name="cpp_material_actionbar_light">@color/cpp_material_grey_light</color>
<color name="cpp_material_actionbar">@color/grey_900</color>
<color name="cpp_material_actionbar_light">@color/grey_800</color>
<color name="cpp_pane_bg">@color/cpp_material_grey</color>
<color name="cpp_pane_bg">@color/grey_900</color>
<color name="cpp_pane_bg_light">#ffeae5e3</color>
<color name="grey_900">#212121</color>
<color name="grey_950">#101010</color>
<color name="grey_600">#757575</color>
<color name="grey_800">#424242</color>
<color name="blue_grey_800">#37474F</color>
</resources>

View File

@ -253,15 +253,23 @@
<item name="android:layout_gravity">center_horizontal</item>
</style>
<style name="CppListViewItem">
<style name="CppListItem.OneLine" parent="CppListItem">
<item name="android:minHeight">48dp</item>
</style>
<style name="CppListItem.TwoLines" parent="CppListItem">
<item name="android:minHeight">72dp</item>
</style>
<style name="CppListItem">
<item name="android:paddingLeft">16dp</item>
<item name="android:paddingRight">16dp</item>
<item name="android:paddingBottom">20dp</item>
<item name="android:paddingTop">20dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:paddingTop">8dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">match_parent</item>
<item name="android:minHeight">72dp</item>
<item name="android:gravity">center_vertical|left</item>
<item name="android:background">?android:attr/selectableItemBackground</item>
</style>
<style name="CppFab">
@ -274,10 +282,23 @@
<item name="fab_colorRipple">?attr/colorControlHighlight</item>
</style>
<style name="CppListViewItemTextPrimary">
<item name="android:textAppearance">@style/TextAppearance.AppCompat</item>
<style name="CppListItemText">
<item name="android:textSize">@dimen/list_item_text_size</item>
</style>
<style name="CppListItemText.Primary" parent="CppListItemText">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">@dimen/cpp_li_text_size</item>
</style>
<style name="CppListItemText.Secondary" parent="CppListItemText">
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
<style name="CppListItemText.Secondary.OneLine" parent="CppListItemText.Secondary">
<item name="android:singleLine">true</item>
<item name="android:minLines">1</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
</style>
<style name="CppListViewItemTextSecondary">
@ -286,7 +307,7 @@
<item name="android:textSize">@dimen/cpp_li_secondary_text_size</item>
</style>
<style name="CppListViewItemTextPrimary.History" parent="CppListViewItemTextPrimary">
<style name="CppListViewItemTextPrimary.History" parent="CppListItemText.Primary">
<item name="android:maxLines">2</item>
<item name="android:ellipsize">end</item>
</style>
@ -321,4 +342,6 @@
<item name="android:backgroundSplit">@color/cpp_material_actionbar_light</item>
</style>
<dimen name="list_item_text_size">16sp</dimen>
<dimen name="list_item_text_size_small">14sp</dimen>
</resources>

View File

@ -103,7 +103,8 @@
<string name="c_save_history">Save history</string>
<string name="c_edit_history">Modify history</string>
<string name="c_edit">Modify</string>
<string name="c_saved_history">Saved history</string>
<string name="cpp_history_tab_saved">Saved</string>
<string name="cpp_history_tab_recent">Recent</string>
<string name="c_history_already_saved">History was already saved!</string>
<string name="c_history_must_be_saved">History must be saved before editing!</string>
<string name="c_history_was_removed">History has been successfully removed!</string>

View File

@ -33,9 +33,11 @@
<item name="cpp_main_bg">@color/cpp_main_bg</item>
<item name="cpp_pane_bg">@drawable/pane</item>
<item name="cpp_fab_bg">@color/cpp_material_grey</item>
<item name="cpp_fab_bg">@color/grey_900</item>
<item name="cpp_text_color">@color/cpp_text</item>
<item name="cpp_text_color_error">@color/cpp_text_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Dialog" parent="@style/Theme.AppCompat.Dialog">
@ -50,9 +52,11 @@
<item name="cpp_main_bg">@color/cpp_main_bg</item>
<item name="cpp_pane_bg">@drawable/pane</item>
<item name="cpp_fab_bg">@color/cpp_material_grey</item>
<item name="cpp_fab_bg">@color/grey_900</item>
<item name="cpp_text_color">@color/cpp_text</item>
<item name="cpp_text_color_error">@color/cpp_text_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Dialog.Alert" parent="@style/Theme.AppCompat.Dialog.Alert">
@ -62,9 +66,11 @@
<item name="cpp_main_bg">@color/cpp_main_bg</item>
<item name="cpp_pane_bg">@drawable/pane</item>
<item name="cpp_fab_bg">@color/cpp_material_grey</item>
<item name="cpp_fab_bg">@color/grey_900</item>
<item name="cpp_text_color">@color/cpp_text</item>
<item name="cpp_text_color_error">@color/cpp_text_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Light" parent="@style/Theme.AppCompat.Light.DarkActionBar">
@ -81,6 +87,8 @@
<item name="cpp_fab_bg">@color/cpp_material_light</item>
<item name="cpp_text_color">@color/cpp_text_inverse</item>
<item name="cpp_text_color_error">@color/cpp_text_inverse_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Light.Dialog" parent="@style/Theme.AppCompat.Light.Dialog">
@ -98,6 +106,8 @@
<item name="cpp_fab_bg">@color/cpp_material_light</item>
<item name="cpp_text_color">@color/cpp_text_inverse</item>
<item name="cpp_text_color_error">@color/cpp_text_inverse_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Light.Dialog.Alert" parent="@style/Theme.AppCompat.Light.Dialog.Alert">
@ -110,6 +120,8 @@
<item name="cpp_fab_bg">@color/cpp_material_light</item>
<item name="cpp_text_color">@color/cpp_text_inverse</item>
<item name="cpp_text_color_error">@color/cpp_text_inverse_error</item>
<item name="android:listDivider">@drawable/divider</item>
</style>
<style name="Cpp.Theme.Wizard" parent="Cpp.Theme.Material">