com.normalexception.app.rx8club.fragment.ProfileFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.normalexception.app.rx8club.fragment.ProfileFragment.java

Source

package com.normalexception.app.rx8club.fragment;

/************************************************************************
 * NormalException.net Software, and other contributors
 * http://www.normalexception.net
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 ************************************************************************/

import java.util.ArrayList;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.normalexception.app.rx8club.Log;
import com.normalexception.app.rx8club.MainApplication;
import com.normalexception.app.rx8club.R;
import com.normalexception.app.rx8club.TimeoutFactory;
import com.normalexception.app.rx8club.WebUrls;
import com.normalexception.app.rx8club.handler.AvatarLoader;
import com.normalexception.app.rx8club.html.VBForumFactory;
import com.normalexception.app.rx8club.state.AppState;
import com.normalexception.app.rx8club.user.UserProfile;
import com.normalexception.app.rx8club.view.profile.ProfileModel;
import com.normalexception.app.rx8club.view.profile.ProfileViewArrayAdapter;

/**
 * Activity that sets up the users profile
 * 
 * Required Intent Parameters:
 * none
 */
public class ProfileFragment extends Fragment {

    private Logger TAG = LogManager.getLogger(this.getClass());

    private ProgressDialog loadingDialog;

    private ArrayList<ProfileModel> stubs;
    private ProfileViewArrayAdapter pva;
    private ListView lv;

    private AvatarLoader imageLoader;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_content, container, false);
        return rootView;
    }

    /*
     * (non-Javadoc)
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainApplication.setState(AppState.State.PROFILE, this);

        if (TimeoutFactory.getInstance().checkTimeout(this)) {
            Log.v(TAG, "Profile Activity Started");

            imageLoader = new AvatarLoader(getActivity());

            constructView();
        }
    }

    private void updateList() {
        final Fragment _frag = this;
        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                pva = new ProfileViewArrayAdapter(_frag, 0, stubs);
                lv.setAdapter(pva);
            }
        });
    }

    /**
     * Construct the profile view
     */
    private void constructView() {
        AsyncTask<Void, String, Void> updaterTask = new AsyncTask<Void, String, Void>() {
            @Override
            protected void onPreExecute() {

                loadingDialog = ProgressDialog.show(getActivity(), getString(R.string.loading),
                        getString(R.string.pleaseWait), true);
            }

            @Override
            protected Void doInBackground(Void... params) {
                final UserProfile upInstance = UserProfile.getInstance();
                Document doc = VBForumFactory.getInstance().get(getActivity(), upInstance.getUserProfileLink());
                if (doc != null) {
                    try {
                        publishProgress(getString(R.string.asyncDialogGrabProfile));
                        String id = upInstance.getUserProfileLink().substring(
                                upInstance.getUserProfileLink().lastIndexOf("-") + 1,
                                upInstance.getUserProfileLink().length() - 1);
                        upInstance.setUserId(id);
                        getUserInformation(doc);

                        lv = (ListView) getView().findViewById(R.id.mainlistview);

                        getActivity().runOnUiThread(new Runnable() {
                            public void run() {
                                View v = getActivity().getLayoutInflater().inflate(R.layout.view_profile_header,
                                        null);
                                //v.setOnClickListener(this);
                                lv.addHeaderView(v);

                                publishProgress(getString(R.string.asyncDialogPopulating));

                                // the dateline at the end of the file so that we aren't
                                // creating multiple images for a user.  The image still
                                // gets returned without a date
                                String nodate_avatar = upInstance.getUserImageLink().indexOf("&dateline") == -1
                                        ? upInstance.getUserImageLink()
                                        : upInstance.getUserImageLink().substring(0,
                                                upInstance.getUserImageLink().indexOf("&dateline"));

                                if (!nodate_avatar.isEmpty()) {
                                    ImageView avatar = ((ImageView) getView().findViewById(R.id.pr_image));
                                    imageLoader.DisplayImage(nodate_avatar, avatar);
                                }

                                ((TextView) getView().findViewById(R.id.pr_username)).setText(
                                        upInstance.getUsername() + " (ID: " + upInstance.getUserId() + ")");
                                ((TextView) getView().findViewById(R.id.pr_userTitle))
                                        .setText(upInstance.getUserTitle());
                                ((TextView) getView().findViewById(R.id.pr_userPosts))
                                        .setText(upInstance.getUserPostCount());
                                ((TextView) getView().findViewById(R.id.pr_userJoin))
                                        .setText(upInstance.getUserJoinDate());
                            }
                        });
                    } catch (Exception e) {
                        Log.e(TAG, "Error Grabbing Profile Data", e);
                    }

                    updateList();
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(String... progress) {
                if (loadingDialog != null)
                    loadingDialog.setMessage(progress[0]);
            }

            @Override
            protected void onPostExecute(Void result) {
                try {
                    loadingDialog.dismiss();
                    loadingDialog = null;
                } catch (Exception e) {
                    Log.w(TAG, e.getMessage());
                }
            }
        };
        updaterTask.execute();
    }

    /**
     * Get the user information from the users profile
     * @param doc   The page document
     */
    private void getUserInformation(Document doc) {
        final UserProfile upInstance = UserProfile.getInstance();
        stubs = new ArrayList<ProfileModel>();

        // Title
        Elements userInfo = doc.select("div[id=main_userinfo]");
        Elements title = userInfo.select("h2");
        upInstance.setUserTitle(title.text());

        // Posts
        Elements statisticInfo = doc.select("fieldset[class=statistics_group]");
        Elements post = statisticInfo.select("li");

        // Profile Pic
        Elements profilePicInfo = doc.select("td[id=profilepic_cell] > img");

        // Grab image, trap
        try {
            upInstance.setUserImageLink(profilePicInfo.attr("src"));
        } catch (Exception e) {
        }

        // Grab Post count, trap exception
        try {
            upInstance.setUserPostCount(
                    post.get(0).text() + " / " + post.get(1).text().split(" ", 4)[3] + " per day");
        } catch (Exception e) {
            upInstance.setUserPostCount("Error Getting Post Count");
        }

        // Grab Join Date, trap exception
        try {
            upInstance.setUserJoinDate(post.get(13).text());
        } catch (Exception e) {
            upInstance.setUserJoinDate("Error Getting Join Date");
        }

        // Threads
        String link = WebUrls.userUrl + upInstance.getUserId();
        doc = VBForumFactory.getInstance().get(getActivity(), link);
        if (doc != null) {
            Elements threadlist = doc.select("table[id^=post]");
            for (Element threadl : threadlist) {
                ProfileModel stub = new ProfileModel();
                Elements divs = threadl.getElementsByTag("div");
                Elements div = divs.get(1).getElementsByTag("a");
                stub.setLink(div.attr("href"));
                stub.setName(div.text());

                div = divs.get(5).getElementsByTag("a");
                stub.setText(div.text());
                stubs.add(stub);
            }
        }
    }
}