Use shared preference to store forwarding ports

key PREFERENCE_FORWARDING_PORTS for all available ports (StringSet)
key PREFERENCE_FORWARDING_PORT_IS_ENABLED_{port} for the enable/disable
of ports (Boolean)

Bug: 375873420
Test: Manually
Change-Id: I06b360d6d31cc34a6618fc418f7fdeef13694ccf
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingActivity.kt
index 7119225..a1509ad 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingActivity.kt
@@ -19,6 +19,7 @@
 import android.app.Notification
 import android.app.NotificationManager
 import android.app.PendingIntent
+import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
 import android.graphics.drawable.Icon
@@ -34,14 +35,29 @@
         super.onCreate(savedInstanceState)
         setContentView(R.layout.settings_port_forwarding)
 
-        val settingsPortForwardingItems = arrayOf(
-            SettingsPortForwardingItem(8080, true),
-            SettingsPortForwardingItem(443, false),
-            SettingsPortForwardingItem(80, false)
+        val settingsPortForwardingItems = ArrayList<SettingsPortForwardingItem>()
+
+        val sharedPref = this.getSharedPreferences(
+            getString(R.string.preference_file_key), Context.MODE_PRIVATE
         )
 
+        val ports =
+            sharedPref.getStringSet(
+                getString(R.string.preference_forwarding_ports),
+                HashSet<String>()
+            )
+
+        for (port in ports!!) {
+            val enabled =
+                sharedPref.getBoolean(
+                    getString(R.string.preference_forwarding_port_is_enabled) + port,
+                    false
+                )
+            settingsPortForwardingItems.add(SettingsPortForwardingItem(port.toInt(), enabled));
+        }
+
         val settingsPortForwardingAdapter =
-            SettingsPortForwardingAdapter(settingsPortForwardingItems)
+            SettingsPortForwardingAdapter(settingsPortForwardingItems, this)
 
         val recyclerView: RecyclerView = findViewById(R.id.settings_port_forwarding_recycler_view)
         recyclerView.layoutManager = LinearLayoutManager(this)
@@ -59,7 +75,12 @@
                 .setChannelId(TAG)
                 .setSmallIcon(R.drawable.ic_launcher_foreground)
                 .setContentTitle(resources.getString(R.string.settings_port_forwarding_notification_title))
-                .setContentText(resources.getString(R.string.settings_port_forwarding_notification_content, settingsPortForwardingItems[0].port))
+                .setContentText(
+                    resources.getString(
+                        R.string.settings_port_forwarding_notification_content,
+                        8080
+                    )
+                )
                 .addAction(
                     Notification.Action.Builder(
                         Icon.createWithResource(resources, R.drawable.ic_launcher_foreground),
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingAdapter.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingAdapter.kt
index 1fa38e3..904f7f6 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingAdapter.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsPortForwardingAdapter.kt
@@ -15,6 +15,8 @@
  */
 package com.android.virtualization.terminal
 
+import android.content.Context
+import android.content.SharedPreferences
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -22,7 +24,10 @@
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.materialswitch.MaterialSwitch
 
-class SettingsPortForwardingAdapter(private val dataSet: Array<SettingsPortForwardingItem>) :
+class SettingsPortForwardingAdapter(
+    private val dataSet: ArrayList<SettingsPortForwardingItem>,
+    private val context: Context
+) :
     RecyclerView.Adapter<SettingsPortForwardingAdapter.ViewHolder>() {
 
     class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@@ -40,6 +45,17 @@
     override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
         viewHolder.port.text = dataSet[position].port.toString()
         viewHolder.enabledSwitch.isChecked = dataSet[position].enabled
+        viewHolder.enabledSwitch.setOnCheckedChangeListener { _, isChecked ->
+            val sharedPref: SharedPreferences = context.getSharedPreferences(
+                context.getString(R.string.preference_file_key), Context.MODE_PRIVATE
+            )
+            val editor = sharedPref.edit()
+            editor.putBoolean(
+                context.getString(R.string.preference_forwarding_port_is_enabled) + viewHolder.port.text,
+                isChecked
+            )
+            editor.apply()
+        }
     }
 
     override fun getItemCount() = dataSet.size
diff --git a/android/TerminalApp/res/values/config.xml b/android/TerminalApp/res/values/config.xml
index 055abb7..9d2456c 100644
--- a/android/TerminalApp/res/values/config.xml
+++ b/android/TerminalApp/res/values/config.xml
@@ -18,4 +18,6 @@
     <string name="preference_file_key" translatable="false">com.android.virtualization.terminal.PREFERENCE_FILE_KEY</string>
     <string name="preference_disk_size_key" translatable="false">PREFERENCE_DISK_SIZE_KEY</string>
     <string name="preference_min_disk_size_key" translatable="false">PREFERENCE_MIN_DISK_SIZE_KEY</string>
+    <string name="preference_forwarding_ports" translatable="false">PREFERENCE_FORWARDING_PORTS</string>
+    <string name="preference_forwarding_port_is_enabled" translatable="false">PREFERENCE_FORWARDING_PORT_IS_ENABLED_</string>
 </resources>
\ No newline at end of file