com.andrewshu.android.reddit.mail.InboxActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.andrewshu.android.reddit.mail.InboxActivity.java

Source

/*
 * Copyright 2011 Andrew Shu
 *
 * This file is part of "reddit is fun".
 *
 * "reddit is fun" 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.
 *
 * "reddit is fun" 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 "reddit is fun".  If not, see <http://www.gnu.org/licenses/>.
 */

package com.andrewshu.android.reddit.mail;

import org.apache.http.client.HttpClient;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.andrewshu.android.reddit.R;
import com.andrewshu.android.reddit.captcha.CaptchaCheckRequiredTask;
import com.andrewshu.android.reddit.captcha.CaptchaDownloadTask;
import com.andrewshu.android.reddit.common.Common;
import com.andrewshu.android.reddit.common.Constants;
import com.andrewshu.android.reddit.common.FormValidation;
import com.andrewshu.android.reddit.common.RedditIsFunHttpClientFactory;
import com.andrewshu.android.reddit.settings.RedditSettings;
import com.andrewshu.android.reddit.things.ThingInfo;

public class InboxActivity extends TabActivity {

    private final RedditSettings mSettings = new RedditSettings();
    private final HttpClient mClient = RedditIsFunHttpClientFactory.getGzipHttpClient();

    private static final String[] whichInboxes = { "inbox", "moderator" };

    private volatile String mCaptchaIden = null;
    private volatile String mCaptchaUrl = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSettings.loadRedditPreferences(this, mClient);
        setRequestedOrientation(mSettings.getRotation());
        setTheme(mSettings.getTheme());

        requestWindowFeature(Window.FEATURE_PROGRESS);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        for (String whichInbox : whichInboxes)
            addInboxTab(whichInbox);

        getTabHost().setCurrentTab(0);
    }

    @Override
    protected void onResume() {
        super.onResume();
        int previousTheme = mSettings.getTheme();

        mSettings.loadRedditPreferences(this, mClient);

        if (mSettings.getTheme() != previousTheme) {
            relaunchActivity();
        }
    }

    private void relaunchActivity() {
        finish();
        startActivity(getIntent());
    }

    private void addInboxTab(String whichInbox) {
        Intent inboxIntent = createInboxIntent(whichInbox);
        getTabHost().addTab(getTabHost().newTabSpec(whichInbox).setIndicator(whichInbox).setContent(inboxIntent));
    }

    private Intent createInboxIntent(String whichInbox) {
        return new Intent(this, InboxListActivity.class).putExtra(Constants.WHICH_INBOX_KEY, whichInbox);
    }

    /**
     * Populates the menu.
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.inbox, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.compose_message_menu_id:
            showDialog(Constants.DIALOG_COMPOSE);
            break;
        case R.id.refresh_menu_id:
            String whichInbox = whichInboxes[getTabHost().getCurrentTab()];
            InboxListActivity inboxListActivity = (InboxListActivity) getLocalActivityManager()
                    .getActivity(whichInbox);
            if (inboxListActivity != null)
                inboxListActivity.refresh();
            break;
        case android.R.id.home:
            Common.goHome(this);
            break;
        }

        return true;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog;
        ProgressDialog pdialog;
        AlertDialog.Builder builder;
        LayoutInflater inflater;
        View layout; // used for inflated views for AlertDialog.Builder.setView()

        switch (id) {
        case Constants.DIALOG_COMPOSE:
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            builder = new AlertDialog.Builder(new ContextThemeWrapper(this, mSettings.getDialogTheme()));
            layout = inflater.inflate(R.layout.compose_dialog, null);
            dialog = builder.setView(layout).create();
            final Dialog composeDialog = dialog;

            Common.setTextColorFromTheme(mSettings.getTheme(), getResources(),
                    (TextView) layout.findViewById(R.id.compose_destination_textview),
                    (TextView) layout.findViewById(R.id.compose_subject_textview),
                    (TextView) layout.findViewById(R.id.compose_message_textview),
                    (TextView) layout.findViewById(R.id.compose_captcha_textview),
                    (TextView) layout.findViewById(R.id.compose_captcha_loading));

            final EditText composeDestination = (EditText) layout.findViewById(R.id.compose_destination_input);
            final EditText composeSubject = (EditText) layout.findViewById(R.id.compose_subject_input);
            final EditText composeText = (EditText) layout.findViewById(R.id.compose_text_input);
            final Button composeSendButton = (Button) layout.findViewById(R.id.compose_send_button);
            final Button composeCancelButton = (Button) layout.findViewById(R.id.compose_cancel_button);
            final EditText composeCaptcha = (EditText) layout.findViewById(R.id.compose_captcha_input);
            composeSendButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    ThingInfo thingInfo = new ThingInfo();

                    if (!FormValidation.validateComposeMessageInputFields(InboxActivity.this, composeDestination,
                            composeSubject, composeText, composeCaptcha))
                        return;

                    thingInfo.setDest(composeDestination.getText().toString().trim());
                    thingInfo.setSubject(composeSubject.getText().toString().trim());
                    new MyMessageComposeTask(composeDialog, thingInfo, composeCaptcha.getText().toString().trim(),
                            mCaptchaIden, mSettings, mClient, InboxActivity.this)
                                    .execute(composeText.getText().toString().trim());
                    removeDialog(Constants.DIALOG_COMPOSE);
                }
            });
            composeCancelButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    removeDialog(Constants.DIALOG_COMPOSE);
                }
            });
            break;

        case Constants.DIALOG_COMPOSING:
            pdialog = new ProgressDialog(new ContextThemeWrapper(this, mSettings.getDialogTheme()));
            pdialog.setMessage("Composing message...");
            pdialog.setIndeterminate(true);
            pdialog.setCancelable(true);
            dialog = pdialog;
            break;
        default:
            throw new IllegalArgumentException("Unexpected dialog id " + id);
        }
        return dialog;
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {
        case Constants.DIALOG_COMPOSE:
            new MyCaptchaCheckRequiredTask(dialog).execute();
            break;
        }
    }

    private class MyMessageComposeTask extends MessageComposeTask {

        public MyMessageComposeTask(Dialog dialog, ThingInfo targetThingInfo, String captcha, String captchaIden,
                RedditSettings settings, HttpClient client, Context context) {
            super(dialog, targetThingInfo, captcha, captchaIden, settings, client, context);
        }

        @Override
        public void onPreExecute() {
            showDialog(Constants.DIALOG_COMPOSING);
        }

        @Override
        public void onPostExecute(Boolean success) {
            removeDialog(Constants.DIALOG_COMPOSING);
            if (success) {
                Toast.makeText(InboxActivity.this, "Message sent.", Toast.LENGTH_SHORT).show();
                // TODO: add the reply beneath the original, OR redirect to sent messages page
            } else {
                Common.showErrorToast(_mUserError, Toast.LENGTH_LONG, InboxActivity.this);
            }
        }
    }

    private class MyCaptchaCheckRequiredTask extends CaptchaCheckRequiredTask {

        Dialog _mDialog;

        public MyCaptchaCheckRequiredTask(Dialog dialog) {
            super(Constants.REDDIT_BASE_URL + "/message/compose/", mClient);
            _mDialog = dialog;
        }

        @Override
        protected void saveState() {
            InboxActivity.this.mCaptchaIden = _mCaptchaIden;
            InboxActivity.this.mCaptchaUrl = _mCaptchaUrl;
        }

        @Override
        public void onPreExecute() {
            // Hide send button so user can't send until we know whether he needs captcha
            final Button sendButton = (Button) _mDialog.findViewById(R.id.compose_send_button);
            sendButton.setVisibility(View.INVISIBLE);
            // Show "loading captcha" label
            final TextView loadingCaptcha = (TextView) _mDialog.findViewById(R.id.compose_captcha_loading);
            loadingCaptcha.setVisibility(View.VISIBLE);
        }

        @Override
        public void onPostExecute(Boolean required) {
            final TextView captchaLabel = (TextView) _mDialog.findViewById(R.id.compose_captcha_textview);
            final ImageView captchaImage = (ImageView) _mDialog.findViewById(R.id.compose_captcha_image);
            final EditText captchaEdit = (EditText) _mDialog.findViewById(R.id.compose_captcha_input);
            final TextView loadingCaptcha = (TextView) _mDialog.findViewById(R.id.compose_captcha_loading);
            final Button sendButton = (Button) _mDialog.findViewById(R.id.compose_send_button);
            if (required == null) {
                Common.showErrorToast("Error retrieving captcha. Use the menu to try again.", Toast.LENGTH_LONG,
                        InboxActivity.this);
                return;
            }
            if (required) {
                captchaLabel.setVisibility(View.VISIBLE);
                captchaImage.setVisibility(View.VISIBLE);
                captchaEdit.setVisibility(View.VISIBLE);
                // Launch a task to download captcha and display it
                new MyCaptchaDownloadTask(_mDialog).execute();
            } else {
                captchaLabel.setVisibility(View.GONE);
                captchaImage.setVisibility(View.GONE);
                captchaEdit.setVisibility(View.GONE);
            }
            loadingCaptcha.setVisibility(View.GONE);
            sendButton.setVisibility(View.VISIBLE);
        }
    }

    private class MyCaptchaDownloadTask extends CaptchaDownloadTask {

        Dialog _mDialog;

        public MyCaptchaDownloadTask(Dialog dialog) {
            super(mCaptchaUrl, mClient);
            _mDialog = dialog;
        }

        @Override
        public void onPostExecute(Drawable captcha) {
            if (captcha == null) {
                Common.showErrorToast("Error retrieving captcha. Use the menu to try again.", Toast.LENGTH_LONG,
                        InboxActivity.this);
                return;
            }
            final ImageView composeCaptchaView = (ImageView) _mDialog.findViewById(R.id.compose_captcha_image);
            composeCaptchaView.setVisibility(View.VISIBLE);
            composeCaptchaView.setImageDrawable(captcha);
        }
    }

}