LabeledEditorView.java revision 7d4a8dda946f5c013573e4d6601fc14c03156ba6
1392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/* 2392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Copyright (C) 2010 The Android Open Source Project 3392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * 4392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Licensed under the Apache License, Version 2.0 (the "License"); 5392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * you may not use this file except in compliance with the License. 6392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * You may obtain a copy of the License at 7392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * 8392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * http://www.apache.org/licenses/LICENSE-2.0 9392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * 10392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Unless required by applicable law or agreed to in writing, software 11392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * distributed under the License is distributed on an "AS IS" BASIS, 12392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * See the License for the specific language governing permissions and 14392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * limitations under the License. 15392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 16392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor; 18392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 19392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.ContactsUtils; 20392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.R; 214597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.DataKind; 224597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EditType; 23392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.EntityDelta; 24392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.EntityDelta.ValuesDelta; 25392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.EntityModifier; 26392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.util.DialogManager; 27392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.util.DialogManager.DialogShowingView; 282fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport com.android.contacts.util.ThemeUtils; 29392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 30392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.app.AlertDialog; 31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.app.Dialog; 32392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.Context; 33392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.DialogInterface; 34392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.Entity; 35392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.res.Resources; 36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Bundle; 3779c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmannimport android.os.Handler; 387d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikovimport android.text.TextUtils; 39392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.AttributeSet; 402fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.view.LayoutInflater; 41392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View; 42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.ViewGroup; 43392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.inputmethod.EditorInfo; 442fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.widget.AdapterView; 452fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.widget.AdapterView.OnItemSelectedListener; 462fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.widget.ArrayAdapter; 47392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.EditText; 48392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.ImageButton; 492fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.widget.Spinner; 502fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikovimport android.widget.TextView; 51392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 5214918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikovimport java.util.List; 5314918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov 54392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/** 55392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Base class for editors that handles labels and values. 56392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Uses {@link ValuesDelta} to read any existing 57392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * {@link Entity} values, and to correctly write any changes values. 58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic abstract class LabeledEditorView extends ViewGroup implements Editor, DialogShowingView { 60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected static final String DIALOG_ID_KEY = "dialog_id"; 61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private static final int DIALOG_ID_CUSTOM = 1; 62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private static final int INPUT_TYPE_CUSTOM = EditorInfo.TYPE_CLASS_TEXT 64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS; 65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 662fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private Spinner mLabel; 672fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private EditTypeAdapter mEditTypeAdapter; 68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private ImageButton mDelete; 69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private DataKind mKind; 71392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private ValuesDelta mEntry; 72392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private EntityDelta mState; 73392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private boolean mReadOnly; 74392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 75392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private EditType mType; 76392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 77392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private ViewIdGenerator mViewIdGenerator; 78392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private DialogManager mDialogManager = null; 79392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private EditorListener mListener; 80392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 812fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov /** 822fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov * A marker in the spinner adapter of the currently selected custom type. 832fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov */ 842fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public static final EditType CUSTOM_SELECTION = new EditType(0, 0); 852fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 862fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private OnItemSelectedListener mSpinnerListener = new OnItemSelectedListener() { 872fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 882fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov @Override 892fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public void onItemSelected( 902fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov AdapterView<?> parent, View view, int position, long id) { 912fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov onTypeSelectionChange(position); 922fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 932fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 942fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov @Override 952fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public void onNothingSelected(AdapterView<?> parent) { 962fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 972fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov }; 982fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public LabeledEditorView(Context context) { 100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context); 101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public LabeledEditorView(Context context, AttributeSet attrs) { 104392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context, attrs); 105392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public LabeledEditorView(Context context, AttributeSet attrs, int defStyle) { 108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context, attrs, defStyle); 109392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 11102bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov public boolean isReadOnly() { 11202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov return mReadOnly; 11302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 11402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void onLayout(boolean changed, int l, int t, int r, int b) { 117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Subtract padding from the borders ==> x1 variables 118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann int t1 = getPaddingTop(); 119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann int r1 = getMeasuredWidth() - getPaddingRight(); 120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann int b1 = getMeasuredHeight() - getPaddingBottom(); 121392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 122cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann final int r2; 123cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann if (mDelete != null) { 124cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r2 = r1 - mDelete.getMeasuredWidth(); 125cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann mDelete.layout( 126cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r2, b1 - mDelete.getMeasuredHeight(), 127cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r1, b1); 128cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann } else { 129cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r2 = r1; 130cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann } 131392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 132cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann if (mLabel != null) { 133392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mLabel.layout( 134cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r2 - mLabel.getMeasuredWidth(), t1, 135cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann r2, t1 + mLabel.getMeasuredHeight()); 136392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 137392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 138392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 139392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 140392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann measureChildren(widthMeasureSpec, heightMeasureSpec); 143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int padding = getPaddingTop() + getPaddingBottom(); 145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int deleteHeight = mDelete != null ? mDelete.getMeasuredHeight() : 0; 146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int labelHeight = mLabel != null ? mLabel.getMeasuredHeight() : 0; 147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 148392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int height = padding + 149392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann Math.max(Math.max(deleteHeight, labelHeight), getEditorHeight()); 150392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), 152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resolveSize(height, heightMeasureSpec)); 153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected abstract int getEditorHeight(); 156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Creates or removes the type/label button. Doesn't do anything if already correctly configured 159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private void setupLabelButton(boolean shouldExist) { 161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (shouldExist && mLabel == null) { 1622fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mLabel = new Spinner(mContext); 163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int width = 164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mContext.getResources().getDimensionPixelSize(R.dimen.editor_type_label_width); 165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mLabel.setLayoutParams(new LayoutParams(width, LayoutParams.WRAP_CONTENT)); 1662fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mLabel.setOnItemSelectedListener(mSpinnerListener); 16702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mLabel.setEnabled(!mReadOnly && isEnabled()); 168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann addView(mLabel); 169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } else if (!shouldExist && mLabel != null) { 170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann removeView(mLabel); 171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mLabel = null; 172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Creates or removes the remove button. Doesn't do anything if already correctly configured 177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private void setupDeleteButton(boolean shouldExist) { 179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (shouldExist && mDelete == null) { 180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete = new ImageButton(mContext); 181915ffc5ae1d10a7ed06d5541fe81da023fa3228fDaniel Lehmann mDelete.setImageResource(R.drawable.ic_menu_remove_field_holo_light); 18279c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann mDelete.setBackgroundResource( 18379c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann ThemeUtils.getSelectableItemBackground(mContext.getTheme())); 184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final Resources resources = mContext.getResources(); 185392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete.setPadding( 186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resources.getDimensionPixelOffset(R.dimen.editor_round_button_padding_left), 187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resources.getDimensionPixelOffset(R.dimen.editor_round_button_padding_top), 188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resources.getDimensionPixelOffset(R.dimen.editor_round_button_padding_right), 189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resources.getDimensionPixelOffset(R.dimen.editor_round_button_padding_bottom)); 190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete.setContentDescription( 191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann getResources().getText(R.string.description_minus_button)); 192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete.setLayoutParams( 193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete.setOnClickListener(new OnClickListener() { 195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void onClick(View v) { 19779c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann // defer removal of this button so that the pressed state is visible shortly 19879c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann new Handler().post(new Runnable() { 19979c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann @Override 20079c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann public void run() { 20179c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann // Keep around in model, but mark as deleted 20279c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann mEntry.markDeleted(); 20379c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann 20479c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann ((ViewGroup) getParent()).removeView(LabeledEditorView.this); 20579c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann 20679c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann if (mListener != null) { 20779c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann // Notify listener when present 20879c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann mListener.onDeleted(LabeledEditorView.this); 20979c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann } 21079c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann } 21179c9c5a8f849908d2b141c30af15923ea2b60f5bDaniel Lehmann }); 212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann }); 21402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mDelete.setEnabled(!mReadOnly && isEnabled()); 215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann addView(mDelete); 216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } else if (!shouldExist && mDelete != null) { 217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann removeView(mDelete); 218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDelete = null; 219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void onOptionalFieldVisibilityChange() { 223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (mListener != null) { 224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mListener.onRequest(EditorListener.EDITOR_FORM_CHANGED); 225392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 226392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 227392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 228392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 229392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setEditorListener(EditorListener listener) { 230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mListener = listener; 231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 232392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setDeletable(boolean deletable) { 235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setupDeleteButton(deletable); 236392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setEnabled(boolean enabled) { 24002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov super.setEnabled(enabled); 24102bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mLabel != null) mLabel.setEnabled(!mReadOnly && enabled); 24202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mDelete != null) mDelete.setEnabled(!mReadOnly && enabled); 243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 2452fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public Spinner getLabel() { 246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mLabel; 247392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 248392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 249392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public ImageButton getDelete() { 250392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mDelete; 251392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 253392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected DataKind getKind() { 254392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mKind; 255392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 256392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 257392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected ValuesDelta getEntry() { 258392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mEntry; 259392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 260392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 261392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected EditType getType() { 262392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mType; 263392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 264392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 265392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 266392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Build the current label state based on selected {@link EditType} and 267392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * possible custom label string. 268392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 269392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private void rebuildLabel() { 270392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (mLabel == null) return; 2712fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mEditTypeAdapter = new EditTypeAdapter(mContext); 2722fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mLabel.setAdapter(mEditTypeAdapter); 2732fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (mEditTypeAdapter.hasCustomSelection()) { 2742fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mLabel.setSelection(mEditTypeAdapter.getPosition(CUSTOM_SELECTION)); 2752fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } else { 2762fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mLabel.setSelection(mEditTypeAdapter.getPosition(mType)); 277392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 278392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 279392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 280392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** {@inheritDoc} */ 281392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 282392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void onFieldChanged(String column, String value) { 2837d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikov String oldValue = mEntry.getAsString(column); 2847d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikov if (oldValue == null && value.equals("") || oldValue != null && oldValue.equals(value)) { 2857d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikov return; 2867d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikov } 2877d4a8dda946f5c013573e4d6601fc14c03156ba6Dmitri Plotnikov 288392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Field changes are saved directly 289392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mEntry.put(column, value); 290392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (mListener != null) { 291392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mListener.onRequest(EditorListener.FIELD_CHANGED); 292392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 293392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 294392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 295392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void rebuildValues() { 296392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setValues(mKind, mEntry, mState, mReadOnly, mViewIdGenerator); 297392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 298392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 299392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 300392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Prepare this editor using the given {@link DataKind} for defining 301392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * structure and {@link ValuesDelta} describing the content to edit. 302392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 303392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 304392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly, 305392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann ViewIdGenerator vig) { 306392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mKind = kind; 307392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mEntry = entry; 308392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mState = state; 309392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mReadOnly = readOnly; 310392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mViewIdGenerator = vig; 311392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setId(vig.getId(state, kind, entry, ViewIdGenerator.NO_VIEW_INDEX)); 312392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 313392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (!entry.isVisible()) { 314392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Hide ourselves entirely if deleted 315392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setVisibility(View.GONE); 316392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return; 317392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 318392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setVisibility(View.VISIBLE); 319392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 320392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Display label selector if multiple types available 321392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final boolean hasTypes = EntityModifier.hasEditTypes(kind); 322392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann setupLabelButton(hasTypes); 32302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mLabel != null) mLabel.setEnabled(!readOnly && isEnabled()); 324392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (hasTypes) { 325392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mType = EntityModifier.getCurrentType(entry, kind); 326392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann rebuildLabel(); 327392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 328392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 329392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 330392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public ValuesDelta getValues() { 331392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mEntry; 332392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 333392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 334392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 335392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Prepare dialog for entering a custom label. The input value is trimmed: white spaces before 336392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * and after the input text is removed. 337392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * <p> 338392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * If the final value is empty, this change request is ignored; 339392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * no empty text is allowed in any custom label. 340392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 341392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private Dialog createCustomDialog() { 342392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final EditText customType = new EditText(mContext); 343392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann customType.setInputType(INPUT_TYPE_CUSTOM); 34414918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov customType.setSaveEnabled(true); 345392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann customType.requestFocus(); 346392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 347392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 348392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann builder.setTitle(R.string.customLabelPickerTitle); 349392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann builder.setView(customType); 350392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 351392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 352392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 353392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void onClick(DialogInterface dialog, int which) { 354392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String customText = customType.getText().toString().trim(); 355392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (ContactsUtils.isGraphic(customText)) { 35614918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov final List<EditType> allTypes = 35714918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov EntityModifier.getValidTypes(mState, mKind, null); 35814918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov mType = null; 35914918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov for (EditType editType : allTypes) { 36014918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov if (editType.customColumn != null) { 36114918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov mType = editType; 36214918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov break; 36314918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov } 36414918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov } 36514918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov if (mType == null) return; 36614918c07e1cb3b5b190bec4cc9106db7adbba29fDmitri Plotnikov 367392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mEntry.put(mKind.typeColumn, mType.rawValue); 368392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mEntry.put(mType.customColumn, customText); 369392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann rebuildLabel(); 370392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann requestFocusForFirstEditField(); 371392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann onLabelRebuilt(); 372392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 373392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 374392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann }); 375392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 376392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann builder.setNegativeButton(android.R.string.cancel, null); 377392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 378392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return builder.create(); 379392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 380392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 381392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 382392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Called after the label has changed (either chosen from the list or entered in the Dialog) 383392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 384392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void onLabelRebuilt() { 385392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 386392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 3872fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov protected void onTypeSelectionChange(int position) { 3882fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov EditType selected = mEditTypeAdapter.getItem(position); 3892fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov // See if the selection has in fact changed 3902fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (mEditTypeAdapter.hasCustomSelection() && selected == CUSTOM_SELECTION) { 3912fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return; 392392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 393392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 3942fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (mType == selected && mType.customColumn == null) { 3952fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return; 3962fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 397392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 3982fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (selected.customColumn != null) { 3992fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov showDialog(DIALOG_ID_CUSTOM); 4002fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } else { 4012fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov // User picked type, and we're sure it's ok to actually write the entry. 4022fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mType = selected; 4032fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mEntry.put(mKind.typeColumn, mType.rawValue); 4042fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov rebuildLabel(); 4052fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov requestFocusForFirstEditField(); 4062fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov onLabelRebuilt(); 4072fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 408392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 409392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 410392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /* package */ 411392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann void showDialog(int bundleDialogId) { 412392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann Bundle bundle = new Bundle(); 413392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann bundle.putInt(DIALOG_ID_KEY, bundleDialogId); 414392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann getDialogManager().showDialogInView(this, bundle); 415392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 416392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 417392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private DialogManager getDialogManager() { 418392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (mDialogManager == null) { 419392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann Context context = getContext(); 420392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (!(context instanceof DialogManager.DialogShowingViewActivity)) { 421392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann throw new IllegalStateException( 422392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann "View must be hosted in an Activity that implements " + 423392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann "DialogManager.DialogShowingViewActivity"); 424392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 425392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann mDialogManager = ((DialogManager.DialogShowingViewActivity)context).getDialogManager(); 426392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 427392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return mDialogManager; 428392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 429392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 430392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 431392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public Dialog createDialog(Bundle bundle) { 432392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (bundle == null) throw new IllegalArgumentException("bundle must not be null"); 433392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann int dialogId = bundle.getInt(DIALOG_ID_KEY); 434392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann switch (dialogId) { 435392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann case DIALOG_ID_CUSTOM: 436392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return createCustomDialog(); 437392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann default: 438392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann throw new IllegalArgumentException("Invalid dialogId: " + dialogId); 439392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 440392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 441392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 442392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected abstract void requestFocusForFirstEditField(); 4432fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4442fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private class EditTypeAdapter extends ArrayAdapter<EditType> { 4452fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private final LayoutInflater mInflater; 4462fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private boolean mHasCustomSelection; 4472fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4482fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public EditTypeAdapter(Context context) { 4492fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov super(context, 0); 4502fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 4512fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4522fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (mType.customColumn != null) { 4532fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4542fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov // Use custom label string when present 4552fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov final String customText = mEntry.getAsString(mType.customColumn); 4562fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (customText != null) { 4572fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov add(CUSTOM_SELECTION); 4582fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov mHasCustomSelection = true; 4592fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4602fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4612fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4622fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov addAll(EntityModifier.getValidTypes(mState, mKind, mType)); 4632fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4642fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4652fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public boolean hasCustomSelection() { 4662fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return mHasCustomSelection; 4672fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4682fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4692fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov @Override 4702fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public View getView(int position, View convertView, ViewGroup parent) { 4712fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return createViewFromResource( 4722fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov position, convertView, parent, android.R.layout.simple_spinner_item); 4732fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4742fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4752fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov @Override 4762fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov public View getDropDownView(int position, View convertView, ViewGroup parent) { 4772fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return createViewFromResource( 4782fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov position, convertView, parent, android.R.layout.simple_spinner_dropdown_item); 4792fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4802fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4812fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov private View createViewFromResource(int position, View convertView, ViewGroup parent, 4822fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov int resource) { 4832fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov View view; 4842fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov TextView textView; 4852fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4862fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (convertView == null) { 4872fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov view = mInflater.inflate(resource, parent, false); 4882fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } else { 4892fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov view = convertView; 4902fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 4912fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4922fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov textView = (TextView) view; 4932fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov 4942fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov EditType type = getItem(position); 4952fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov String text; 4962fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov if (type == CUSTOM_SELECTION) { 4972fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov text = mEntry.getAsString(mType.customColumn); 4982fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } else { 4992fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov text = getContext().getString(type.labelRes); 5002fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 5012fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov textView.setText(text); 5022fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov return view; 5032fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 5042fcfa499dd44f62dc63636e363522354e13aa20dDmitri Plotnikov } 505392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann} 506