package com.geel9.facepunch.activities;
import java.util.ArrayList;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.geel9.facepunch.APISession.Category;
import com.geel9.facepunch.APISession.FPThread;
import com.geel9.facepunch.APISession.Forum;
import com.geel9.facepunch.APISession.QuoteCallback;
import com.geel9.facepunch.APISession.ThreadCallback;
import com.geel9.facepunch.R.id;
import com.geel9.facepunch.R.layout;
import com.geel9.facepunch.R.menu;
import com.geel9.facepunch.R.string;
import com.geel9.facepunch.fragments.ThreadListFragment;
import com.geel9.facepunch.fragments.ThreadListFragment.OnThreadSelectedListener;
import com.geel9.facepunch.APISession;
import com.geel9.facepunch.R;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Html;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
public class ForumActivity extends FPActivity implements OnThreadSelectedListener {
// Used for restoring list
private class State
{
FPThread[] threads;
int scrollY;
int page;
int numPages;
String forumName;
int forumId;
}
private int currentPage = 1;
private int forumId = 1;
private String forumName = "";
private FPThread[] displayedThreads;
private ArrayList<Forum> subForums = new ArrayList<Forum>();
private ThreadListFragment threadFragment;
AlertDialog alertDialog;
@Override
public void OnLogout(){
loadPage(currentPage);
super.OnLogout();
}
@Override
public void OnLogin(){
loadPage(currentPage);
super.OnLogin();
}
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.forummenu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.itemNextF:
currentPage += 1;
loadPage(currentPage);
break;
case R.id.itemPrevF:
if(currentPage > 1){
currentPage -= 1;
loadPage(currentPage);
}
break;
case R.id.itemJumpF:
try{
onCreateDialog(0).show();
}catch(Exception e){
}
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
@Override
public void OnRefreshPressed()
{
loadPage(currentPage);
super.OnRefreshPressed();
}
@Override
protected Dialog onCreateDialog(int id) {
switch(id) {
case 0:
Context mContext = this;
AlertDialog.Builder builder;
alertDialog = null;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.jump_dialog,
(ViewGroup) findViewById(R.id.layout_root));
builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
builder.setInverseBackgroundForced(true);
final EditText edit = (EditText) layout.findViewById(R.id.editTextJump);
edit.setText(String.valueOf(currentPage));
edit.requestFocus();
edit.setSelected(true);
edit.setSelection(edit.getText().toString().length());
Button jump = (Button) layout.findViewById(R.id.buttonJumpOkay);
Button cancel = (Button) layout.findViewById(R.id.buttonJumpCancel);
jump.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
int pageTo;
try{
pageTo = Integer.parseInt(edit.getText().toString());
}catch(Exception e){
pageTo = 1;
}
if(pageTo < 1) pageTo = 1;
currentPage = pageTo;
alertDialog.dismiss();
loadPage(pageTo);
}
});
cancel.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
alertDialog.dismiss();
}
});
alertDialog = builder.create();
return alertDialog;
default:
return null;
}
}
@Override
public void onCreate( Bundle savedInstanceState )
{
// Load layout
super.onCreate( savedInstanceState );
setContentView( R.layout.forumview );
threadFragment = (ThreadListFragment)getSupportFragmentManager().findFragmentById(R.id.forumThreadListFragment);
threadFragment.setRetainInstance(true);
//Restore forum list
final State data = (State)getLastCustomNonConfigurationInstance();
if ( data != null )
{
if(threadFragment != null)
threadFragment.PopulateList( data.threads );
currentPage = data.page;
displayedThreads = data.threads;
this.forumId = data.forumId;
this.forumName = data.forumName;
ActionText(forumName);
final ScrollView scroller = (ScrollView)findViewById( R.id.scrollViewThreads );
scroller.post( new Runnable()
{
public void run()
{
scroller.scrollTo( 0, data.scrollY );
}
} );
return;
}
CheckLoginState();
Intent intent = getIntent();
forumName = intent.getStringExtra("forumName");
forumId = intent.getIntExtra("forumId", 0);
subForums = api.new Forum().loadSubForums(intent.getStringArrayExtra("subForums"));
LinearLayout subs = (LinearLayout)findViewById(R.id.LinearLayoutSub);
if(subForums.size() == 0){
subs.setVisibility(View.GONE);
}
else{
LayoutInflater inflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE );
final LinearLayout subList = (LinearLayout)findViewById( R.id.linearLayoutSubforums );
subList.removeAllViews();
for(final Forum sub : subForums){
LinearLayout subItem = (LinearLayout)inflater.inflate(R.layout.listthread, subList, false);
((TextView)subItem.findViewById(R.id.threadPages)).setVisibility(View.GONE);
((TextView)subItem.findViewById(R.id.threadAuthor)).setVisibility(View.GONE);
((TextView)subItem.findViewById(R.id.threadAuthorTime)).setVisibility(View.GONE);
TextView title = (TextView)subItem.findViewById(R.id.threadTitle);
title.setTextColor((255 << 24) | (204 << 16) | (2 << 8) | 2);
title.setTextSize(16);
title.setText(sub.getName());
subItem.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Intent i = new Intent(ForumActivity.this, ForumActivity.class);
i.putExtra("forumId", sub.getId());
i.putExtra("forumName", sub.getName());
i.putExtra("subForums", sub.getSubForumsString());
startActivity(i);
}
});
subList.addView(subItem);
}
}
ActionText(forumName);
loadPage(1);
}
// Save activity state
@Override
public Object onRetainCustomNonConfigurationInstance()
{
State data = new State();
data.threads = displayedThreads;
data.scrollY = ( (ScrollView)findViewById( R.id.scrollViewThreads ) ).getScrollY();
data.page = currentPage;
data.forumId = forumId;
data.forumName = forumName;
return data;
}
private void loadPage(int page){
threadFragment.ShowLoadingIcon();
api.listThreads(this, forumId, page, new APISession.ThreadCallback() {
public void onResult(boolean success, FPThread[] threads) {
threadFragment.RemoveLoadingIcon();
if(success && threads != null && threads.length > 0){
displayedThreads = threads;
threadFragment.PopulateList(threads);
}
else{
Toast.makeText(ForumActivity.this, getString(R.string.forumLoadingFailed), Toast.LENGTH_SHORT).show();
}
}
});
}
public void OnThreadLongClicked(final FPThread thread){
final CharSequence[] items;
if(api.loggedIn()){
items = new CharSequence[]{ "First page", "First unread post", "Last page" };
}
else{
items = new CharSequence[]{ "First page", "Last page" };
}
new AlertDialog.Builder( ForumActivity.this )
.setTitle( "Thread actions" )
.setItems( items, new DialogInterface.OnClickListener()
{
public void onClick( DialogInterface dialog, int item )
{
String option = (String) items[item];
// First page
if ( option.equals("First page") )
{
Intent i = new Intent().setClass(ForumActivity.this, ThreadActivity.class);
i.putExtra("threadId", thread.getId());
i.putExtra("threadName", thread.getTitle());
i.putExtra("threadPage", 1);
i.putExtra("numPages", thread.pageCount());
i.putExtra("locked", thread.isLocked());
startActivity(i);
}
//First unread post
else if(option.equals("First unread post")){
Intent i = new Intent().setClass(ForumActivity.this, ThreadActivity.class);
i.putExtra("threadId", thread.getId());
i.putExtra("threadName", thread.getTitle());
i.putExtra("threadPage", -1);
i.putExtra("numPages", thread.pageCount());
i.putExtra("locked", thread.isLocked());
startActivity(i);
}
//Last page
else if ( option.equals("Last page") )
{
Intent i = new Intent().setClass(ForumActivity.this, ThreadActivity.class);
i.putExtra("threadId", thread.getId());
i.putExtra("threadName", thread.getTitle());
i.putExtra("threadPage", thread.pageCount());
i.putExtra("numPages", thread.pageCount());
i.putExtra("locked", thread.isLocked());
startActivity(i);
}
}
} )
.create().show();
}
public void OnThreadSelected(FPThread thread) {
Intent i = new Intent().setClass(ForumActivity.this, ThreadActivity.class);
i.putExtra("threadId", thread.getId());
i.putExtra("threadName", thread.getTitle());
i.putExtra("numPages", thread.pageCount());
i.putExtra("locked", thread.isLocked());
int page = api.loggedIn() ? -1 : thread.pageCount();
i.putExtra("threadPage", page);
startActivity(i);
}
}