Add title and icon in panel header

- Add getIcon() and getSubTitle() in PanelContent
- Check icon avalibility to decide header layout
- Add test cases

Bug: 147776885
Test: make -j42 RunSettingsRoboTests
Change-Id: Idb51e81359b6037ca9b90965dd9b370fc5e22c84
This commit is contained in:
timhypeng
2020-01-16 10:14:13 +08:00
parent 07416f4bee
commit adae7475b0
5 changed files with 142 additions and 3 deletions

View File

@@ -27,6 +27,51 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/panel_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="49dp"
android:layout_height="49dp"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal"
android:layout_marginStart="10dp">
<ImageView
android:id="@+id/title_icon"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingBottom="9dp"
android:paddingTop="9dp">
<TextView
android:id="@+id/header_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:textSize="20sp"/>
<TextView
android:id="@+id/header_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/panel_title"
android:layout_width="match_parent"

View File

@@ -28,6 +28,20 @@ import java.util.List;
*/
public interface PanelContent extends Instrumentable {
/**
* @return a icon resource for the title of the Panel.
*/
default int getIcon() {
return -1;
}
/**
* @return a string for the subtitle of the Panel.
*/
default CharSequence getSubTitle() {
return null;
}
/**
* @return a string for the title of the Panel.
*/

View File

@@ -32,6 +32,8 @@ import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -77,15 +79,19 @@ public class PanelFragment extends Fragment {
*/
private static final int DURATION_SLICE_BINDING_TIMEOUT_MS = 250;
private View mLayoutView;
@VisibleForTesting
View mLayoutView;
private TextView mTitleView;
private Button mSeeMoreButton;
private Button mDoneButton;
private RecyclerView mPanelSlices;
private PanelContent mPanel;
private MetricsFeatureProvider mMetricsProvider;
private String mPanelClosedKey;
private LinearLayout mPanelHeader;
private ImageView mTitleIcon;
private TextView mHeaderTitle;
private TextView mHeaderSubtitle;
private final Map<Uri, LiveData<Slice>> mSliceLiveData = new LinkedHashMap<>();
@@ -155,6 +161,10 @@ public class PanelFragment extends Fragment {
mSeeMoreButton = mLayoutView.findViewById(R.id.see_more);
mDoneButton = mLayoutView.findViewById(R.id.done);
mTitleView = mLayoutView.findViewById(R.id.panel_title);
mPanelHeader = mLayoutView.findViewById(R.id.panel_header);
mTitleIcon = mLayoutView.findViewById(R.id.title_icon);
mHeaderTitle = mLayoutView.findViewById(R.id.header_title);
mHeaderSubtitle = mLayoutView.findViewById(R.id.header_subtitle);
// Make the panel layout gone here, to avoid janky animation when updating from old panel.
// We will make it visible once the panel is ready to load.
@@ -182,7 +192,16 @@ public class PanelFragment extends Fragment {
// Start loading Slices. When finished, the Panel will animate in.
loadAllSlices();
final int iconRes = mPanel.getIcon();
if (iconRes == -1) {
mTitleView.setText(mPanel.getTitle());
} else {
mTitleView.setVisibility(View.GONE);
mPanelHeader.setVisibility(View.VISIBLE);
mTitleIcon.setImageResource(iconRes);
mHeaderTitle.setText(mPanel.getTitle());
mHeaderSubtitle.setText(mPanel.getSubTitle());
}
mSeeMoreButton.setOnClickListener(getSeeMoreListener());
mDoneButton.setOnClickListener(getCloseListener());

View File

@@ -40,6 +40,27 @@ public class FakePanelContent implements PanelContent {
public static final Intent INTENT = new Intent();
private CharSequence mSubTitle;
private int mIconRes = -1;
@Override
public int getIcon() {
return mIconRes;
}
@Override
public CharSequence getSubTitle() {
return mSubTitle;
}
public void setIcon(int iconRes) {
mIconRes = iconRes;
}
public void setSubTitle(CharSequence subTitle) {
mSubTitle = subTitle;
}
@Override
public CharSequence getTitle() {
return TITLE;

View File

@@ -31,6 +31,7 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
@@ -41,10 +42,15 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.android.controller.ActivityController;
import java.util.Objects;
@RunWith(RobolectricTestRunner.class)
public class PanelFragmentTest {
private static final String SUBTITLE = "subtitle";
private Context mContext;
private PanelFragment mPanelFragment;
private FakeSettingsPanelActivity mActivity;
@@ -141,4 +147,38 @@ public class PanelFragmentTest {
0
);
}
@Test
public void supportIcon_displayIconHeaderLayout() {
mFakePanelContent.setIcon(R.drawable.ic_android);
mFakePanelContent.setSubTitle(SUBTITLE);
final ActivityController<FakeSettingsPanelActivity> activityController =
Robolectric.buildActivity(FakeSettingsPanelActivity.class);
activityController.setup();
final PanelFragment panelFragment = (PanelFragment)
Objects.requireNonNull(activityController
.get()
.getSupportFragmentManager()
.findFragmentById(R.id.main_content));
final View titleView = panelFragment.mLayoutView.findViewById(R.id.panel_title);
final LinearLayout panelHeader = panelFragment.mLayoutView.findViewById(R.id.panel_header);
final TextView headerTitle = panelFragment.mLayoutView.findViewById(R.id.header_title);
final TextView headerSubtitle = panelFragment.mLayoutView.findViewById(
R.id.header_subtitle);
// Check visibility
assertThat(panelHeader.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(titleView.getVisibility()).isEqualTo(View.GONE);
// Check content
assertThat(headerTitle.getText()).isEqualTo(FakePanelContent.TITLE);
assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE);
}
@Test
public void notSupportIcon_displayDefaultHeaderLayout() {
final View titleView = mPanelFragment.mLayoutView.findViewById(R.id.panel_title);
final View panelHeader = mPanelFragment.mLayoutView.findViewById(R.id.panel_header);
assertThat(panelHeader.getVisibility()).isEqualTo(View.GONE);
assertThat(titleView.getVisibility()).isEqualTo(View.VISIBLE);
}
}