com.infine.android.devoxx.ui.HomeActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.infine.android.devoxx.ui.HomeActivity.java

Source

/*
 * 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.infine.android.devoxx.ui;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.infine.android.devoxx.R;
import com.infine.android.devoxx.service.RestService;
import com.infine.android.devoxx.service.ServiceStatus;
import com.infine.android.devoxx.util.DetachableResultReceiver;
import com.infine.android.devoxx.util.EulaHelper;

/**
 * Front-door {@link Activity} that displays high-level features the schedule
 * application offers to users. Depending on whether the device is a phone or an
 * Android 3.0+ tablet, different layouts will be used. For example, on a phone,
 * the primary content is a {@link DashboardFragment}, whereas on a tablet, both
 * a {@link DashboardFragment} and a {@link TagStreamFragment} are displayed.
 */
public class HomeActivity extends BaseActivity {
    private static final String TAG = "HomeActivity";

    // 1 minute between 2 refresh, unless force=true in #triggerRefresh()
    private static final long REFRESH_INTERVAL = 60000;

    private TagStreamFragment mTagStreamFragment;
    private SyncStatusUpdaterFragment mSyncStatusUpdaterFragment;

    private long lastRefresh = 0;

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

        // TODO a virer
        // mode debug -- reset EULA
        // EulaHelper.resetEula(this);

        if (!EulaHelper.hasAcceptedEula(this)) {
            EulaHelper.showEula(false, this);
        }

        //      AnalyticsUtils.getInstance(this).trackPageView("/Home");

        setContentView(R.layout.activity_home);
        getActivityHelper().setupActionBar(null, 0);

        FragmentManager fm = getSupportFragmentManager();

        mTagStreamFragment = (TagStreamFragment) fm.findFragmentById(R.id.fragment_tag_stream);

        mSyncStatusUpdaterFragment = (SyncStatusUpdaterFragment) fm
                .findFragmentByTag(SyncStatusUpdaterFragment.TAG);
        if (mSyncStatusUpdaterFragment == null) {
            mSyncStatusUpdaterFragment = new SyncStatusUpdaterFragment();
            fm.beginTransaction().add(mSyncStatusUpdaterFragment, SyncStatusUpdaterFragment.TAG).commit();

            triggerRefresh(true);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        triggerRefresh(false);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        getActivityHelper().setupHomeActivity();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.home_menu_items, menu);
        super.onCreateOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.menu_refresh) {
            triggerRefresh(true);
            return true;
        } else if (item.getItemId() == R.id.menu_info) {
            showAbout();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * Execute a refresh of data.
     * @param forceRefresh bypass the interval between 2 refresh
     */
    private void triggerRefresh(boolean forceRefresh) {
        long now = System.currentTimeMillis();

        if (forceRefresh || now - lastRefresh > REFRESH_INTERVAL) {
            final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, RestService.class);

            intent.putExtra(RestService.EXTRA_STATUS_RECEIVER, mSyncStatusUpdaterFragment.mReceiver);

            startService(intent);

            if (mTagStreamFragment != null) {
                mTagStreamFragment.refresh();
            }
        }
        lastRefresh = now;
    }

    private void updateRefreshStatus(boolean refreshing) {
        getActivityHelper().setRefreshActionButtonCompatState(refreshing);
    }

    private void showAbout() {
        AlertDialog about = new AlertDialog.Builder(this).setTitle(R.string.description_info)
                .setIcon(android.R.drawable.ic_dialog_info).setMessage(R.string.dialog_about).setCancelable(true)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }).create();
        about.show();
    }

    /**
     * A non-UI fragment, retained across configuration changes, that updates
     * its activity's UI when sync status changes.
     */
    public static class SyncStatusUpdaterFragment extends Fragment implements DetachableResultReceiver.Receiver {
        public static final String TAG = SyncStatusUpdaterFragment.class.getName();

        private boolean mSyncing = false;
        private DetachableResultReceiver mReceiver;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
            mReceiver = new DetachableResultReceiver(new Handler());
            mReceiver.setReceiver(this);
        }

        /** {@inheritDoc} */
        public void onReceiveResult(int resultCode, Bundle resultData) {
            HomeActivity activity = (HomeActivity) getActivity();
            if (activity == null) {
                return;
            }

            switch (resultCode) {
            case ServiceStatus.STATUS_RUNNING: {
                mSyncing = true;
                break;
            }
            case ServiceStatus.STATUS_FINISHED: {
                mSyncing = false;
                break;
            }
            case ServiceStatus.STATUS_ERROR: {
                // Error happened down in SyncService, show as toast.
                mSyncing = false;
                final String errorText = getString(R.string.toast_sync_error,
                        resultData.getString(Intent.EXTRA_TEXT));
                Toast.makeText(activity, errorText, Toast.LENGTH_LONG).show();
                break;
            }
            }

            activity.updateRefreshStatus(mSyncing);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            ((HomeActivity) getActivity()).updateRefreshStatus(mSyncing);
        }
    }
}