package edu.mit.mobile.android.locast.ver2.browser; /* * Copyright (C) 2011 MIT Mobile Experience Lab * * This program 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 2 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import android.app.Dialog; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Gallery; import android.widget.Toast; import edu.mit.mobile.android.appupdater.AppUpdateChecker; import edu.mit.mobile.android.imagecache.ImageCache; import edu.mit.mobile.android.imagecache.ImageLoaderAdapter; import edu.mit.mobile.android.locast.Constants; import edu.mit.mobile.android.locast.accounts.Authenticator; import edu.mit.mobile.android.locast.accounts.AuthenticatorActivity; import edu.mit.mobile.android.locast.accounts.AuthenticatorActivity.LogoutHandler; import edu.mit.mobile.android.locast.accounts.SigninOrSkip; import edu.mit.mobile.android.locast.casts.CastCursorAdapter; import edu.mit.mobile.android.locast.data.Cast; import edu.mit.mobile.android.locast.data.Event; import edu.mit.mobile.android.locast.data.Favoritable; import edu.mit.mobile.android.locast.data.Itinerary; import edu.mit.mobile.android.locast.sync.LocastSyncService; import edu.mit.mobile.android.locast.sync.LocastSyncStatusObserver; import edu.mit.mobile.android.locast.ver2.R; import edu.mit.mobile.android.locast.ver2.casts.LocatableListWithMap; import edu.mit.mobile.android.widget.NotificationProgressBar; import edu.mit.mobile.android.widget.RefreshButton; public class BrowserHome extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnClickListener { private ImageCache mImageCache; private CastCursorAdapter mAdapter; private AppUpdateChecker mAppUpdateChecker; private boolean shouldRefresh; private static final String TAG = BrowserHome.class.getSimpleName(); private NotificationProgressBar mProgressBar; private static final int REQUEST_SIGNIN_FAVORITES = 0; private static final int LOADER_FEATURED_CASTS = 0; private static final int DIALOG_LOGOUT = 100; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case LocastSyncStatusObserver.MSG_SET_REFRESHING: if (Constants.DEBUG) { Log.d(TAG, "refreshing..."); } mProgressBar.showProgressBar(true); mRefresh.setRefreshing(true); break; case LocastSyncStatusObserver.MSG_SET_NOT_REFRESHING: if (Constants.DEBUG) { Log.d(TAG, "done loading."); } mProgressBar.showProgressBar(false); mRefresh.setRefreshing(false); break; } }; }; private RefreshButton mRefresh; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mImageCache = ImageCache.getInstance(this); setContentView(R.layout.browser_main); mProgressBar =(NotificationProgressBar) (findViewById(R.id.progressNotification)); if (Constants.USE_APPUPDATE_CHECKER) { mAppUpdateChecker = new AppUpdateChecker(this, getString(R.string.app_update_url), new AppUpdateChecker.OnUpdateDialog(this, getString(R.string.app_name))); mAppUpdateChecker.checkForUpdates(); } final Gallery casts = (Gallery) findViewById(R.id.casts); final String[] from = { Cast._TITLE, Cast._AUTHOR, Cast._THUMBNAIL_URI }; final int[] to = { R.id.cast_title, R.id.author, R.id.media_thumbnail }; mAdapter = new CastCursorAdapter(this, null, R.layout.cast_large_thumbnail_item, from, to); casts.setAdapter(new ImageLoaderAdapter(this, mAdapter, mImageCache, new int[] { R.id.media_thumbnail }, 320, 200, ImageLoaderAdapter.UNIT_DIP)); casts.setOnItemClickListener(this); casts.setEmptyView(findViewById(R.id.progressNotification)); final LoaderManager lm = getSupportLoaderManager(); lm.initLoader(LOADER_FEATURED_CASTS, null, this); mRefresh = (RefreshButton) findViewById(R.id.refresh); mRefresh.setOnClickListener(this); findViewById(R.id.itineraries).setOnClickListener(this); findViewById(R.id.events).setOnClickListener(this); findViewById(R.id.nearby).setOnClickListener(this); findViewById(R.id.favorites).setOnClickListener(this); final boolean isFirstTime = SigninOrSkip.checkFirstTime(this); shouldRefresh = !isFirstTime; if (isFirstTime) { SigninOrSkip.startSignin(this, SigninOrSkip.REQUEST_SIGNIN); } } private Object mSyncHandle; @Override protected void onPause() { super.onPause(); if (mSyncHandle != null) { ContentResolver.removeStatusChangeListener(mSyncHandle); } } @Override protected void onResume() { super.onResume(); mSyncHandle = ContentResolver.addStatusChangeListener(0xff, new LocastSyncStatusObserver( this, mHandler)); LocastSyncStatusObserver.notifySyncStatusToHandler(this, mHandler); if (shouldRefresh) { refresh(false); } } @Override public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { final Cursor c = (Cursor) adapter.getAdapter().getItem(position); startActivity(new Intent(Intent.ACTION_VIEW, Cast.getCanonicalUri(c))); } private void refresh(boolean explicitSync) { // the default sync should get all the things we care about for the home screen. LocastSyncService.startSync(this, null, explicitSync); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case SigninOrSkip.REQUEST_SIGNIN: if (resultCode == RESULT_CANCELED) { finish(); } break; case REQUEST_SIGNIN_FAVORITES: if (resultCode == RESULT_OK) { onClick(findViewById(R.id.favorites)); } default: break; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.itineraries: startActivity(new Intent(Intent.ACTION_VIEW, Itinerary.CONTENT_URI)); break; case R.id.events: startActivity(new Intent(Intent.ACTION_VIEW, Event.CONTENT_URI)); break; case R.id.nearby: startActivity(new Intent(LocatableListWithMap.ACTION_SEARCH_NEARBY, Cast.CONTENT_URI)); break; case R.id.favorites: if (Authenticator.hasRealAccount(this)) { startActivity(new Intent(Intent.ACTION_VIEW, Favoritable.getFavoritedUri( Cast.CONTENT_URI, true))); } else { startActivityForResult( new Intent(this, SigninOrSkip.class).putExtra( SigninOrSkip.EXTRA_MESSAGE, getText(R.string.auth_signin_for_favorites)).putExtra( SigninOrSkip.EXTRA_SKIP_IS_CANCEL, true), REQUEST_SIGNIN_FAVORITES); } break; case R.id.refresh: refresh(true); break; } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { case LOADER_FEATURED_CASTS: return new CursorLoader(this, Cast.FEATURED, Cast.PROJECTION, null, null, Cast.SORT_ORDER_DEFAULT); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { mAdapter.swapCursor(c); } @Override public void onLoaderReset(Loader<Cursor> arg0) { mAdapter.swapCursor(null); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.homescreen_menu, menu); return true; } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_LOGOUT: return AuthenticatorActivity.createLogoutDialog(this, mLogoutHandler); default: return super.onCreateDialog(id); } } @Override public boolean onPrepareOptionsMenu(Menu menu) { final boolean hasRealAccount = Authenticator.hasRealAccount(this); menu.findItem(R.id.login).setVisible(!hasRealAccount); menu.findItem(R.id.logout).setVisible(hasRealAccount); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.login: startActivity(new Intent(this, AuthenticatorActivity.class)); return true; case R.id.logout: showDialog(DIALOG_LOGOUT); return true; default: return super.onOptionsItemSelected(item); } } private final LogoutHandler mLogoutHandler = new LogoutHandler(this) { @Override public void onAccountRemoved(boolean success) { if (success) { finish(); } else { Log.e(TAG, "error removing account"); Toast.makeText(BrowserHome.this, R.string.auth_logout_error, Toast.LENGTH_LONG).show(); } } }; // LogoutHandler }