Add a learn more text in footerprefernce

Add this new learn more text view so that
It would keep the implementation and styling centralized
in our widget library, ensuring consistency.

Test: Check the learn more link works well.
Fix: 188009297
Change-Id: If88cc4c4b03047c53e1fa8f7025583bdee592013
diff --git a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
index 3b50acc..e586dbb 100644
--- a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
@@ -43,13 +43,27 @@
             android:layout_height="wrap_content"/>
     </LinearLayout>
 
-    <com.android.settingslib.widget.LinkTextView
-        android:id="@android:id/title"
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingBottom="16dp"
-        android:paddingTop="16dp"
-        android:textColor="?android:attr/textColorSecondary"
-        android:ellipsize="marquee" />
+        android:orientation="vertical">
+        <com.android.settingslib.widget.LinkTextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="16dp"
+            android:paddingBottom="8dp"
+            android:textColor="?android:attr/textColorSecondary"
+            android:ellipsize="marquee" />
+
+        <com.android.settingslib.widget.LinkTextView
+            android:id="@+id/settingslib_learn_more"
+            android:text="@string/settingslib_learn_more_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:clickable="true"
+            android:visibility="gone"
+            style="@style/TextAppearance.Footer.Title.SettingsLib"/>
+    </LinearLayout>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
index 87e8358..990860a 100644
--- a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
@@ -42,13 +42,27 @@
             android:layout_height="wrap_content"/>
     </LinearLayout>
 
-    <com.android.settingslib.widget.LinkTextView
-        android:id="@android:id/title"
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingBottom="16dp"
-        android:paddingTop="16dp"
-        android:textColor="?android:attr/textColorSecondary"
-        android:ellipsize="marquee" />
+        android:orientation="vertical">
+        <com.android.settingslib.widget.LinkTextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="16dp"
+            android:paddingBottom="8dp"
+            android:textColor="?android:attr/textColorSecondary"
+            android:ellipsize="marquee" />
+
+        <com.android.settingslib.widget.LinkTextView
+            android:id="@+id/settingslib_learn_more"
+            android:text="@string/settingslib_learn_more_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:clickable="true"
+            android:visibility="gone"
+            style="@style/TextAppearance.Footer.Title.SettingsLib"/>
+    </LinearLayout>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/values/strings.xml b/packages/SettingsLib/FooterPreference/res/values/strings.xml
new file mode 100644
index 0000000..9d5df12
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- learn more text of footer preference [CHAR LIMIT=NONE] -->
+    <string name="settingslib_learn_more_text">Learn more</string>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/values/styles.xml b/packages/SettingsLib/FooterPreference/res/values/styles.xml
new file mode 100644
index 0000000..08dd359
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+    <style name="TextAppearance.Footer.Title.SettingsLib"
+           parent="@android:style/TextAppearance.DeviceDefault.Medium">
+        <item name="android:textSize">14sp</item>
+        <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
+        <item name="android:textColor">?android:attr/colorAccent</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java b/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
index feb3b01..33bf590 100644
--- a/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
+++ b/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
@@ -17,13 +17,17 @@
 package com.android.settingslib.widget;
 
 import android.content.Context;
+import android.text.SpannableString;
 import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
+import android.text.style.UnderlineSpan;
 import android.util.AttributeSet;
+import android.view.View;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
@@ -35,7 +39,10 @@
 
     public static final String KEY_FOOTER = "footer_preference";
     static final int ORDER_FOOTER = Integer.MAX_VALUE - 1;
+    @VisibleForTesting
+    View.OnClickListener mLearnMoreListener;
     private CharSequence mContentDescription;
+    private CharSequence mLearnMoreContentDescription;
 
     public FooterPreference(Context context, AttributeSet attrs) {
         super(context, attrs, R.attr.footerPreferenceStyle);
@@ -53,7 +60,23 @@
         title.setMovementMethod(new LinkMovementMethod());
         title.setClickable(false);
         title.setLongClickable(false);
-        title.setContentDescription(mContentDescription);
+        if (!TextUtils.isEmpty(mContentDescription)) {
+            title.setContentDescription(mContentDescription);
+        }
+
+        TextView learnMore = holder.itemView.findViewById(R.id.settingslib_learn_more);
+        if (learnMore != null && mLearnMoreListener != null) {
+            learnMore.setVisibility(View.VISIBLE);
+            learnMore.setOnClickListener(mLearnMoreListener);
+            SpannableString learnMoreText = new SpannableString(learnMore.getText());
+            learnMoreText.setSpan(new UnderlineSpan(), 0, learnMoreText.length(), 0);
+            learnMore.setText(learnMoreText);
+            if (!TextUtils.isEmpty(mLearnMoreContentDescription)) {
+                learnMore.setContentDescription(mLearnMoreContentDescription);
+            }
+        } else {
+            learnMore.setVisibility(View.GONE);
+        }
     }
 
     @Override
@@ -87,10 +110,42 @@
     /**
      * Return the content description of footer preference.
      */
-    public CharSequence getContentDescription() {
+    @VisibleForTesting
+    CharSequence getContentDescription() {
         return mContentDescription;
     }
 
+    /**
+     * To set content description of the learn more text. This can use for talkback
+     * environment if developer wants to have a customization content.
+     *
+     * @param learnMoreContentDescription The resource id of the content description.
+     */
+    public void setLearnMoreContentDescription(CharSequence learnMoreContentDescription) {
+        if (!TextUtils.equals(mContentDescription, learnMoreContentDescription)) {
+            mLearnMoreContentDescription = learnMoreContentDescription;
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Return the content description of learn more link.
+     */
+    @VisibleForTesting
+    CharSequence getLearnMoreContentDescription() {
+        return mLearnMoreContentDescription;
+    }
+
+    /**
+     * Assign an action for the learn more link.
+     */
+    public void setLearnMoreAction(View.OnClickListener listener) {
+        if (mLearnMoreListener != listener) {
+            mLearnMoreListener = listener;
+            notifyChanged();
+        }
+    }
+
     private void init() {
         setLayoutResource(R.layout.preference_footer);
         if (getIcon() == null) {
@@ -110,6 +165,7 @@
         private String mKey;
         private CharSequence mTitle;
         private CharSequence mContentDescription;
+        private CharSequence mLearnMoreContentDescription;
 
         public Builder(@NonNull Context context) {
             mContext = context;
@@ -168,6 +224,30 @@
         }
 
         /**
+         * To set content description of the learn more text. This can use for talkback
+         * environment if developer wants to have a customization content.
+         *
+         * @param learnMoreContentDescription The resource id of the content description.
+         */
+        public Builder setLearnMoreContentDescription(CharSequence learnMoreContentDescription) {
+            mLearnMoreContentDescription = learnMoreContentDescription;
+            return this;
+        }
+
+        /**
+         * To set content description of the {@link FooterPreference}. This can use for talkback
+         * environment if developer wants to have a customization content.
+         *
+         * @param learnMoreContentDescriptionResId The resource id of the content description.
+         */
+        public Builder setLearnMoreContentDescription(
+                @StringRes int learnMoreContentDescriptionResId) {
+            mLearnMoreContentDescription = mContext.getText(learnMoreContentDescriptionResId);
+            return this;
+        }
+
+
+        /**
          * To generate the {@link FooterPreference}.
          */
         public FooterPreference build() {
@@ -184,6 +264,10 @@
             if (!TextUtils.isEmpty(mContentDescription)) {
                 footerPreference.setContentDescription(mContentDescription);
             }
+
+            if (!TextUtils.isEmpty(mLearnMoreContentDescription)) {
+                footerPreference.setLearnMoreContentDescription(mLearnMoreContentDescription);
+            }
             return footerPreference;
         }
     }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
index 4503669..10ac829 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
@@ -69,4 +69,19 @@
 
         assertThat(mFooterPreference.getContentDescription()).isEqualTo("test");
     }
+
+    @Test
+    public void setLearnMoreContentDescription_contentSet_shouldGetSameContentDescription() {
+        mFooterPreference.setLearnMoreContentDescription("test");
+
+        assertThat(mFooterPreference.getLearnMoreContentDescription()).isEqualTo("test");
+    }
+
+    @Test
+    public void setLearnMoreAction_actionSet_shouldGetAction() {
+        mFooterPreference.setLearnMoreAction(v -> {
+        });
+
+        assertThat(mFooterPreference.mLearnMoreListener).isNotNull();
+    }
 }