/*
* Copyright (C) 2016 Simon Vig Therkildsen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.simonvt.cathode.ui.comments;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import net.simonvt.cathode.CathodeApp;
import net.simonvt.cathode.R;
import net.simonvt.cathode.api.enumeration.ItemType;
import net.simonvt.cathode.database.SimpleCursor;
import net.simonvt.cathode.database.SimpleCursorLoader;
import net.simonvt.cathode.database.SimpleMergeCursor;
import net.simonvt.cathode.provider.DatabaseContract.CommentColumns;
import net.simonvt.cathode.provider.DatabaseSchematic.Tables;
import net.simonvt.cathode.provider.ProviderSchematic.Comments;
import net.simonvt.cathode.ui.fragment.ToolbarGridFragment;
public class CommentFragment extends ToolbarGridFragment<CommentsAdapter.ViewHolder> {
public static final String TAG = "net.simonvt.cathode.ui.comments.CommentFragment";
private static final String ARG_COMMENT_ID =
"net.simonvt.cathode.ui.comments.CommentFragment.commentId";
private static final String DIALOG_COMMENT_ADD =
"net.simonvt.cathode.ui.comments.CommentFragment.addCommentDialog";
private static final String DIALOG_COMMENT_UPDATE =
"net.simonvt.cathode.ui.comments.CommentFragment.updateCommentDialog";
private static final String STATE_ADAPTER =
"net.simonvt.cathode.ui.comments.CommentFragment.adapterState";
private static final int LOADER_COMMENT = 1;
private static final int LOADER_COMMENTS = 2;
private long commentId;
private int columnCount;
private CommentsAdapter adapter;
private Cursor comment;
private Cursor replies;
private Bundle adapterState;
public static Bundle getArgs(long commentId) {
Bundle args = new Bundle();
args.putLong(ARG_COMMENT_ID, commentId);
return args;
}
@Override public void onCreate(Bundle inState) {
super.onCreate(inState);
CathodeApp.inject(getActivity(), this);
Bundle args = getArguments();
commentId = args.getLong(ARG_COMMENT_ID);
//columnCount = getResources().getInteger(R.integer.listColumns);
columnCount = 1;
if (inState != null) {
adapterState = inState.getBundle(STATE_ADAPTER);
}
setTitle(R.string.title_comments);
getLoaderManager().initLoader(LOADER_COMMENT, null, commentLoader);
getLoaderManager().initLoader(LOADER_COMMENTS, null, repliesLoader);
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle(STATE_ADAPTER, adapter.saveState());
}
@Override protected int getColumnCount() {
return columnCount;
}
@Override public void createMenu(Toolbar toolbar) {
super.createMenu(toolbar);
toolbar.inflateMenu(R.menu.fragment_comment);
}
@Override public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_reply:
AddCommentDialog.newInstance(ItemType.COMMENT, commentId)
.show(getFragmentManager(), DIALOG_COMMENT_ADD);
return true;
default:
return super.onMenuItemClick(item);
}
}
private CommentsAdapter.OnCommentClickListener commentClickListener =
new CommentsAdapter.OnCommentClickListener() {
@Override public void onCommentClick(long commentId, String comment, boolean spoiler,
boolean isUserComment) {
if (isUserComment) {
UpdateCommentDialog.newInstance(commentId, comment, spoiler)
.show(getFragmentManager(), DIALOG_COMMENT_UPDATE);
}
}
};
private void updateCursor() {
if (comment == null || replies == null) {
return;
}
SimpleMergeCursor cursor = new SimpleMergeCursor(comment, replies);
setCursor(cursor);
}
private void setCursor(Cursor cursor) {
if (adapter == null) {
adapter = new CommentsAdapter(getActivity(), null, true, commentClickListener);
if (adapterState != null) {
adapter.restoreState(adapterState);
}
setAdapter(adapter);
}
adapter.changeCursor(cursor);
}
private LoaderManager.LoaderCallbacks<SimpleCursor> commentLoader =
new LoaderManager.LoaderCallbacks<SimpleCursor>() {
@Override public Loader<SimpleCursor> onCreateLoader(int id, Bundle args) {
return new SimpleCursorLoader(getContext(), Comments.COMMENTS_WITH_PROFILE,
CommentsAdapter.PROJECTION, Tables.COMMENTS + "." + CommentColumns.ID + "=?",
new String[] {
String.valueOf(commentId),
}, null);
}
@Override public void onLoadFinished(Loader<SimpleCursor> loader, SimpleCursor data) {
comment = data;
updateCursor();
}
@Override public void onLoaderReset(Loader<SimpleCursor> loader) {
}
};
private LoaderManager.LoaderCallbacks<SimpleCursor> repliesLoader =
new LoaderManager.LoaderCallbacks<SimpleCursor>() {
@Override public Loader<SimpleCursor> onCreateLoader(int id, Bundle args) {
return new SimpleCursorLoader(getContext(), Comments.withParent(commentId),
CommentsAdapter.PROJECTION, null, null, CommentColumns.CREATED_AT + " DESC");
}
@Override public void onLoadFinished(Loader<SimpleCursor> loader, SimpleCursor data) {
replies = data;
updateCursor();
}
@Override public void onLoaderReset(Loader<SimpleCursor> loader) {
}
};
}