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