[SuwLib] Add SwitchItem

Bug: 27600894
Change-Id: Idca6f2fad550561ed71f9eb1bcae8ba54c5dae33
This commit is contained in:
Maurice Lam 2016-03-10 17:27:35 -08:00
parent a8c0365b2a
commit 6e55f30c31
5 changed files with 374 additions and 1 deletions

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/SuwItemContainer.Verbose"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/suw_items_icon_container"
android:layout_width="@dimen/suw_items_icon_container_width"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:gravity="start">
<ImageView
android:id="@+id/suw_items_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/suw_items_verbose_padding_bottom_extra"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/suw_items_title"
style="@style/SuwItemTitle.Verbose"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textAlignment="viewStart"
tools:ignore="UnusedAttribute" />
<TextView
android:id="@+id/suw_items_summary"
style="@style/SuwItemSummary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textAlignment="viewStart"
android:visibility="gone"
tools:ignore="UnusedAttribute" />
</LinearLayout>
<android.support.v7.widget.SwitchCompat
android:id="@+id/suw_items_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<declare-styleable name="SuwSwitchItem">
<attr name="android:checked" />
</declare-styleable>
</resources>

View file

@ -0,0 +1,99 @@
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.setupwizardlib.items;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.widget.SwitchCompat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CompoundButton;
import com.android.setupwizardlib.R;
/**
* An Item with a switch, which the user can
*/
public class SwitchItem extends Item implements CompoundButton.OnCheckedChangeListener {
public interface OnCheckedChangeListener {
void onCheckedChange(SwitchItem item, boolean isChecked);
}
private boolean mChecked = false;
private OnCheckedChangeListener mListener;
public SwitchItem() {
super();
}
public SwitchItem(Context context, AttributeSet attrs) {
super(context, attrs);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuwSwitchItem);
mChecked = a.getBoolean(R.styleable.SuwSwitchItem_android_checked, false);
a.recycle();
}
public void setChecked(boolean checked) {
if (mChecked != checked) {
mChecked = checked;
notifyChanged();
if (mListener != null) {
mListener.onCheckedChange(this, checked);
}
}
}
public boolean isChecked() {
return mChecked;
}
protected int getDefaultLayoutResource() {
return R.layout.suw_items_switch;
}
/**
* Toggle the checked state of the switch, without invalidating the entire item.
*
* @param view The root view of this item, typically from the argument of onItemClick.
*/
public void toggle(View view) {
mChecked = !mChecked;
final SwitchCompat switchView = (SwitchCompat) view.findViewById(R.id.suw_items_switch);
switchView.setChecked(mChecked);
}
@Override
public void onBindView(View view) {
super.onBindView(view);
final SwitchCompat switchView = (SwitchCompat) view.findViewById(R.id.suw_items_switch);
switchView.setChecked(mChecked);
switchView.setOnCheckedChangeListener(this);
switchView.setEnabled(isEnabled());
}
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mListener = listener;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mListener != null) {
mListener.onCheckedChange(this, isChecked);
}
}
}

View file

@ -0,0 +1,171 @@
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.setupwizardlib.test;
import android.support.v7.widget.SwitchCompat;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.setupwizardlib.R;
import com.android.setupwizardlib.items.SwitchItem;
public class SwitchItemTest extends AndroidTestCase {
private SwitchCompat mSwitch;
@SmallTest
public void testChecked() {
SwitchItem item = new SwitchItem();
item.setTitle("TestTitle");
item.setSummary("TestSummary");
View view = createLayout();
item.setChecked(true);
item.onBindView(view);
assertTrue("Switch should be checked", mSwitch.isChecked());
}
@SmallTest
public void testNotChecked() {
SwitchItem item = new SwitchItem();
item.setTitle("TestTitle");
item.setSummary("TestSummary");
View view = createLayout();
item.setChecked(false);
item.onBindView(view);
assertFalse("Switch should be unchecked", mSwitch.isChecked());
}
@SmallTest
public void testListener() {
SwitchItem item = new SwitchItem();
item.setTitle("TestTitle");
item.setSummary("TestSummary");
View view = createLayout();
item.setChecked(true);
final TestOnCheckedChangeListener listener = new TestOnCheckedChangeListener();
item.setOnCheckedChangeListener(listener);
item.onBindView(view);
assertTrue("Switch should be checked", mSwitch.isChecked());
mSwitch.setChecked(false);
assertTrue("Listener should be called", listener.called);
assertFalse("Listener should not be checked", listener.checked);
mSwitch.setChecked(true);
assertTrue("Listener should be called", listener.called);
assertTrue("Listener should be checked", listener.checked);
}
@SmallTest
public void testListenerSetChecked() {
// Check that calling setChecked on the item will also call the listener.
SwitchItem item = new SwitchItem();
item.setTitle("TestTitle");
item.setSummary("TestSummary");
View view = createLayout();
item.setChecked(true);
final TestOnCheckedChangeListener listener = new TestOnCheckedChangeListener();
item.setOnCheckedChangeListener(listener);
item.onBindView(view);
assertTrue("Switch should be checked", mSwitch.isChecked());
item.setChecked(false);
assertTrue("Listener should be called", listener.called);
assertFalse("Listener should not be checked", listener.checked);
item.setChecked(true);
assertTrue("Listener should be called", listener.called);
assertTrue("Listener should be checked", listener.checked);
}
@SmallTest
public void testToggle() {
SwitchItem item = new SwitchItem();
item.setTitle("TestTitle");
item.setSummary("TestSummary");
View view = createLayout();
item.setChecked(true);
item.onBindView(view);
assertTrue("Switch should be checked", mSwitch.isChecked());
item.toggle(view);
assertFalse("Switch should be unchecked", mSwitch.isChecked());
}
private ViewGroup createLayout() {
ViewGroup root = new FrameLayout(mContext);
TextView titleView = new TextView(mContext);
titleView.setId(R.id.suw_items_title);
root.addView(titleView);
TextView summaryView = new TextView(mContext);
summaryView.setId(R.id.suw_items_summary);
root.addView(summaryView);
FrameLayout iconContainer = new FrameLayout(mContext);
iconContainer.setId(R.id.suw_items_icon_container);
root.addView(iconContainer);
ImageView iconView = new ImageView(mContext);
iconView.setId(R.id.suw_items_icon);
iconContainer.addView(iconView);
mSwitch = new SwitchCompat(mContext);
mSwitch.setId(R.id.suw_items_switch);
root.addView(mSwitch);
return root;
}
private static class TestOnCheckedChangeListener implements SwitchItem.OnCheckedChangeListener {
public boolean called = false;
public boolean checked = false;
@Override
public void onCheckedChange(SwitchItem item, boolean isChecked) {
called = true;
checked = isChecked;
}
}
}

View file

@ -96,8 +96,12 @@ android {
res.srcDirs = ['test/res']
}
androidTestEclairMr1Compat {
java.srcDirs = ['eclair-mr1/test/src']
}
androidTestFullSupport {
java.srcDirs = ['full-support/test/src']
java.srcDirs = ['full-support/test/src', 'eclair-mr1/test/src']
res.srcDirs = ['full-support/test/res']
}
}