19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.view; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenimport com.android.frameworks.coretests.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ListActivity; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SubMenu; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exercises context menus in lists 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ListContextMenu extends ListActivity implements View.OnCreateContextMenuListener 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "ListContextMenu"; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ThrashListAdapter mAdapter; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ThrashListAdapter extends BaseAdapter { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutInflater mInflater; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mTitles = new String[100]; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ThrashListAdapter(Context context) { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTitles = new String[100]; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<100; i++) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTitles[i] = "[" + i + "]"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTitles.length; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getItem(int position) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView view; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, null); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = (TextView) convertView; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.setText("List item " + mTitles[position]); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCreate(Bundle icicle) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(icicle); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = new ThrashListAdapter(this); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getListView().setOnCreateContextMenuListener(this); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setListAdapter(mAdapter); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItem item = menu.add(0, 0, 0, "Really long menu item name"); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setTitleCondensed("Long name"); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setIcon(R.drawable.black_square); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SubMenu sm = menu.addSubMenu(0, 0, 0, "The 2nd item, a sub menu").setIcon(R.drawable.black_square_stretchable); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item = sm.getItem(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setTitleCondensed("Sub menu"); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(1, 0, 0, "Subitem 1"); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(1, 0, 0, "Subitem 2"); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(1, 0, 0, "Subitem 3"); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.setGroupCheckable(1, true, true); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 3"); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 4"); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 5"); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 6"); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 7"); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 8"); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Item 9"); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm = menu.addSubMenu(0, 0, 0, "Item 10 SM"); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 1"); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 2"); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 3"); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 4"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 5"); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 6"); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 7"); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "Subitem 8"); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String text = ((TextView) info.targetView).getText().toString(); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text.contains("[0]")) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.setHeaderTitle("This is a test of the title and the icon").setHeaderIcon( 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.R.drawable.sym_def_app_icon); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (text.contains("[1]")) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.setHeaderTitle("This is a test of just the title"); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView textView = new TextView(this); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project textView.setText("This is a test of a custom View"); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.setHeaderView(textView); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 1"); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SubMenu sm = menu.addSubMenu(0, 0, 0, "Test 1.5 SM"); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "CM Subitem 1"); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "CM Subitem 2"); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm.add(0, 0, 0, "CM Subitem 3"); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 2"); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 3"); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 4"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 5"); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 6"); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 7"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 8"); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 9"); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 10"); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 11"); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 12"); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 13"); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 14"); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 15"); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 16"); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 17"); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 18"); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 19"); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 20"); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 21"); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 22"); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 23"); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menu.add(0, 0, 0, "Test 24"); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Options item " + item.toString() + " selected."); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onOptionsItemSelected(item); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onOptionsMenuClosed(Menu menu) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Options menu closed"); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Context item " + item.toString() + " selected."); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onContextItemSelected(item); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onContextMenuClosed(Menu menu) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Context menu closed"); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 202