/*
* Copyright 2012-2013 JNRain
*
* 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 org.jnrain.mobile.ui.kbs;
import org.jnrain.kbs.collection.ListPosts;
import org.jnrain.kbs.entity.Post;
import org.jnrain.mobile.R;
import org.jnrain.mobile.network.requests.ThreadRequest;
import org.jnrain.mobile.util.CacheKeyManager;
import org.jnrain.mobile.util.GlobalState;
import roboguice.inject.InjectView;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import com.github.rtyley.android.sherlock.roboguice.fragment.RoboSherlockFragment;
import com.octo.android.robospice.persistence.DurationInMillis;
import com.octo.android.robospice.persistence.exception.SpiceException;
import com.octo.android.robospice.request.listener.RequestListener;
public class ReadThreadPageFragment extends RoboSherlockFragment {
@InjectView(R.id.listPosts)
ListView listPosts;
private String _brd_id;
private long _tid;
private int _page;
private ListPosts _posts;
protected ReadThreadFragmentListener _listener;
private static final String TAG = "ReadThreadFragment";
public ReadThreadPageFragment(String brd_id, long tid, int page) {
super();
initState(brd_id, tid, page, null);
}
public ReadThreadPageFragment() {
super();
}
protected void initState(
String brdId,
long tid,
int page,
ListPosts posts) {
_brd_id = brdId;
_tid = tid;
_page = page;
_posts = posts;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_listener = (ReadThreadFragmentListener) getParentFragment();
if (savedInstanceState != null) {
initState(
savedInstanceState.getString(KBSUIConstants.BOARD_ID_STORE),
savedInstanceState
.getLong(KBSUIConstants.THREAD_ID_STORE),
savedInstanceState.getInt(KBSUIConstants.PAGE_STORE),
(ListPosts) savedInstanceState
.getSerializable(KBSUIConstants.POSTS_LIST_STORE));
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KBSUIConstants.BOARD_ID_STORE, _brd_id);
outState.putLong(KBSUIConstants.THREAD_ID_STORE, _tid);
outState.putInt(KBSUIConstants.PAGE_STORE, _page);
outState.putSerializable(KBSUIConstants.POSTS_LIST_STORE, _posts);
}
@Override
public View onCreateView(
LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(
R.layout.frag_kbs_read_thread,
container,
false);
return view;
}
@SuppressWarnings("unchecked")
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (_posts != null) {
updateData();
} else {
// fetch posts
_listener.makeSpiceRequest(
new ThreadRequest(_brd_id, _tid, _page),
CacheKeyManager.keyForPagedPostList(
_brd_id,
_tid,
_page,
GlobalState.getUserName()),
DurationInMillis.ONE_MINUTE,
new ThreadRequestListener());
}
}
@Override
public void onCreateContextMenu(
ContextMenu menu,
View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = this.getActivity().getMenuInflater();
inflater.inflate(R.menu.read_thread_context, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.action_reply:
Post post = ((ThreadAdapter) listPosts.getAdapter())
.getItem(info.position);
_listener.showReplyUIFor(post);
return true;
default:
return super.onContextItemSelected(item);
}
}
public synchronized void updateData() {
if (getActivity() == null) {
return;
}
@SuppressWarnings("unchecked")
ThreadAdapter adapter = new ThreadAdapter(
getActivity(),
_listener,
_posts,
_listener);
listPosts.setAdapter(adapter);
listPosts
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(
AdapterView<?> parent,
View view,
int position,
long id) {
Post post = _posts.getPosts().get(position);
Log.i(TAG, "clicked: " + position + ", id=" + id
+ ", post=" + post.toString());
}
});
// context menu
registerForContextMenu(listPosts);
}
private class ThreadRequestListener
implements RequestListener<ListPosts> {
@Override
public void onRequestFailure(SpiceException arg0) {
Log.d(TAG, "err on req: " + arg0.toString());
}
@Override
public void onRequestSuccess(ListPosts posts) {
Log.v(TAG, "got posts list: " + posts.toString());
_posts = posts;
updateData();
}
}
}