Loading packages/SystemUI/res/layout/quick_settings_footer.xml +9 −1 Original line number Diff line number Diff line Loading @@ -26,11 +26,19 @@ android:layout_gravity="center_vertical|center_horizontal" android:background="@android:color/transparent"> <ImageView android:id="@+id/primary_footer_icon" android:layout_width="@dimen/qs_footer_icon_size" android:layout_height="@dimen/qs_footer_icon_size" android:gravity="start" android:layout_marginEnd="8dp" android:contentDescription="@null" android:tint="?android:attr/textColorPrimary" /> <com.android.systemui.util.AutoMarqueeTextView android:id="@+id/footer_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" Loading packages/SystemUI/res/layout/quick_settings_footer_dialog_parental_controls.xml +2 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ android:orientation="vertical"> <ImageView android:id="@+id/parental_controls_icon" android:layout_width="36dip" android:layout_height="36dip" android:layout_width="24dip" android:layout_height="24dip" android:layout_gravity="center_horizontal" /> Loading packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +24 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private final View mRootView; private final TextView mFooterText; private final ImageView mFooterIcon; private final ImageView mPrimaryFooterIcon; private final Context mContext; private final Callback mCallback = new Callback(); private final SecurityController mSecurityController; Loading @@ -83,6 +84,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private CharSequence mFooterTextContent = null; private int mFooterTextId; private int mFooterIconId; private Drawable mPrimaryFooterIconDrawable; @Inject QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context, Loading @@ -92,6 +94,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen mRootView.setOnClickListener(this); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon); mFooterIconId = R.drawable.ic_info_outline; mContext = context; mMainHandler = mainHandler; Loading Loading @@ -188,6 +191,18 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen mFooterIconId = footerIconId; mMainHandler.post(mUpdateIcon); } // Update the primary icon if (isParentalControlsEnabled) { if (mPrimaryFooterIconDrawable == null) { DeviceAdminInfo info = mSecurityController.getDeviceAdminInfo(); mPrimaryFooterIconDrawable = mSecurityController.getIcon(info); } } else { mPrimaryFooterIconDrawable = null; } mMainHandler.post(mUpdatePrimaryIcon); mMainHandler.post(mUpdateDisplayState); } Loading Loading @@ -532,6 +547,15 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen } }; private final Runnable mUpdatePrimaryIcon = new Runnable() { @Override public void run() { mPrimaryFooterIcon.setVisibility(mPrimaryFooterIconDrawable != null ? View.VISIBLE : View.GONE); mPrimaryFooterIcon.setImageDrawable(mPrimaryFooterIconDrawable); } }; private final Runnable mUpdateDisplayState = new Runnable() { @Override public void run() { Loading packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ package com.android.systemui.qs; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.assertFalse; import static org.mockito.Matchers.any; Loading @@ -24,6 +25,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.graphics.drawable.VectorDrawable; import android.os.Handler; import android.os.Looper; import android.provider.Settings; Loading Loading @@ -75,6 +78,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { private ViewGroup mRootView; private TextView mFooterText; private TestableImageView mFooterIcon; private TestableImageView mPrimaryFooterIcon; private QSSecurityFooter mFooter; @Mock private SecurityController mSecurityController; Loading @@ -95,6 +99,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mActivityStarter, mSecurityController, looper); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon); mFooter.setHostEnvironment(null); } Loading @@ -119,6 +124,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mFooterText.getText()); assertEquals(View.VISIBLE, mRootView.getVisibility()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); } Loading @@ -136,6 +142,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mFooterText.getText()); assertEquals(View.VISIBLE, mRootView.getVisibility()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); } Loading Loading @@ -165,6 +172,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); Loading Loading @@ -203,6 +211,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { VPN_PACKAGE), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); // Same situation, but with organization name set Loading @@ -229,6 +238,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_vpns), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); // Same situation, but with organization name set Loading @@ -252,6 +262,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring), mFooterText.getText()); Loading Loading @@ -534,12 +545,27 @@ public class QSSecurityFooterTest extends SysuiTestCase { @Test public void testParentalControls() { when(mSecurityController.isParentalControlsEnabled()).thenReturn(true); Drawable testDrawable = new VectorDrawable(); when(mSecurityController.getIcon(any())).thenReturn(testDrawable); assertNotNull(mSecurityController.getIcon(null)); mFooter.refreshState(); TestableLooper.get(this).processAllMessages(); assertEquals(mContext.getString(R.string.quick_settings_disclosure_parental_controls), mFooterText.getText()); assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility()); assertEquals(testDrawable, mPrimaryFooterIcon.getDrawable()); // Ensure the primary icon is set to gone when parental controls is disabled. when(mSecurityController.isParentalControlsEnabled()).thenReturn(false); mFooter.refreshState(); TestableLooper.get(this).processAllMessages(); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); } @Test Loading Loading
packages/SystemUI/res/layout/quick_settings_footer.xml +9 −1 Original line number Diff line number Diff line Loading @@ -26,11 +26,19 @@ android:layout_gravity="center_vertical|center_horizontal" android:background="@android:color/transparent"> <ImageView android:id="@+id/primary_footer_icon" android:layout_width="@dimen/qs_footer_icon_size" android:layout_height="@dimen/qs_footer_icon_size" android:gravity="start" android:layout_marginEnd="8dp" android:contentDescription="@null" android:tint="?android:attr/textColorPrimary" /> <com.android.systemui.util.AutoMarqueeTextView android:id="@+id/footer_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" Loading
packages/SystemUI/res/layout/quick_settings_footer_dialog_parental_controls.xml +2 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ android:orientation="vertical"> <ImageView android:id="@+id/parental_controls_icon" android:layout_width="36dip" android:layout_height="36dip" android:layout_width="24dip" android:layout_height="24dip" android:layout_gravity="center_horizontal" /> Loading
packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +24 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private final View mRootView; private final TextView mFooterText; private final ImageView mFooterIcon; private final ImageView mPrimaryFooterIcon; private final Context mContext; private final Callback mCallback = new Callback(); private final SecurityController mSecurityController; Loading @@ -83,6 +84,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private CharSequence mFooterTextContent = null; private int mFooterTextId; private int mFooterIconId; private Drawable mPrimaryFooterIconDrawable; @Inject QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context, Loading @@ -92,6 +94,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen mRootView.setOnClickListener(this); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon); mFooterIconId = R.drawable.ic_info_outline; mContext = context; mMainHandler = mainHandler; Loading Loading @@ -188,6 +191,18 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen mFooterIconId = footerIconId; mMainHandler.post(mUpdateIcon); } // Update the primary icon if (isParentalControlsEnabled) { if (mPrimaryFooterIconDrawable == null) { DeviceAdminInfo info = mSecurityController.getDeviceAdminInfo(); mPrimaryFooterIconDrawable = mSecurityController.getIcon(info); } } else { mPrimaryFooterIconDrawable = null; } mMainHandler.post(mUpdatePrimaryIcon); mMainHandler.post(mUpdateDisplayState); } Loading Loading @@ -532,6 +547,15 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen } }; private final Runnable mUpdatePrimaryIcon = new Runnable() { @Override public void run() { mPrimaryFooterIcon.setVisibility(mPrimaryFooterIconDrawable != null ? View.VISIBLE : View.GONE); mPrimaryFooterIcon.setImageDrawable(mPrimaryFooterIconDrawable); } }; private final Runnable mUpdateDisplayState = new Runnable() { @Override public void run() { Loading
packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ package com.android.systemui.qs; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.assertFalse; import static org.mockito.Matchers.any; Loading @@ -24,6 +25,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.graphics.drawable.VectorDrawable; import android.os.Handler; import android.os.Looper; import android.provider.Settings; Loading Loading @@ -75,6 +78,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { private ViewGroup mRootView; private TextView mFooterText; private TestableImageView mFooterIcon; private TestableImageView mPrimaryFooterIcon; private QSSecurityFooter mFooter; @Mock private SecurityController mSecurityController; Loading @@ -95,6 +99,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mActivityStarter, mSecurityController, looper); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon); mFooter.setHostEnvironment(null); } Loading @@ -119,6 +124,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mFooterText.getText()); assertEquals(View.VISIBLE, mRootView.getVisibility()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); } Loading @@ -136,6 +142,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { mFooterText.getText()); assertEquals(View.VISIBLE, mRootView.getVisibility()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); } Loading Loading @@ -165,6 +172,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); // -1 == never set. assertEquals(-1, mFooterIcon.getLastImageResource()); Loading Loading @@ -203,6 +211,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { VPN_PACKAGE), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); // Same situation, but with organization name set Loading @@ -229,6 +238,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_vpns), mFooterText.getText()); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); // Same situation, but with organization name set Loading @@ -252,6 +262,7 @@ public class QSSecurityFooterTest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); assertEquals(View.VISIBLE, mFooterIcon.getVisibility()); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource()); assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring), mFooterText.getText()); Loading Loading @@ -534,12 +545,27 @@ public class QSSecurityFooterTest extends SysuiTestCase { @Test public void testParentalControls() { when(mSecurityController.isParentalControlsEnabled()).thenReturn(true); Drawable testDrawable = new VectorDrawable(); when(mSecurityController.getIcon(any())).thenReturn(testDrawable); assertNotNull(mSecurityController.getIcon(null)); mFooter.refreshState(); TestableLooper.get(this).processAllMessages(); assertEquals(mContext.getString(R.string.quick_settings_disclosure_parental_controls), mFooterText.getText()); assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility()); assertEquals(testDrawable, mPrimaryFooterIcon.getDrawable()); // Ensure the primary icon is set to gone when parental controls is disabled. when(mSecurityController.isParentalControlsEnabled()).thenReturn(false); mFooter.refreshState(); TestableLooper.get(this).processAllMessages(); assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility()); } @Test Loading