Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion AndroidInfoLib/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>

</manifest>
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.udfsoft.androidinfo.lib

import android.Manifest
import android.content.Context
import androidx.annotation.RequiresPermission
import androidx.annotation.WorkerThread
import com.udfsoft.androidinfo.lib.entity.*

Expand All @@ -11,7 +13,14 @@ interface DeviceInformation {

fun getDesignInformation(): DesignInformation

fun getSIMCardInformation(): SIMCardInformation
@RequiresPermission(
allOf = [
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_SMS,
"android.permission.READ_PHONE_NUMBERS"
]
)
fun getSIMCardInformation(context: Context): SIMCardInformation

fun getNetworkInformation(): NetworkInformation

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.udfsoft.androidinfo.lib

import android.Manifest
import android.content.Context
import android.os.Build
import androidx.annotation.RequiresPermission
import androidx.annotation.WorkerThread
import com.udfsoft.androidinfo.lib.command.GetOSInformationCommand
import com.udfsoft.androidinfo.lib.command.GetRAMInformationCommand
import com.udfsoft.androidinfo.lib.command.cpu.GetCpuInformationCommand
import com.udfsoft.androidinfo.lib.command.sim.GetSIMCardInformationCommand
import com.udfsoft.androidinfo.lib.entity.*

@WorkerThread
Expand All @@ -19,8 +22,16 @@ object DeviceInformationFactory : DeviceInformation {
TODO("Not yet implemented")
}

override fun getSIMCardInformation(): SIMCardInformation {
TODO("Not yet implemented")
@RequiresPermission(
allOf = [
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_SMS,
"android.permission.READ_PHONE_NUMBERS"
]
)
override fun getSIMCardInformation(context: Context): SIMCardInformation {
val getSIMCardInformationCommand = GetSIMCardInformationCommand(context)
return getSIMCardInformationCommand(Unit)
}

override fun getNetworkInformation(): NetworkInformation {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.udfsoft.androidinfo.lib.command.sim

import android.Manifest
import android.content.Context
import android.os.Build
import android.telephony.TelephonyManager
import androidx.annotation.RequiresPermission
import com.udfsoft.androidinfo.lib.command.CommandInterface
import com.udfsoft.androidinfo.lib.entity.SIMCardInformation

class GetSIMCardInformationCommand(
private val context: Context
) : CommandInterface<Unit, SIMCardInformation> {

@RequiresPermission(
allOf = [Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_SMS, "android.permission.READ_PHONE_NUMBERS"]
)
override fun invoke(param: Unit): SIMCardInformation {
val telephonyService =
context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

val callState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
telephonyService.callStateForSubscription
} else {
telephonyService.callState
}

val isMultiSimSupported = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
telephonyService.isMultiSimSupported
} else {
1
}

val deviceSoftwareVersion: String? = telephonyService.deviceSoftwareVersion
val mobileNumber: String? = telephonyService.line1Number
val simOperatorName: String? = telephonyService.simOperatorName
val simState = telephonyService.simState
val simCountryIso = telephonyService.simCountryIso

return SIMCardInformation(
deviceSoftwareVersion,
mobileNumber,
simOperatorName,
callState,
simState,
simCountryIso,
isMultiSimSupported
)
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
package com.udfsoft.androidinfo.lib.entity

class SIMCardInformation
data class SIMCardInformation(
val deviceSoftwareVersion: String?,
val mobileNumber: String?,
val simOperatorName: String?,
val callState: Int,
val simState: Int,
val simCountryIso: String,
val isMultiSimSupported: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.udfsoft.androidinfo.lib.exception

class PermissionDeniedException : RuntimeException()
1 change: 1 addition & 0 deletions sample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-livedata:2.5.1'

implementation "androidx.core:core-ktx:1.9.0"
implementation "androidx.activity:activity-ktx:1.6.0"
implementation "androidx.fragment:fragment-ktx:1.5.3"

// Widgets
Expand Down
4 changes: 4 additions & 0 deletions sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package com.udfsoft.androidinfo.sample.ui.main

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.udfsoft.androidinfo.sample.R
Expand All @@ -11,26 +16,89 @@ class MainFragment : Fragment(R.layout.fragment_main) {

private val viewModel by viewModels<MainViewModel>()

private val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
val grantedPermissions = it.values.filter { isGranted -> isGranted }.size
val isGranted = grantedPermissions == 3
if (isGranted) {
loadInformation()
} else {
Toast.makeText(requireContext(), "Permissions denied!", Toast.LENGTH_SHORT).show()
}
}

private fun loadInformation() {
if (ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.READ_SMS
) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.READ_PHONE_NUMBERS
) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.READ_PHONE_STATE
) != PackageManager.PERMISSION_GRANTED
) {
Toast.makeText(requireContext(), "Permissions denied!", Toast.LENGTH_SHORT).show()
launchRequestPermissions()
return
}
viewModel.loadInformation(requireActivity())
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initLiveData()
viewModel.loadInformation(requireContext())
requestPermissions()
}

private fun requestPermissions() {
if (ActivityCompat.shouldShowRequestPermissionRationale(
requireActivity(), Manifest.permission.READ_PHONE_STATE
) && ActivityCompat.shouldShowRequestPermissionRationale(
requireActivity(), Manifest.permission.READ_SMS
) && ActivityCompat.shouldShowRequestPermissionRationale(
requireActivity(), "android.permission.READ_PHONE_NUMBERS"
)
) {
launchRequestPermissions()
} else {
launchRequestPermissions()
}
}

private fun launchRequestPermissions() {
requestPermissionLauncher.launch(
arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_SMS,
"android.permission.READ_PHONE_NUMBERS"
)
)
}


private fun initLiveData() {
viewModel.getGeneralInformationLiveData().observe(viewLifecycleOwner) {
Log.d(TAG, it.toString())
}

viewModel.getRAMInformationLiveData().observe(viewLifecycleOwner) {
Log.d(TAG, it.toString())
}

viewModel.getOSInformationLiveData().observe(viewLifecycleOwner) {
Log.d(TAG, it.toString())
}

viewModel.getCPUInformationLiveData().observe(viewLifecycleOwner) {
Log.d(TAG, it.toString())
}

viewModel.getSIMCardInformationLiveData().observe(viewLifecycleOwner) {
Log.d(TAG, it.toString())
}
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.udfsoft.androidinfo.sample.ui.main

import android.Manifest
import android.content.Context
import androidx.annotation.RequiresPermission
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.udfsoft.androidinfo.lib.DeviceInformationFactory
import com.udfsoft.androidinfo.lib.entity.CPUInformation
import com.udfsoft.androidinfo.lib.entity.GeneralInformation
import com.udfsoft.androidinfo.lib.entity.RAMInformation
import com.udfsoft.androidinfo.lib.entity.OSInformation
import com.udfsoft.androidinfo.lib.entity.*
import com.udfsoft.androidinfo.sample.util.toLiveData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand All @@ -23,11 +22,17 @@ class MainViewModel : ViewModel() {

private val cpuInformationLiveData = MutableLiveData<CPUInformation>()

private val simCardInformationLiveData = MutableLiveData<SIMCardInformation>()

@RequiresPermission(
allOf = [Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_SMS, "android.permission.READ_PHONE_NUMBERS"]
)
fun loadInformation(context: Context) = viewModelScope.launch(Dispatchers.IO) {
generalInformationLiveData.postValue(DeviceInformationFactory.getGeneralInformation())
ramInformationLiveData.postValue(DeviceInformationFactory.getRAMInformation(context))
osInformationLiveData.postValue(DeviceInformationFactory.getOSInformation())
cpuInformationLiveData.postValue(DeviceInformationFactory.getCPUInformation())
simCardInformationLiveData.postValue(DeviceInformationFactory.getSIMCardInformation(context))
}

fun getGeneralInformationLiveData() = generalInformationLiveData.toLiveData()
Expand All @@ -37,4 +42,6 @@ class MainViewModel : ViewModel() {
fun getOSInformationLiveData() = osInformationLiveData.toLiveData()

fun getCPUInformationLiveData() = cpuInformationLiveData.toLiveData()

fun getSIMCardInformationLiveData() = simCardInformationLiveData.toLiveData()
}