/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.fragments; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Rect; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; import com.galaxy.meetup.client.android.EsCursorLoader; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.StreamAdapter; 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.api.ApiUtils; import com.galaxy.meetup.client.android.api.OzServerException; import com.galaxy.meetup.client.android.content.AudienceData; import com.galaxy.meetup.client.android.content.AvatarRequest; import com.galaxy.meetup.client.android.content.DbAudienceData; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsAvatarData; import com.galaxy.meetup.client.android.content.EsProvider; import com.galaxy.meetup.client.android.service.EsService; import com.galaxy.meetup.client.android.service.EsServiceListener; import com.galaxy.meetup.client.android.service.ImageCache; import com.galaxy.meetup.client.android.service.ImageCache.ImageConsumer; import com.galaxy.meetup.client.android.service.ImageCache.OnAvatarChangeListener; import com.galaxy.meetup.client.android.service.ServiceResult; import com.galaxy.meetup.client.android.ui.fragments.AlertFragmentDialog.AlertDialogListener; import com.galaxy.meetup.client.android.ui.view.AudienceView; import com.galaxy.meetup.client.android.ui.view.MentionMultiAutoCompleteTextView; import com.galaxy.meetup.client.util.MentionTokenizer; import com.galaxy.meetup.client.util.PeopleUtils; import com.galaxy.meetup.client.util.SoftInput; /** * * @author sihai * */ public class ReshareFragment extends AudienceFragment implements LoaderCallbacks, OnEditorActionListener, AlertDialogListener, ImageConsumer, OnAvatarChangeListener { private static Bitmap sAuthorBitmap; private EsAccount mAccount; private String mActivityId; private String mAuthorId; private ImageCache mAvatarCache; private AvatarRequest mAvatarRequest; private ImageView mAvatarView; private MentionMultiAutoCompleteTextView mEditor; private boolean mLimited; private Integer mPendingRequestId; private TextView mReshareInfo; private ScrollView mScrollView; private final EsServiceListener mServiceListener = new ServiceListener(); private final TextWatcher mTextWatcher = new TextWatcher() { final MentionTokenizer mentionTokenizer = new MentionTokenizer(); public final void afterTextChanged(Editable editable) { } public final void beforeTextChanged(CharSequence charsequence, int i, int j, int k) { } public final void onTextChanged(CharSequence charsequence, int i, int j, int k) { if(mEditor != null) { int l = mEditor.getSelectionEnd(); if(mentionTokenizer.findTokenStart(charsequence, l) + mEditor.getThreshold() <= l) { int i1 = (int)getActivity().getResources().getDimension(R.dimen.plus_mention_suggestion_min_space); int ai[] = new int[2]; mEditor.getLocationOnScreen(ai); Rect rect = new Rect(); getView().getWindowVisibleDisplayFrame(rect); int j1 = ai[1] + mEditor.getCursorYPosition(); if(rect.height() - j1 < i1) mScrollView.smoothScrollTo(0, mEditor.getCursorYTop()); } } } }; public ReshareFragment() { } private void handleServiceCallback(int i, ServiceResult serviceresult) { if(mPendingRequestId != null && mPendingRequestId.intValue() == i) { mPendingRequestId = null; DialogFragment dialogfragment = (DialogFragment)getFragmentManager().findFragmentByTag("req_pending"); if(dialogfragment != null) dialogfragment.dismiss(); if(serviceresult != null && serviceresult.hasError()) { Exception exception = serviceresult.getException(); if((exception instanceof OzServerException) && ((OzServerException)exception).getErrorCode() == 14) { AlertFragmentDialog alertfragmentdialog = AlertFragmentDialog.newInstance(getString(R.string.post_not_sent_title), getString(R.string.post_restricted_mention_error), getString(R.string.ok), null); alertfragmentdialog.setTargetFragment(getTargetFragment(), 0); alertfragmentdialog.show(getFragmentManager(), "StreamPostRestrictionsNotSupported"); } else { Toast.makeText(getActivity(), R.string.reshare_post_error, 0).show(); } } else { getActivity().finish(); } } } public void onAvatarChanged(String s) { if(s != null && s.equals(String.valueOf(mAuthorId))) mAvatarCache.refreshImage(this, mAvatarRequest); } public final void onCreate(Bundle bundle) { super.onCreate(bundle); Intent intent = getActivity().getIntent(); mAccount = (EsAccount)intent.getParcelableExtra("account"); mActivityId = intent.getStringExtra("activity_id"); mLimited = intent.getBooleanExtra("limited", false); mAvatarCache = ImageCache.getInstance(getActivity()); if(sAuthorBitmap == null) sAuthorBitmap = EsAvatarData.getTinyDefaultAvatar(getActivity(), true); byte byte0; if(mLimited) byte0 = 9; else byte0 = 5; setCirclesUsageType(byte0); setIncludePhoneOnlyContacts(false); setIncludePlusPages(true); if(bundle != null && bundle.containsKey("reshare_request_id")) mPendingRequestId = Integer.valueOf(bundle.getInt("reshare_request_id")); } public final Loader onCreateLoader(int i, Bundle bundle) { Loader loader = null; if(2 == i) { loader = new EsCursorLoader(getActivity(), EsProvider.appendAccountParameter(EsProvider.ACCOUNT_STATUS_URI, mAccount), AccountStatusQuery.PROJECTION, null, null, null); } else if(3 == i) { android.net.Uri.Builder builder = EsProvider.ACTIVITY_VIEW_BY_ACTIVITY_ID_URI.buildUpon(); builder.appendPath(mActivityId); EsProvider.appendAccountParameter(builder, mAccount); loader = new EsCursorLoader(getActivity(), builder.build(), StreamAdapter.StreamQuery.PROJECTION_ACTIVITY, null, null, null); } return loader; } public final View onCreateView(LayoutInflater layoutinflater, ViewGroup viewgroup, Bundle bundle) { View view = layoutinflater.inflate(R.layout.reshare_fragment, viewgroup, false); mAvatarView = (ImageView)view.findViewById(R.id.reshare_avatar); mReshareInfo = (TextView)view.findViewById(R.id.reshare_info); return view; } public final void onDestroyView() { mEditor.removeTextChangedListener(mTextWatcher); mEditor.destroy(); mEditor = null; super.onDestroyView(); } 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("quit".equals(s)) getActivity().finish(); } public final void onDiscard() { SoftInput.hide(mEditor); boolean flag; if(!TextUtils.isEmpty(mEditor.getText())) flag = true; else flag = false; if(flag) { AlertFragmentDialog alertfragmentdialog = AlertFragmentDialog.newInstance(getString(R.string.reshare_title), getString(R.string.post_quit_question), getString(R.string.yes), getString(R.string.no)); alertfragmentdialog.setTargetFragment(this, 0); alertfragmentdialog.show(getFragmentManager(), "quit"); } else { getActivity().finish(); } } public boolean onEditorAction(TextView textview, int i, KeyEvent keyevent) { if(textview != mEditor) { return false; } if(6 == i) { SoftInput.hide(textview); return true; } return false; } public final void onLoadFinished(Loader loader, Cursor cursor) { int id = loader.getId(); if(2 == id) { if(!mAudienceView.isEdited() && cursor != null && cursor.moveToFirst()) { byte abyte0[] = cursor.getBlob(0); if(abyte0 != null) { AudienceData audiencedata = DbAudienceData.deserialize(abyte0); mAudienceView.setDefaultAudience(audiencedata); } } } else if(3 == id) { FragmentActivity fragmentactivity = getActivity(); if(cursor != null && cursor.moveToFirst()) { String s; if(!TextUtils.isEmpty(cursor.getString(18))) { mAuthorId = cursor.getString(18); s = cursor.getString(19); } else { mAuthorId = cursor.getString(2); s = cursor.getString(3); } mReshareInfo.setText(getString(R.string.originally_shared, new Object[] { s }).toUpperCase()); mAvatarRequest = new AvatarRequest(mAuthorId, 0, true); mAvatarCache.loadImage(this, mAvatarRequest); } else { EsService.getActivity(fragmentactivity, mAccount, mActivityId, null); } } } public final void onLoadFinished(Loader loader, Object obj) { onLoadFinished(loader, (Cursor)obj); } public final void onLoaderReset(Loader loader) { } public final void onPause() { EsService.unregisterListener(mServiceListener); ImageCache _tmp = mAvatarCache; ImageCache.unregisterAvatarChangeListener(this); super.onPause(); } public final void onResume() { super.onResume(); EsService.registerListener(mServiceListener); ImageCache _tmp = mAvatarCache; ImageCache.registerAvatarChangeListener(this); if(mPendingRequestId != null && !EsService.isRequestPending(mPendingRequestId.intValue())) { ServiceResult serviceresult = EsService.removeResult(mPendingRequestId.intValue()); handleServiceCallback(mPendingRequestId.intValue(), serviceresult); } } public final void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); if(mPendingRequestId != null) bundle.putInt("reshare_request_id", mPendingRequestId.intValue()); } public final void onViewCreated(View view, Bundle bundle) { super.onViewCreated(view, bundle); mScrollView = (ScrollView)view.findViewById(R.id.mention_scroll_view); mEditor = (MentionMultiAutoCompleteTextView)view.findViewById(R.id.reshare_text); mEditor.init(this, mAccount, null, mAudienceView); mEditor.setOnEditorActionListener(this); mEditor.addTextChangedListener(mTextWatcher); mSearchListAdapter.setShowPersonNameDialog(false); getLoaderManager().initLoader(3, null, this); if(!mLimited) getLoaderManager().initLoader(2, null, this); } public final boolean reshare() { boolean flag = false; SoftInput.hide(mEditor); AudienceData audiencedata = getAudience(); if(PeopleUtils.isEmpty(audiencedata)) { mAudienceView.performClick(); } else { FragmentActivity fragmentactivity = getActivity(); EsAccount _tmp = mAccount; String s = ApiUtils.buildPostableString(mEditor.getText()); mPendingRequestId = Integer.valueOf(EsService.reshareActivity(fragmentactivity, mAccount, mActivityId, s, audiencedata)); ProgressFragmentDialog.newInstance(null, getString(R.string.post_operation_pending), false).show(getFragmentManager(), "req_pending"); FragmentActivity fragmentactivity1 = getActivity(); FragmentActivity fragmentactivity2 = getActivity(); Bundle bundle = null; if(fragmentactivity2 != null) { AudienceView audienceview = mAudienceView; bundle = null; if(audienceview != null) { AudienceData audiencedata1 = mAudienceView.getAudience(); bundle = null; if(audiencedata1 != null) { int i = audiencedata1.getSquareTargetCount(); bundle = null; if(i > 0) { bundle = new Bundle(); bundle.putString("extra_square_id", mAudienceView.getAudience().getSquareTarget(0).getSquareId()); } } } } OzViews ozviews = OzViews.getViewForLogging(fragmentactivity1); EsAnalytics.recordActionEvent(fragmentactivity1, mAccount, OzActions.RESHARE, ozviews, bundle); flag = true; } return flag; } public void setBitmap(Bitmap bitmap, boolean flag) { if(bitmap == null) mAvatarView.setImageBitmap(sAuthorBitmap); else mAvatarView.setImageBitmap(bitmap); } protected final void setupAudienceClickListener() { mAudienceView.setOnClickListener(this); } //================================================================================================================== // Inner class //================================================================================================================== private static interface AccountStatusQuery { public static final String PROJECTION[] = { "audience_data" }; } private final class ServiceListener extends EsServiceListener { public final void onReshareActivity(int i, ServiceResult serviceresult) { handleServiceCallback(i, serviceresult); } } }