Redesign QSSecurityFooter dialog

The dialog consists now of up to four sections: Device management,
CA certificates, Network Logging and VPN.

Also, small tweaks to the footer's coloring after the theme change of QS.

Bug: 34369166
Bug: 37492743
Test: in class QSSecurityFooterTest, which is part of "runtest systemui"

Change-Id: Ibf07a26fb6c5485a152f9d447f10c0f73acb94ba
(cherry picked from commit 0330f88144)
This commit is contained in:
phweiss
2017-04-19 20:14:51 +02:00
committed by Philipp Weiß
parent 96d27d826f
commit 48e353cefb
5 changed files with 282 additions and 221 deletions

View File

@@ -23,7 +23,7 @@
android:paddingStart="@dimen/qs_footer_padding_start"
android:paddingEnd="@dimen/qs_footer_padding_end"
android:gravity="center_vertical"
android:background="?android:attr/colorPrimaryDark" >
android:background="?android:attr/colorPrimary" >
<TextView
android:id="@+id/footer_text"
@@ -39,6 +39,7 @@
android:layout_width="@dimen/qs_footer_icon_size"
android:layout_height="@dimen/qs_footer_icon_size"
android:contentDescription="@null"
android:src="@drawable/ic_info_outline" />
android:src="@drawable/ic_info_outline"
android:tint="?android:attr/textColorSecondary"/>
</LinearLayout>

View File

@@ -27,90 +27,105 @@
android:paddingTop="?android:attr/dialogPreferredPadding"
android:paddingRight="?android:attr/dialogPreferredPadding"
android:paddingLeft="?android:attr/dialogPreferredPadding"
android:paddingBottom="?android:attr/dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@+id/device_owner_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimaryInverse"
/>
<LinearLayout
android:id="@+id/device_management_disclosures"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/vpn_icon"
android:layout_width="@dimen/qs_footer_dialog_icon_size"
android:layout_height="wrap_content"
android:paddingTop="?android:attr/dialogPreferredPadding"
android:layout_marginStart="@dimen/qs_footer_dialog_icon_margin"
android:layout_marginEnd="@dimen/qs_footer_dialog_icon_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_qs_vpn"
android:tint="?android:attr/textColorPrimaryInverse"
android:adjustViewBounds="true"/>
<LinearLayout
android:paddingBottom="?android:attr/dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@+id/device_management_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/vpn_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="?android:attr/dialogPreferredPadding"
android:text="@string/monitoring_subtitle_vpn"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimaryInverse"
/>
<TextView
android:id="@+id/vpn_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@null"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimaryInverse"
/>
</LinearLayout>
android:text="@string/monitoring_title_device_owned"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/device_management_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@null"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ca_certs_disclosures"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/network_logging_icon"
android:layout_width="@dimen/qs_footer_dialog_icon_size"
android:layout_height="wrap_content"
android:paddingTop="?android:attr/dialogPreferredPadding"
android:layout_marginStart="@dimen/qs_footer_dialog_icon_margin"
android:layout_marginEnd="@dimen/qs_footer_dialog_icon_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_qs_network_logging"
android:tint="?android:attr/textColorPrimaryInverse"
android:adjustViewBounds="true"/>
<LinearLayout
android:paddingBottom="?android:attr/dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@+id/ca_certs_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/network_logging_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="?android:attr/dialogPreferredPadding"
android:text="@string/monitoring_subtitle_network_logging"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimaryInverse"
/>
<TextView
android:id="@+id/network_logging_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_description_network_logging"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimaryInverse"
/>
</LinearLayout>
android:text="@string/monitoring_subtitle_ca_certificate"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/ca_certs_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@null"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/network_logging_disclosures"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="?android:attr/dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@+id/network_logging_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_network_logging"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/network_logging_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@null"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/vpn_disclosures"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="?android:attr/dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@+id/vpn_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_vpn"
style="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/vpn_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@null"
style="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary"
/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@@ -282,6 +282,8 @@
<dimen name="qs_footer_dialog_icon_size">24sp</dimen>
<!-- Left and right margin of the icons -->
<dimen name="qs_footer_dialog_icon_margin">8sp</dimen>
<!-- Padding between subtitles and the following text in the QSFooter dialog -->
<dimen name="qs_footer_dialog_subtitle_padding">20dp</dimen>
<!-- Zen mode panel: condition item button padding -->
<dimen name="zen_mode_condition_detail_button_padding">8dp</dimen>

View File

@@ -31,6 +31,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
@@ -224,117 +225,152 @@ public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClic
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_NEGATIVE) {
final Intent settingsIntent = new Intent(ACTION_VPN_SETTINGS);
mActivityStarter.postStartActivityDismissingKeyguard(settingsIntent, 0);
final Intent intent = new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS);
mDialog.dismiss();
mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
}
}
private void createDialog() {
final String deviceOwnerPackage = mSecurityController.getDeviceOwnerName();
final String profileOwnerPackage = mSecurityController.getProfileOwnerName();
final boolean isNetworkLoggingEnabled = mSecurityController.isNetworkLoggingEnabled();
final String primaryVpn = mSecurityController.getPrimaryVpnName();
final String profileVpn = mSecurityController.getWorkProfileVpnName();
final boolean isDeviceManaged = mSecurityController.isDeviceManaged();
final boolean hasWorkProfile = mSecurityController.hasWorkProfile();
final CharSequence deviceOwnerOrganization =
mSecurityController.getDeviceOwnerOrganizationName();
boolean hasProfileOwner = mSecurityController.hasProfileOwner();
final boolean hasCACerts = mSecurityController.hasCACertInCurrentUser();
final boolean hasCACertsInWorkProfile = mSecurityController.hasCACertInWorkProfile();
final boolean isNetworkLoggingEnabled = mSecurityController.isNetworkLoggingEnabled();
final String vpnName = mSecurityController.getPrimaryVpnName();
final String vpnNameWorkProfile = mSecurityController.getWorkProfileVpnName();
mDialog = new SystemUIDialog(mContext);
mDialog.setTitle(getTitle(deviceOwnerPackage));
CharSequence msg = getMessage(deviceOwnerPackage, profileOwnerPackage, primaryVpn,
profileVpn, deviceOwnerOrganization, hasProfileOwner);
if (deviceOwnerPackage == null) {
mDialog.setMessage(msg);
if (mSecurityController.isVpnEnabled() && !mSecurityController.isVpnRestricted()) {
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this);
}
} else {
View dialogView = LayoutInflater.from(mContext)
.inflate(R.layout.quick_settings_footer_dialog, null, false);
mDialog.setView(dialogView);
TextView deviceOwnerWarning =
(TextView) dialogView.findViewById(R.id.device_owner_warning);
deviceOwnerWarning.setText(msg);
// Make the link "learn more" clickable.
deviceOwnerWarning.setMovementMethod(new LinkMovementMethod());
if (primaryVpn == null) {
dialogView.findViewById(R.id.vpn_icon).setVisibility(View.GONE);
dialogView.findViewById(R.id.vpn_subtitle).setVisibility(View.GONE);
dialogView.findViewById(R.id.vpn_warning).setVisibility(View.GONE);
} else {
final SpannableStringBuilder message = new SpannableStringBuilder();
message.append(mContext.getString(R.string.monitoring_description_do_body_vpn,
primaryVpn));
if (!mSecurityController.isVpnRestricted()) {
message.append(mContext.getString(
R.string.monitoring_description_vpn_settings_separator));
message.append(mContext.getString(R.string.monitoring_description_vpn_settings),
new VpnSpan(), 0);
}
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
View dialogView = LayoutInflater.from(mContext)
.inflate(R.layout.quick_settings_footer_dialog, null, false);
mDialog.setView(dialogView);
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
TextView vpnWarning = (TextView) dialogView.findViewById(R.id.vpn_warning);
vpnWarning.setText(message);
// Make the link "Open VPN Settings" clickable.
vpnWarning.setMovementMethod(new LinkMovementMethod());
}
if (!isNetworkLoggingEnabled) {
dialogView.findViewById(R.id.network_logging_icon).setVisibility(View.GONE);
dialogView.findViewById(R.id.network_logging_subtitle).setVisibility(View.GONE);
dialogView.findViewById(R.id.network_logging_warning).setVisibility(View.GONE);
}
// device management section
CharSequence managementMessage = getManagementMessage(isDeviceManaged,
deviceOwnerOrganization);
if (managementMessage == null) {
dialogView.findViewById(R.id.device_management_disclosures).setVisibility(View.GONE);
} else {
dialogView.findViewById(R.id.device_management_disclosures).setVisibility(View.VISIBLE);
TextView deviceManagementWarning =
(TextView) dialogView.findViewById(R.id.device_management_warning);
deviceManagementWarning.setText(managementMessage);
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this);
}
// ca certificate section
CharSequence caCertsMessage = getCaCertsMessage(isDeviceManaged, hasCACerts,
hasCACertsInWorkProfile);
if (caCertsMessage == null) {
dialogView.findViewById(R.id.ca_certs_disclosures).setVisibility(View.GONE);
} else {
dialogView.findViewById(R.id.ca_certs_disclosures).setVisibility(View.VISIBLE);
TextView caCertsWarning = (TextView) dialogView.findViewById(R.id.ca_certs_warning);
caCertsWarning.setText(caCertsMessage);
// Make "Open trusted credentials"-link clickable
caCertsWarning.setMovementMethod(new LinkMovementMethod());
}
// network logging section
CharSequence networkLoggingMessage = getNetworkLoggingMessage(isNetworkLoggingEnabled);
if (networkLoggingMessage == null) {
dialogView.findViewById(R.id.network_logging_disclosures).setVisibility(View.GONE);
} else {
dialogView.findViewById(R.id.network_logging_disclosures).setVisibility(View.VISIBLE);
TextView networkLoggingWarning =
(TextView) dialogView.findViewById(R.id.network_logging_warning);
networkLoggingWarning.setText(networkLoggingMessage);
}
// vpn section
CharSequence vpnMessage = getVpnMessage(isDeviceManaged, hasWorkProfile, vpnName,
vpnNameWorkProfile);
if (vpnMessage == null) {
dialogView.findViewById(R.id.vpn_disclosures).setVisibility(View.GONE);
} else {
dialogView.findViewById(R.id.vpn_disclosures).setVisibility(View.VISIBLE);
TextView vpnWarning = (TextView) dialogView.findViewById(R.id.vpn_warning);
vpnWarning.setText(vpnMessage);
// Make "Open VPN Settings"-link clickable
vpnWarning.setMovementMethod(new LinkMovementMethod());
}
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
mDialog.show();
mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
private String getSettingsButton() {
return mContext.getString(R.string.status_bar_settings_settings_button);
return mContext.getString(R.string.monitoring_button_view_policies);
}
private String getPositiveButton() {
return mContext.getString(R.string.quick_settings_done);
}
protected CharSequence getMessage(String deviceOwnerPackage, String profileOwnerPackage,
String primaryVpn, String profileVpn, CharSequence deviceOwnerOrganization,
boolean hasProfileOwner) {
if (deviceOwnerPackage != null) {
final SpannableStringBuilder message = new SpannableStringBuilder();
if (deviceOwnerOrganization != null) {
message.append(mContext.getString(
R.string.monitoring_description_do_header_with_name,
deviceOwnerOrganization, deviceOwnerPackage));
} else {
message.append(mContext.getString(R.string.monitoring_description_do_header_generic,
deviceOwnerPackage));
}
message.append("\n\n");
message.append(mContext.getString(R.string.monitoring_description_do_body));
message.append(mContext.getString(
R.string.monitoring_description_do_learn_more_separator));
message.append(mContext.getString(R.string.monitoring_description_do_learn_more),
new EnterprisePrivacySpan(), 0);
return message;
} else if (primaryVpn != null) {
if (profileVpn != null) {
return mContext.getString(R.string.monitoring_description_app_personal_work,
profileOwnerPackage, profileVpn, primaryVpn);
} else {
return mContext.getString(R.string.monitoring_description_app_personal,
primaryVpn);
}
} else if (profileVpn != null) {
return mContext.getString(R.string.monitoring_description_app_work,
profileOwnerPackage, profileVpn);
} else if (profileOwnerPackage != null && hasProfileOwner) {
return mContext.getString(R.string.do_disclosure_with_name,
profileOwnerPackage);
} else {
// No device owner, no personal VPN, no work VPN, no user owner. Why are we here?
return null;
protected CharSequence getManagementMessage(boolean isDeviceManaged,
CharSequence organizationName) {
if (!isDeviceManaged) return null;
if (organizationName != null)
return mContext.getString(
R.string.monitoring_description_named_management, organizationName);
return mContext.getString(R.string.monitoring_description_management);
}
protected CharSequence getCaCertsMessage(boolean isDeviceManaged, boolean hasCACerts,
boolean hasCACertsInWorkProfile) {
if (!(hasCACerts || hasCACertsInWorkProfile)) return null;
if (isDeviceManaged) {
return mContext.getString(R.string.monitoring_description_management_ca_certificate);
}
if (hasCACertsInWorkProfile) {
return mContext.getString(
R.string.monitoring_description_managed_profile_ca_certificate);
}
return mContext.getString(R.string.monitoring_description_ca_certificate);
}
protected CharSequence getNetworkLoggingMessage(boolean isNetworkLoggingEnabled) {
if (!isNetworkLoggingEnabled) return null;
return mContext.getString(R.string.monitoring_description_management_network_logging);
}
protected CharSequence getVpnMessage(boolean isDeviceManaged, boolean hasWorkProfile,
String vpnName, String vpnNameWorkProfile) {
if (vpnName == null && vpnNameWorkProfile == null) return null;
final SpannableStringBuilder message = new SpannableStringBuilder();
if (isDeviceManaged) {
if (vpnName != null && vpnNameWorkProfile != null) {
message.append(mContext.getString(R.string.monitoring_description_two_named_vpns,
vpnName, vpnNameWorkProfile));
} else {
message.append(mContext.getString(R.string.monitoring_description_named_vpn,
vpnName != null ? vpnName : vpnNameWorkProfile));
}
} else {
if (vpnName != null && vpnNameWorkProfile != null) {
message.append(mContext.getString(R.string.monitoring_description_two_named_vpns,
vpnName, vpnNameWorkProfile));
} else if (vpnNameWorkProfile != null) {
message.append(mContext.getString(
R.string.monitoring_description_managed_profile_named_vpn,
vpnNameWorkProfile));
} else if (hasWorkProfile) {
message.append(mContext.getString(
R.string.monitoring_description_personal_profile_named_vpn, vpnName));
} else {
message.append(mContext.getString(R.string.monitoring_description_named_vpn,
vpnName));
}
}
message.append(mContext.getString(R.string.monitoring_description_vpn_settings_separator));
message.append(mContext.getString(R.string.monitoring_description_vpn_settings),
new VpnSpan(), 0);
return message;
}
private int getTitle(String deviceOwner) {
@@ -397,20 +433,6 @@ public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClic
}
}
protected class EnterprisePrivacySpan extends ClickableSpan {
@Override
public void onClick(View widget) {
final Intent intent = new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS);
mDialog.dismiss();
mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
}
@Override
public boolean equals(Object object) {
return object instanceof EnterprisePrivacySpan;
}
}
protected class VpnSpan extends ClickableSpan {
@Override
public void onClick(View widget) {
@@ -418,5 +440,16 @@ public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClic
mDialog.dismiss();
mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
}
// for testing, to compare two CharSequences containing VpnSpans
@Override
public boolean equals(Object object) {
return object instanceof VpnSpan;
}
@Override
public int hashCode() {
return 314159257; // prime
}
}
}

View File

@@ -312,62 +312,72 @@ public class QSSecurityFooterTest extends SysuiTestCase {
}
@Test
public void testGetMessageWithNoOrganizationAndNoVPN() {
assertEquals(getExpectedMessage(false /* hasDeviceOwnerOrganization */, false /* hasVPN */),
mFooter.getMessage(DEVICE_OWNER_PACKAGE,
null /* profileOwnerPackage */,
null /* primaryVpn */,
null /* profileVpn */,
null /* deviceOwnerOrganization */,
false /* hasProfileOwner */));
public void testGetManagementMessage() {
assertEquals(null, mFooter.getManagementMessage(false, MANAGING_ORGANIZATION));
assertEquals(mContext.getString(R.string.monitoring_description_named_management,
MANAGING_ORGANIZATION),
mFooter.getManagementMessage(true, MANAGING_ORGANIZATION));
assertEquals(mContext.getString(R.string.monitoring_description_management),
mFooter.getManagementMessage(true, null));
}
@Test
public void testGetMessageWithNoOrganizationAndVPN() {
assertEquals(getExpectedMessage(false /* hasDeviceOwnerOrganization */, true /* hasVPN */),
mFooter.getMessage(DEVICE_OWNER_PACKAGE,
null /* profileOwnerPackage */,
VPN_PACKAGE,
null /* profileVpn */,
null /* deviceOwnerOrganization */,
false /* hasProfileOwner */));
public void testGetCaCertsMessage() {
assertEquals(null, mFooter.getCaCertsMessage(true, false, false));
assertEquals(null, mFooter.getCaCertsMessage(false, false, false));
assertEquals(mContext.getString(R.string.monitoring_description_management_ca_certificate),
mFooter.getCaCertsMessage(true, true, true));
assertEquals(mContext.getString(R.string.monitoring_description_management_ca_certificate),
mFooter.getCaCertsMessage(true, false, true));
assertEquals(mContext.getString(
R.string.monitoring_description_managed_profile_ca_certificate),
mFooter.getCaCertsMessage(false, false, true));
assertEquals(mContext.getString(
R.string.monitoring_description_ca_certificate),
mFooter.getCaCertsMessage(false, true, false));
}
@Test
public void testGetMessageWithOrganizationAndNoVPN() {
assertEquals(getExpectedMessage(true /* hasDeviceOwnerOrganization */, false /* hasVPN */),
mFooter.getMessage(DEVICE_OWNER_PACKAGE,
null /* profileOwnerPackage */,
null /* primaryVpn */,
null /* profileVpn */,
MANAGING_ORGANIZATION,
false /* hasProfileOwner */));
public void testGetNetworkLoggingMessage() {
assertEquals(null, mFooter.getNetworkLoggingMessage(false));
assertEquals(mContext.getString(R.string.monitoring_description_management_network_logging),
mFooter.getNetworkLoggingMessage(true));
}
@Test
public void testGetMessageWithOrganizationAndVPN() {
assertEquals(getExpectedMessage(true /* hasDeviceOwnerOrganization */, true /* hasVPN */),
mFooter.getMessage(DEVICE_OWNER_PACKAGE,
null /* profileOwnerPackage */,
VPN_PACKAGE,
null /* profileVpn */,
MANAGING_ORGANIZATION,
false /* hasProfileOwner */));
public void testGetVpnMessage() {
assertEquals(null, mFooter.getVpnMessage(true, true, null, null));
assertEquals(addLink(mContext.getString(R.string.monitoring_description_two_named_vpns,
VPN_PACKAGE, VPN_PACKAGE_2)),
mFooter.getVpnMessage(true, true, VPN_PACKAGE, VPN_PACKAGE_2));
assertEquals(addLink(mContext.getString(R.string.monitoring_description_two_named_vpns,
VPN_PACKAGE, VPN_PACKAGE_2)),
mFooter.getVpnMessage(false, true, VPN_PACKAGE, VPN_PACKAGE_2));
assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn,
VPN_PACKAGE)),
mFooter.getVpnMessage(true, false, VPN_PACKAGE, null));
assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn,
VPN_PACKAGE)),
mFooter.getVpnMessage(false, false, VPN_PACKAGE, null));
assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn,
VPN_PACKAGE_2)),
mFooter.getVpnMessage(true, true, null, VPN_PACKAGE_2));
assertEquals(addLink(mContext.getString(
R.string.monitoring_description_managed_profile_named_vpn,
VPN_PACKAGE_2)),
mFooter.getVpnMessage(false, true, null, VPN_PACKAGE_2));
assertEquals(addLink(mContext.getString(
R.string.monitoring_description_personal_profile_named_vpn,
VPN_PACKAGE)),
mFooter.getVpnMessage(false, true, VPN_PACKAGE, null));
}
private CharSequence getExpectedMessage(boolean hasDeviceOwnerOrganization, boolean hasVPN) {
private CharSequence addLink(CharSequence description) {
final SpannableStringBuilder message = new SpannableStringBuilder();
message.append(hasDeviceOwnerOrganization ?
mContext.getString(R.string.monitoring_description_do_header_with_name,
MANAGING_ORGANIZATION, DEVICE_OWNER_PACKAGE) :
mContext.getString(R.string.monitoring_description_do_header_generic,
DEVICE_OWNER_PACKAGE));
message.append("\n\n");
message.append(mContext.getString(R.string.monitoring_description_do_body));
message.append(mContext.getString(
R.string.monitoring_description_do_learn_more_separator));
message.append(mContext.getString(R.string.monitoring_description_do_learn_more),
mFooter.new EnterprisePrivacySpan(), 0);
message.append(description);
message.append(mContext.getString(R.string.monitoring_description_vpn_settings_separator));
message.append(mContext.getString(R.string.monitoring_description_vpn_settings),
mFooter.new VpnSpan(), 0);
return message;
}
}