package com.kenny.openimgur.fragments; import android.app.Activity; import android.app.Fragment; import android.app.LoaderManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.CursorLoader; import android.content.DialogInterface; import android.content.Intent; import android.content.Loader; import android.database.Cursor; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; import android.util.Log; 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.widget.CheckBox; import android.widget.TextView; import com.kenny.openimgur.R; import com.kenny.openimgur.activities.FullScreenPhotoActivity; import com.kenny.openimgur.activities.ViewActivity; import com.kenny.openimgur.api.ApiClient; import com.kenny.openimgur.api.ImgurService; import com.kenny.openimgur.api.responses.BasicResponse; import com.kenny.openimgur.classes.FragmentListener; import com.kenny.openimgur.ui.adapters.UploadAdapter; import com.kenny.openimgur.util.DBContracts; import com.kenny.openimgur.util.LogUtil; import com.kenny.openimgur.util.SqlHelper; import com.kenny.openimgur.util.ViewUtils; import com.kennyc.view.MultiStateView; import butterknife.BindView; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * Created by Kenny-PC on 1/14/2015. */ public class UploadedPhotosFragment extends BaseFragment implements View.OnClickListener, View.OnLongClickListener, LoaderManager.LoaderCallbacks<Cursor> { static int LOADER_ID = UploadedPhotosFragment.class.hashCode(); @BindView(R.id.multiView) public MultiStateView mMultiStateView; @BindView(R.id.grid) public RecyclerView mGrid; @BindView(R.id.refreshLayout) protected SwipeRefreshLayout mRefreshLayout; FragmentListener mListener; UploadAdapter mAdapter; public static Fragment createInstance() { return new UploadedPhotosFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof FragmentListener) { mListener = (FragmentListener) activity; } } @Override public void onDetach() { super.onDetach(); mListener = null; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_uploads, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ViewUtils.setRecyclerViewGridDefaults(getActivity(), mGrid); if (mListener != null) mListener.onUpdateActionBarTitle(getString(R.string.uploaded_photos_title)); mRefreshLayout.setColorSchemeColors(getResources().getColor(theme.accentColor)); int bgColor = theme.isDarkTheme ? R.color.bg_dark : R.color.bg_light; mRefreshLayout.setProgressBackgroundColorSchemeColor(getResources().getColor(bgColor)); mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mRefreshLayout.setRefreshing(true); refresh(true); } }); } @Override public void onDestroyView() { if (mAdapter != null) mAdapter.onDestroy(); getLoaderManager().destroyLoader(LOADER_ID); super.onDestroyView(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.uploads, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.refresh: refresh(true); return true; } return super.onOptionsItemSelected(item); } @Override public void onResume() { super.onResume(); if (mAdapter == null || mAdapter.isEmpty()) { refresh(false); } } @Override public void onClick(View v) { int adapterPosition = mGrid.getChildAdapterPosition(v); if (adapterPosition != RecyclerView.NO_POSITION) { Cursor cursor = mAdapter.getCursor(); cursor.moveToPosition(adapterPosition); String photoUrl = cursor.getString(DBContracts.UploadContract.COLUMN_INDEX_URL); boolean isAlbum = cursor.getInt(DBContracts.UploadContract.COLUMN_INDEX_IS_ALBUM) == 1; if (isAlbum) { startActivity(ViewActivity.createIntent(getActivity(), photoUrl, true)); } else { startActivity(FullScreenPhotoActivity.createIntent(getActivity(), photoUrl)); } } } @Override public boolean onLongClick(View v) { int adapterPosition = mGrid.getChildAdapterPosition(v); if (adapterPosition != RecyclerView.NO_POSITION) { Cursor cursor = mAdapter.getCursor(); cursor.moveToPosition(adapterPosition); final String photoUrl = cursor.getString(DBContracts.UploadContract.COLUMN_INDEX_URL); final String deleteHash = cursor.getString(DBContracts.UploadContract.COLUMN_INDEX_DELETE_HASH); final boolean isAlbum = cursor.getInt(DBContracts.UploadContract.COLUMN_INDEX_IS_ALBUM) == 1; new AlertDialog.Builder(getActivity(), theme.getAlertDialogTheme()) .setItems(R.array.uploaded_photos_options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 0. Share 1. Copy Link 2. Delete switch (which) { case 0: Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share)); shareIntent.putExtra(Intent.EXTRA_TEXT, photoUrl); share(shareIntent, R.string.share); break; case 1: ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newPlainText("link", photoUrl)); Snackbar.make(mListener != null ? mListener.getSnackbarView() : mMultiStateView, R.string.link_copied, Snackbar.LENGTH_LONG).show(); break; case 2: View deleteView = LayoutInflater.from(getActivity()).inflate(R.layout.upload_delete_confirm, null); final CheckBox cb = (CheckBox) deleteView.findViewById(R.id.imgurDelete); ((TextView) deleteView.findViewById(R.id.message)).setText(isAlbum ? R.string.uploaded_remove_album_message : R.string.uploaded_remove_photo_message); new AlertDialog.Builder(getActivity(), theme.getAlertDialogTheme()) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); if (cb.isChecked()) deleteItem(deleteHash, isAlbum); SqlHelper.getInstance(getActivity()).deleteUploadedPhoto(deleteHash); refresh(true); } }) .setView(deleteView) .show(); } } }).show(); return true; } return false; } void deleteItem(@NonNull String deleteHash, boolean isAlbum) { ImgurService apiService = ApiClient.getService(); Call<BasicResponse> call; if (isAlbum) { call = apiService.deleteAlbum(deleteHash); } else { call = apiService.deletePhoto(deleteHash); } call.enqueue(new Callback<BasicResponse>() { @Override public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { if (response != null && response.body() != null) { LogUtil.v(TAG, "Response from deletion " + response.body().data); } else { LogUtil.w(TAG, "Received no response when deleting"); } } @Override public void onFailure(Call<BasicResponse> call, Throwable t) { LogUtil.e(TAG, "Unable to delete item", t); } }); } void refresh(boolean restart) { if (mAdapter != null) mAdapter.swapCursor(null); mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); mRefreshLayout.setRefreshing(false); if (restart) { getLoaderManager().restartLoader(LOADER_ID, null, UploadedPhotosFragment.this); } else { getLoaderManager().initLoader(LOADER_ID, null, UploadedPhotosFragment.this); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Log.v(TAG, "onCreateLoader"); return id == LOADER_ID ? new PhotoCursorLoader(getActivity()) : null; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { Log.v(TAG, "onLoadFinished"); if (data == null || data.getCount() <= 0) { mMultiStateView.setViewState(MultiStateView.VIEW_STATE_EMPTY); return; } if (mAdapter == null) { mAdapter = new UploadAdapter(getActivity(), data, this, this); mGrid.setAdapter(mAdapter); } else { mAdapter.swapCursor(data); mAdapter.notifyDataSetChanged(); } mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } @Override public void onLoaderReset(Loader<Cursor> loader) { Log.v(TAG, "onLoaderReset"); if (mAdapter != null) mAdapter.swapCursor(null); if (mMultiStateView != null) mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); } static class PhotoCursorLoader extends CursorLoader { public PhotoCursorLoader(Context context) { super(context); } @Override public Cursor loadInBackground() { return SqlHelper.getInstance(getContext()).getUploadedPhotos(); } } }