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