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); } }