Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.

Commit dee73c8

Browse files
author
Evgenii Kanivets
committed
#70[2h]. Refactor AddRecordActivity to simplify validation implementation.
1 parent 16b0251 commit dee73c8

File tree

3 files changed

+169
-118
lines changed

3 files changed

+169
-118
lines changed

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.java

Lines changed: 51 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
import android.annotation.SuppressLint;
44
import android.app.DatePickerDialog;
55
import android.app.TimePickerDialog;
6-
import android.graphics.drawable.ColorDrawable;
7-
import android.os.Build;
8-
import android.support.annotation.Nullable;
9-
import android.support.annotation.StyleRes;
106
import android.support.v7.widget.AppCompatSpinner;
117
import android.text.InputFilter;
128
import android.text.Spanned;
@@ -15,8 +11,6 @@
1511
import android.view.Menu;
1612
import android.view.MenuItem;
1713
import android.view.View;
18-
import android.view.Window;
19-
import android.view.WindowManager;
2014
import android.view.inputmethod.EditorInfo;
2115
import android.widget.AdapterView;
2216
import android.widget.ArrayAdapter;
@@ -36,6 +30,7 @@
3630
import com.blogspot.e_kanivets.moneytracker.entity.data.Account;
3731
import com.blogspot.e_kanivets.moneytracker.entity.data.Category;
3832
import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
33+
import com.blogspot.e_kanivets.moneytracker.ui.AddRecordUiDecorator;
3934
import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter;
4035

4136
import java.util.ArrayList;
@@ -67,8 +62,6 @@ public class AddRecordActivity extends BaseBackActivity {
6762

6863
private List<Account> accountList;
6964
private long timestamp;
70-
@StyleRes
71-
private int dialogTheme;
7265

7366
@Inject
7467
CategoryController categoryController;
@@ -79,6 +72,8 @@ public class AddRecordActivity extends BaseBackActivity {
7972
@Inject
8073
FormatController formatController;
8174

75+
AddRecordUiDecorator uiDecorator;
76+
8277
@Bind(R.id.tv_date)
8378
TextView tvDate;
8479
@Bind(R.id.tv_time)
@@ -102,6 +97,8 @@ protected boolean initData() {
10297
super.initData();
10398
getAppComponent().inject(AddRecordActivity.this);
10499

100+
uiDecorator = new AddRecordUiDecorator(AddRecordActivity.this);
101+
105102
record = getIntent().getParcelableExtra(KEY_RECORD);
106103
mode = (Mode) getIntent().getSerializableExtra(KEY_MODE);
107104
type = getIntent().getIntExtra(KEY_TYPE, -1);
@@ -126,42 +123,9 @@ protected void initViews() {
126123
etPrice.setText(formatController.formatPrecisionNone(record.getFullPrice()));
127124
}
128125

126+
uiDecorator.decorateActionBar(getSupportActionBar(), mode, type);
129127
presentSpinnerAccount();
130128

131-
dialogTheme = 0;
132-
if (getSupportActionBar() != null) {
133-
switch (type) {
134-
case Record.TYPE_EXPENSE:
135-
if (mode == Mode.MODE_ADD) getSupportActionBar().setTitle(R.string.title_add_expense);
136-
else getSupportActionBar().setTitle(R.string.title_edit_expense);
137-
getSupportActionBar().setBackgroundDrawable(
138-
new ColorDrawable(getResources().getColor(R.color.red_light)));
139-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
140-
Window window = getWindow();
141-
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
142-
window.setStatusBarColor(getResources().getColor(R.color.red_dark));
143-
dialogTheme = R.style.RedDialogTheme;
144-
}
145-
break;
146-
147-
case Record.TYPE_INCOME:
148-
if (mode == Mode.MODE_ADD) getSupportActionBar().setTitle(R.string.title_add_income);
149-
else getSupportActionBar().setTitle(R.string.title_edit_income);
150-
getSupportActionBar().setBackgroundDrawable(
151-
new ColorDrawable(getResources().getColor(R.color.green_light)));
152-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
153-
Window window = getWindow();
154-
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
155-
window.setStatusBarColor(getResources().getColor(R.color.green_dark));
156-
dialogTheme = R.style.GreenDialogTheme;
157-
}
158-
break;
159-
160-
default:
161-
break;
162-
}
163-
}
164-
165129
etCategory.setAdapter(new CategoryAutoCompleteAdapter(AddRecordActivity.this,
166130
R.layout.view_category_item, new CategoryAutoCompleter(categoryController)));
167131
etCategory.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@@ -199,9 +163,6 @@ public boolean onPrepareOptionsMenu(Menu menu) {
199163
menu.removeItem(R.id.action_delete);
200164
break;
201165

202-
case MODE_EDIT:
203-
break;
204-
205166
default:
206167
break;
207168
}
@@ -231,22 +192,22 @@ public boolean onOptionsItemSelected(MenuItem item) {
231192
public void selectDate() {
232193
Calendar calendar = Calendar.getInstance();
233194
calendar.setTimeInMillis(timestamp);
234-
DatePickerDialog dialog = new DatePickerDialog(AddRecordActivity.this, dialogTheme,
235-
new DatePickerDialog.OnDateSetListener() {
236-
@Override
237-
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
238-
Calendar calendar = Calendar.getInstance();
239-
calendar.setTimeInMillis(timestamp);
240-
calendar.set(Calendar.YEAR, year);
241-
calendar.set(Calendar.MONTH, monthOfYear);
242-
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
243-
244-
if (calendar.getTimeInMillis() < new Date().getTime()) {
245-
timestamp = calendar.getTimeInMillis();
246-
updateDateAndTime();
247-
}
248-
}
249-
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
195+
DatePickerDialog dialog = new DatePickerDialog(AddRecordActivity.this,
196+
uiDecorator.getTheme(type), new DatePickerDialog.OnDateSetListener() {
197+
@Override
198+
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
199+
Calendar calendar = Calendar.getInstance();
200+
calendar.setTimeInMillis(timestamp);
201+
calendar.set(Calendar.YEAR, year);
202+
calendar.set(Calendar.MONTH, monthOfYear);
203+
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
204+
205+
if (calendar.getTimeInMillis() < new Date().getTime()) {
206+
timestamp = calendar.getTimeInMillis();
207+
updateDateAndTime();
208+
}
209+
}
210+
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
250211
calendar.get(Calendar.DAY_OF_MONTH));
251212
dialog.show();
252213
}
@@ -255,21 +216,21 @@ public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth
255216
public void selectTime() {
256217
Calendar calendar = Calendar.getInstance();
257218
calendar.setTimeInMillis(timestamp);
258-
TimePickerDialog dialog = new TimePickerDialog(AddRecordActivity.this, dialogTheme,
259-
new TimePickerDialog.OnTimeSetListener() {
260-
@Override
261-
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
262-
Calendar calendar = Calendar.getInstance();
263-
calendar.setTimeInMillis(timestamp);
264-
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
265-
calendar.set(Calendar.MINUTE, minute);
266-
267-
if (calendar.getTimeInMillis() < new Date().getTime()) {
268-
timestamp = calendar.getTimeInMillis();
269-
updateDateAndTime();
270-
}
271-
}
272-
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
219+
TimePickerDialog dialog = new TimePickerDialog(AddRecordActivity.this,
220+
uiDecorator.getTheme(type), new TimePickerDialog.OnTimeSetListener() {
221+
@Override
222+
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
223+
Calendar calendar = Calendar.getInstance();
224+
calendar.setTimeInMillis(timestamp);
225+
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
226+
calendar.set(Calendar.MINUTE, minute);
227+
228+
if (calendar.getTimeInMillis() < new Date().getTime()) {
229+
timestamp = calendar.getTimeInMillis();
230+
updateDateAndTime();
231+
}
232+
}
233+
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
273234
DateFormat.is24HourFormat(AddRecordActivity.this));
274235
dialog.show();
275236
}
@@ -344,38 +305,25 @@ private boolean prepareRecord() {
344305
Account account = null;
345306
if (spinnerAccount.isEnabled())
346307
account = accountList.get(spinnerAccount.getSelectedItemPosition());
347-
348-
return doRecord(timestamp, title, category, price, account);
349-
}
350-
351-
private boolean doRecord(long timestamp, String title, String category, double price,
352-
@Nullable Account account) {
308+
//noinspection SimplifiableIfStatement
353309
if (account == null) return false;
354310

355-
if (mode == Mode.MODE_ADD) {
356-
switch (type) {
357-
case Record.TYPE_EXPENSE:
358-
recordController.create(new Record(timestamp, Record.TYPE_EXPENSE, title,
359-
new Category(category), price, account, account.getCurrency()));
360-
return true;
311+
return makeRecord(timestamp, title, category, price, account);
312+
}
361313

362-
case Record.TYPE_INCOME:
363-
recordController.create(new Record(timestamp, Record.TYPE_INCOME, title,
364-
new Category(category), price, account, account.getCurrency()));
365-
return true;
314+
/**
315+
* All data must be valid here.
316+
*/
317+
private boolean makeRecord(long timestamp, String title, String category, double price, Account account) {
318+
long recordId = (record == null ? -1 : record.getId());
319+
Record record = new Record(recordId, timestamp, type, title, new Category(category),
320+
price, account, account.getCurrency());
366321

367-
default:
368-
return false;
369-
}
370-
} else if (mode == Mode.MODE_EDIT) {
371-
Record updatedRecord = new Record(record.getId(), timestamp, record.getType(),
372-
title, new Category(category), price, account, account.getCurrency());
373-
recordController.update(updatedRecord);
374-
375-
return true;
376-
}
322+
Record resultedRecord = null;
323+
if (mode == Mode.MODE_ADD) resultedRecord = recordController.create(record);
324+
else if (mode == Mode.MODE_EDIT) resultedRecord = recordController.update(record);
377325

378-
return false;
326+
return resultedRecord != null;
379327
}
380328

381329
private void updateDateAndTime() {

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,17 @@ public void onPeriodSelected(Period period) {
126126
public void editRecord(int position) {
127127
// Minus one because of list view's header view
128128
Record record = recordList.get(position - 1);
129-
if (record.isIncome())
130-
startAddIncomeActivity(record, AddRecordActivity.Mode.MODE_EDIT);
131-
else startAddExpenseActivity(record, AddRecordActivity.Mode.MODE_EDIT);
129+
startAddRecordActivity(record, AddRecordActivity.Mode.MODE_EDIT, record.getType());
132130
}
133131

134132
@OnClick(R.id.btn_add_expense)
135133
public void addExpense() {
136-
startAddExpenseActivity(null, AddRecordActivity.Mode.MODE_ADD);
134+
startAddRecordActivity(null, AddRecordActivity.Mode.MODE_ADD, Record.TYPE_EXPENSE);
137135
}
138136

139137
@OnClick(R.id.btn_add_income)
140138
public void addIncome() {
141-
startAddIncomeActivity(null, AddRecordActivity.Mode.MODE_ADD);
139+
startAddRecordActivity(null, AddRecordActivity.Mode.MODE_ADD, Record.TYPE_INCOME);
142140
}
143141

144142
public void showReport() {
@@ -191,19 +189,11 @@ private void showAppRateDialog() {
191189
dialog.show();
192190
}
193191

194-
private void startAddIncomeActivity(Record record, AddRecordActivity.Mode mode) {
192+
private void startAddRecordActivity(Record record, AddRecordActivity.Mode mode, int type) {
195193
Intent intent = new Intent(MainActivity.this, AddRecordActivity.class);
196194
intent.putExtra(AddRecordActivity.KEY_RECORD, record);
197195
intent.putExtra(AddRecordActivity.KEY_MODE, mode);
198-
intent.putExtra(AddRecordActivity.KEY_TYPE, Record.TYPE_INCOME);
199-
startActivityForResult(intent, REQUEST_ACTION_RECORD);
200-
}
201-
202-
private void startAddExpenseActivity(Record record, AddRecordActivity.Mode mode) {
203-
Intent intent = new Intent(MainActivity.this, AddRecordActivity.class);
204-
intent.putExtra(AddRecordActivity.KEY_RECORD, record);
205-
intent.putExtra(AddRecordActivity.KEY_MODE, mode);
206-
intent.putExtra(AddRecordActivity.KEY_TYPE, Record.TYPE_EXPENSE);
196+
intent.putExtra(AddRecordActivity.KEY_TYPE, type);
207197
startActivityForResult(intent, REQUEST_ACTION_RECORD);
208198
}
209199

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.blogspot.e_kanivets.moneytracker.ui;
2+
3+
import android.app.Activity;
4+
import android.content.res.Resources;
5+
import android.graphics.drawable.ColorDrawable;
6+
import android.os.Build;
7+
import android.support.annotation.NonNull;
8+
import android.support.annotation.Nullable;
9+
import android.support.annotation.StyleRes;
10+
import android.support.v7.app.ActionBar;
11+
import android.view.Window;
12+
import android.view.WindowManager;
13+
14+
import com.blogspot.e_kanivets.moneytracker.R;
15+
import com.blogspot.e_kanivets.moneytracker.activity.record.AddRecordActivity;
16+
import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
17+
18+
/**
19+
* Util class to encapsulate toolbar customization for AddRecordActivity
20+
* Created on 9/2/16.
21+
*
22+
* @author Evgenii Kanivets
23+
*/
24+
public class AddRecordUiDecorator {
25+
private Activity activity;
26+
27+
@StyleRes
28+
private int dialogTheme = -1;
29+
30+
private int redLightColor;
31+
private int redDarkColor;
32+
private int greenLightColor;
33+
private int greenDarkColor;
34+
35+
@SuppressWarnings("deprecation")
36+
public AddRecordUiDecorator(@NonNull Activity activity) {
37+
this.activity = activity;
38+
39+
Resources resources = activity.getResources();
40+
redLightColor = resources.getColor(R.color.red_light);
41+
redDarkColor = resources.getColor(R.color.red_dark);
42+
greenLightColor = resources.getColor(R.color.green_light);
43+
greenDarkColor = resources.getColor(R.color.green_dark);
44+
}
45+
46+
/**
47+
* @param type of record to handle, may be TYPE_EXPENSE or TYPE_INCOME
48+
* @return theme res id
49+
*/
50+
@StyleRes
51+
public int getTheme(int type) {
52+
if (dialogTheme == -1) {
53+
switch (type) {
54+
case Record.TYPE_EXPENSE:
55+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
56+
dialogTheme = R.style.RedDialogTheme;
57+
}
58+
break;
59+
60+
case Record.TYPE_INCOME:
61+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
62+
dialogTheme = R.style.GreenDialogTheme;
63+
}
64+
break;
65+
66+
default:
67+
break;
68+
}
69+
}
70+
71+
return dialogTheme;
72+
}
73+
74+
/**
75+
* @param actionBar to decorate
76+
* @param mode - MODE_ADD or MODE_EDIT
77+
* @param type of record to handle, may be TYPE_EXPENSE or TYPE_INCOME
78+
*/
79+
public void decorateActionBar(@Nullable ActionBar actionBar, AddRecordActivity.Mode mode, int type) {
80+
if (actionBar == null) return;
81+
82+
switch (type) {
83+
case Record.TYPE_EXPENSE:
84+
if (mode == AddRecordActivity.Mode.MODE_ADD)
85+
actionBar.setTitle(R.string.title_add_expense);
86+
else actionBar.setTitle(R.string.title_edit_expense);
87+
88+
actionBar.setBackgroundDrawable(new ColorDrawable(redLightColor));
89+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
90+
Window window = activity.getWindow();
91+
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
92+
window.setStatusBarColor(redDarkColor);
93+
}
94+
break;
95+
96+
case Record.TYPE_INCOME:
97+
if (mode == AddRecordActivity.Mode.MODE_ADD)
98+
actionBar.setTitle(R.string.title_add_income);
99+
else actionBar.setTitle(R.string.title_edit_income);
100+
101+
actionBar.setBackgroundDrawable(new ColorDrawable(greenLightColor));
102+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
103+
Window window = activity.getWindow();
104+
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
105+
window.setStatusBarColor(greenDarkColor);
106+
}
107+
break;
108+
109+
default:
110+
break;
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)