195af12dac219e6945bab6142ea3a4099077314aaMaurice Lam/*
295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * Copyright (C) 2015 The Android Open Source Project
395af12dac219e6945bab6142ea3a4099077314aaMaurice Lam *
495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
595af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * you may not use this file except in compliance with the License.
695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * You may obtain a copy of the License at
795af12dac219e6945bab6142ea3a4099077314aaMaurice Lam *
895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
995af12dac219e6945bab6142ea3a4099077314aaMaurice Lam *
1095af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * Unless required by applicable law or agreed to in writing, software
1195af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
1295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1395af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * See the License for the specific language governing permissions and
1495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam * limitations under the License.
1595af12dac219e6945bab6142ea3a4099077314aaMaurice Lam */
1695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
1795af12dac219e6945bab6142ea3a4099077314aaMaurice Lampackage com.android.setupwizardlib;
1895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
199f9367672191190f903955d09a4314d40869acc6Maurice Lamimport android.annotation.TargetApi;
2095af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.content.Context;
2115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lamimport android.content.res.TypedArray;
2215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lamimport android.graphics.drawable.Drawable;
2315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lamimport android.os.Build;
249f9367672191190f903955d09a4314d40869acc6Maurice Lamimport android.os.Build.VERSION_CODES;
2595af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.util.AttributeSet;
267bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lamimport android.util.Log;
2795af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.view.LayoutInflater;
2895af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.view.View;
29bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lamimport android.view.ViewGroup;
3095af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.widget.ListAdapter;
3195af12dac219e6945bab6142ea3a4099077314aaMaurice Lamimport android.widget.ListView;
3295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
3315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lamimport com.android.setupwizardlib.util.DrawableLayoutDirectionHelper;
347bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lamimport com.android.setupwizardlib.util.ListViewRequireScrollHelper;
357bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lamimport com.android.setupwizardlib.view.NavigationBar;
367bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam
3795af12dac219e6945bab6142ea3a4099077314aaMaurice Lampublic class SetupWizardListLayout extends SetupWizardLayout {
3895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
3995af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    private static final String TAG = "SetupWizardListLayout";
4095af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    private ListView mListView;
4115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    private Drawable mDivider;
4215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    private Drawable mDefaultDivider;
4315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    private int mDividerInset;
4495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
4595af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public SetupWizardListLayout(Context context) {
46bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        this(context, 0, 0);
4795af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
4895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
4995af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public SetupWizardListLayout(Context context, int template) {
50bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        this(context, template, 0);
51bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam    }
52bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam
53bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam    public SetupWizardListLayout(Context context, int template, int containerId) {
54bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        super(context, template, containerId);
5515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        init(context, null, 0);
5695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
5795af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
5895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public SetupWizardListLayout(Context context, AttributeSet attrs) {
599f9367672191190f903955d09a4314d40869acc6Maurice Lam        super(context, attrs);
6015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        init(context, attrs, 0);
6195af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
6295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
639f9367672191190f903955d09a4314d40869acc6Maurice Lam    @TargetApi(VERSION_CODES.HONEYCOMB)
6495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public SetupWizardListLayout(Context context, AttributeSet attrs, int defStyleAttr) {
659f9367672191190f903955d09a4314d40869acc6Maurice Lam        super(context, attrs, defStyleAttr);
6615391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        init(context, attrs, defStyleAttr);
6715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
6815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
6915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
7015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        final TypedArray a = context.obtainStyledAttributes(attrs,
7115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam                R.styleable.SuwSetupWizardListLayout, defStyleAttr, 0);
7215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        int dividerInset =
7315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam                a.getDimensionPixelSize(R.styleable.SuwSetupWizardListLayout_suwDividerInset, 0);
7415391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        setDividerInset(dividerInset);
7515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        a.recycle();
7695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
7795af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
7895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    @Override
7995af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    protected View onInflateTemplate(LayoutInflater inflater, int template) {
8095af12dac219e6945bab6142ea3a4099077314aaMaurice Lam        if (template == 0) {
8195af12dac219e6945bab6142ea3a4099077314aaMaurice Lam            template = R.layout.suw_list_template;
8295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam        }
83bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        return super.onInflateTemplate(inflater, template);
8495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
8595af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
8695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    @Override
87bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam    protected ViewGroup findContainer(int containerId) {
88bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        if (containerId == 0) {
89bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam            containerId = android.R.id.list;
90bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        }
91bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        return super.findContainer(containerId);
9295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
9395af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
9495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    @Override
9515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
9615391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        super.onLayout(changed, left, top, right, bottom);
9715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        if (mDivider == null) {
9815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            // Update divider in case layout direction has just been resolved
9915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            updateDivider();
10015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        }
10115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
10215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
10315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    @Override
104bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam    protected void onTemplateInflated() {
105bdfc0132ff90a333de202adfbf204cdc8139e632Maurice Lam        mListView = (ListView) findViewById(android.R.id.list);
10695af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
10795af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
10895af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public ListView getListView() {
10995af12dac219e6945bab6142ea3a4099077314aaMaurice Lam        return mListView;
11095af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
11195af12dac219e6945bab6142ea3a4099077314aaMaurice Lam
11295af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    public void setAdapter(ListAdapter adapter) {
11395af12dac219e6945bab6142ea3a4099077314aaMaurice Lam        getListView().setAdapter(adapter);
11495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam    }
1157bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam
1168e2e803f9d5a0c99ade0ee21749b4184bc888d18Maurice Lam    @Override
1177bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam    public void requireScrollToBottom() {
1187bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam        final NavigationBar navigationBar = getNavigationBar();
1197bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam        final ListView listView = getListView();
1207bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam        if (navigationBar != null && listView != null) {
1217bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam            ListViewRequireScrollHelper.requireScroll(navigationBar, listView);
1227bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam        } else {
1237bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam            Log.e(TAG, "Both suw_layout_navigation_bar and list must exist in"
1247bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam                    + " the template to require scrolling.");
1257bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam        }
1267bc6f176937ed369b180fa89f6c311d2801f206cMaurice Lam    }
12715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
12815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    /**
12915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     * Sets the start inset of the divider. This will use the default divider drawable set in the
13015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     * theme and inset it {@code inset} pixels to the right (or left in RTL layouts).
13115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     *
13215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     * @param inset The number of pixels to inset on the "start" side of the list divider. Typically
13315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     *              this will be either {@code @dimen/suw_items_icon_divider_inset} or
13415391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     *              {@code @dimen/suw_items_text_divider_inset}.
13515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam     */
13615391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    public void setDividerInset(int inset) {
13715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        mDividerInset = inset;
13815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        updateDivider();
13915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
14015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
14115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    public int getDividerInset() {
14215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        return mDividerInset;
14315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
14415391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
14515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    private void updateDivider() {
14615391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        boolean shouldUpdate = true;
14715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        if (Build.VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
14815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            shouldUpdate = isLayoutDirectionResolved();
14915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        }
15015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        if (shouldUpdate) {
15115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            final ListView listView = getListView();
15215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            if (mDefaultDivider == null) {
15315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam                mDefaultDivider = listView.getDivider();
15415391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            }
15515391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            mDivider = DrawableLayoutDirectionHelper.createRelativeInsetDrawable(mDefaultDivider,
15615391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam                    mDividerInset /* start */, 0 /* top */, 0 /* end */, 0 /* bottom */, this);
15715391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam            listView.setDivider(mDivider);
15815391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        }
15915391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
16015391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam
16115391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    public Drawable getDivider() {
16215391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam        return mDivider;
16315391fc05a0fc45e9af85b653abffa41df575e91Maurice Lam    }
16495af12dac219e6945bab6142ea3a4099077314aaMaurice Lam}
165