11package com .blogspot .e_kanivets .moneytracker .fragment ;
22
33import android .app .Activity ;
4+ import android .content .Intent ;
45import android .os .Bundle ;
56import android .support .v4 .app .Fragment ;
7+ import android .support .v7 .widget .PopupMenu ;
8+ import android .view .ContextMenu ;
69import android .view .LayoutInflater ;
10+ import android .view .MenuItem ;
711import android .view .View ;
812import android .view .ViewGroup ;
13+ import android .view .ViewTreeObserver ;
14+ import android .widget .AdapterView ;
15+ import android .widget .BaseAdapter ;
16+ import android .widget .Button ;
17+ import android .widget .ListView ;
18+ import android .widget .TextView ;
919
1020import com .blogspot .e_kanivets .moneytracker .R ;
1121import com .blogspot .e_kanivets .moneytracker .activity .NavDrawerActivity ;
22+ import com .blogspot .e_kanivets .moneytracker .activity .ReportActivity ;
23+ import com .blogspot .e_kanivets .moneytracker .adapter .RecordAdapter ;
24+ import com .blogspot .e_kanivets .moneytracker .helper .MTHelper ;
25+ import com .blogspot .e_kanivets .moneytracker .helper .PeriodHelper ;
26+ import com .blogspot .e_kanivets .moneytracker .model .Record ;
27+ import com .blogspot .e_kanivets .moneytracker .ui .AddExpenseDialog ;
28+ import com .blogspot .e_kanivets .moneytracker .ui .AddIncomeDialog ;
29+ import com .blogspot .e_kanivets .moneytracker .ui .AppRateDialog ;
30+ import com .blogspot .e_kanivets .moneytracker .ui .ChangeDateDialog ;
31+ import com .blogspot .e_kanivets .moneytracker .util .AppUtils ;
32+
33+ import java .util .Calendar ;
34+ import java .util .Date ;
35+ import java .util .Observable ;
36+ import java .util .Observer ;
1237
1338/**
1439 * A simple {@link Fragment} subclass.
1540 * Use the {@link RecordsFragment#newInstance} factory method to
1641 * create an instance of this fragment.
1742 */
18- public class RecordsFragment extends Fragment {
43+ public class RecordsFragment extends Fragment implements View . OnClickListener , Observer {
1944 private static final String KEY_POSITION = "key_position" ;
2045
2146 private int position ;
2247
48+ private ListView listView ;
49+
50+ private TextView tvFromDate ;
51+ private TextView tvToDate ;
52+
2353 /**
2454 * Use this factory method to create a new instance of
2555 * this fragment using the provided parameters.
@@ -52,7 +82,9 @@ public void onCreate(Bundle savedInstanceState) {
5282 public View onCreateView (LayoutInflater inflater , ViewGroup container ,
5383 Bundle savedInstanceState ) {
5484 // Inflate the layout for this fragment
55- return inflater .inflate (R .layout .fragment_records , container , false );
85+ View rootView = inflater .inflate (R .layout .fragment_records , container , false );
86+ initViews (rootView );
87+ return rootView ;
5688 }
5789
5890 @ Override
@@ -61,4 +93,207 @@ public void onAttach(Activity activity) {
6193
6294 ((NavDrawerActivity ) activity ).onSectionAttached (position );
6395 }
96+
97+ @ Override
98+ public void onCreateContextMenu (ContextMenu menu , View v , ContextMenu .ContextMenuInfo menuInfo ) {
99+ super .onCreateContextMenu (menu , v , menuInfo );
100+
101+ getActivity ().getMenuInflater ().inflate (R .menu .menu_record , menu );
102+ }
103+
104+ @ Override
105+ public boolean onContextItemSelected (MenuItem item ) {
106+ AdapterView .AdapterContextMenuInfo info = (AdapterView .AdapterContextMenuInfo ) item .getMenuInfo ();
107+
108+ switch (item .getItemId ()) {
109+ case R .id .edit :
110+ Record record = MTHelper .getInstance ().getRecords ().get (info .position );
111+ if (record .isIncome ()) {
112+ AddIncomeDialog dialog = new AddIncomeDialog (getActivity (), record , AddIncomeDialog .Mode .MODE_EDIT );
113+ dialog .show ();
114+ } else {
115+ AddExpenseDialog dialog = new AddExpenseDialog (getActivity (), record , AddExpenseDialog .Mode .MODE_EDIT );
116+ dialog .show ();
117+ }
118+ return true ;
119+ case R .id .delete :
120+ MTHelper .getInstance ().deleteRecordById (MTHelper .getInstance ().getRecords ().
121+ get (info .position ).getId ());
122+ return true ;
123+ default :
124+ return super .onContextItemSelected (item );
125+ }
126+ }
127+
128+ @ Override
129+ public void onClick (View view ) {
130+ switch (view .getId ()) {
131+ case R .id .btn_add_expense :
132+ showAddExpenseDialog ();
133+ break ;
134+
135+ case R .id .btn_add_income :
136+ showAddIncomeDialog ();
137+ break ;
138+
139+ case R .id .btn_select_period :
140+ showSelectPopupMenu (view );
141+ break ;
142+
143+ case R .id .btn_report :
144+ Intent intent = new Intent (getActivity (), ReportActivity .class );
145+ startActivity (intent );
146+ break ;
147+
148+ case R .id .tv_from_date :
149+ showChangeFromDateDialog ();
150+ break ;
151+
152+ case R .id .tv_to_date :
153+ showChangeToDateDialog ();
154+ break ;
155+
156+ default :
157+ break ;
158+ }
159+ }
160+
161+ @ Override
162+ public void update (Observable observable , Object o ) {
163+ ((BaseAdapter ) listView .getAdapter ()).notifyDataSetChanged ();
164+ }
165+
166+ private void initViews (View rootView ) {
167+ if (rootView != null ) {
168+ View btnAddIncome = rootView .findViewById (R .id .btn_add_income );
169+ View btnAddExpense = rootView .findViewById (R .id .btn_add_expense );
170+ View btnReport = rootView .findViewById (R .id .btn_report );
171+ View btnSelectPeriod = rootView .findViewById (R .id .btn_select_period );
172+
173+ tvFromDate = (TextView ) rootView .findViewById (R .id .tv_from_date );
174+ tvToDate = (TextView ) rootView .findViewById (R .id .tv_to_date );
175+
176+ listView = (ListView ) rootView .findViewById (R .id .listView );
177+
178+ //Set dates of current week
179+ tvFromDate .setText (MTHelper .getInstance ().getFirstDay ());
180+ tvToDate .setText (MTHelper .getInstance ().getLastDay ());
181+
182+ //Set listeners
183+ btnAddIncome .setOnClickListener (RecordsFragment .this );
184+ btnAddExpense .setOnClickListener (RecordsFragment .this );
185+ btnSelectPeriod .setOnClickListener (RecordsFragment .this );
186+ tvFromDate .setOnClickListener (RecordsFragment .this );
187+ tvToDate .setOnClickListener (RecordsFragment .this );
188+ btnReport .setOnClickListener (RecordsFragment .this );
189+
190+ listView .setAdapter (new RecordAdapter (getActivity (), MTHelper .getInstance ().getRecords ()));
191+ ((BaseAdapter ) listView .getAdapter ()).notifyDataSetChanged ();
192+ registerForContextMenu (listView );
193+
194+ /* Scroll list to bottom only once at start */
195+ listView .getViewTreeObserver ().addOnGlobalLayoutListener (new ViewTreeObserver .OnGlobalLayoutListener () {
196+ private boolean isFirst = true ;
197+
198+ @ Override
199+ public void onGlobalLayout () {
200+ if (isFirst ) {
201+ isFirst = false ;
202+ listView .setSelection (listView .getCount ()-1 );
203+ if (AppUtils .checkRateDialog (getActivity ())) {
204+ showAppRateDialog ();
205+ }
206+ }
207+ }
208+ });
209+
210+ //Subscribe to helper
211+ MTHelper .getInstance ().addObserver (this );
212+ }
213+ }
214+
215+ private void showAddIncomeDialog () {
216+ AddIncomeDialog dialog = new AddIncomeDialog (getActivity (), null , AddIncomeDialog .Mode .MODE_ADD );
217+ dialog .show ();
218+ }
219+
220+ private void showAddExpenseDialog () {
221+ AddExpenseDialog dialog = new AddExpenseDialog (getActivity (), null , AddExpenseDialog .Mode .MODE_ADD );
222+ dialog .show ();
223+ }
224+
225+ private void showSelectPopupMenu (View view ) {
226+ PopupMenu popupMenu = new PopupMenu (getActivity (), view );
227+ popupMenu .getMenuInflater ().inflate (R .menu .menu_popup , popupMenu .getMenu ());
228+
229+ popupMenu .setOnMenuItemClickListener (new PopupMenu .OnMenuItemClickListener () {
230+ @ Override
231+ public boolean onMenuItemClick (MenuItem menuItem ) {
232+ Calendar calendar = Calendar .getInstance ();
233+ calendar .clear (Calendar .MINUTE );
234+ calendar .clear (Calendar .SECOND );
235+ calendar .clear (Calendar .MILLISECOND );
236+
237+ switch (menuItem .getItemId ()) {
238+ case R .id .period_day :
239+ MTHelper .getInstance ().setPeriod (PeriodHelper .getInstance ().getDayPeriod ());
240+ break ;
241+ case R .id .period_week :
242+ MTHelper .getInstance ().setPeriod (PeriodHelper .getInstance ().getWeekPeriod ());
243+ break ;
244+ case R .id .period_month :
245+ MTHelper .getInstance ().setPeriod (PeriodHelper .getInstance ().getMonthPeriod ());
246+ break ;
247+ case R .id .period_year :
248+ MTHelper .getInstance ().setPeriod (PeriodHelper .getInstance ().getYearPeriod ());
249+ break ;
250+ default :
251+ break ;
252+ }
253+
254+ MTHelper .getInstance ().update ();
255+
256+ tvFromDate .setText (MTHelper .getInstance ().getFirstDay ());
257+ tvToDate .setText (MTHelper .getInstance ().getLastDay ());
258+
259+ return false ;
260+ }
261+ });
262+
263+ popupMenu .show ();
264+ }
265+
266+ private void showChangeFromDateDialog () {
267+ ChangeDateDialog dialog = new ChangeDateDialog (getActivity (),
268+ MTHelper .getInstance ().getPeriod ().getFirst (), new ChangeDateDialog .OnDateChangedListener () {
269+ @ Override
270+ public void OnDataChanged (Date date ) {
271+ MTHelper .getInstance ().getPeriod ().setFirst (date );
272+ MTHelper .getInstance ().update ();
273+
274+ tvFromDate .setText (MTHelper .getInstance ().getFirstDay ());
275+ }
276+ });
277+ dialog .show ();
278+ }
279+
280+ private void showChangeToDateDialog () {
281+ ChangeDateDialog dialog = new ChangeDateDialog (getActivity (),
282+ MTHelper .getInstance ().getPeriod ().getLast (), new ChangeDateDialog .OnDateChangedListener () {
283+ @ Override
284+ public void OnDataChanged (Date date ) {
285+ MTHelper .getInstance ().getPeriod ().setLast (date );
286+ MTHelper .getInstance ().update ();
287+
288+ tvToDate .setText (MTHelper .getInstance ().getLastDay ());
289+ }
290+ });
291+ dialog .show ();
292+ }
293+
294+ private void showAppRateDialog () {
295+ AppRateDialog dialog = new AppRateDialog (getActivity ());
296+ dialog .setCanceledOnTouchOutside (false );
297+ dialog .show ();
298+ }
64299}
0 commit comments