Merge "Expose signals being sent to support in a fragment to the user"
This commit is contained in:
committed by
Android (Google) Code Review
commit
627c811c11
@@ -7779,6 +7779,9 @@
|
||||
<!-- Spinner dropdown text, when selected will try to add account [CHAR LIMIT=60] -->
|
||||
<string name="support_account_picker_add_account">Add account</string>
|
||||
|
||||
<!-- Title for the dialog containing system information shown [CHAR LIMIT=30] -->
|
||||
<string name="support_system_information_title">System information</string>
|
||||
|
||||
<!-- [CHAR LIMIT=60] Title of work profile setting page -->
|
||||
<string name="managed_profile_settings_title">Work profile settings</string>
|
||||
<!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
|
||||
|
@@ -21,9 +21,11 @@ import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.StringRes;
|
||||
import android.app.Activity;
|
||||
import android.app.FragmentManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import android.os.Bundle;
|
||||
import com.android.settings.support.SupportPhone;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -142,8 +144,13 @@ public interface SupportFeatureProvider {
|
||||
Intent getTipsAndTricksIntent(Context context);
|
||||
|
||||
/**
|
||||
* Returns the string for the disclaimer in the Support dialog
|
||||
* Returns the string for the disclaimer in the Support dialog.
|
||||
*/
|
||||
@StringRes
|
||||
int getDisclaimerStringResId();
|
||||
|
||||
/**
|
||||
* launches the fragment that displays the system information being sent to support agents.
|
||||
*/
|
||||
void launchSystemInfoFragment(Bundle args, FragmentManager manager);
|
||||
}
|
||||
|
@@ -23,14 +23,18 @@ import android.app.Dialog;
|
||||
import android.app.DialogFragment;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.text.Annotation;
|
||||
import android.text.Spannable;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextPaint;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.URLSpan;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
@@ -44,8 +48,8 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra
|
||||
implements DialogInterface.OnClickListener {
|
||||
|
||||
public static final String TAG = "SupportDisclaimerDialog";
|
||||
private static final String EXTRA_TYPE = "extra_type";
|
||||
private static final String EXTRA_ACCOUNT = "extra_account";
|
||||
public static final String EXTRA_TYPE = "extra_type";
|
||||
public static final String EXTRA_ACCOUNT = "extra_account";
|
||||
|
||||
public static SupportDisclaimerDialogFragment newInstance(Account account,
|
||||
@SupportFeatureProvider.SupportType int type) {
|
||||
@@ -69,8 +73,13 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra
|
||||
final Activity activity = getActivity();
|
||||
final SupportFeatureProvider supportFeatureProvider =
|
||||
FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
|
||||
|
||||
// sets the two links that go to privacy policy and terms of service
|
||||
disclaimer.setText(supportFeatureProvider.getDisclaimerStringResId());
|
||||
stripUnderlines((Spannable) disclaimer.getText());
|
||||
Spannable viewText = (Spannable) disclaimer.getText();
|
||||
stripUnderlines(viewText);
|
||||
SystemInformationSpan.linkify(viewText, this);
|
||||
// sets the link that launches a dialog to expose the signals we are sending
|
||||
return builder
|
||||
.setView(content)
|
||||
.create();
|
||||
@@ -112,9 +121,11 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra
|
||||
for (URLSpan span : urls) {
|
||||
final int start = input.getSpanStart(span);
|
||||
final int end = input.getSpanEnd(span);
|
||||
input.removeSpan(span);
|
||||
input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
if (!TextUtils.isEmpty(span.getURL())) {
|
||||
input.removeSpan(span);
|
||||
input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,4 +149,69 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra
|
||||
ds.setUnderlineText(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A {@link URLSpan} that opens a dialog when clicked
|
||||
*/
|
||||
public static class SystemInformationSpan extends URLSpan {
|
||||
|
||||
private static final String ANNOTATION_URL = "url";
|
||||
private final DialogFragment mDialog;
|
||||
private SupportFeatureProvider mSupport;
|
||||
|
||||
public SystemInformationSpan(DialogFragment parent) {
|
||||
// sets the url to empty string so we can prevent the NoUnderlineUrlSpan from stripping
|
||||
// this one
|
||||
super("");
|
||||
mSupport = FeatureFactory.getFactory(parent.getContext())
|
||||
.getSupportFeatureProvider(parent.getContext());
|
||||
mDialog = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View widget) {
|
||||
Activity activity = mDialog.getActivity();
|
||||
if (mSupport != null && activity != null) {
|
||||
// launch the system info fragment
|
||||
mSupport.launchSystemInfoFragment(mDialog.getArguments(),
|
||||
activity.getFragmentManager());
|
||||
|
||||
// dismiss this fragment
|
||||
mDialog.dismiss();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDrawState(TextPaint ds) {
|
||||
super.updateDrawState(ds);
|
||||
// remove underline
|
||||
ds.setUnderlineText(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method takes a string and turns it into a url span that will launch a
|
||||
* SupportSystemInformationDialogFragment
|
||||
* @param msg The text to turn into a link
|
||||
* @param parent The dialog the text is in
|
||||
* @return A CharSequence containing the original text content as a url
|
||||
*/
|
||||
public static CharSequence linkify(Spannable msg, DialogFragment parent) {
|
||||
Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
|
||||
for (Annotation annotation : spans) {
|
||||
int start = msg.getSpanStart(annotation);
|
||||
int end = msg.getSpanEnd(annotation);
|
||||
if (ANNOTATION_URL.equals(annotation.getValue())) {
|
||||
SystemInformationSpan link = new SystemInformationSpan(parent);
|
||||
msg.removeSpan(annotation);
|
||||
msg.setSpan(link, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void setSupportProvider(SupportFeatureProvider prov) {
|
||||
mSupport = prov;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user