• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.devicelockcontroller.activities;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.text.Html;
22 import android.text.Spannable;
23 import android.text.SpannableString;
24 import android.text.method.LinkMovementMethod;
25 import android.text.style.ClickableSpan;
26 import android.text.style.URLSpan;
27 import android.view.View;
28 import android.view.ViewGroup;
29 import android.widget.TextView;
30 
31 import androidx.annotation.NonNull;
32 import androidx.recyclerview.widget.RecyclerView;
33 
34 import com.android.devicelockcontroller.R;
35 
36 /**
37  * A {@link androidx.recyclerview.widget.RecyclerView.ViewHolder} class which describes the item
38  * views used in the {@link RecyclerView}
39  */
40 final class DevicePolicyGroupViewHolder extends RecyclerView.ViewHolder {
41 
42     private static final String TAG = "DevicePolicyGroupViewHolder";
43 
44     private final TextView mGroupTitleTextView;
45     private final ViewGroup mDevicePolicyItems;
46 
DevicePolicyGroupViewHolder(View iteView)47     DevicePolicyGroupViewHolder(View iteView) {
48         super(iteView);
49         mGroupTitleTextView = iteView.findViewById(R.id.text_view_device_policy_group_title);
50         mDevicePolicyItems = iteView.findViewById(R.id.device_policy_items);
51     }
52 
bind(DevicePolicyGroup devicePolicyGroup, int maxDevicePolicy, String providerName)53     void bind(DevicePolicyGroup devicePolicyGroup, int maxDevicePolicy, String providerName) {
54         Context context = itemView.getContext();
55         mGroupTitleTextView.setText(
56                 context.getString(devicePolicyGroup.getGroupTitleTextId(), providerName));
57         for (int i = 0; i < devicePolicyGroup.getDevicePolicyList().size(); ++i) {
58             TextView devicePolicyItemView = (TextView) mDevicePolicyItems.getChildAt(i);
59             DevicePolicy devicePolicy = devicePolicyGroup.getDevicePolicyList().get(i);
60             String policyText = context.getString(devicePolicy.getTextId(), providerName);
61             SpannableString text =
62                     new SpannableString(Html.fromHtml(policyText, Html.FROM_HTML_MODE_COMPACT));
63             if (handleUrlSpan(text)) {
64                 devicePolicyItemView.setMovementMethod(LinkMovementMethod.getInstance());
65             }
66             devicePolicyItemView.setText(text);
67             devicePolicyItemView.setCompoundDrawablesRelativeWithIntrinsicBounds(
68                     devicePolicy.getDrawableId(),
69                     /* top=*/ 0,
70                     /* end=*/ 0,
71                     /* bottom=*/ 0);
72             devicePolicyItemView.setVisibility(View.VISIBLE);
73         }
74         // not every DevicePolicyGroup has the maximum number of DevicePolicy, hide the extra views
75         for (int i = devicePolicyGroup.getDevicePolicyList().size(); i < maxDevicePolicy; ++i) {
76             TextView devicePolicyItemView = (TextView) mDevicePolicyItems.getChildAt(i);
77             devicePolicyItemView.setVisibility(View.GONE);
78         }
79     }
80 
handleUrlSpan(SpannableString text)81     private boolean handleUrlSpan(SpannableString text) {
82         boolean hasUrl = false;
83         URLSpan[] spans = text.getSpans(0, text.length(), URLSpan.class);
84         for (URLSpan span : spans) {
85             int start = text.getSpanStart(span);
86             int end = text.getSpanEnd(span);
87             ClickableSpan clickableSpan = new CustomClickableSpan(span.getURL());
88             text.removeSpan(span);
89             text.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
90             hasUrl = true;
91         }
92         return hasUrl;
93     }
94 
95     /**
96      * A custom clickable span to open URL as a web intent.
97      */
98     private static final class CustomClickableSpan extends ClickableSpan {
99         final String mUrl;
100 
CustomClickableSpan(String url)101         CustomClickableSpan(String url) {
102             mUrl = url;
103         }
104 
105         @Override
onClick(@onNull View view)106         public void onClick(@NonNull View view) {
107             Context context = view.getContext();
108             Intent webIntent = new Intent(context, HelpActivity.class);
109             webIntent.putExtra(HelpActivity.EXTRA_URL_PARAM, mUrl);
110             context.startActivity(webIntent);
111         }
112     }
113 }
114