Loading res/layout/panel_layout.xml +45 −0 Original line number Diff line number Diff line Loading @@ -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" Loading src/com/android/settings/panel/PanelContent.java +14 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading src/com/android/settings/panel/PanelFragment.java +22 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); Loading Loading @@ -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. Loading Loading @@ -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()); Loading tests/robotests/src/com/android/settings/panel/FakePanelContent.java +21 −0 Original line number Diff line number Diff line Loading @@ -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; Loading tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } No newline at end of file Loading
res/layout/panel_layout.xml +45 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
src/com/android/settings/panel/PanelContent.java +14 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading
src/com/android/settings/panel/PanelFragment.java +22 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); Loading Loading @@ -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. Loading Loading @@ -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()); Loading
tests/robotests/src/com/android/settings/panel/FakePanelContent.java +21 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } No newline at end of file