1b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin/* 2b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * Copyright (C) 2016 The Android Open Source Project 3b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * 4b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * you may not use this file except in compliance with the License. 6b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * You may obtain a copy of the License at 7b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * 8b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * http://www.apache.org/licenses/LICENSE-2.0 9b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * 10b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * Unless required by applicable law or agreed to in writing, software 11b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * See the License for the specific language governing permissions and 14b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * limitations under the License. 15b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin */ 16b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 17b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linpackage com.android.documentsui; 18b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 19b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.content.Context; 20b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.util.AttributeSet; 21b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.view.LayoutInflater; 22b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.view.View; 23b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.view.ViewGroup; 24b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.widget.AdapterView; 25b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.widget.BaseAdapter; 26b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.widget.Spinner; 27b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport android.widget.TextView; 28b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 29b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport com.android.documentsui.NavigationViewManager.Breadcrumb; 30b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linimport com.android.documentsui.NavigationViewManager.Environment; 31d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport com.android.documentsui.base.DocumentInfo; 32d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport com.android.documentsui.base.RootInfo; 33d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.State; 34b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 3562442459cbd6f49c0ae5c1b66dfd925841e20f3dBen Linimport java.util.function.IntConsumer; 36b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 37b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin/** 38b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin * Dropdown implementation of breadcrumb used for phone device layouts 39b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin */ 40b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 41b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Linpublic final class DropdownBreadcrumb extends Spinner implements Breadcrumb { 42b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 43b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin private DropdownAdapter mAdapter; 44b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 45b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DropdownBreadcrumb( 46b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 47b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin super(context, attrs, defStyleAttr, defStyleRes); 48b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 49b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 50b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DropdownBreadcrumb(Context context, AttributeSet attrs, int defStyleAttr) { 51b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin super(context, attrs, defStyleAttr); 52b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 53b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 54b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DropdownBreadcrumb(Context context, AttributeSet attrs) { 55b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin super(context, attrs); 56b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 57b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 58b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DropdownBreadcrumb(Context context) { 59b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin super(context); 60b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 61b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 62b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 6362442459cbd6f49c0ae5c1b66dfd925841e20f3dBen Lin public void setup(Environment env, State state, IntConsumer listener) { 64b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin mAdapter = new DropdownAdapter(state, env); 65b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setOnItemSelectedListener( 66b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin new OnItemSelectedListener() { 67b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 68b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public void onItemSelected( 69b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin AdapterView<?> parent, View view, int position, long id) { 70b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin listener.accept(position); 71b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 72b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 73b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 74b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public void onNothingSelected(AdapterView<?> parent) {} 75b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin }); 76b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 77b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 78b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 79b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public void show(boolean visibility) { 80b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin if (visibility) { 81b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setVisibility(VISIBLE); 82b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setAdapter(mAdapter); 83b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } else { 84b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setVisibility(GONE); 85b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setAdapter(null); 86b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 87b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 88b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 89b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 90b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public void postUpdate() { 91b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin setSelection(mAdapter.getCount() - 1, false); 92b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 93b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 94b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin private static final class DropdownAdapter extends BaseAdapter { 95b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin private Environment mEnv; 96b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin private State mState; 97b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 98b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DropdownAdapter(State state, Environment env) { 99b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin mState = state; 100b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin mEnv = env; 101b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 102b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 103b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 104b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public int getCount() { 105b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin return mState.stack.size(); 106b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 107b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 108b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 109b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public DocumentInfo getItem(int position) { 1102a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan return mState.stack.get(position); 111b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 112b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 113b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 114b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public long getItemId(int position) { 115b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin return position; 116b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 117b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 118b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 119b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public View getView(int position, View convertView, ViewGroup parent) { 120b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin if (convertView == null) { 121b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin convertView = LayoutInflater.from(parent.getContext()) 122b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin .inflate(R.layout.item_subdir_title, parent, false); 123b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 124b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 125b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final TextView title = (TextView) convertView.findViewById(android.R.id.title); 126b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final DocumentInfo doc = getItem(position); 127b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 128b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin if (position == 0) { 129b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final RootInfo root = mEnv.getCurrentRoot(); 130b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin title.setText(root.title); 131b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } else { 132b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin title.setText(doc.displayName); 133b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 134b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 135b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin return convertView; 136b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 137b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 138b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin @Override 139b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin public View getDropDownView(int position, View convertView, ViewGroup parent) { 140b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin if (convertView == null) { 141b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin convertView = LayoutInflater.from(parent.getContext()) 142b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin .inflate(R.layout.item_subdir, parent, false); 143b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 144b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 145b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final TextView title = (TextView) convertView.findViewById(android.R.id.title); 146b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final DocumentInfo doc = getItem(position); 147b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 148b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin if (position == 0) { 149b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin final RootInfo root = mEnv.getCurrentRoot(); 150b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin title.setText(root.title); 151b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } else { 152b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin title.setText(doc.displayName); 153b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 154b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 155b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin return convertView; 156b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 157b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin } 158b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin 159b8c54e773b1d4087a543f22bf02ea6421de09f5cBen Lin} 160