package slidenerd.vivz.bucketdrops.home;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import io.realm.Realm;
import io.realm.RealmChangeListener;
import io.realm.RealmResults;
import io.realm.Sort;
import slidenerd.vivz.bucketdrops.R;
import slidenerd.vivz.bucketdrops.adapters.AdapterDrops;
import slidenerd.vivz.bucketdrops.adapters.AddListener;
import slidenerd.vivz.bucketdrops.adapters.Divider;
import slidenerd.vivz.bucketdrops.adapters.OnAddListener;
import slidenerd.vivz.bucketdrops.adapters.SimpleTouchCallback;
import slidenerd.vivz.bucketdrops.beans.Drop;
import slidenerd.vivz.bucketdrops.extras.Util;
import slidenerd.vivz.bucketdrops.widgets.BucketRecyclerView;
import static slidenerd.vivz.bucketdrops.extras.Constants.COMPLETED;
import static slidenerd.vivz.bucketdrops.extras.Constants.POSITION;
import static slidenerd.vivz.bucketdrops.extras.Constants.SHOW_COMPLETE;
import static slidenerd.vivz.bucketdrops.extras.Constants.SHOW_INCOMPLETE;
import static slidenerd.vivz.bucketdrops.extras.Constants.SORT_ASCENDING_DATE;
import static slidenerd.vivz.bucketdrops.extras.Constants.SORT_DESCENDING_DATE;
import static slidenerd.vivz.bucketdrops.extras.Constants.WHEN;
public class ActivityMain extends AppCompatActivity {
public static final String TAG_DIALOG = "dialog_add";
private Realm mRealm;
private RealmResults<Drop> mResults;
private BucketRecyclerView mRecycler;
private Button mBtnAdd;
//The View to be displayed when the RecyclerView is empty.
private View mEmptyView;
private Toolbar mToolbar;
private AdapterDrops mAdapter;
private ImageView mBackground;
private OnAddListener mOnAddListener = new OnAddListener() {
@Override
public void onAdd(Drop drop) {
mAdapter.add(drop);
}
};
//When the add row_drop button is clicked, show a dialog that lets the person add a new row_drop
private View.OnClickListener mBtnAddListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialogAdd();
}
};
private AddListener mAddListener = new AddListener() {
@Override
public void add() {
showDialogAdd();
}
};
private DialogMark.MarkedListener mMarkedListener = new DialogMark.MarkedListener() {
@Override
public void onMarked(int position) {
//Mark an row_drop as complete in our database when the user clicks "Mark as Complete"
mAdapter.markComplete(position);
}
};
private AdapterDrops.MarkListener mMarkListener = new AdapterDrops.MarkListener() {
@Override
public void onMark(int position) {
//Launch the DialogMark which are shown when the user clicks on some row_drop from our RecyclerView
Bundle arguments = new Bundle();
arguments.putInt(POSITION, position);
DialogMark dialog = new DialogMark();
dialog.setArguments(arguments);
dialog.setDialogActionsListener(mMarkedListener);
dialog.show(getSupportFragmentManager(), "dialog_mark");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRealm = Realm.getDefaultInstance();
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
initBackgroundImage();
initRecycler();
if (savedInstanceState == null) {
Util.runBackgroundService(this);
}
}
private void initRecycler() {
mRecycler = (BucketRecyclerView) findViewById(R.id.rv_drops);
mEmptyView = findViewById(R.id.empty_drops);
mRecycler.setViewsToHideWhenEmpty(mToolbar);
mRecycler.setViewsToShowWhenEmpty(mEmptyView);
//Add a divider to our RecyclerView
mRecycler.addItemDecoration(new Divider(this, LinearLayoutManager.VERTICAL));
mRecycler.setItemAnimator(new DefaultItemAnimator());
mBtnAdd = (Button) findViewById(R.id.btn_add);
mBtnAdd.setOnClickListener(mBtnAddListener);
mResults = mRealm.where(Drop.class).findAllSortedAsync(WHEN);
mAdapter = new AdapterDrops(this, mRealm, mResults);
mAdapter.setHasStableIds(true);
mResults.addChangeListener(new RealmChangeListener() {
@Override
public void onChange() {
mAdapter.updateResults(mResults);
mResults.removeChangeListener(this);
}
});
//Let our Activity handle the event when the footer is clicked from our RecyclerView
mAdapter.setAddListener(mAddListener);
//Let our Activity handle the event when the Add Drop button is clicked from the empty view
mAdapter.setMarkListener(mMarkListener);
//Handler the swipe from our RecyclerView
ItemTouchHelper.Callback callback =
new SimpleTouchCallback(mAdapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(mRecycler);
mRecycler.setAdapter(mAdapter);
}
private void initBackgroundImage() {
//Convert our background image to a specific size that suits our device's screen size
//THIS HAPPENS ON THE UI THREAD WHICH IS A POSSIBLE AREA FOR IMPROVEMENT
mBackground = (ImageView) findViewById(R.id.iv_background);
Glide.with(this)
.load(R.drawable.background)
.centerCrop()
.into(mBackground);
}
private void showDialogAdd() {
DialogAdd dialog = new DialogAdd();
dialog.setOnAddListener(mOnAddListener);
dialog.show(getSupportFragmentManager(), TAG_DIALOG);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar row_drop clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
boolean handled = true;
switch (id) {
case R.id.action_add:
showDialogAdd();
break;
default:
handled = false;
break;
}
int sortOption = SORT_ASCENDING_DATE;
if (id == R.id.action_show_completed) {
sortOption = SHOW_COMPLETE;
mResults = mRealm.where(Drop.class).equalTo(COMPLETED, true).findAllAsync();
} else if (id == R.id.action_show_uncompleted) {
sortOption = SHOW_INCOMPLETE;
mResults = mRealm.where(Drop.class).equalTo(COMPLETED, false).findAllAsync();
} else if (id == R.id.action_sort_ascending_date) {
sortOption = SORT_ASCENDING_DATE;
mResults = mRealm.where(Drop.class).findAllSortedAsync(WHEN, Sort.ASCENDING);
} else if (id == R.id.action_sort_descending_date) {
sortOption = SORT_DESCENDING_DATE;
mResults = mRealm.where(Drop.class).findAllSortedAsync(WHEN, Sort.DESCENDING);
} else {
mResults = mRealm.where(Drop.class).findAllAsync();
}
AppBucketDrops.storeSortOption(sortOption);
mResults.addChangeListener(new RealmChangeListener() {
@Override
public void onChange() {
mAdapter.updateResults(mResults);
mResults.removeChangeListener(this);
}
});
return handled;
}
@Override
protected void onDestroy() {
super.onDestroy();
mRealm.close();
}
}