Android Open Source - twitt4droid Web Login Activity






From Project

Back to project page twitt4droid.

License

The source code is released under:

Apache License

If you think the Android project twitt4droid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2014 Daniel Pedraza-Arcega//from  w  w w.j a v  a2s .co m
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.twitt4droid.activity;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.twitt4droid.R;
import com.twitt4droid.Resources;
import com.twitt4droid.Twitt4droid;

import twitter4j.AsyncTwitter;
import twitter4j.TwitterAdapter;
import twitter4j.TwitterException;
import twitter4j.TwitterMethod;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;

/**
 * This Activity provides the web based Twitter login process. Is not meant to 
 * be used directly (DO NOT START IT DIRECTLY). Add this activity to your 
 * AndroidManifest.xml like this:
 * <pre>
 * {@code 
 * <activity android:name="com.twitt4droid.activity.WebLoginActivity"
 *           android:theme="@android:style/Theme.Black.NoTitleBar" />
 * }
 * </pre>
 * 
 * @author Daniel Pedraza-Arcega
 * @since version 1.0
 */
public class WebLoginActivity extends Activity {

    /** The request code for this activity. */
    public static final int REQUEST_CODE = 340;

    /** The name of the Intent-extra used to indicate the twitter user returned. */
    public static final String EXTRA_USER = "com.twitt4droid.extra.user";
     
    private static final String TAG = WebLoginActivity.class.getSimpleName();
    private static final String OAUTH_VERIFIER_CALLBACK_PARAMETER = "oauth_verifier";
    private static final String DENIED_CALLBACK_PARAMETER = "denied";
    private static final String CALLBACK_URL = "oauth://twitt4droid";

    private AsyncTwitter twitter;
    private TextView urlTextView;
    private ProgressBar loadingBar;
    private ImageButton refreshCancelButton;
    private WebView webView;

    /** {@inheritDoc} */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Twitt4droid.areConsumerTokensAvailable(getApplicationContext())) {
            if (Resources.isConnectedToInternet(this)) {
                setUpTwitter();
                if (Twitt4droid.isUserLoggedIn(this)) twitter.verifyCredentials();
                else {
                    setContentView(R.layout.twitt4droid_web_browser);
                    setUpView();
                    twitter.getOAuthRequestTokenAsync(CALLBACK_URL);
                }
            } else {
                Log.w(TAG, "No Internet connection detected");
                showNetworkAlertDialog();
            }
        } else {
            Log.e(TAG, "Twitter consumer key and/or consumer secret are not defined correctly");
            setResult(RESULT_CANCELED, getIntent());
            finish();
        }
    }

    /** Sets up Twitter async listeners. */
    private void setUpTwitter() { 
        twitter = Twitt4droid.getAsyncTwitter(this);
        twitter.addListener(new TwitterAdapter() {
            @Override
            public void verifiedCredentials(final User user) {
                runOnUiThread(new Runnable() {
                    
                    @Override
                    public void run() {
                        handleUserValidation(user);
                    }
                });
            }

            @Override
            public void gotOAuthRequestToken(final RequestToken token) {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        String url = token.getAuthenticationURL();
                        urlTextView.setText(url);
                        webView.loadUrl(url);
                    }
                });
            }

            @Override
            public void gotOAuthAccessToken(final AccessToken token) {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Twitt4droid.saveAuthenticationInfo(getApplicationContext(), token);
                    }
                });
            }

            @Override
            public void onException(TwitterException te, TwitterMethod method) {
                Log.e(TAG, "Twitter error in " + method, te);
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        showErrorAlertDialog();
                    }
                });
            }
        });
    }

    /** Shows a network error alert dialog. */
    private void showNetworkAlertDialog() {
        new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle(R.string.twitt4droid_is_offline_title)
            .setMessage(R.string.twitt4droid_is_offline_messege)
            .setNegativeButton(android.R.string.cancel, 
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Log.i(TAG, "User canceled authentication process due to network failure");
                        setResult(RESULT_CANCELED, getIntent());
                        finish();
                    }
            })
            .setPositiveButton(R.string.twitt4droid_goto_settings, 
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(Settings.ACTION_SETTINGS));
                        finish();
                    }
                })
            .setCancelable(false)
            .show();
    }

    /** Sets up views. */
    @SuppressWarnings("deprecation")
    private void setUpView() {
        urlTextView = (TextView) findViewById(R.id.url_text);
        loadingBar = (ProgressBar) findViewById(R.id.loading_bar);
        refreshCancelButton = (ImageButton) findViewById(R.id.refresh_cancel_botton);
        webView = (WebView) findViewById(R.id.web_view);
        refreshCancelButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                onRefreshCancelButtonClick();
            }
        });
        CookieSyncManager.createInstance(this);
        CookieManager.getInstance().removeAllCookie();
        webView.getSettings().setSaveFormData(false);
        webView.getSettings().setSavePassword(false);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int progress) {
                if (progress == 100) {
                    loadingBar.setVisibility(View.INVISIBLE);
                    loadingBar.setProgress(0);
                    refreshCancelButton.setContentDescription(getString(R.string.twitt4droid_refresh_button_title));
                    refreshCancelButton.setImageResource(R.drawable.twitt4droid_ic_refresh_holo_dark);
                } else loadingBar.setVisibility(View.VISIBLE);
                loadingBar.setProgress(progress);
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                urlTextView.setText(url);
                if (url.startsWith(CALLBACK_URL)) {
                    Uri uri = Uri.parse(url);
                    if (uri.getQueryParameter(DENIED_CALLBACK_PARAMETER) != null) {
                        setResult(RESULT_CANCELED, getIntent());
                        finish();
                        return true;
                    }
                    if (uri.getQueryParameter(OAUTH_VERIFIER_CALLBACK_PARAMETER) != null) {
                        String oauthVerifier = uri.getQueryParameter(OAUTH_VERIFIER_CALLBACK_PARAMETER);
                        twitter.getOAuthAccessTokenAsync(oauthVerifier);
                        twitter.verifyCredentials();
                        return true;
                    }
                }

                return super.shouldOverrideUrlLoading(view, url);
            }
        });
    }

    /**
     * Handles user validation.
     * 
     * @param user the validated user.
     */
    private void handleUserValidation(User user) {
        Twitt4droid.saveOrUpdateUser(user, getApplicationContext());
        Intent data = getIntent();
        data.putExtra(EXTRA_USER, user);
        setResult(RESULT_OK, data);
        finish();
    }

    /** Shows a generic alert dialog. */
    private void showErrorAlertDialog() {
        new AlertDialog.Builder(WebLoginActivity.this)
            .setTitle(R.string.twitt4droid_error_title)
            .setMessage(R.string.twitt4droid_error_message)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setNegativeButton(R.string.twitt4droid_return,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        setResult(RESULT_CANCELED, getIntent());
                        finish();
                    }
                })
            .setPositiveButton(R.string.twitt4droid_continue, null)
            .setCancelable(false)
            .show();
    }

    /** {@inheritDoc} */
    @Override
    public void onBackPressed() {
        if (webView != null && webView.canGoBack()) {
            webView.goBack();
            urlTextView.setText(webView.getUrl());
        } else {
            setResult(RESULT_CANCELED, getIntent());
            finish();
        }
    }

    /** Action when the refresh/cancel button is clicked. */
    private void onRefreshCancelButtonClick() {
        if (refreshCancelButton.getDrawable().getConstantState().equals(
                getResources().getDrawable(R.drawable.twitt4droid_ic_cancel_holo_dark).getConstantState())) {
            webView.stopLoading();
            refreshCancelButton.setContentDescription(getString(R.string.twitt4droid_refresh_button_title));
            refreshCancelButton.setImageResource(R.drawable.twitt4droid_ic_refresh_holo_dark);
        } else {
            webView.reload();
            refreshCancelButton.setContentDescription(getString(R.string.twitt4droid_cancel_button_title));
            refreshCancelButton.setImageResource(R.drawable.twitt4droid_ic_cancel_holo_dark);
        }
    }
}




Java Source Code List

com.twitt4droid.Resources.java
com.twitt4droid.Twitt4droid.java
com.twitt4droid.activity.UserProfileActivity.java
com.twitt4droid.activity.WebLoginActivity.java
com.twitt4droid.app.activity.MainActivity.java
com.twitt4droid.app.activity.SettingsActivity.java
com.twitt4droid.app.activity.SignInActivity.java
com.twitt4droid.app.fragment.ListsFragment.java
com.twitt4droid.app.widget.DrawerItemAdapter.java
com.twitt4droid.app.widget.DrawerItem.java
com.twitt4droid.app.widget.ScrimInsetsFrameLayout.java
com.twitt4droid.data.dao.GenericDAO.java
com.twitt4droid.data.dao.ListTimelineDAO.java
com.twitt4droid.data.dao.TimelineDAO.java
com.twitt4droid.data.dao.UserDAO.java
com.twitt4droid.data.dao.UserTimelineDAO.java
com.twitt4droid.data.dao.impl.DAOFactory.java
com.twitt4droid.data.dao.impl.sqlite.ListSQLiteDAO.java
com.twitt4droid.data.dao.impl.sqlite.SQLiteTemplate.java
com.twitt4droid.data.dao.impl.sqlite.SQLiteUtils.java
com.twitt4droid.data.dao.impl.sqlite.StatusCursorImpl.java
com.twitt4droid.data.dao.impl.sqlite.TimelineSQLiteDAO.java
com.twitt4droid.data.dao.impl.sqlite.UserCursorImpl.java
com.twitt4droid.data.dao.impl.sqlite.UserSQLiteDAO.java
com.twitt4droid.data.dao.impl.sqlite.UserTimelineSQLiteDAO.java
com.twitt4droid.data.source.SQLFileParser.java
com.twitt4droid.data.source.Twitt4droidDatabaseHelper.java
com.twitt4droid.fragment.FixedQueryTimelineFragment.java
com.twitt4droid.fragment.HomeTimelineFragment.java
com.twitt4droid.fragment.ListTimelineFragment.java
com.twitt4droid.fragment.MentionsTimelineFragment.java
com.twitt4droid.fragment.QueryableTimelineFragment.java
com.twitt4droid.fragment.TimelineFragment.java
com.twitt4droid.fragment.UserTimelineFragment.java
com.twitt4droid.util.Files.java
com.twitt4droid.util.Images.java
com.twitt4droid.util.Objects.java
com.twitt4droid.util.Strings.java
com.twitt4droid.widget.LogInOutButton.java
com.twitt4droid.widget.TweetAdapter.java
com.twitt4droid.widget.TweetDialog.java