package eu.se_bastiaan.popcorntimeremote.fragments; import android.annotation.TargetApi; import android.content.Intent; import android.database.Cursor; import android.graphics.Outline; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity; import android.support.v7.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.widget.AdapterView; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import butterknife.ButterKnife; import butterknife.Bind; import eu.se_bastiaan.popcorntimeremote.R; import eu.se_bastiaan.popcorntimeremote.activities.ControllerActivity; import eu.se_bastiaan.popcorntimeremote.database.InstanceEntry; import eu.se_bastiaan.popcorntimeremote.database.InstanceProvider; import eu.se_bastiaan.popcorntimeremote.iab.DonationFragment; import eu.se_bastiaan.popcorntimeremote.utils.PixelUtils; public class InstanceListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { private final Boolean mActionMode = false; private SimpleCursorAdapter mAdapter; private Integer mSelectedPosition; private ActionMode mMode; @Bind(R.id.instancesList) ListView listView; @Bind(R.id.add_button) ImageButton addButton; private final ListView.OnItemClickListener mClickListener = new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { if (!mActionMode) { Cursor cursor = (Cursor) adapterView.getItemAtPosition(position); Intent intent = new Intent(getActivity(), ControllerActivity.class); intent.putExtra(ControllerActivity.KEY_IP, cursor.getString(1)); intent.putExtra(ControllerActivity.KEY_PORT, cursor.getString(2)); intent.putExtra(ControllerActivity.KEY_NAME, cursor.getString(3)); intent.putExtra(ControllerActivity.KEY_USERNAME, cursor.getString(4)); intent.putExtra(ControllerActivity.KEY_PASSWORD, cursor.getString(5)); startActivity(intent); } else { getListView().getChildAt(mSelectedPosition).setBackgroundDrawable(null); mSelectedPosition = position; getListView().setItemChecked(mSelectedPosition, true); view.setBackgroundResource(R.color.list_selected); } } }; private final AdapterView.OnItemLongClickListener mOnLongClickListener = new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (mSelectedPosition != null) { View v = getListView().getChildAt(mSelectedPosition); if (v != null) v.setBackgroundDrawable(null); } mSelectedPosition = position; view.setBackgroundResource(R.color.list_selected); mMode = ((AppCompatActivity) getActivity()).startSupportActionMode(new ActionBarCallBack()); return true; } }; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_listinstance, container, false); ButterKnife.bind(this, v); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { addButton.setVisibility(View.VISIBLE); final int diameter = getResources().getDimensionPixelSize(R.dimen.diameter); ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, diameter, diameter); } }; addButton.setOutlineProvider(viewOutlineProvider); addButton.setClipToOutline(true); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { openEditorFragment(null); } }); } return v; } private ListView getListView() { return listView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setOnItemLongClickListener(mOnLongClickListener); getListView().setSelector(R.drawable.selectable_background_popcorntimeremote); int horizontalMargin = getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin); int verticalMargin = getResources().getDimensionPixelSize(R.dimen.activity_vertical_margin); int actionBarHeight = getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material); int statusBarHeight = 0; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { statusBarHeight = PixelUtils.getStatusBarHeight(getActivity()); } getListView().setPadding(horizontalMargin, verticalMargin + actionBarHeight + statusBarHeight, horizontalMargin, verticalMargin); mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.fragment_listinstance_item, null, new String[]{ InstanceEntry.COLUMN_NAME_NAME, InstanceEntry.COLUMN_NAME_IP}, new int[]{ R.id.text1, R.id.text2}, 0); getLoaderManager().initLoader(0, null, this); listView.setOnItemClickListener(mClickListener); } @Override public void onPause() { super.onPause(); if (mMode != null) mMode.finish(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(getActivity(), InstanceProvider.INSTANCES_URI, new String[]{"_id", InstanceEntry.COLUMN_NAME_IP, InstanceEntry.COLUMN_NAME_PORT, InstanceEntry.COLUMN_NAME_NAME, InstanceEntry.COLUMN_NAME_USERNAME, InstanceEntry.COLUMN_NAME_PASSWORD}, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { if (getListView().getAdapter() == null) { getListView().setAdapter(mAdapter); } mAdapter.swapCursor(cursor); if (mAdapter.getCount() <= 0) { TextView emptyText = (TextView) getActivity().findViewById(android.R.id.empty); getListView().setEmptyView(emptyText); } } @Override public void onLoaderReset(Loader loader) { mAdapter.swapCursor(null); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_instancelist, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_add: openEditorFragment(null); return true; case R.id.action_donate: DonationFragment.show(getFragmentManager()); return true; default: break; } return super.onOptionsItemSelected(item); } class ActionBarCallBack implements ActionMode.Callback { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { Cursor cursor = (Cursor) getListView().getItemAtPosition(mSelectedPosition); switch (item.getItemId()) { case R.id.action_delete: getActivity().getContentResolver().delete(Uri.withAppendedPath(InstanceProvider.INSTANCES_URI, "/" + cursor.getString(0)), null, null); mMode.finish(); break; case R.id.action_edit: openEditorFragment(cursor.getString(0)); mMode.finish(); break; default: break; } return true; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.getMenuInflater().inflate(R.menu.fragment_instancelist_contextual, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { getListView().getChildAt(mSelectedPosition).setBackgroundDrawable(null); } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } } private void openEditorFragment(String id) { try { InstanceEditorDialogFragment fragment = new InstanceEditorDialogFragment(); if (id != null) { Bundle args = new Bundle(); args.putString("_id", id); fragment.setArguments(args); } fragment.show(getActivity().getSupportFragmentManager(), "editor_fragment"); } catch (IllegalStateException e) { e.printStackTrace(); } } }