/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.activity; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import com.galaxy.meetup.client.android.EsCursorLoader; import com.galaxy.meetup.client.android.HostNavigationBarAdapter; import com.galaxy.meetup.client.android.Intents; import com.galaxy.meetup.client.android.MeetupFeedback; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.ShakeDetector; import com.galaxy.meetup.client.android.SignOnManager; import com.galaxy.meetup.client.android.analytics.OzActions; import com.galaxy.meetup.client.android.analytics.OzViews; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsAccountsData; import com.galaxy.meetup.client.android.content.EsNotificationData; import com.galaxy.meetup.client.android.content.EsPostsData; import com.galaxy.meetup.client.android.content.EsProvider; import com.galaxy.meetup.client.android.hangout.GCommApp; import com.galaxy.meetup.client.android.hangout.Log; import com.galaxy.meetup.client.android.service.AndroidContactsSync; import com.galaxy.meetup.client.android.service.AndroidNotification; import com.galaxy.meetup.client.android.service.EsService; import com.galaxy.meetup.client.android.service.EsServiceListener; import com.galaxy.meetup.client.android.service.Hangout; import com.galaxy.meetup.client.android.service.ImageResourceManager; import com.galaxy.meetup.client.android.service.ServiceResult; import com.galaxy.meetup.client.android.ui.fragments.AlertFragmentDialog; import com.galaxy.meetup.client.android.ui.fragments.HostedAlbumsFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedEventListFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedHangoutFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedMessengerFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedPeopleFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedProfileFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedSquareListFragment; import com.galaxy.meetup.client.android.ui.fragments.HostedStreamFragment; import com.galaxy.meetup.client.android.ui.view.HostActionBar; import com.galaxy.meetup.client.android.ui.view.HostLayout; import com.galaxy.meetup.client.android.ui.view.NewFeaturesFragmentDialog; import com.galaxy.meetup.client.util.HelpUrl; import com.galaxy.meetup.client.util.MapUtils; import com.galaxy.meetup.client.util.Property; /** * * @author sihai * */ public class HomeActivity extends BaseActivity implements LoaderManager.LoaderCallbacks, AdapterView.OnItemClickListener, EsAccountsData.ExperimentListener, HostActionBar.OnUpButtonClickListener, HostLayout.HostLayoutListener { private static final Uri REMOVE = Uri.parse("https://plus.google.com/downgrade/"); private HostActionBar mActionBar; private Bundle mDestination; private Parcelable mDestinationState[]; private boolean mDestinationsConfigured; private List mDialogTags; protected boolean mFirstLoad; private HostLayout mHostLayout; private ListView mNavigationBar; private HostNavigationBarAdapter mNavigationBarAdapter; private int mNavigationBarScrollPosition; private int mNotificationCount; private boolean mNotificationsLoaded; private Integer mRequestId; private EsServiceListener mServiceListener; private ShakeDetector.ShakeEventListener mShakeListener; private SignOnManager mSignOnManager; public HomeActivity() { mNavigationBarScrollPosition = -1; mDestinationState = new Parcelable[9]; mFirstLoad = true; mServiceListener = new EsServiceListener() { public final void onSyncNotifications(int i, ServiceResult serviceresult) { handleServiceCallback(i, serviceresult); } }; mSignOnManager = new SignOnManager(this); } private void buildDestinationBundleForIntent() { Intent intent = getIntent(); Bundle bundle = intent.getExtras(); mDestination = new Bundle(); if(bundle == null) { mDestination.putInt("destination", 0); } else { mDestination.putAll(bundle); int i = intent.getIntExtra("destination", 0); mDestination.putInt("destination", i); } mDestination.putParcelable("account", mSignOnManager.getAccount()); } private void configureDestinations() { mNavigationBarAdapter.removeAllDestinations(); mNavigationBarAdapter.addDestination(0, R.drawable.ic_nav_home, R.string.home_stream_label); mNavigationBarAdapter.addDestination(5, R.drawable.ic_nav_circles, R.string.home_screen_people_label); EsAccount esaccount = mSignOnManager.getAccount(); boolean flag; Intent intent; boolean flag1; boolean flag2; if(esaccount != null && esaccount.isPlusPage()) flag = true; else flag = false; if(flag) mNavigationBarAdapter.addDestination(1, R.drawable.ic_nav_profile, esaccount.getDisplayName(), esaccount.getGaiaId()); else mNavigationBarAdapter.addDestination(1, R.drawable.ic_nav_profile, R.string.home_screen_profile_label); mNavigationBarAdapter.addDestination(7, R.drawable.ic_nav_myphotos, R.string.home_screen_photos_label); if(Property.ENABLE_SQUARES.getBoolean()) mNavigationBarAdapter.addDestination(8, R.drawable.ic_nav_communities, R.string.home_screen_squares_label); if(esaccount != null && !flag && Hangout.isHangoutCreationSupported(getApplicationContext(), esaccount)) mNavigationBarAdapter.addDestination(3, R.drawable.ic_nav_hangouts, R.string.home_screen_hangout_label); mNavigationBarAdapter.addDestination(2, R.drawable.ic_nav_events, R.string.home_screen_events_label); if(!flag) mNavigationBarAdapter.addDestination(4, R.drawable.ic_nav_messenger, R.string.home_screen_huddle_label); intent = MapUtils.getPlacesActivityIntent(); flag1 = getPackageManager().queryIntentActivities(intent, 0x10000).isEmpty(); flag2 = false; if(!flag1) flag2 = true; if(flag2 && !flag) mNavigationBarAdapter.addDestination(6, R.drawable.ic_nav_local, R.string.home_screen_local_label); mNavigationBarAdapter.showDestinations(); mDestinationsConfigured = true; restoreNavigationBarScrollPosition(); } private void handleServiceCallback(int i, ServiceResult serviceresult) { if (mRequestId != null && mRequestId.intValue() == i) { mRequestId = null; updateNotificationsSpinner(); } } private static boolean isLauncherIntent(Intent intent) { boolean flag; if ("android.intent.action.MAIN".equals(intent.getAction()) && intent.getCategories() != null && intent.getCategories().contains( "android.intent.category.LAUNCHER") && intent.getExtras() == null) flag = true; else flag = false; return flag; } private void navigateToDestination(int i, Bundle bundle, boolean flag, Fragment.SavedState savedstate) { EsAccount esaccount = mSignOnManager.getAccount(); boolean flag1; if(esaccount != null && esaccount.isPlusPage()) flag1 = true; else flag1 = false; if(i == 4 && flag1) i = 0; switch(i) { case 0: HostedStreamFragment hostedstreamfragment = new HostedStreamFragment(); hostedstreamfragment.setArguments(bundle); mHostLayout.showFragment(hostedstreamfragment, flag, savedstate); break; case 1: HostedProfileFragment hostedprofilefragment = new HostedProfileFragment(); if(!bundle.containsKey("person_id")) bundle.putString("person_id", mSignOnManager.getAccount().getPersonId()); hostedprofilefragment.setArguments(bundle); mHostLayout.showFragment(hostedprofilefragment, flag, savedstate); break; case 2: HostedEventListFragment hostedeventlistfragment = new HostedEventListFragment(); bundle.putBoolean("refresh", true); hostedeventlistfragment.setArguments(bundle); mHostLayout.showFragment(hostedeventlistfragment, flag, savedstate); break; case 3: try { Context context; context = getApplicationContext(); if(esaccount == null) break; if(Hangout.isHangoutCreationSupported(context, esaccount)) { GCommApp.getInstance(context).getGCommNativeWrapper().getCurrentState(); HostedHangoutFragment hostedhangoutfragment = new HostedHangoutFragment(); hostedhangoutfragment.setArguments(bundle); mHostLayout.showFragment(hostedhangoutfragment, flag, savedstate); } if(esaccount != null && Hangout.getSupportedStatus(context, esaccount) == Hangout.SupportStatus.SUPPORTED && GCommApp.getInstance(context).isInAHangout()) { Intent intent = GCommApp.getInstance(this).getGCommService().getNotificationIntent(); if(intent != null) startActivity(intent); } } catch (LinkageError linkageerror) { int j = R.string.hangout_native_lib_error; String s = getResources().getString(j); Object aobj[] = new Object[2]; aobj[0] = s; aobj[1] = Boolean.valueOf(false); Log.debug("showError: message=%s finishOnOk=%s", aobj); AlertFragmentDialog alertfragmentdialog = AlertFragmentDialog.newInstance(null, s, getResources().getString(R.string.ok), null, 0x1080027); alertfragmentdialog.setCancelable(false); final boolean finishOnOk = flag; alertfragmentdialog.setListener(new AlertFragmentDialog.AlertDialogListener() { public final void onDialogCanceled(String s1) { } public final void onDialogListClick(int k, Bundle bundle1) { } public final void onDialogNegativeClick(String s1) { } public final void onDialogPositiveClick(Bundle bundle1, String s1) { if(finishOnOk) { finish(); } else { if(mHostLayout.isNavigationBarVisible()) mHostLayout.hideNavigationBar(); mDestination = null; } } }); alertfragmentdialog.show(getSupportFragmentManager(), "error"); } break; case 4: HostedMessengerFragment hostedmessengerfragment = new HostedMessengerFragment(); hostedmessengerfragment.setArguments(bundle); mHostLayout.showFragment(hostedmessengerfragment, true, savedstate); break; case 5: HostedPeopleFragment hostedpeoplefragment = new HostedPeopleFragment(true); hostedpeoplefragment.setArguments(bundle); mHostLayout.showFragment(hostedpeoplefragment, flag, savedstate); break; case 6: break; case 7: HostedAlbumsFragment hostedalbumsfragment = new HostedAlbumsFragment(); if(!bundle.containsKey("person_id")) bundle.putString("person_id", mSignOnManager.getAccount().getPersonId()); if(!bundle.containsKey("photos_home")) bundle.putBoolean("photos_home", true); hostedalbumsfragment.setArguments(bundle); mHostLayout.showFragment(hostedalbumsfragment, flag, savedstate); break; case 8: HostedSquareListFragment hostedsquarelistfragment = new HostedSquareListFragment(); bundle.putBoolean("refresh", true); hostedsquarelistfragment.setArguments(bundle); mHostLayout.showFragment(hostedsquarelistfragment, flag, null); break; default: break; } } private void refreshNotifications() { mRequestId = EsService.syncNotifications(this, mSignOnManager.getAccount()); updateNotificationsSpinner(); } private void restoreNavigationBarScrollPosition() { if(mNavigationBarScrollPosition != -1 && mDestinationsConfigured && mNotificationsLoaded) { mNavigationBar.setSelection(mNavigationBarScrollPosition); mNavigationBarScrollPosition = -1; } } private void saveDestinationState() { if(mDestination != null) { int i = mDestination.getInt("destination", -1); if(i != -1) mDestinationState[i] = mHostLayout.saveHostedFragmentState(); } } private void showCurrentDestination() { if(mActionBar != null) mActionBar.dismissPopupMenus(); if(mDialogTags != null && !mDialogTags.isEmpty()) { FragmentManager fragmentmanager = getSupportFragmentManager(); Iterator iterator = mDialogTags.iterator(); do { if(!iterator.hasNext()) break; DialogFragment dialogfragment = (DialogFragment)fragmentmanager.findFragmentByTag((String)iterator.next()); if(dialogfragment != null) dialogfragment.dismissAllowingStateLoss(); } while(true); mDialogTags = null; } navigateToDestination(mDestination.getInt("destination"), mDestination, false, null); } private void updateNotificationsSpinner() { if(mNavigationBarAdapter != null) if(mRequestId != null) mNavigationBarAdapter.showProgressIndicator(); else mNavigationBarAdapter.hideProgressIndicator(); } protected final EsAccount getAccount() { return mSignOnManager.getAccount(); } public final OzViews getViewForLogging() { HostedFragment hostedfragment; OzViews ozviews; if(mHostLayout == null) hostedfragment = null; else hostedfragment = mHostLayout.getCurrentHostedFragment(); if(hostedfragment == null) ozviews = OzViews.HOME; else ozviews = hostedfragment.getViewForLogging(); return ozviews; } public void onActivityResult(int i, int j, Intent intent) { if(!mSignOnManager.onActivityResult(i, j)) super.onActivityResult(i, j, intent); } public final void onAttachFragment(Fragment fragment) { if(mHostLayout != null && (fragment instanceof HostedFragment)) mHostLayout.onAttachFragment((HostedFragment)fragment); if(fragment instanceof DialogFragment) { if(mDialogTags == null) mDialogTags = new ArrayList(); mDialogTags.add(fragment.getTag()); } } public void onBackPressed() { if (mHostLayout.isNavigationBarVisible()) { mHostLayout.hideNavigationBar(); return; } if (mHostLayout.getCurrentHostedFragment() == null || !mHostLayout.getCurrentHostedFragment().onBackPressed()) super.onBackPressed(); } protected void onCreate(Bundle bundle) { if(bundle != null) bundle.setClassLoader(getClass().getClassLoader()); super.onCreate(bundle); if(!isTaskRoot()) { int i = getIntent().getIntExtra("destination", 0); if(isLauncherIntent(getIntent()) || i == 4) { finish(); return; } } mSignOnManager.onCreate(bundle, getIntent()); if(isFinishing()) { // TODO return; } setContentView(R.layout.host_navigation_activity); mHostLayout = (HostLayout)findViewById(R.id.host); mHostLayout.setListener(this); mActionBar = mHostLayout.getActionBar(); mActionBar.setOnUpButtonClickListener(this); mActionBar.setUpButtonContentDescription(getString(R.string.main_menu_content_description)); mNavigationBar = (ListView)mHostLayout.getNavigationBar(); mNavigationBarAdapter = new HostNavigationBarAdapter(this); mNavigationBarAdapter.setCollapsedMenuItemCount(mHostLayout.getCollapsedMenuItemCount()); mNavigationBar.setAdapter(mNavigationBarAdapter); mNavigationBar.setOnItemClickListener(this); EsAccountsData.registerExperimentListener(this); configureDestinations(); if(null != bundle) { if(bundle.containsKey("reqId")) mRequestId = Integer.valueOf(bundle.getInt("reqId")); mNavigationBarScrollPosition = bundle.getInt("scrollPos"); mNavigationBarAdapter.setCollapsed(bundle.getBoolean("navBarCollapsed", true)); mHostLayout.attachActionBar(); } else { if(mSignOnManager.isSignedIn()) { boolean flag; buildDestinationBundleForIntent(); showCurrentDestination(); if(getIntent().getBooleanExtra("show_notifications", false)) mHostLayout.showNavigationBarDelayed(); EsAccount esaccount = mSignOnManager.getAccount(); boolean flag2; if(esaccount != null && esaccount.isPlusPage()) flag = true; else flag = false; if(!flag && EsAccountsData.isContactsStatsSyncPreferenceSet(this, mSignOnManager.getAccount())) { (new NewFeaturesFragmentDialog(mSignOnManager.getAccount())).show(getSupportFragmentManager(), "new_features"); } else { if(!flag) { boolean flag1; if(android.os.Build.VERSION.SDK_INT >= 14 && !EsAccountsData.isContactsSyncPreferenceSet(this, mSignOnManager.getAccount()) && AndroidContactsSync.isAndroidSyncSupported(this)) flag1 = true; else flag1 = false; if(flag1) startActivity(Intents.getContactsSyncConfigActivityIntent(this, mSignOnManager.getAccount())); } } } } if(mSignOnManager.getAccount() != null) getSupportLoaderManager().initLoader(0, null, this); mActionBar.setNotificationCount(mNotificationCount); ShakeDetector shakedetector = ShakeDetector.getInstance(getApplicationContext()); if(shakedetector != null) { mShakeListener = new ShakeDetector.ShakeEventListener() { public final void onShakeDetected() { EsAccount esaccount1 = getAccount(); Context context = getApplicationContext(); if(esaccount1 != null && Hangout.isHangoutCreationSupported(context, esaccount1) || Hangout.getSupportedStatus(context, esaccount1) == Hangout.SupportStatus.SUPPORTED && GCommApp.getInstance(context).isInAHangout()) { Intent intent = Intents.getHangoutActivityIntent(context, esaccount1); intent.addFlags(0x4000000); intent.addFlags(0x10000000); getApplicationContext().startActivity(intent); } } }; shakedetector.addEventListener(mShakeListener); shakedetector.start(); } } public final Loader onCreateLoader(int i, Bundle bundle) { Loader loader = null; switch(i) { case 0: EsAccount esaccount = mSignOnManager.getAccount(); loader = null; if(esaccount != null) loader = new EsCursorLoader(this, EsProvider.appendAccountParameter(EsProvider.NOTIFICATIONS_URI, esaccount), EsNotificationData.NotificationQuery.PROJECTION, null, null, "timestamp DESC"); break; default: break; } return loader; } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.host_menu, menu); return true; } protected void onDestroy() { super.onDestroy(); ShakeDetector shakedetector = ShakeDetector.getInstance(getApplicationContext()); if (shakedetector != null) { shakedetector.removeEventListener(mShakeListener); shakedetector.stop(); } ImageResourceManager.getInstance(this).verifyEmpty(); EsAccountsData.unregisterExperimentListener(this); } public final void onExperimentsChanged() { configureDestinations(); } public void onItemClick(AdapterView adapterview, View view, int i, long l) { if(mNavigationBarAdapter.isNotificationHeader(i)) { refreshNotifications(); return; } int j = mNavigationBarAdapter.getDestinationId(i); if(j != -1) { if(j == -2) mNavigationBarAdapter.setCollapsed(false); else if(j == 6) { startActivity(MapUtils.getPlacesActivityIntent()); mHostLayout.hideNavigationBar(); } else if(mDestination != null && mDestination.getInt("destination") == j) { mHostLayout.hideNavigationBar(); } else { saveDestinationState(); mDestination = new Bundle(); mDestination.putParcelable("account", mSignOnManager.getAccount()); mDestination.putInt("destination", j); navigateToDestination(j, mDestination, true, (android.support.v4.app.Fragment.SavedState)mDestinationState[j]); } } else { Cursor cursor = (Cursor)mNavigationBarAdapter.getItem(i); if(cursor != null) { Intent intent = AndroidNotification.newViewNotificationIntent(this, mSignOnManager.getAccount(), cursor); if(intent != null) { String s = cursor.getString(1); if(cursor.getInt(11) != 1) EsService.markNotificationAsRead(this, mSignOnManager.getAccount(), s); intent.putExtra("com.google.plus.analytics.intent.extra.START_VIEW", OzViews.NOTIFICATIONS_WIDGET); intent.putExtra("com.google.plus.analytics.intent.extra.FROM_NOTIFICATION", true); startActivity(intent); } } } } public final void onLoadFinished(Loader loader, Object obj) { Cursor cursor = (Cursor)obj; mNavigationBarAdapter.setNotifications(cursor); mNotificationCount = mNavigationBarAdapter.getUnreadNotificationCount(); mActionBar.setNotificationCount(mNotificationCount); mNotificationsLoaded = true; restoreNavigationBarScrollPosition(); if(cursor.getCount() == 0 && mFirstLoad) refreshNotifications(); mFirstLoad = false; } public final void onLoaderReset(Loader loader) { } public final void onNavigationBarVisibilityChange(boolean flag) { if(!flag && mNavigationBarAdapter != null) { mNavigationBarAdapter.setCollapsed(true); if(mNavigationBarAdapter.getUnreadNotificationCount() > 0) { EsAccount esaccount = mSignOnManager.getAccount(); if(esaccount != null) EsService.tellServerNotificationsWereRead(this, esaccount); } } } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if(mSignOnManager.isSignedIn() && !isLauncherIntent(intent)) { setIntent(intent); buildDestinationBundleForIntent(); showCurrentDestination(); if(intent.getBooleanExtra("show_notifications", false)) mHostLayout.showNavigationBarDelayed(); } } public boolean onOptionsItemSelected(MenuItem menuitem) { boolean flag = true; if(!mHostLayout.onOptionsItemSelected(menuitem)) { int i = menuitem.getItemId(); if(i == R.id.search) startActivity(Intents.getPostSearchActivityIntent(this, mSignOnManager.getAccount(), null)); else if(i == R.id.feedback) { recordUserAction(OzActions.SETTINGS_FEEDBACK); MeetupFeedback.launch(this); } else if(i == R.id.settings) startActivity(Intents.getSettingsActivityIntent(this, mSignOnManager.getAccount())); else if(i == R.id.help) startExternalActivity(new Intent("android.intent.action.VIEW", HelpUrl.getHelpUrl(this, getResources().getString(R.string.url_param_help_stream)))); else if(i == R.id.sign_out) mSignOnManager.signOut(false); else flag = super.onOptionsItemSelected(menuitem); } return flag; } protected void onPause() { super.onPause(); mSignOnManager.onPause(); EsService.unregisterListener(mServiceListener); } public boolean onPrepareOptionsMenu(Menu menu) { int i = menu.size(); int j = 0; while(j < i) { MenuItem menuitem = menu.getItem(j); int k = menuitem.getItemId(); if(k == R.id.search || k == R.id.feedback || k == R.id.settings || k == R.id.help || k == R.id.sign_out) menuitem.setVisible(true); else menuitem.setVisible(false); j++; } mHostLayout.onPrepareOptionsMenu(menu); return true; } protected void onResume() { boolean flag; super.onResume(); flag = mSignOnManager.onResume(); EsService.registerListener(mServiceListener); if(mRequestId != null) { if(!EsService.isRequestPending(mRequestId.intValue())) { int i = mRequestId.intValue(); handleServiceCallback(i, EsService.removeResult(mRequestId.intValue())); } else { updateNotificationsSpinner(); } } else { updateNotificationsSpinner(); } if(getIntent().getBooleanExtra("sign_out", false)) { mSignOnManager.signOut(true); startExternalActivity(new Intent("android.intent.action.VIEW", REMOVE)); finish(); return; } if(mSignOnManager.getAccount() == null) Arrays.fill(mDestinationState, null); if(flag) { getSupportLoaderManager().initLoader(0, null, this); configureDestinations(); buildDestinationBundleForIntent(); showCurrentDestination(); } } protected void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); if (mRequestId != null) bundle.putInt("reqId", mRequestId.intValue()); if (mNavigationBar != null) { bundle.putInt("scrollPos", mNavigationBar.getFirstVisiblePosition()); bundle.putBoolean("navBarCollapsed", mNavigationBarAdapter.isCollapsed()); } saveDestinationState(); } protected void onStart() { super.onStart(); EsPostsData.setSyncEnabled(false); } protected void onStop() { super.onStop(); EsPostsData.setSyncEnabled(true); } public final void onUpButtonClick() { if (mHostLayout.isNavigationBarVisible() || mHostLayout.getCurrentHostedFragment() == null || !mHostLayout.getCurrentHostedFragment().onUpButtonClicked()) mHostLayout.toggleNavigationBarVisibility(); } }