151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov/* 251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Copyright (C) 2011 The Android Open Source Project 351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * you may not use this file except in compliance with the License. 651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * You may obtain a copy of the License at 751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 1051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software 1151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 1251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * See the License for the specific language governing permissions and 1451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * limitations under the License. 1551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 1651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 1751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovpackage android.widget; 1851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 19823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powellimport com.android.internal.R; 20823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell 21baeabb65e1e818c6679036774933f40e8540b293Svetoslavimport android.content.ActivityNotFoundException; 2251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.content.Context; 2351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.content.Intent; 2451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.content.pm.PackageManager; 2551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.content.pm.ResolveInfo; 26414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganovimport android.content.res.Resources; 2751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.content.res.TypedArray; 2851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.database.DataSetObserver; 2951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.graphics.drawable.Drawable; 3051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.util.AttributeSet; 31baeabb65e1e818c6679036774933f40e8540b293Svetoslavimport android.util.Log; 32823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powellimport android.view.ActionProvider; 3351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.view.LayoutInflater; 345d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viveretteimport android.view.MotionEvent; 3551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.view.View; 3651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.view.ViewGroup; 378c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganovimport android.view.ViewTreeObserver; 388c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganovimport android.view.ViewTreeObserver.OnGlobalLayoutListener; 39058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viveretteimport android.view.accessibility.AccessibilityNodeInfo; 4051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovimport android.widget.ActivityChooserModel.ActivityChooserModelClient; 415d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viveretteimport android.widget.ListPopupWindow.ForwardingListener; 4251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 4351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov/** 4451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * This class is a view for choosing an activity for handling a given {@link Intent}. 4551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * <p> 4651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The view is composed of two adjacent buttons: 4751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * <ul> 4851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * <li> 4951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The left button is an immediate action and allows one click activity choosing. 5051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Tapping this button immediately executes the intent without requiring any further 5151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * user input. Long press on this button shows a popup for changing the default 5251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * activity. 5351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * </li> 5451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * <li> 5551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The right button is an overflow action and provides an optimized menu 5651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * of additional activities. Tapping this button shows a popup anchored to this 5751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * view, listing the most frequently used activities. This list is initially 5851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * limited to a small number of items in frequency used order. The last item, 5951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * "Show all..." serves as an affordance to display all available activities. 6051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * </li> 6151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * </ul> 6251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * </p> 6351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 6451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @hide 6551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 6651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganovpublic class ActivityChooserView extends ViewGroup implements ActivityChooserModelClient { 6751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 68baeabb65e1e818c6679036774933f40e8540b293Svetoslav private static final String LOG_TAG = "ActivityChooserView"; 69baeabb65e1e818c6679036774933f40e8540b293Svetoslav 7051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 7151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * An adapter for displaying the activities in an {@link AdapterView}. 7251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 7351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private final ActivityChooserViewAdapter mAdapter; 7451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 7551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 7651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Implementation of various interfaces to avoid publishing them in the APIs. 7751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 7851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private final Callbacks mCallbacks; 7951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 8051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 8151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The content of this view. 8251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 8351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private final LinearLayout mActivityChooserContent; 8451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 8551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 86f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov * Stores the background drawable to allow hiding and latter showing. 87f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov */ 88f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov private final Drawable mActivityChooserContentBackground; 89f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov 90f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov /** 9151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The expand activities action button; 9251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 93bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov private final FrameLayout mExpandActivityOverflowButton; 94bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov 95bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov /** 96bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov * The image for the expand activities action button; 97bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov */ 98bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov private final ImageView mExpandActivityOverflowButtonImage; 9951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 10051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 10151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The default activities action button; 10251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 103bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov private final FrameLayout mDefaultActivityButton; 104bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov 105bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov /** 106bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov * The image for the default activities action button; 107bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov */ 108bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov private final ImageView mDefaultActivityButtonImage; 10951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 11051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 111414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov * The maximal width of the list popup. 112414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov */ 113414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov private final int mListPopupMaxWidth; 114414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov 115414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov /** 116823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell * The ActionProvider hosting this view, if applicable. 117823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell */ 118823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell ActionProvider mProvider; 119823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell 120823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell /** 12176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov * Observer for the model data. 12251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 12376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov private final DataSetObserver mModelDataSetOberver = new DataSetObserver() { 12451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 12576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov @Override 12676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov public void onChanged() { 12776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov super.onChanged(); 12876559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mAdapter.notifyDataSetChanged(); 12976559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 13076559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov @Override 13176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov public void onInvalidated() { 13276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov super.onInvalidated(); 13376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mAdapter.notifyDataSetInvalidated(); 13476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 13576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov }; 13651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 1378c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() { 1388c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov @Override 1398c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov public void onGlobalLayout() { 1408c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (isShowingPopup()) { 1418c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (!isShown()) { 1428c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov getListPopupWindow().dismiss(); 1438c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } else { 1448c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov getListPopupWindow().show(); 145823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell if (mProvider != null) { 146823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell mProvider.subUiVisibilityChanged(true); 147823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell } 1488c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 1498c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 1508c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 1518c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov }; 1528c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov 15351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 15451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Popup window for showing the activity overflow list. 15551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 15651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private ListPopupWindow mListPopupWindow; 15751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 15851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 15951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Listener for the dismissal of the popup/alert. 16051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 16151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private PopupWindow.OnDismissListener mOnDismissListener; 16251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 16351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 16451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Flag whether a default activity currently being selected. 16551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 16651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private boolean mIsSelectingDefaultActivity; 16751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 16851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 16951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * The count of activities in the popup. 17051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 17151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private int mInitialActivityCount = ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT; 17251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 17351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 17451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Flag whether this view is attached to a window. 17551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 17651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private boolean mIsAttachedToWindow; 17751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 17851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 17970853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * String resource for formatting content description of the default target. 18070853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov */ 18170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov private int mDefaultActionButtonContentDescription; 18270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov 18370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov /** 18451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Create a new instance. 18551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 18651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param context The application environment. 18751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 18851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ActivityChooserView(Context context) { 18951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov this(context, null); 19051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 19151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 19251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 19351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Create a new instance. 19451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 19551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param context The application environment. 19651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param attrs A collection of attributes. 19751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 19851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ActivityChooserView(Context context, AttributeSet attrs) { 19923f4cc0353615107cc9c19fda9cf96ddd43266e2Adam Powell this(context, attrs, 0); 20051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 20151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 20251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 20351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Create a new instance. 20451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 20551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param context The application environment. 20651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param attrs A collection of attributes. 20751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param defStyle The default style to apply to this view. 20851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 20951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ActivityChooserView(Context context, AttributeSet attrs, int defStyle) { 21051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov super(context, attrs, defStyle); 21151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 21251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov TypedArray attributesArray = context.obtainStyledAttributes(attrs, 21351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov R.styleable.ActivityChooserView, defStyle, 0); 21451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 21551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mInitialActivityCount = attributesArray.getInt( 21651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov R.styleable.ActivityChooserView_initialActivityCount, 21751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT); 21851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 21951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable( 22051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov R.styleable.ActivityChooserView_expandActivityOverflowButtonDrawable); 22151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 222f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov attributesArray.recycle(); 223f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov 22476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov LayoutInflater inflater = LayoutInflater.from(mContext); 22551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov inflater.inflate(R.layout.activity_chooser_view, this, true); 22651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 22751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mCallbacks = new Callbacks(); 22851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 22951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mActivityChooserContent = (LinearLayout) findViewById(R.id.activity_chooser_view_content); 230f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov mActivityChooserContentBackground = mActivityChooserContent.getBackground(); 23151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 232bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button); 233bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButton.setOnClickListener(mCallbacks); 234bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButton.setOnLongClickListener(mCallbacks); 235bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.image); 23651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 2375d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette final FrameLayout expandButton = (FrameLayout) findViewById(R.id.expand_activities_button); 2385d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette expandButton.setOnClickListener(mCallbacks); 2395d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette expandButton.setAccessibilityDelegate(new AccessibilityDelegate() { 240058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viverette @Override 241058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viverette public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { 242058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viverette super.onInitializeAccessibilityNodeInfo(host, info); 243cb8ed39b3fb591be60b9fb1799d4ea4530eab758Svetoslav Ganov info.setCanOpenPopup(true); 244058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viverette } 245058ac7cfe5bb7b9ecc411b94622ac3f31a7fa25eAlan Viverette }); 2465d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette expandButton.setOnTouchListener(new ForwardingListener(expandButton) { 2475d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette @Override 2485d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette public ListPopupWindow getPopup() { 2495d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette return getListPopupWindow(); 2505d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette } 2515d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette 2525d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette @Override 2535d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette protected boolean onForwardingStarted() { 2545d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette showPopup(); 2555d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette return true; 2565d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette } 2575d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette 2585d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette @Override 2595d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette protected boolean onForwardingStopped() { 2605d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette dismissPopup(); 2615d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette return true; 2625d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette } 2635d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette }); 2645d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette mExpandActivityOverflowButton = expandButton; 2655d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette 266bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mExpandActivityOverflowButtonImage = 2675d46c89e3c032711a3835dbe5e4b499f5cd4d023Alan Viverette (ImageView) expandButton.findViewById(R.id.image); 268bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable); 26951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 27051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mAdapter = new ActivityChooserViewAdapter(); 27151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mAdapter.registerDataSetObserver(new DataSetObserver() { 27251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 27351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void onChanged() { 27451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov super.onChanged(); 275f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov updateAppearance(); 27651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 27751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov }); 278414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov 279414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov Resources resources = context.getResources(); 280414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov mListPopupMaxWidth = Math.max(resources.getDisplayMetrics().widthPixels / 2, 281414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov resources.getDimensionPixelSize(com.android.internal.R.dimen.config_prefDialogWidth)); 28251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 28351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 28451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 28551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * {@inheritDoc} 28651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 28751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setActivityChooserModel(ActivityChooserModel dataModel) { 28851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mAdapter.setDataModel(dataModel); 28951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (isShowingPopup()) { 29051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov dismissPopup(); 29151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov showPopup(); 29251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 29351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 29451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 29551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 29651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Sets the background for the button that expands the activity 29751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * overflow list. 29851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 29951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * <strong>Note:</strong> Clients would like to set this drawable 30051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * as a clue about the action the chosen activity will perform. For 30170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * example, if a share activity is to be chosen the drawable should 30251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * give a clue that sharing is to be performed. 30351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 30451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param drawable The drawable. 30551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 30651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setExpandActivityOverflowButtonDrawable(Drawable drawable) { 307bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mExpandActivityOverflowButtonImage.setImageDrawable(drawable); 30851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 30951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 31051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 31170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * Sets the content description for the button that expands the activity 31270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * overflow list. 31370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * 31470853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * description as a clue about the action performed by the button. 31570853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * For example, if a share activity is to be chosen the content 31670853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * description should be something like "Share with". 31770853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * 31870853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * @param resourceId The content description resource id. 31970853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov */ 32070853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov public void setExpandActivityOverflowButtonContentDescription(int resourceId) { 32170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov CharSequence contentDescription = mContext.getString(resourceId); 32270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov mExpandActivityOverflowButtonImage.setContentDescription(contentDescription); 32370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov } 32470853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov 32570853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov /** 326823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell * Set the provider hosting this view, if applicable. 327823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell * @hide Internal use only 328823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell */ 329823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell public void setProvider(ActionProvider provider) { 330823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell mProvider = provider; 331823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell } 332823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell 333823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell /** 33451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Shows the popup window with activities. 33551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 33651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @return True if the popup was shown, false if already showing. 33751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 33851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public boolean showPopup() { 33976559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (isShowingPopup() || !mIsAttachedToWindow) { 34051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return false; 34151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 34251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mIsSelectingDefaultActivity = false; 34351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov showPopupUnchecked(mInitialActivityCount); 34451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return true; 34551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 34651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 34751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 34851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Shows the popup no matter if it was already showing. 34951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 35051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param maxActivityCount The max number of activities to display. 35151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 35251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private void showPopupUnchecked(int maxActivityCount) { 35376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (mAdapter.getDataModel() == null) { 35476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov throw new IllegalStateException("No data model. Did you call #setDataModel?"); 35551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 35651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 3578c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); 3588c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov 359f632eaa9d64fb21892cc057ec7444ec157686734Svetoslav Ganov final boolean defaultActivityButtonShown = 360f632eaa9d64fb21892cc057ec7444ec157686734Svetoslav Ganov mDefaultActivityButton.getVisibility() == VISIBLE; 361f632eaa9d64fb21892cc057ec7444ec157686734Svetoslav Ganov 36276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov final int activityCount = mAdapter.getActivityCount(); 363f632eaa9d64fb21892cc057ec7444ec157686734Svetoslav Ganov final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0; 36476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED 365f632eaa9d64fb21892cc057ec7444ec157686734Svetoslav Ganov && activityCount > maxActivityCount + maxActivityCountOffset) { 36676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mAdapter.setShowFooterView(true); 3671c07e22c364732779b33c72bdc0e18c4bda0f7efSvetoslav Ganov mAdapter.setMaxActivityCount(maxActivityCount - 1); 36851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 36976559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mAdapter.setShowFooterView(false); 3701c07e22c364732779b33c72bdc0e18c4bda0f7efSvetoslav Ganov mAdapter.setMaxActivityCount(maxActivityCount); 37151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 37251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 37376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov ListPopupWindow popupWindow = getListPopupWindow(); 37476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (!popupWindow.isShowing()) { 375efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) { 376efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown); 37776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } else { 378efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov mAdapter.setShowDefaultActivity(false, false); 37951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 380414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth); 381414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov popupWindow.setContentWidth(contentWidth); 38276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov popupWindow.show(); 383823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell if (mProvider != null) { 384823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell mProvider.subUiVisibilityChanged(true); 385823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell } 38670853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov popupWindow.getListView().setContentDescription(mContext.getString( 38770853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov R.string.activitychooserview_choose_application)); 38851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 38951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 39051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 39151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 39251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Dismisses the popup window with activities. 39351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 39451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @return True if dismissed, false if already dismissed. 39551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 39651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public boolean dismissPopup() { 39776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (isShowingPopup()) { 39851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov getListPopupWindow().dismiss(); 3998c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov ViewTreeObserver viewTreeObserver = getViewTreeObserver(); 4008c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (viewTreeObserver.isAlive()) { 401aa47a6b35a209812212fcd4ed7b600557ab66f0aSvetoslav Ganov viewTreeObserver.removeOnGlobalLayoutListener(mOnGlobalLayoutListener); 4028c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 40351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 40451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return true; 40551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 40651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 40751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 40851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Gets whether the popup window with activities is shown. 40951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 41051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @return True if the popup is shown. 41151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 41251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public boolean isShowingPopup() { 41376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov return getListPopupWindow().isShowing(); 41451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 41551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 41651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 41751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov protected void onAttachedToWindow() { 41851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov super.onAttachedToWindow(); 41951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ActivityChooserModel dataModel = mAdapter.getDataModel(); 420b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov if (dataModel != null) { 42176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov dataModel.registerObserver(mModelDataSetOberver); 42251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 42351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mIsAttachedToWindow = true; 42451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 42551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 42651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 42751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov protected void onDetachedFromWindow() { 42851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov super.onDetachedFromWindow(); 42951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ActivityChooserModel dataModel = mAdapter.getDataModel(); 430b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov if (dataModel != null) { 43176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov dataModel.unregisterObserver(mModelDataSetOberver); 43251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 4338c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov ViewTreeObserver viewTreeObserver = getViewTreeObserver(); 4348c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (viewTreeObserver.isAlive()) { 435aa47a6b35a209812212fcd4ed7b600557ab66f0aSvetoslav Ganov viewTreeObserver.removeOnGlobalLayoutListener(mOnGlobalLayoutListener); 4368c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 437748ee2e82a6f7a3adbbb522d45001e6dcb52b947Svetoslav Ganov if (isShowingPopup()) { 438748ee2e82a6f7a3adbbb522d45001e6dcb52b947Svetoslav Ganov dismissPopup(); 439748ee2e82a6f7a3adbbb522d45001e6dcb52b947Svetoslav Ganov } 44051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mIsAttachedToWindow = false; 44151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 44251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 44351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 44451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 445f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov View child = mActivityChooserContent; 446f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // If the default action is not visible we want to be as tall as the 447f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // ActionBar so if this widget is used in the latter it will look as 448f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // a normal action button. 449f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov if (mDefaultActivityButton.getVisibility() != VISIBLE) { 450f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), 451f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov MeasureSpec.EXACTLY); 452f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } 453f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov measureChild(child, widthMeasureSpec, heightMeasureSpec); 454f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov setMeasuredDimension(child.getMeasuredWidth(), child.getMeasuredHeight()); 45551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 45651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 45751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 45851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 45976559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mActivityChooserContent.layout(0, 0, right - left, bottom - top); 460748ee2e82a6f7a3adbbb522d45001e6dcb52b947Svetoslav Ganov if (!isShowingPopup()) { 46176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov dismissPopup(); 46251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 46351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 46451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 46551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ActivityChooserModel getDataModel() { 46651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return mAdapter.getDataModel(); 46751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 46851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 46951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 47051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Sets a listener to receive a callback when the popup is dismissed. 47151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 47251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param listener The listener to be notified. 47351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 47451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setOnDismissListener(PopupWindow.OnDismissListener listener) { 47551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mOnDismissListener = listener; 47651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 47751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 47851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 47951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Sets the initial count of items shown in the activities popup 48051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * i.e. the items before the popup is expanded. This is an upper 48151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * bound since it is not guaranteed that such number of intent 48251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * handlers exist. 48351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 48451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @param itemCount The initial popup item count. 48551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 48651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setInitialActivityCount(int itemCount) { 48751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mInitialActivityCount = itemCount; 48851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 48951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 49051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 49170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * Sets a content description of the default action button. This 49270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * resource should be a string taking one formatting argument and 49370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * will be used for formatting the content description of the button 49470853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * dynamically as the default target changes. For example, a resource 49570853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * pointing to the string "share with %1$s" will result in a content 49670853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * description "share with Bluetooth" for the Bluetooth activity. 49770853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * 49870853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov * @param resourceId The resource id. 49970853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov */ 50070853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov public void setDefaultActionButtonContentDescription(int resourceId) { 50170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov mDefaultActionButtonContentDescription = resourceId; 50270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov } 50370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov 50470853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov /** 50551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Gets the list popup window which is lazily initialized. 50651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * 50751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * @return The popup. 50851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 50951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private ListPopupWindow getListPopupWindow() { 51051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (mListPopupWindow == null) { 51151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow = new ListPopupWindow(getContext()); 51251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow.setAdapter(mAdapter); 51351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow.setAnchorView(ActivityChooserView.this); 51451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow.setModal(true); 51551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow.setOnItemClickListener(mCallbacks); 51651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mListPopupWindow.setOnDismissListener(mCallbacks); 51751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 51851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return mListPopupWindow; 51951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 52051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 52151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 52251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Updates the buttons state. 52351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 524f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov private void updateAppearance() { 525f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // Expand overflow button. 526f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov if (mAdapter.getCount() > 0) { 527f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov mExpandActivityOverflowButton.setEnabled(true); 528f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } else { 529f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov mExpandActivityOverflowButton.setEnabled(false); 530f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } 531f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // Default activity button. 53251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int activityCount = mAdapter.getActivityCount(); 533f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov final int historySize = mAdapter.getHistorySize(); 5345a1195fd5faf40428bc98e5bc24d09edbf3c3b6cfredc if (activityCount==1 || activityCount > 1 && historySize > 0) { 535bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButton.setVisibility(VISIBLE); 53651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ResolveInfo activity = mAdapter.getDefaultActivity(); 53751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov PackageManager packageManager = mContext.getPackageManager(); 538bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager)); 53970853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov if (mDefaultActionButtonContentDescription != 0) { 54070853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov CharSequence label = activity.loadLabel(packageManager); 54170853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov String contentDescription = mContext.getString( 54270853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov mDefaultActionButtonContentDescription, label); 54370853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov mDefaultActivityButton.setContentDescription(contentDescription); 54470853772bd119339244a4fc8e020ad78495228beSvetoslav Ganov } 54551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 546f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov mDefaultActivityButton.setVisibility(View.GONE); 547f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } 548f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov // Activity chooser content. 549f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov if (mDefaultActivityButton.getVisibility() == VISIBLE) { 550baeabb65e1e818c6679036774933f40e8540b293Svetoslav mActivityChooserContent.setBackground(mActivityChooserContentBackground); 551f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } else { 552baeabb65e1e818c6679036774933f40e8540b293Svetoslav mActivityChooserContent.setBackground(null); 55351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 55451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 55551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 55651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 55751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Interface implementation to avoid publishing them in the APIs. 55851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 55951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private class Callbacks implements AdapterView.OnItemClickListener, 56076559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov View.OnClickListener, View.OnLongClickListener, PopupWindow.OnDismissListener { 56151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 56251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // AdapterView#OnItemClickListener 56351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 56451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ActivityChooserViewAdapter adapter = (ActivityChooserViewAdapter) parent.getAdapter(); 56551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int itemViewType = adapter.getItemViewType(position); 56651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov switch (itemViewType) { 56751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_FOOTER: { 56851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov showPopupUnchecked(ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED); 56951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } break; 57051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_ACTIVITY: { 57151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov dismissPopup(); 57251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (mIsSelectingDefaultActivity) { 57376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov // The item at position zero is the default already. 57476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (position > 0) { 57576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mAdapter.getDataModel().setDefaultActivity(position); 57676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 57751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 578efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov // If the default target is not shown in the list, the first 579efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov // item in the model is default action => adjust index 580efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov position = mAdapter.getShowDefaultActivity() ? position : position + 1; 581efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov Intent launchIntent = mAdapter.getDataModel().chooseActivity(position); 5828c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (launchIntent != null) { 583314419ccb9daa215c5148f59e5b60c696ef51385Adam Powell launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 584baeabb65e1e818c6679036774933f40e8540b293Svetoslav ResolveInfo resolveInfo = mAdapter.getDataModel().getActivity(position); 585baeabb65e1e818c6679036774933f40e8540b293Svetoslav startActivity(launchIntent, resolveInfo); 5868c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 58751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 58851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } break; 58951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov default: 59051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov throw new IllegalArgumentException(); 59151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 59251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 59351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 59451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // View.OnClickListener 59551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void onClick(View view) { 596bfbbcf5677d4a5f8c8f938e4c8a8f86d3c7d74c2Svetoslav Ganov if (view == mDefaultActivityButton) { 59751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov dismissPopup(); 59851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ResolveInfo defaultActivity = mAdapter.getDefaultActivity(); 59951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int index = mAdapter.getDataModel().getActivityIndex(defaultActivity); 60051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov Intent launchIntent = mAdapter.getDataModel().chooseActivity(index); 6018c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov if (launchIntent != null) { 602314419ccb9daa215c5148f59e5b60c696ef51385Adam Powell launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 603baeabb65e1e818c6679036774933f40e8540b293Svetoslav startActivity(launchIntent, defaultActivity); 6048c6c79f0909ceabeb8abe1013648c31c7582b7adSvetoslav Ganov } 60551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else if (view == mExpandActivityOverflowButton) { 60651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mIsSelectingDefaultActivity = false; 60751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov showPopupUnchecked(mInitialActivityCount); 60851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 60951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov throw new IllegalArgumentException(); 61051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 61151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 61251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 61351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // OnLongClickListener#onLongClick 61451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 61551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public boolean onLongClick(View view) { 616b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov if (view == mDefaultActivityButton) { 61751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (mAdapter.getCount() > 0) { 61851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mIsSelectingDefaultActivity = true; 61951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov showPopupUnchecked(mInitialActivityCount); 62051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 62151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 62251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov throw new IllegalArgumentException(); 62351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 62451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return true; 62551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 62651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 62751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // PopUpWindow.OnDismissListener#onDismiss 62851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void onDismiss() { 62951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov notifyOnDismissListener(); 630823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell if (mProvider != null) { 631823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell mProvider.subUiVisibilityChanged(false); 632823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell } 63351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 63451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 63551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private void notifyOnDismissListener() { 63651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (mOnDismissListener != null) { 63751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mOnDismissListener.onDismiss(); 63851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 63951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 640baeabb65e1e818c6679036774933f40e8540b293Svetoslav 641baeabb65e1e818c6679036774933f40e8540b293Svetoslav private void startActivity(Intent intent, ResolveInfo resolveInfo) { 642baeabb65e1e818c6679036774933f40e8540b293Svetoslav try { 643baeabb65e1e818c6679036774933f40e8540b293Svetoslav mContext.startActivity(intent); 644baeabb65e1e818c6679036774933f40e8540b293Svetoslav } catch (RuntimeException re) { 645baeabb65e1e818c6679036774933f40e8540b293Svetoslav CharSequence appLabel = resolveInfo.loadLabel(mContext.getPackageManager()); 646baeabb65e1e818c6679036774933f40e8540b293Svetoslav String message = mContext.getString( 647baeabb65e1e818c6679036774933f40e8540b293Svetoslav R.string.activitychooserview_choose_application_error, appLabel); 648baeabb65e1e818c6679036774933f40e8540b293Svetoslav Log.e(LOG_TAG, message); 649baeabb65e1e818c6679036774933f40e8540b293Svetoslav Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); 650baeabb65e1e818c6679036774933f40e8540b293Svetoslav } 651baeabb65e1e818c6679036774933f40e8540b293Svetoslav } 65251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 65351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 65451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov /** 65551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov * Adapter for backing the list of activities shown in the popup. 65651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov */ 65751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private class ActivityChooserViewAdapter extends BaseAdapter { 65851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 65951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public static final int MAX_ACTIVITY_COUNT_UNLIMITED = Integer.MAX_VALUE; 66051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 66151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public static final int MAX_ACTIVITY_COUNT_DEFAULT = 4; 66251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 66376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov private static final int ITEM_VIEW_TYPE_ACTIVITY = 0; 66451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 66576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov private static final int ITEM_VIEW_TYPE_FOOTER = 1; 66651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 66751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private static final int ITEM_VIEW_TYPE_COUNT = 3; 66851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 66951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private ActivityChooserModel mDataModel; 67051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 67151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; 67251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 67376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov private boolean mShowDefaultActivity; 67451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 675efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov private boolean mHighlightDefaultActivity; 676efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov 67776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov private boolean mShowFooterView; 67851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 67951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setDataModel(ActivityChooserModel dataModel) { 68076559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov ActivityChooserModel oldDataModel = mAdapter.getDataModel(); 681b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov if (oldDataModel != null && isShown()) { 68276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov oldDataModel.unregisterObserver(mModelDataSetOberver); 68376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 68451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mDataModel = dataModel; 685b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov if (dataModel != null && isShown()) { 68676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov dataModel.registerObserver(mModelDataSetOberver); 68751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 688b9f286e1a31bfc13e9c0e9635294742d558014c6Svetoslav Ganov notifyDataSetChanged(); 68951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 69051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 69151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 69251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public int getItemViewType(int position) { 69376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (mShowFooterView && position == getCount() - 1) { 69451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return ITEM_VIEW_TYPE_FOOTER; 69551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } else { 69651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return ITEM_VIEW_TYPE_ACTIVITY; 69751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 69851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 69951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 70051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov @Override 70151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public int getViewTypeCount() { 70251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return ITEM_VIEW_TYPE_COUNT; 70351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 70451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 70551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public int getCount() { 70651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov int count = 0; 70751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov int activityCount = mDataModel.getActivityCount(); 70876559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { 70951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov activityCount--; 71051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 71151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov count = Math.min(activityCount, mMaxActivityCount); 71276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (mShowFooterView) { 71351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov count++; 71451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 71551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return count; 71651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 71751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 71851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public Object getItem(int position) { 71951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int itemViewType = getItemViewType(position); 72051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov switch (itemViewType) { 72151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ITEM_VIEW_TYPE_FOOTER: 72276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov return null; 72351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ITEM_VIEW_TYPE_ACTIVITY: 72476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { 72576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov position++; 72651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 72776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov return mDataModel.getActivity(position); 72851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov default: 72951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov throw new IllegalArgumentException(); 73051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 73151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 73251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 73351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public long getItemId(int position) { 73451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return position; 73551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 73651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 73751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public View getView(int position, View convertView, ViewGroup parent) { 73851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int itemViewType = getItemViewType(position); 73951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov switch (itemViewType) { 74051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ITEM_VIEW_TYPE_FOOTER: 74176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (convertView == null || convertView.getId() != ITEM_VIEW_TYPE_FOOTER) { 74276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov convertView = LayoutInflater.from(getContext()).inflate( 74376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov R.layout.activity_chooser_view_list_item, parent, false); 74476559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov convertView.setId(ITEM_VIEW_TYPE_FOOTER); 74576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov TextView titleView = (TextView) convertView.findViewById(R.id.title); 74676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov titleView.setText(mContext.getString( 74776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov R.string.activity_chooser_view_see_all)); 74876559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 74976559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov return convertView; 75051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov case ITEM_VIEW_TYPE_ACTIVITY: 75151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (convertView == null || convertView.getId() != R.id.list_item) { 75251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov convertView = LayoutInflater.from(getContext()).inflate( 75351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov R.layout.activity_chooser_view_list_item, parent, false); 75451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 75551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov PackageManager packageManager = mContext.getPackageManager(); 75651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // Set the icon 75751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ImageView iconView = (ImageView) convertView.findViewById(R.id.icon); 75851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov ResolveInfo activity = (ResolveInfo) getItem(position); 759414051b8b1e31b69ca622d68f391245f1989500bSvetoslav Ganov iconView.setImageDrawable(activity.loadIcon(packageManager)); 76051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // Set the title. 76151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov TextView titleView = (TextView) convertView.findViewById(R.id.title); 76251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov titleView.setText(activity.loadLabel(packageManager)); 76376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov // Highlight the default. 764efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { 76576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov convertView.setActivated(true); 76676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } else { 76776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov convertView.setActivated(false); 76876559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 76951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return convertView; 77051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov default: 77151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov throw new IllegalArgumentException(); 77251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 77351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 77451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 77551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public int measureContentWidth() { 77676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov // The user may have specified some of the target not to be shown but we 77751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov // want to measure all of them since after expansion they should fit. 77851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int oldMaxActivityCount = mMaxActivityCount; 77951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mMaxActivityCount = MAX_ACTIVITY_COUNT_UNLIMITED; 78051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 78151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov int contentWidth = 0; 78251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov View itemView = null; 78351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 78451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 78551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 78651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov final int count = getCount(); 78751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 78851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov for (int i = 0; i < count; i++) { 78951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov itemView = getView(i, itemView, null); 79051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov itemView.measure(widthMeasureSpec, heightMeasureSpec); 79151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov contentWidth = Math.max(contentWidth, itemView.getMeasuredWidth()); 79251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 79351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 79451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mMaxActivityCount = oldMaxActivityCount; 79551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 79651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return contentWidth; 79751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 79851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 79951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public void setMaxActivityCount(int maxActivityCount) { 80051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov if (mMaxActivityCount != maxActivityCount) { 80151ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov mMaxActivityCount = maxActivityCount; 80251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov notifyDataSetChanged(); 80351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 80451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 80551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 80651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ResolveInfo getDefaultActivity() { 80776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov return mDataModel.getDefaultActivity(); 80851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 80951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 81076559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov public void setShowFooterView(boolean showFooterView) { 81176559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov if (mShowFooterView != showFooterView) { 81276559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mShowFooterView = showFooterView; 81351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov notifyDataSetChanged(); 81451ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 81551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 81651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 81751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public int getActivityCount() { 81851ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return mDataModel.getActivityCount(); 81951ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 82051ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov 821f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov public int getHistorySize() { 822f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov return mDataModel.getHistorySize(); 823f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov } 824f2e754002166b8126e6faf8c494da5835432d572Svetoslav Ganov 82551ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov public ActivityChooserModel getDataModel() { 82651ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov return mDataModel; 82751ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 82876559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov 829efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov public void setShowDefaultActivity(boolean showDefaultActivity, 830efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov boolean highlightDefaultActivity) { 831efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov if (mShowDefaultActivity != showDefaultActivity 832efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov || mHighlightDefaultActivity != highlightDefaultActivity) { 83376559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov mShowDefaultActivity = showDefaultActivity; 834efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov mHighlightDefaultActivity = highlightDefaultActivity; 83576559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov notifyDataSetChanged(); 83676559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 83776559a65ad9d644f10beacf8895ceb217fdd0aebSvetoslav Ganov } 838efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov 839efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov public boolean getShowDefaultActivity() { 840efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov return mShowDefaultActivity; 841efab4e7f59835cb2ea9fdc42cc8fd9ea3771d261Svetoslav Ganov } 84251ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov } 84351ac0e94a83cfccb5105aa14df1077729a5b4cccSvetoslav Ganov} 844