|
|
@@ -5,6 +5,13 @@ import android.annotation.SuppressLint
|
|
|
import android.content.Context
|
|
|
import android.content.DialogInterface
|
|
|
import android.content.pm.PackageManager
|
|
|
+import android.net.ConnectivityManager
|
|
|
+import android.net.Network
|
|
|
+import android.net.NetworkCapabilities
|
|
|
+import android.net.NetworkRequest
|
|
|
+import android.net.wifi.WifiInfo
|
|
|
+import android.net.wifi.WifiManager
|
|
|
+import android.net.wifi.WifiManager.ScanResultsCallback
|
|
|
import android.os.Bundle
|
|
|
import android.telephony.SmsManager
|
|
|
import android.telephony.SubscriptionManager
|
|
|
@@ -19,20 +26,21 @@ import androidx.activity.result.ActivityResultLauncher
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
|
import androidx.core.app.ActivityCompat
|
|
|
import androidx.core.content.ContextCompat
|
|
|
+import androidx.core.content.ContextCompat.getSystemService
|
|
|
import androidx.core.widget.addTextChangedListener
|
|
|
import androidx.fragment.app.Fragment
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
import com.example.modifier.R
|
|
|
-import com.example.modifier.baseTag
|
|
|
import com.example.modifier.Utils
|
|
|
+import com.example.modifier.baseTag
|
|
|
import com.example.modifier.constants.servers
|
|
|
-import com.example.modifier.repo.AppPrefsRepo
|
|
|
import com.example.modifier.databinding.FragmentSettingsBinding
|
|
|
-import com.example.modifier.http.ktorClient
|
|
|
import com.example.modifier.http.api.RcsNumberApi
|
|
|
+import com.example.modifier.http.ktorClient
|
|
|
import com.example.modifier.http.request.RcsNumberRequest
|
|
|
import com.example.modifier.http.response.RcsNumberResponse
|
|
|
import com.example.modifier.model.SpoofedSimInfo
|
|
|
+import com.example.modifier.repo.AppPrefsRepo
|
|
|
import com.example.modifier.repo.SpoofedSimInfoRepo
|
|
|
import com.example.modifier.utils.genICCID
|
|
|
import com.example.modifier.utils.genIMEI
|
|
|
@@ -47,7 +55,6 @@ import io.ktor.http.contentType
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
import kotlinx.coroutines.delay
|
|
|
-import kotlinx.coroutines.flow.StateFlow
|
|
|
import kotlinx.coroutines.launch
|
|
|
import kotlinx.coroutines.withContext
|
|
|
import org.apache.commons.lang3.RandomStringUtils
|
|
|
@@ -56,6 +63,7 @@ import org.apache.commons.validator.routines.UrlValidator
|
|
|
import java.util.Objects
|
|
|
import java.util.Optional
|
|
|
|
|
|
+
|
|
|
@SuppressLint("SetTextI18n", "MissingPermission", "HardwareIds", "NewApi")
|
|
|
class SettingsFragment : Fragment() {
|
|
|
companion object {
|
|
|
@@ -63,7 +71,7 @@ class SettingsFragment : Fragment() {
|
|
|
}
|
|
|
|
|
|
private lateinit var binding: FragmentSettingsBinding
|
|
|
- private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
|
|
|
+ private lateinit var requestPermissionLauncher: ActivityResultLauncher<Array<String>>
|
|
|
private val appPrefsRepo = AppPrefsRepo.instance
|
|
|
private val spoofedSimInfoRepo = SpoofedSimInfoRepo.instance
|
|
|
|
|
|
@@ -75,15 +83,10 @@ class SettingsFragment : Fragment() {
|
|
|
super.onCreate(savedInstanceState)
|
|
|
requestPermissionLauncher =
|
|
|
registerForActivityResult(
|
|
|
- ActivityResultContracts.RequestPermission()
|
|
|
- ) { isGranted: Boolean ->
|
|
|
- if (isGranted) {
|
|
|
- } else {
|
|
|
- // Explain to the user that the feature is unavailable because the
|
|
|
- // feature requires a permission that the user has denied. At the
|
|
|
- // same time, respect the user's decision. Don't link to system
|
|
|
- // settings in an effort to convince the user to change their
|
|
|
- // decision.
|
|
|
+ ActivityResultContracts.RequestMultiplePermissions()
|
|
|
+ ) { permissions ->
|
|
|
+ permissions.entries.forEach {
|
|
|
+ Log.i(TAG, "${it.key} = ${it.value}")
|
|
|
}
|
|
|
}
|
|
|
Log.i(TAG, "SettingsFragment.onCreate")
|
|
|
@@ -235,12 +238,40 @@ class SettingsFragment : Fragment() {
|
|
|
}
|
|
|
|
|
|
binding.btnCheck.setOnClickListener {
|
|
|
-
|
|
|
when {
|
|
|
ContextCompat.checkSelfPermission(
|
|
|
requireContext(),
|
|
|
- Manifest.permission.READ_PHONE_STATE
|
|
|
- ) == PackageManager.PERMISSION_GRANTED -> {
|
|
|
+ Manifest.permission.ACCESS_WIFI_STATE,
|
|
|
+ ) == PackageManager.PERMISSION_GRANTED &&
|
|
|
+ ContextCompat.checkSelfPermission(
|
|
|
+ requireContext(),
|
|
|
+ Manifest.permission.READ_PHONE_STATE,
|
|
|
+ ) == PackageManager.PERMISSION_GRANTED &&
|
|
|
+ ContextCompat.checkSelfPermission(
|
|
|
+ requireContext(),
|
|
|
+ Manifest.permission.ACCESS_FINE_LOCATION,
|
|
|
+ ) == PackageManager.PERMISSION_GRANTED -> {
|
|
|
+
|
|
|
+ val manager =
|
|
|
+ getSystemService(
|
|
|
+ requireContext(),
|
|
|
+ WifiManager::class.java
|
|
|
+ ) as WifiManager
|
|
|
+ manager.startScan()
|
|
|
+ manager.registerScanResultsCallback(
|
|
|
+ {
|
|
|
+ Log.i(TAG, "onResults")
|
|
|
+ },
|
|
|
+ object : ScanResultsCallback() {
|
|
|
+ override fun onScanResultsAvailable() {
|
|
|
+ manager.scanResults.forEach {
|
|
|
+ Log.i(TAG, "scanResults: ${it.SSID}")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
val telephonyManager =
|
|
|
requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
|
|
|
|
|
|
@@ -299,7 +330,11 @@ class SettingsFragment : Fragment() {
|
|
|
// You can directly ask for the permission.
|
|
|
// The registered ActivityResultCallback gets the result of this request.
|
|
|
requestPermissionLauncher.launch(
|
|
|
- Manifest.permission.READ_PHONE_STATE
|
|
|
+ arrayOf(
|
|
|
+ Manifest.permission.READ_PHONE_STATE,
|
|
|
+ Manifest.permission.ACCESS_FINE_LOCATION,
|
|
|
+ Manifest.permission.CHANGE_WIFI_STATE
|
|
|
+ )
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
@@ -353,7 +388,7 @@ class SettingsFragment : Fragment() {
|
|
|
lifecycleScope.launch {
|
|
|
withContext(Dispatchers.IO) {
|
|
|
spoofedSimInfoRepo.updateSpoofedSimInfo(
|
|
|
- SpoofedSimInfo(
|
|
|
+ spoofedSimInfo = SpoofedSimInfo(
|
|
|
0,
|
|
|
binding.etNumber.text.toString(),
|
|
|
binding.etMcc.text.toString(),
|
|
|
@@ -366,7 +401,8 @@ class SettingsFragment : Fragment() {
|
|
|
false,
|
|
|
binding.etCarrierId.text.toString(),
|
|
|
binding.etCarrierName.text.toString()
|
|
|
- )
|
|
|
+ ),
|
|
|
+ suspend = true
|
|
|
)
|
|
|
}
|
|
|
binding.btnSave.setIconResource(R.drawable.ic_done)
|