com.scoreloop.android.coreui.BaseActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.scoreloop.android.coreui.BaseActivity.java

Source

/*
 * In derogation of the Scoreloop SDK - License Agreement concluded between
 * Licensor and Licensee, as defined therein, the following conditions shall
 * apply for the source code contained below, whereas apart from that the
 * Scoreloop SDK - License Agreement shall remain unaffected.
 * 
 * Copyright: Scoreloop AG, Germany (Licensor)
 * 
 * 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.scoreloop.android.coreui;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.ActivityGroup;
import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.scoreloop.client.android.core.controller.RequestController;
import com.scoreloop.client.android.core.controller.SocialProviderController;
import com.scoreloop.client.android.core.controller.SocialProviderControllerObserver;
import com.scoreloop.client.android.core.controller.UserController;
import com.scoreloop.client.android.core.controller.UserControllerObserver;
import com.scoreloop.client.android.core.model.Session;
import com.scoreloop.client.android.core.model.SocialProvider;

//this part is included in the ScoreloopCoreUI doc
import com.geekadoo.R;

abstract class BaseActivity extends ActivityGroup {

    private final class SocialConnectObserver implements SocialProviderControllerObserver {
        @Override
        public void socialProviderControllerDidCancel(final SocialProviderController controller) {
            showDialogSafe(DIALOG_ERROR_SOCIAL_USER_CANCEL);
            onSocialProviderConnectionStatusChange(controller.getSocialProvider());
        }

        @Override
        public void socialProviderControllerDidEnterInvalidCredentials(final SocialProviderController controller) {
            showDialogSafe(DIALOG_ERROR_SOCIAL_USER_INVALID);
            onSocialProviderConnectionStatusChange(controller.getSocialProvider());
        }

        @Override
        public void socialProviderControllerDidFail(final SocialProviderController controller,
                final Throwable error) {
            showDialogSafe(DIALOG_ERROR_SOCIAL_FAILED);
            onSocialProviderConnectionStatusChange(controller.getSocialProvider());
        }

        @Override
        public void socialProviderControllerDidSucceed(final SocialProviderController controller) {
            onSocialProviderConnectionStatusChange(controller.getSocialProvider());
        }
    }

    class GenericListItemAdapter extends ArrayAdapter<ListItem> {
        ImageView image;
        ListItem listItem;
        TextView text0;
        TextView text1;
        TextView text2;

        public GenericListItemAdapter(final Context context, final int resource, final List<ListItem> objects) {
            super(context, resource, objects);
        }

        View init(final int position, View convertView) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.sl_list_item, null);
            }

            listItem = getItem(position);

            text0 = (TextView) convertView.findViewById(R.id.text0);
            text1 = (TextView) convertView.findViewById(R.id.text1);
            text2 = (TextView) convertView.findViewById(R.id.text2);
            image = (ImageView) convertView.findViewById(R.id.image);

            return convertView;
        }
    }

    class UserGenericObserver implements UserControllerObserver {

        @Override
        public void requestControllerDidFail(final RequestController requestController, final Exception exception) {
        }

        @Override
        public void requestControllerDidReceiveResponse(final RequestController requestController) {
        }

        @Override
        public void userControllerDidFailOnEmailAlreadyTaken(final UserController controller) {
        }

        @Override
        public void userControllerDidFailOnInvalidEmailFormat(final UserController controller) {
        }

        @Override
        public void userControllerDidFailOnUsernameAlreadyTaken(final UserController controller) {
        }

    }

    private static Map<String, Drawable> map = Collections.synchronizedMap(new HashMap<String, Drawable>());
    private static Runnable notify;
    static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
    static final int DIALOG_ERROR_NETWORK = 0;
    static final int DIALOG_ERROR_SOCIAL_FAILED = 5;
    static final int DIALOG_ERROR_SOCIAL_USER_CANCEL = 4;
    static final int DIALOG_ERROR_SOCIAL_USER_INVALID = 6;
    static final int DIALOG_ERROR_USER_EMAIL_ALREADY_TAKEN = 1;
    static final int DIALOG_ERROR_USER_INVALID_EMAIL_FORMAT = 2;
    static final int DIALOG_ERROR_USER_NAME_ALREADY_TAKEN = 3;
    static final SocialProvider facebookProvider = SocialProvider
            .getSocialProviderForIdentifier(SocialProvider.FACEBOOK_IDENTIFIER);
    static final int MENU_GAMES = 2;

    static final int MENU_HIGHSCORES = 0;
    static final int MENU_PROFILE = 1;
    static final SocialProvider myspaceProvider = SocialProvider
            .getSocialProviderForIdentifier(SocialProvider.MYSPACE_IDENTIFIER);

    static final SocialProvider twitterProvider = SocialProvider
            .getSocialProviderForIdentifier(SocialProvider.TWITTER_IDENTIFIER);

    private final Handler handler = new Handler();

    private boolean shouldShowDialogs;

    @Override
    public void onWindowFocusChanged(final boolean hasFocus) {
        if (hasFocus) {
            final ImageView imageView = ((ImageView) getTopActivity().findViewById(R.id.progress_indicator));
            if ((imageView != null) && (imageView.getVisibility() == View.VISIBLE)) {
                final AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
                frameAnimation.start();
            }
        }
    }

    private Dialog createErrorDialog(final int resId) {
        final Dialog dialog = new Dialog(this);
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        final View view = getLayoutInflater().inflate(R.layout.sl_dialog_custom, null);
        dialog.setContentView(view);
        dialog.setCanceledOnTouchOutside(true);
        ((TextView) view.findViewById(R.id.message)).setText(getString(resId));
        return dialog;
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    @Override
    protected Dialog onCreateDialog(final int id) {
        switch (id) {
        case DIALOG_ERROR_NETWORK:
            return createErrorDialog(R.string.sl_error_message_network);
        case DIALOG_ERROR_USER_EMAIL_ALREADY_TAKEN:
            return createErrorDialog(R.string.sl_error_message_email_already_taken);
        case DIALOG_ERROR_USER_NAME_ALREADY_TAKEN:
            return createErrorDialog(R.string.sl_error_message_name_already_taken);
        case DIALOG_ERROR_USER_INVALID_EMAIL_FORMAT:
            return createErrorDialog(R.string.sl_error_message_invalid_email);
        case DIALOG_ERROR_SOCIAL_USER_CANCEL:
            return createErrorDialog(R.string.sl_error_message_user_cancel);
        case DIALOG_ERROR_SOCIAL_FAILED:
            return createErrorDialog(R.string.sl_error_message_connect_failed);
        case DIALOG_ERROR_SOCIAL_USER_INVALID:
            return createErrorDialog(R.string.sl_error_message_user_invalid);
        default:
            return null;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        shouldShowDialogs = false;
    }

    @Override
    protected void onStart() {
        super.onStart();
        shouldShowDialogs = true;
    }

    void connectToSocialProvider(final SocialProvider socialProvider) {
        if (socialProvider.isUserConnected(Session.getCurrentSession().getUser())) {
            onSocialProviderConnectionStatusChange(socialProvider);
        } else {
            final SocialProviderController socialController = SocialProviderController
                    .getSocialProviderController(socialProvider.getIdentifier(), new SocialConnectObserver());
            socialController.connect(this);
        }
    }

    Drawable getDrawable(final String url) {
        if (!map.containsKey(url)) {
            final Drawable drawable = getResources().getDrawable(R.drawable.sl_game_default);
            map.put(url, drawable);

            final Thread thread = new Thread() {
                @Override
                public void run() {
                    try {
                        final DefaultHttpClient httpClient = new DefaultHttpClient();
                        final HttpGet request = new HttpGet(url);
                        final HttpResponse response = httpClient.execute(request);
                        final InputStream inputStream = response.getEntity().getContent();
                        final Drawable drawable = Drawable.createFromStream(inputStream, "src");
                        map.put(url, drawable);
                    } catch (final MalformedURLException e) {
                        map.remove(url);
                    } catch (final IOException e) {
                        map.remove(url);
                    }

                    handler.post(notify);
                }
            };
            thread.start();
        }

        return map.get(url);
    }

    Activity getTopActivity() {
        return (getParent() == null ? this : getParent());
    }

    <T> boolean isEmpty(final T t) {
        return (t == null) || "".equals(t.toString().trim());
    }

    void onSocialProviderConnectionStatusChange(final SocialProvider socialProvider) {
    }

    void setNotify(final Runnable notify) {
        BaseActivity.notify = notify;
    }

    void setProgressIndicator(final boolean visible) {
        final ImageView imageView = ((ImageView) getTopActivity().findViewById(R.id.progress_indicator));
        if (visible) {
            imageView.setVisibility(View.VISIBLE);
        } else {
            imageView.setVisibility(View.INVISIBLE);
        }
    }

    void showDialogSafe(final int res) {
        if (shouldShowDialogs) {
            showDialog(res);
        }
    }

    void showToast(final String message) {
        final View view = getLayoutInflater().inflate(R.layout.sl_dialog_custom, null);
        ((TextView) view.findViewById(R.id.message)).setText(message);
        final Toast toast = new Toast(getApplicationContext());
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
    }

    void updateHeading(final String heading, final boolean showIcon) {
        ((TextView) findViewById(R.id.heading_text)).setText(heading);
        if (!showIcon) {
            ((ImageView) findViewById(R.id.icon_image)).setVisibility(View.GONE);
        }
    }

    void updateStatusBar() {
        if (Session.getCurrentSession().isAuthenticated()) {
            ((TextView) getTopActivity().findViewById(R.id.login_text))
                    .setText(Session.getCurrentSession().getUser().getLogin());
        }
    }
}