/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.fragments; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.app.FragmentActivity; import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Toast; import com.galaxy.meetup.client.android.EsCursorLoader; import com.galaxy.meetup.client.android.EsMatrixCursor; import com.galaxy.meetup.client.android.Intents; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.SquareCardAdapter; import com.galaxy.meetup.client.android.analytics.EsAnalytics; 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.EsAnalyticsData; import com.galaxy.meetup.client.android.content.EsProvider; import com.galaxy.meetup.client.android.content.EsSquaresData; import com.galaxy.meetup.client.android.service.EsService; import com.galaxy.meetup.client.android.service.EsServiceListener; import com.galaxy.meetup.client.android.service.ServiceResult; import com.galaxy.meetup.client.android.ui.view.ColumnGridView; import com.galaxy.meetup.client.android.ui.view.HostActionBar; import com.galaxy.meetup.client.android.ui.view.SquareListItemView; import com.galaxy.meetup.client.util.HelpUrl; import com.galaxy.meetup.client.util.Property; /** * * @author sihai * */ public class HostedSquareListFragment extends HostedEsFragment implements android.support.v4.app.LoaderManager.LoaderCallbacks, AlertFragmentDialog.AlertDialogListener, SquareListItemView.OnItemClickListener { private SquareCardAdapter mAdapter; private Context mContext; private int mCurrentMode; private int mCurrentSpinnerPosition; private boolean mDataPresent; private EsMatrixCursor mDescriptionHeaderCursor; private String mErrorText; private ColumnGridView mGridView; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final EsServiceListener mListener = new EsServiceListener() { public final void onGetSquaresComplete(int i, ServiceResult serviceresult) { if(mNewerReqId != null && i == mNewerReqId.intValue()) { mNewerReqId = null; mRefreshNeeded = false; if(serviceresult.hasError()) setError(getString(R.string.squares_load_error)); else clearError(); updateSpinner(); mHandler.post(new Runnable() { public final void run() { if(getActivity() != null && !getActivity().isFinishing()) getLoaderManager().restartLoader(0, null, HostedSquareListFragment.this); } }); } } }; private boolean mRefreshNeeded; private ArrayAdapter mSpinnerAdapter; private boolean mSquaresLoaderActive; public HostedSquareListFragment() { mCurrentMode = 0; mSquaresLoaderActive = true; } private void fetchData() { if(mNewerReqId == null && mContext != null) { if(!mDataPresent) showEmptyViewProgress(getView(), getString(R.string.loading)); mNewerReqId = Integer.valueOf(EsService.getSquares(mContext, mAccount)); } updateSpinner(); } private boolean hasError() { boolean flag; if(mErrorText != null) flag = true; else flag = false; return flag; } protected final void clearError() { mErrorText = null; } public final OzViews getViewForLogging() { return OzViews.SQUARE_HOME; } protected final boolean isEmpty() { boolean flag; if(mAdapter == null || mAdapter.isEmpty()) flag = true; else flag = false; return flag; } protected final boolean isProgressIndicatorVisible() { boolean flag; if(super.isProgressIndicatorVisible() || mSquaresLoaderActive) flag = true; else flag = false; return flag; } public final void onActionButtonClicked(int i) { if(0 == i) { startActivity(Intents.getSquareSearchActivityIntent(mContext, mAccount)); } } public final void onAttach(Activity activity) { super.onAttach(activity); mContext = activity; } public final void onClick(String s) { startActivity(Intents.getSquareStreamActivityIntent(getActivity(), mAccount, s, null, null)); } public final void onCreate(Bundle bundle) { super.onCreate(bundle); if(bundle != null) { mRefreshNeeded = bundle.getBoolean("squares_refresh", false); mCurrentMode = bundle.getInt("squares_currentmode", 0); mDataPresent = bundle.getBoolean("squares_datapresent", false); } else { mRefreshNeeded = getArguments().getBoolean("refresh", false); } getLoaderManager().initLoader(0, null, this); } public final Loader onCreateLoader(int i, Bundle bundle) { mSquaresLoaderActive = true; return new SquaresLoader(mContext, mAccount, mCurrentMode); } public final View onCreateView(LayoutInflater layoutinflater, ViewGroup viewgroup, Bundle bundle) { View view = layoutinflater.inflate(R.layout.hosted_squares_fragment, viewgroup, false); mGridView = (ColumnGridView)view.findViewById(R.id.grid); mAdapter = new SquareCardAdapter(mContext, mAccount, this, mGridView); mGridView.setAdapter(mAdapter); setupEmptyView(view, R.string.no_squares); return view; } public final void onDialogCanceled(String s) { } public final void onDialogListClick(int i, Bundle bundle) { } public final void onDialogNegativeClick(String s) { } public final void onDialogPositiveClick(Bundle bundle, String s) { if("dismiss_invitation".equals(s)) { String s1 = bundle.getString("square_id"); FragmentActivity fragmentactivity = getActivity(); EsService.declineSquareInvitation(fragmentactivity, mAccount, s1); Bundle bundle1 = EsAnalyticsData.createExtras("extra_square_id", s1); EsAnalytics.recordActionEvent(fragmentactivity, mAccount, OzActions.SQUARE_DECLINE_INVITATION, OzViews.SQUARE_HOME, bundle1); } } public final void onInvitationDismissed(String s) { AlertFragmentDialog alertfragmentdialog = AlertFragmentDialog.newInstance(null, getString(R.string.square_dismiss_invitation_text), getString(R.string.square_dialog_decline_button), getString(R.string.cancel)); alertfragmentdialog.setTargetFragment(this, 0); Bundle bundle = alertfragmentdialog.getArguments(); if(bundle == null) bundle = new Bundle(); bundle.putString("square_id", s); alertfragmentdialog.setArguments(bundle); alertfragmentdialog.show(getFragmentManager(), "dismiss_invitation"); } public final void onInviterImageClick(String s) { if(!TextUtils.isEmpty(s)) { String s1 = (new StringBuilder("g:")).append(s).toString(); startActivity(Intents.getProfileActivityIntent(mContext, mAccount, s1, null, 0)); } } public final void onLoadFinished(Loader loader, Object obj) { int i; byte byte0; Cursor cursor = (Cursor)obj; mSquaresLoaderActive = false; boolean flag; SquareCardAdapter squarecardadapter; EsMatrixCursor esmatrixcursor; SquareCardAdapter squarecardadapter1; if(cursor != null && cursor.getCount() > 0) flag = true; else flag = false; mDataPresent = flag; if(!hasError() && (loader instanceof SquaresLoader)) mRefreshNeeded = mRefreshNeeded | ((SquaresLoader)loader).isDataStale(); i = mCurrentMode; if(loader instanceof SquaresLoader) i = ((SquaresLoader)loader).getCurrentMode(); squarecardadapter = mAdapter; if(i == 3) { if(mDescriptionHeaderCursor == null) { mDescriptionHeaderCursor = new EsMatrixCursor(new String[] { "_id" }, 1); EsMatrixCursor esmatrixcursor1 = mDescriptionHeaderCursor; Integer ainteger[] = new Integer[1]; ainteger[0] = Integer.valueOf(0); esmatrixcursor1.addRow(ainteger); } esmatrixcursor = mDescriptionHeaderCursor; } else { esmatrixcursor = null; } squarecardadapter.changeDescriptionHeaderCursor(esmatrixcursor); squarecardadapter1 = mAdapter; if(1 == i) { byte0 = 1; } else if(2 == i) { byte0 = 2; } else if(3 == i) { byte0 = 3; } else { byte0 = 2; } squarecardadapter1.changeSquaresCursor(cursor, byte0); if(!mRefreshNeeded) if(mDataPresent) mCurrentMode = i; else if(i != mCurrentMode) getLoaderManager().restartLoader(0, null, this); if(mDataPresent) { if(1 == i) { mCurrentSpinnerPosition = 0; } else if(2 == i) { mCurrentSpinnerPosition = 1; } else if(3 == i) { mCurrentSpinnerPosition = 2; } } invalidateActionBar(); if(mDataPresent) showContent(getView()); else if(mRefreshNeeded) { showEmptyViewProgress(getView(), getString(R.string.loading)); } else { View view = getView(); String s; if(hasError()) s = mErrorText; else if(mCurrentSpinnerPosition == 0) s = getString(R.string.no_square_invitations); else s = getString(R.string.no_squares); showEmptyView(view, s); } return; } public final void onLoaderReset(Loader loader) { } public final boolean onOptionsItemSelected(MenuItem menuitem) { boolean flag = true; int i = menuitem.getItemId(); if(i == R.id.refresh) refresh(); else if(i == R.id.help) { String s = getResources().getString(R.string.url_param_help_squares); startExternalActivity(new Intent("android.intent.action.VIEW", HelpUrl.getHelpUrl(mContext, s))); } else { flag = super.onOptionsItemSelected(menuitem); } return flag; } public final void onPause() { EsService.unregisterListener(mListener); super.onPause(); } protected final void onPrepareActionBar(HostActionBar hostactionbar) { mSpinnerAdapter = new ArrayAdapter(mContext, R.layout.simple_spinner_item); mSpinnerAdapter.setDropDownViewResource(0x1090009); CharSequence acharsequence[] = getResources().getTextArray(R.array.square_list_spinner_items); int i = 0; for(int j = acharsequence.length; i < j; i++) mSpinnerAdapter.add(acharsequence[i].toString()); if(mCurrentMode != 0 || mDataPresent) hostactionbar.showPrimarySpinner(mSpinnerAdapter, mCurrentSpinnerPosition); hostactionbar.showRefreshButtonIfRoom(); hostactionbar.showActionButton(0, R.drawable.ic_menu_search_holo_light, R.string.menu_search); } public final void onPrepareOptionsMenu(Menu menu) { boolean flag = getActionBar().isRefreshButtonVisible(); MenuItem menuitem = menu.findItem(R.id.refresh); boolean flag1; if(!flag) flag1 = true; else flag1 = false; menuitem.setVisible(flag1); } public final void onPrimarySpinnerSelectionChange(int i) { if(mCurrentSpinnerPosition == i) { return; } if(0 == mCurrentSpinnerPosition) { mCurrentMode = 1; } else if(1 == mCurrentSpinnerPosition) { mCurrentMode = 2; } else { mCurrentMode = 3; } mGridView.setSelectionToTop(); getLoaderManager().restartLoader(0, null, this); } public final void onResume() { EsService.registerListener(mListener); super.onResume(); if(!Property.ENABLE_SQUARES.getBoolean()) getActivity().finish(); if(mRefreshNeeded) fetchData(); updateSpinner(); } protected final void onResumeContentFetched(View view) { super.onResumeContentFetched(view); mRefreshNeeded = false; mErrorText = null; } public final void onSaveInstanceState(Bundle bundle) { bundle.putBoolean("squares_refresh", mRefreshNeeded); bundle.putInt("squares_currentmode", mCurrentMode); bundle.putBoolean("squares_datapresent", mDataPresent); super.onSaveInstanceState(bundle); } public final void refresh() { super.refresh(); fetchData(); } protected final void setError(String s) { mErrorText = s; if(mDataPresent && mErrorText != null) Toast.makeText(mContext, mErrorText, 0).show(); } protected final void showContent(View view) { super.showContent(view); mGridView.setVisibility(0); } protected final void showEmptyView(View view, String s) { super.showEmptyView(view, s); mGridView.setVisibility(8); } //================================================================================== // Inner class //================================================================================== public static interface Query { public static final String INVITATION_PROJECTION[] = { "_id", "square_id", "square_name", "photo_url", "post_visibility", "member_count", "membership_status", "unread_count", "inviter_gaia_id", "inviter_name", "inviter_photo_url" }; public static final String PROJECTION[] = { "_id", "square_id", "square_name", "photo_url", "post_visibility", "member_count", "membership_status", "unread_count" }; } static final class SquaresLoader extends EsCursorLoader { private final EsAccount mAccount; private boolean mIsDataStale; private int mMode; public SquaresLoader(Context context, EsAccount esaccount, int i) { super(context, EsProvider.SQUARES_URI); mMode = i; mAccount = esaccount; } public final Cursor esLoadInBackground() { boolean flag1 = false; Cursor cursor = null; long l = EsSquaresData.queryLastSquaresSyncTimestamp(getContext(), mAccount); boolean flag; if(System.currentTimeMillis() - l > 0xdbba0L) flag = true; else flag = false; mIsDataStale = flag; int i = mMode; if(0 == i || 1 == i) { if(0 == i) { flag1 = true; } cursor = EsSquaresData.getInvitedSquares(getContext(), mAccount, Query.INVITATION_PROJECTION, null); if(!flag1 || cursor != null && cursor.getCount() > 0) { mMode = 1; } }else if(2 == i) { cursor = EsSquaresData.getJoinedSquares(getContext(), mAccount, Query.PROJECTION, null); if(!flag1 || cursor != null && cursor.getCount() > 0) { mMode = 2; } } else if(3 == i) { cursor = EsSquaresData.getSuggestedSquares(getContext(), mAccount, Query.PROJECTION, null); if(!flag1 || cursor != null && cursor.getCount() > 0) mMode = 3; } return cursor; } public final int getCurrentMode() { return mMode; } public final boolean isDataStale() { return mIsDataStale; } } }