/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import android.content.Context; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AutoCompleteTextView; import android.widget.ScrollView; import com.galaxy.meetup.client.android.R; 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.ui.fragments.PeopleSearchListAdapter; import com.galaxy.meetup.client.util.SoftInput; /** * * @author sihai * */ public class TypeableAudienceView extends AudienceView implements TextWatcher, OnClickListener { static final boolean $assertionsDisabled; AudienceTextView mEditText; private int mEmptyAudienceHint; private int mMaxLines; ScrollView mScrollView; static { boolean flag; if(!TypeableAudienceView.class.desiredAssertionStatus()) flag = true; else flag = false; $assertionsDisabled = flag; } public TypeableAudienceView(Context context) { this(context, null); } public TypeableAudienceView(Context context, AttributeSet attributeset) { this(context, attributeset, 0); } public TypeableAudienceView(Context context, AttributeSet attributeset, int i) { super(context, attributeset, i, true); mMaxLines = -1; TypedArray typedarray = context.obtainStyledAttributes(attributeset, R.styleable.AudienceView, i, 0); mMaxLines = typedarray.getInteger(0, -1); typedarray.recycle(); } private void updateEditTextHint() { if(mEditText != null) if(mChips.isEmpty() && mEmptyAudienceHint != 0) mEditText.setHint(mEmptyAudienceHint); else mEditText.setHint(""); } public void afterTextChanged(Editable editable) { } public void beforeTextChanged(CharSequence charsequence, int i, int j, int k) { } public final void clearText() { mEditText.setText(""); updateEditTextHint(); } protected final int getChipCount() { return -1 + mChipContainer.getChildCount(); } protected final void init() { addView(inflate(R.layout.typeable_audience_view)); mScrollView = (ScrollView)findViewById(R.id.audience_scrollview); mChipContainer = (MultiLineLayout)findViewById(R.id.people_audience_view_chip_container); mChipContainer.setOnClickListener(this); mEditText = (AudienceTextView)mChipContainer.getChildAt(0); mEditText.setThreshold(2); mEditText.setDropDownWidth(getResources().getDimensionPixelSize(R.dimen.audience_autocomplete_dropdown_width)); mEditText.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { public final void onItemClick(AdapterView adapterview, View view, int i, long l) { PeopleSearchListAdapter peoplesearchlistadapter = (PeopleSearchListAdapter)mEditText.getAdapter(); if(peoplesearchlistadapter != null) { peoplesearchlistadapter.onItemClick(i); InputMethodManager inputmethodmanager = (InputMethodManager)getContext().getSystemService("input_method"); if(inputmethodmanager.isFullscreenMode()) inputmethodmanager.toggleSoftInput(0, 0); } } }); mEditText.setOnKeyListener(new android.view.View.OnKeyListener() { public final boolean onKey(View view, int i, KeyEvent keyevent) { boolean flag = true; if(keyevent.getAction() != 0) { return false; } InputMethodManager inputmethodmanager; boolean flag1; inputmethodmanager = (InputMethodManager)getContext().getSystemService("input_method"); flag1 = inputmethodmanager.isFullscreenMode(); if(66 == i) { if(!flag1) { return false; } else { inputmethodmanager.toggleSoftInput(0, 0); return flag; } } else if(67 == i) { if(mEditText.getSelectionStart() > 0 || mEditText.getSelectionEnd() > 0 || flag1) { return false; } else { removeLastChip(); return flag; } } else { return false; } } }); mEditText.setAudienceTextViewListener(new AudienceTextViewListener() { public final void onDeleteFromBeginning(AudienceTextView audiencetextview) { if(audiencetextview == mEditText) removeLastChip(); } }); mEditText.addTextChangedListener(this); mEditText.setImeOptions(1); setEmptyAudienceHint(0); } public void onClick(View view) { Context context = getContext(); OzViews ozviews = OzViews.getViewForLogging(context); EsAnalytics.recordActionEvent(context, mAccount, OzActions.PLATFORM_AUDIENCE_VIEW_CLICKED, ozviews); if(mChipContainer.indexOfChild(view) == -1) { if(!$assertionsDisabled && view != mChipContainer) throw new AssertionError(); mEditText.requestFocus(); SoftInput.show(mEditText); } else { super.onClick(view); } } public void onLayout(boolean flag, int i, int j, int k, int l) { super.onLayout(flag, i, j, k, l); if(!(mChipContainer instanceof MultiLineLayout)) { return; } MultiLineLayout multilinelayout; int i1; multilinelayout = (MultiLineLayout)mChipContainer; i1 = multilinelayout.getNumLines(); if(mMaxLines == -1 || i1 < mMaxLines) { if(mScrollView.getLayoutParams().height != -2) mScrollView.getLayoutParams().height = -2; } else { mScrollView.getLayoutParams().height = multilinelayout.getHeightForNumLines(mMaxLines); mScrollView.scrollTo(0, multilinelayout.getMeasuredHeight()); } } protected void onRestoreInstanceState(Parcelable parcelable) { SavedState savedstate = (SavedState)parcelable; super.onRestoreInstanceState(savedstate.getSuperState()); mEditText.setText(savedstate.text); mEditText.setSelection(savedstate.selectionStart, savedstate.selectionEnd); } protected Parcelable onSaveInstanceState() { SavedState savedstate = new SavedState(super.onSaveInstanceState()); savedstate.text = mEditText.getText().toString(); savedstate.selectionStart = mEditText.getSelectionStart(); savedstate.selectionEnd = mEditText.getSelectionEnd(); return savedstate; } public void onTextChanged(CharSequence charsequence, int i, int j, int k) { mEdited = true; } public void setAutoCompleteAdapter(PeopleSearchListAdapter peoplesearchlistadapter) { mEditText.setAdapter(peoplesearchlistadapter); } public void setEmptyAudienceHint(int i) { mEmptyAudienceHint = i; updateEditTextHint(); } protected final void update() { super.update(); updateEditTextHint(); } //================================================================================ // Inner class //================================================================================ public static class AudienceTextView extends AutoCompleteTextView { private AudienceTextViewListener mListener; public AudienceTextView(Context context) { super(context); } public AudienceTextView(Context context, AttributeSet attributeset) { super(context, attributeset); } public AudienceTextView(Context context, AttributeSet attributeset, int i) { super(context, attributeset, i); } public boolean onCheckIsTextEditor() { return true; } public InputConnection onCreateInputConnection(EditorInfo editorinfo) { AudienceInputConnection audienceinputconnection = new AudienceInputConnection(super.onCreateInputConnection(editorinfo), true); audienceinputconnection.setAudienceTextView(this); return audienceinputconnection; } public void setAudienceTextViewListener(AudienceTextViewListener audiencetextviewlistener) { mListener = audiencetextviewlistener; } public final class AudienceInputConnection extends InputConnectionWrapper { private AudienceTextView mAudienceTextView; public AudienceInputConnection(InputConnection inputconnection, boolean flag) { super(inputconnection, true); } public final boolean deleteSurroundingText(int i, int j) { int k = getSelectionStart(); int l = getSelectionEnd(); boolean flag; if(i > 0 && j <= 0 && k <= 0 && l <= 0 && mListener != null && mAudienceTextView != null) { mListener.onDeleteFromBeginning(mAudienceTextView); flag = true; } else { flag = super.deleteSurroundingText(i, j); } return flag; } public final void setAudienceTextView(AudienceTextView audiencetextview) { mAudienceTextView = audiencetextview; } } } public static interface AudienceTextViewListener { public abstract void onDeleteFromBeginning(AudienceTextView audiencetextview); } public static class SavedState extends android.view.View.BaseSavedState { public static final android.os.Parcelable.Creator CREATOR = new android.os.Parcelable.Creator() { public final Object createFromParcel(Parcel parcel) { return new SavedState(parcel); } public final Object[] newArray(int i) { return new SavedState[i]; } }; public int selectionEnd; public int selectionStart; public String text; public SavedState(Parcel parcel) { super(parcel.readParcelable(TypeableAudienceView.SavedState.class.getClassLoader())); text = parcel.readString(); selectionStart = parcel.readInt(); selectionEnd = parcel.readInt(); } public SavedState(Parcelable parcelable) { super(parcelable); } public void writeToParcel(Parcel parcel, int i) { super.writeToParcel(parcel, i); parcel.writeString(text); parcel.writeInt(selectionStart); parcel.writeInt(selectionEnd); } } }