LargeTemplateView.java revision 8a2763f580c71e17a0b13e682c73012e902b4232
18a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk/*
28a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * Copyright 2017 The Android Open Source Project
38a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk *
48a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * Licensed under the Apache License, Version 2.0 (the "License");
58a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * you may not use this file except in compliance with the License.
68a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * You may obtain a copy of the License at
78a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk *
88a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
98a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk *
108a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * Unless required by applicable law or agreed to in writing, software
118a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * distributed under the License is distributed on an "AS IS" BASIS,
128a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * See the License for the specific language governing permissions and
148a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * limitations under the License.
158a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk */
168a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
178a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monkpackage androidx.app.slice.widget;
188a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
192a7d0fcd09ed39bbeda29e024c47fca617050094Jason Monkimport android.annotation.TargetApi;
208a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monkimport android.content.Context;
218a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monkimport android.support.annotation.RestrictTo;
228a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monkimport android.support.v7.widget.LinearLayoutManager;
238a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monkimport android.support.v7.widget.RecyclerView;
24dc05204762b444dde1db9029aed2819fd72476f7Mady Mellorimport android.util.AttributeSet;
258a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
26b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellorimport java.util.List;
27b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor
28dcb5e2f13fa8471f62a7f4625b4dc6e449358cbdJason Monkimport androidx.app.slice.Slice;
29b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellorimport androidx.app.slice.SliceItem;
308a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
318a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk/**
328a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk * @hide
338a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk */
348a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk@RestrictTo(RestrictTo.Scope.LIBRARY)
352a7d0fcd09ed39bbeda29e024c47fca617050094Jason Monk@TargetApi(24)
36dc05204762b444dde1db9029aed2819fd72476f7Mady Mellorpublic class LargeTemplateView extends SliceChildView {
378a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
388a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    private final LargeSliceAdapter mAdapter;
398a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    private final RecyclerView mRecyclerView;
408a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    private Slice mSlice;
418a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    private boolean mIsScrollable;
42b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor    private ListContent mListContent;
438a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
448a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    public LargeTemplateView(Context context) {
458a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        super(context);
468a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mRecyclerView = new RecyclerView(getContext());
478a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
488a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mAdapter = new LargeSliceAdapter(context);
498a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mRecyclerView.setAdapter(mAdapter);
508a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        addView(mRecyclerView);
518a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor    }
528a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor
538a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor    @Override
548a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor    public int getActualHeight() {
558a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor        return mListContent != null ? mListContent.getListHeight() : 0;
565b2c0ce4135a0531d1b8ddb4bd35698859678b83Mady Mellor    }
575b2c0ce4135a0531d1b8ddb4bd35698859678b83Mady Mellor
585b2c0ce4135a0531d1b8ddb4bd35698859678b83Mady Mellor    @Override
590922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor    public void setTint(int tint) {
600922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor        super.setTint(tint);
610922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor        populate();
620922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor    }
630922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor
640922d59222960ed7c88c5e5098399e33a343c9c6Mady Mellor    @Override
658a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    public @SliceView.SliceMode int getMode() {
668a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        return SliceView.MODE_LARGE;
678a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    }
688a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
698a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    @Override
70abd7ffd938056760f750af041b0e6f02d2cb6e1eMady Mellor    public void setSliceActionListener(SliceView.OnSliceActionListener observer) {
71238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor        mObserver = observer;
72238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor        if (mAdapter != null) {
73238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor            mAdapter.setSliceObserver(mObserver);
74238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor        }
75238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor    }
76238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor
77238b9b6aad4ef0c63acbecfa89605a3d753931feMady Mellor    @Override
78b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor    public void setSliceActions(List<SliceItem> actions) {
79b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor        mAdapter.setSliceActions(actions);
80b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor    }
81b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor
82b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor    @Override
838a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    public void setSlice(Slice slice) {
848a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mSlice = slice;
85dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        populate();
86dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor    }
87dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor
88dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor    @Override
89dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor    public void setStyle(AttributeSet attrs) {
90dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        super.setStyle(attrs);
91dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        mAdapter.setStyle(attrs);
92dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor    }
93dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor
94dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor    private void populate() {
95dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        if (mSlice == null) {
96dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor            return;
97dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        }
988a2763f580c71e17a0b13e682c73012e902b4232Mady Mellor        mListContent = new ListContent(getContext(), mSlice);
99b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor        mAdapter.setSliceItems(mListContent.getRowItems(), mTintColor);
1008a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    }
1018a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk
1028a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    /**
1038a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk     * Whether or not the content in this template should be scrollable.
1048a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk     */
1058a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    public void setScrollable(boolean isScrollable) {
1068a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        // TODO -- restrict / enable how much this view can show
1078a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk        mIsScrollable = isScrollable;
1088a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk    }
109df26970a23ca28c8582178e3dd0e5502d4030293Mady Mellor
110df26970a23ca28c8582178e3dd0e5502d4030293Mady Mellor    @Override
111df26970a23ca28c8582178e3dd0e5502d4030293Mady Mellor    public void resetView() {
112df26970a23ca28c8582178e3dd0e5502d4030293Mady Mellor        mSlice = null;
113dc05204762b444dde1db9029aed2819fd72476f7Mady Mellor        mAdapter.setSliceItems(null, -1);
114b794b5b0f4bcd000e098265a6ec63d4b0cf3852fMady Mellor        mListContent = null;
115df26970a23ca28c8582178e3dd0e5502d4030293Mady Mellor    }
1168a452e96e2308fe9515aa91b8e5b369eeefc25e7Jason Monk}
117