ソースを参照

implement DSDS switch

Peter Cai 3 年 前
コミット
8df559700f

+ 1 - 0
.idea/misc.xml

@@ -9,6 +9,7 @@
         <entry key="app/src/main/res/layout/fragment_euicc.xml" value="0.19375" />
         <entry key="app/src/main/res/layout/fragment_profile_download.xml" value="0.19375" />
         <entry key="app/src/main/res/layout/fragment_profile_rename.xml" value="0.19375" />
+        <entry key="app/src/main/res/menu/activity_main.xml" value="0.19375" />
         <entry key="app/src/main/res/menu/activity_main_slot_spinner.xml" value="0.19375" />
         <entry key="app/src/main/res/menu/fragment_profile_download.xml" value="0.19375" />
         <entry key="app/src/main/res/menu/fragment_profile_rename.xml" value="0.19375" />

+ 26 - 1
app/src/main/java/im/angry/openeuicc/ui/MainActivity.kt

@@ -1,18 +1,23 @@
 package im.angry.openeuicc.ui
 
 import android.os.Bundle
+import android.telephony.TelephonyManager
 import android.util.Log
 import android.view.Menu
+import android.view.MenuItem
 import android.view.View
 import android.widget.AdapterView
 import android.widget.ArrayAdapter
 import android.widget.Spinner
+import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.lifecycleScope
 import im.angry.openeuicc.OpenEUICCApplication
 import im.angry.openeuicc.R
 import im.angry.openeuicc.core.EuiccChannelRepository
 import im.angry.openeuicc.databinding.ActivityMainBinding
+import im.angry.openeuicc.util.dsdsEnabled
+import im.angry.openeuicc.util.supportsDSDS
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
@@ -31,11 +36,15 @@ class MainActivity : AppCompatActivity() {
 
     private lateinit var binding: ActivityMainBinding
 
+    private lateinit var tm: TelephonyManager
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         binding = ActivityMainBinding.inflate(layoutInflater)
         setContentView(binding.root)
 
+        tm = getSystemService(TelephonyManager::class.java)
+
         repo = (application as OpenEUICCApplication).euiccChannelRepo
 
         spinnerAdapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item)
@@ -46,7 +55,7 @@ class MainActivity : AppCompatActivity() {
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
-        menuInflater.inflate(R.menu.activity_main_slot_spinner, menu)
+        menuInflater.inflate(R.menu.activity_main, menu)
 
         spinner = menu.findItem(R.id.spinner).actionView as Spinner
         spinner.adapter = spinnerAdapter
@@ -65,9 +74,25 @@ class MainActivity : AppCompatActivity() {
 
         }
 
+        if (tm.supportsDSDS) {
+            val dsds = menu.findItem(R.id.dsds)
+            dsds.isVisible = true
+            dsds.isChecked = tm.dsdsEnabled
+        }
+
         return true
     }
 
+    override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
+        R.id.dsds -> {
+            tm.dsdsEnabled = !item.isChecked
+            Toast.makeText(this, R.string.toast_dsds_switched, Toast.LENGTH_LONG).show()
+            finish()
+            true
+        }
+        else -> false
+    }
+
     private suspend fun init() {
         withContext(Dispatchers.IO) {
             repo.load()

+ 12 - 0
app/src/main/java/im/angry/openeuicc/util/TelephonyUtils.kt

@@ -0,0 +1,12 @@
+package im.angry.openeuicc.util
+
+import android.telephony.TelephonyManager
+
+val TelephonyManager.supportsDSDS: Boolean
+    get() = supportedModemCount == 2
+
+var TelephonyManager.dsdsEnabled: Boolean
+    get() = activeModemCount >= 2
+    set(value) {
+        switchMultiSimConfig(if (value) { 2 } else {1})
+    }

+ 7 - 0
app/src/main/res/menu/activity_main_slot_spinner.xml → app/src/main/res/menu/activity_main.xml

@@ -7,4 +7,11 @@
         app:actionViewClass="android.widget.Spinner"
         android:background="?android:attr/colorPrimary"
         app:showAsAction="always" />
+
+    <item
+        android:id="@+id/dsds"
+        android:title="@string/dsds"
+        android:checkable="true"
+        android:visible="false"
+        app:showAsAction="never" />
 </menu>

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -3,6 +3,8 @@
 
     <string name="no_euicc">No eUICC found on this device.</string>
 
+    <string name="dsds">Dual SIM</string>
+
     <string name="enabled">Enabled</string>
     <string name="disabled">Disabled</string>
     <string name="provider">Provider:</string>
@@ -16,6 +18,7 @@
     <string name="toast_profile_enabled">eSIM profile switched. Please wait for a while when the card is restarting.</string>
     <string name="toast_profile_enable_failed">Cannot switch to new eSIM profile.</string>
     <string name="toast_profile_name_too_long">Nickname cannot be longer than 64 characters</string>
+    <string name="toast_dsds_switched">DSDS state switched. Please wait until the modem restarts.</string>
 
     <string name="profile_download">New eSIM</string>
     <string name="profile_download_server">Server (RSP / SM-DP+)</string>