1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.browser.addbookmark; 18 19 import android.content.Context; 20 import android.view.View; 21 import android.util.AttributeSet; 22 import android.widget.AdapterView; 23 import android.widget.Spinner; 24 25 /** 26 * Special Spinner class with its own callback for when the selection is set, which 27 * can be ignored by calling setSelectionIgnoringSelectionChange 28 */ 29 public class FolderSpinner extends Spinner 30 implements AdapterView.OnItemSelectedListener { 31 private OnSetSelectionListener mOnSetSelectionListener; 32 private boolean mFireSetSelection; 33 34 /** 35 * Callback for knowing when the selection has been manually set. Does not 36 * get called until the selected view has changed. 37 */ 38 public interface OnSetSelectionListener { onSetSelection(long id)39 public void onSetSelection(long id); 40 } 41 FolderSpinner(Context context, AttributeSet attrs)42 public FolderSpinner(Context context, AttributeSet attrs) { 43 super(context, attrs); 44 super.setOnItemSelectedListener(this); 45 } 46 47 @Override setOnItemSelectedListener(AdapterView.OnItemSelectedListener l)48 public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { 49 // Disallow setting an OnItemSelectedListener, since it is used by us 50 // to fire onSetSelection. 51 throw new RuntimeException("Cannot set an OnItemSelectedListener on a FolderSpinner"); 52 } 53 setOnSetSelectionListener(OnSetSelectionListener l)54 public void setOnSetSelectionListener(OnSetSelectionListener l) { 55 mOnSetSelectionListener = l; 56 } 57 58 /** 59 * Call setSelection, without firing the callback 60 * @param position New position to select. 61 */ setSelectionIgnoringSelectionChange(int position)62 public void setSelectionIgnoringSelectionChange(int position) { 63 super.setSelection(position); 64 } 65 66 @Override setSelection(int position)67 public void setSelection(int position) { 68 mFireSetSelection = true; 69 int oldPosition = getSelectedItemPosition(); 70 super.setSelection(position); 71 if (mOnSetSelectionListener != null) { 72 if (oldPosition == position) { 73 long id = getAdapter().getItemId(position); 74 // Normally this is not called because the item did not actually 75 // change, but in this case, we still want it to be called. 76 onItemSelected(this, null, position, id); 77 } 78 } 79 } 80 81 @Override onItemSelected(AdapterView<?> parent, View view, int position, long id)82 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 83 if (mFireSetSelection) { 84 mOnSetSelectionListener.onSetSelection(id); 85 mFireSetSelection = false; 86 } 87 } 88 89 @Override onNothingSelected(AdapterView<?> parent)90 public void onNothingSelected(AdapterView<?> parent) {} 91 } 92 93