org.opensourcetlapp.tl.ShowForumList.java Source code

Java tutorial

Introduction

Here is the source code for org.opensourcetlapp.tl.ShowForumList.java

Source

/*
 * Copyright 2010, 2011 Ali Piccioni & Francois Poizat
 *
 * This program is distributed under the terms of the GNU General Public License
 *
 *  This file is part of Team Liquid Android App.
 *
 *  Team Liquid Android App is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Team Liquid Android App is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Team Liquid Android App.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package org.opensourcetlapp.tl;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import org.opensourcetlapp.tl.R;
import org.opensourcetlapp.tl.Adapters.ForumsListCurosrAdapter;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.net.DhcpInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.CursorAdapter;
import android.text.Html;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
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.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class ShowForumList extends ListFragment implements Runnable {
    public static final String TAG = "main";
    private static TagNode node;
    private static final String FORUM_NAME_XPATH = "//a[@class='forummsginfo']";
    private DBHelper db;
    private Cursor forumsCursor;
    private static final int PROGRESS_DIALOG_KEY = 1;
    private boolean seeHidden = false;
    private boolean rendered = false;

    private Context context;

    private ProgressDialog progressDialog;

    private static final String[] HARD_CODED_FORUM_NAMES = {};
    private static final String[] HARD_CODED_FORUM_URLS = {};

    private TLHandler handler;
    private ShowForumList instance;
    private static final String ACTIVITY_SUBTITLE = "Forums";

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    /** Called when the activity is first created. */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = inflater.inflate(R.layout.show_forum_list, container, false);
        db = new DBHelper(getActivity());
        context = getActivity();
        instance = this;

        doThreadStuff();

        return view;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        forumsCursor.close();
        db.close();
    }

    private void renderForumList(boolean hidden) throws IOException {
        forumsCursor = db.getForums(hidden);
        forumsCursor.moveToFirst();
        if (forumsCursor.isAfterLast()) {
            fetchForumInfo();
            forumsCursor.requery();
        }
    }

    private void fetchForumInfo() throws IOException {
        HtmlCleaner cleaner = TLLib.buildDefaultHtmlCleaner();
        String forumURL = TLLib.getAbsoluteURL(Config.FORUM_LIST);
        try {
            node = TLLib.TagNodeFromURLShowForumList(cleaner, new URL(forumURL), handler, context);
            String parent = "";
            handler.sendEmptyMessage(TLHandler.PROGRESS_SEARCHING);
            Object[] forumNameNodes = node.evaluateXPath(FORUM_NAME_XPATH);
            for (Object forumNameObject : forumNameNodes) {
                TagNode forumNameNode = (TagNode) forumNameObject;
                String fname = HtmlTools
                        .unescapeHtml(forumNameNode.getChildren().iterator().next().toString().trim());
                String furl = HtmlTools.unescapeHtml(forumNameNode.getAttributeByName("href"));
                if (forumNameNode.getParent().getName().equals("h2")) {
                    db.insertForum(fname, furl, false, false);
                } else {
                    db.insertForum(fname, furl, false, true);
                }
                Log.d("a", "b");
            }

            for (int i = 0; i < HARD_CODED_FORUM_NAMES.length; i++) {
                db.insertForum(HARD_CODED_FORUM_NAMES[i], HARD_CODED_FORUM_URLS[i], false, false);
            }

            handler.sendEmptyMessage(TLHandler.PROGRESS_RENDERING);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XPatherException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void onListItemClick(ListView l, View v, int position, long id) {
        String forumURLString = forumsCursor.getString(forumsCursor.getColumnIndex("url"));
        String forumName = forumsCursor.getString(forumsCursor.getColumnIndex("name"));
        Intent intent = new Intent().setClass(getActivity(), ShowForum.class);
        intent.putExtra("forumURL", forumURLString);
        intent.putExtra("forumName", forumName);
        startActivity(intent);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater menuInflater = getActivity().getMenuInflater();
        menuInflater.inflate(R.menu.hold_forum_menu, menu);
    }

    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.hide:
            AdapterView.AdapterContextMenuInfo info;
            try {
                info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            } catch (ClassCastException e) {
                Log.e(TAG, "bad menuInfo", e);
                return false;
            }
            db.hideForum(getListAdapter().getItemId(info.position));
            doThreadStuff();
            break;
        }
        return true;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
        menuInflater.inflate(R.menu.show_forums_menu, menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.refresh:
            db.clear();
            doThreadStuff();
            break;
        case R.id.unhide:
            db.unhide();
            doThreadStuff();
            break;
        }
        return true;
    }

    @Override
    public void run() {
        try {
            renderForumList(seeHidden);
        } catch (IOException e) {
            handler.progressStatus = TLHandler.PROGRESS_NETWORK_DOWN;
            Log.d(TAG, "Cannot establish connection");
        }
        handler.sendEmptyMessage(0);
    }

    private void doThreadStuff() { // Find a better name
        if (!rendered) {
            progressDialog = ProgressDialog.show(getActivity(), null, "Loading forum list...", true, true);
            handler = new MainTLHandler(progressDialog, getActivity());
            Thread thread = new Thread(this);
            thread.start();
            rendered = true;
        }
    }

    private class MainTLHandler extends TLHandler {
        public MainTLHandler(ProgressDialog progressDialog, Context context) {
            super(progressDialog, context);
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0 && this.progressStatus == TLHandler.PROGRESS_OKAY) {
                progressDialog.dismiss();

                ForumsListCurosrAdapter adapter = new ForumsListCurosrAdapter(getActivity(),
                        R.layout.show_forum_list_row, R.layout.show_sub_forum_list_row, forumsCursor,
                        new String[] { "name" }, new int[] { android.R.id.text1 },
                        CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
                setListAdapter(adapter);
            }

            else {
                super.handleMessage(msg);
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        registerForContextMenu(getListView());
    };

}