diff --git a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformation.kt b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformation.kt index ee76b44..94ae1db 100644 --- a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformation.kt +++ b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformation.kt @@ -36,7 +36,7 @@ interface DeviceInformation { fun getStorageInformation(): StorageInformation - fun getDisplayInformation(): DisplayInformation + fun getDisplayInformation(context: Context): DisplayInformation fun getSensorsInformation(): SensorsInformation diff --git a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformationFactory.kt b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformationFactory.kt index 486e8af..7846a62 100644 --- a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformationFactory.kt +++ b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/DeviceInformationFactory.kt @@ -8,6 +8,7 @@ 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.display.GetDisplayInformationCommand import com.udfsoft.androidinfo.lib.command.sim.GetSIMCardInformationCommand import com.udfsoft.androidinfo.lib.entity.* @@ -23,11 +24,7 @@ object DeviceInformationFactory : DeviceInformation { } @RequiresPermission( - allOf = [ - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.READ_SMS, - "android.permission.READ_PHONE_NUMBERS" - ] + 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) @@ -65,8 +62,9 @@ object DeviceInformationFactory : DeviceInformation { TODO("Not yet implemented") } - override fun getDisplayInformation(): DisplayInformation { - TODO("Not yet implemented") + override fun getDisplayInformation(context: Context): DisplayInformation { + val getDisplayInformationCommand = GetDisplayInformationCommand(context) + return getDisplayInformationCommand(Unit) } override fun getSensorsInformation(): SensorsInformation { diff --git a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/command/display/GetDisplayInformationCommand.kt b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/command/display/GetDisplayInformationCommand.kt new file mode 100644 index 0000000..5e7f7a0 --- /dev/null +++ b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/command/display/GetDisplayInformationCommand.kt @@ -0,0 +1,101 @@ +package com.udfsoft.androidinfo.lib.command.display + +import android.content.Context +import android.content.res.Configuration +import android.graphics.Rect +import android.os.Build +import android.util.DisplayMetrics +import android.util.Size +import android.view.Display +import android.view.WindowInsets +import android.view.WindowManager +import androidx.annotation.RequiresApi +import com.udfsoft.androidinfo.lib.command.CommandInterface +import com.udfsoft.androidinfo.lib.entity.DisplayInformation + +class GetDisplayInformationCommand(val context: Context) : + CommandInterface { + + override fun invoke(param: Unit): DisplayInformation { + val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager + + val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + context.display + } else { + windowManager.defaultDisplay + } + + val displayId = display?.displayId + val appVsyncOffsetNanos = display?.appVsyncOffsetNanos + val displayName = display?.name + val rotation = display?.rotation + + val isHdr = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + display?.isHdr + } else { + false + } + + val screenRefreshRate = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + display?.mode?.refreshRate + } else { + null + } + + val screenSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + getScreenSize(windowManager) + } else { + getScreenSizeOld(display) + } + + val screenSizeCategory = getScreenSizeCategory() + + return DisplayInformation( + screenSize, + screenSizeCategory, + rotation, + isHdr, + screenRefreshRate, + displayId, + displayName, + appVsyncOffsetNanos + ) + } + + + private fun getScreenSizeOld(display: Display?): Size { + val metrics = DisplayMetrics() + display?.getMetrics(metrics) + val width = metrics.widthPixels + val height = metrics.heightPixels + return Size(width, height) + } + + @RequiresApi(Build.VERSION_CODES.R) + private fun getScreenSize(windowManager: WindowManager): Size { + val metrics = windowManager.currentWindowMetrics + val windowInsets: WindowInsets = metrics.windowInsets + val insets = windowInsets.getInsetsIgnoringVisibility( + WindowInsets.Type.navigationBars() or WindowInsets.Type.displayCutout() + ) + + val insetsWidth: Int = insets.right + insets.left + val insetsHeight: Int = insets.top + insets.bottom + + val bounds: Rect = metrics.bounds + return Size( + bounds.width() - insetsWidth, bounds.height() - insetsHeight + ) + } + + private fun getScreenSizeCategory(): String { + val screenSize = + context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK + return when (screenSize) { + Configuration.SCREENLAYOUT_SIZE_LARGE -> "Large screen" + Configuration.SCREENLAYOUT_SIZE_NORMAL -> "Normal screen" + Configuration.SCREENLAYOUT_SIZE_SMALL -> "Small screen" + else -> "Screen size is neither large, normal or small" + } + } +} \ No newline at end of file diff --git a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/entity/DisplayInformation.kt b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/entity/DisplayInformation.kt index 8a4657c..f0df7ea 100644 --- a/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/entity/DisplayInformation.kt +++ b/AndroidInfoLib/src/main/java/com/udfsoft/androidinfo/lib/entity/DisplayInformation.kt @@ -1,5 +1,14 @@ package com.udfsoft.androidinfo.lib.entity -class DisplayInformation { +import android.util.Size -} +data class DisplayInformation( + val screenSize: Size, + val screenSizeCategory: String, + val rotation: Int?, + val isHdr: Boolean?, + val screenRefreshRate: Float?, + val displayId: Int?, + val displayName: String?, + val appVsyncOffsetNanos: Long? +) diff --git a/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainFragment.kt b/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainFragment.kt index de5fe1f..caf1e3f 100644 --- a/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainFragment.kt +++ b/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainFragment.kt @@ -99,6 +99,10 @@ class MainFragment : Fragment(R.layout.fragment_main) { viewModel.getSIMCardInformationLiveData().observe(viewLifecycleOwner) { Log.d(TAG, it.toString()) } + + viewModel.getDisplayInformationLiveData().observe(viewLifecycleOwner) { + Log.d(TAG, it.toString()) + } } companion object { diff --git a/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainViewModel.kt b/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainViewModel.kt index 548d3cd..1e5bd3c 100644 --- a/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainViewModel.kt +++ b/sample/src/main/java/com/udfsoft/androidinfo/sample/ui/main/MainViewModel.kt @@ -24,6 +24,8 @@ class MainViewModel : ViewModel() { private val simCardInformationLiveData = MutableLiveData() + private val displayInformationLiveData = MutableLiveData() + @RequiresPermission( allOf = [Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_SMS, "android.permission.READ_PHONE_NUMBERS"] ) @@ -33,6 +35,7 @@ class MainViewModel : ViewModel() { osInformationLiveData.postValue(DeviceInformationFactory.getOSInformation()) cpuInformationLiveData.postValue(DeviceInformationFactory.getCPUInformation()) simCardInformationLiveData.postValue(DeviceInformationFactory.getSIMCardInformation(context)) + displayInformationLiveData.postValue(DeviceInformationFactory.getDisplayInformation(context)) } fun getGeneralInformationLiveData() = generalInformationLiveData.toLiveData() @@ -44,4 +47,6 @@ class MainViewModel : ViewModel() { fun getCPUInformationLiveData() = cpuInformationLiveData.toLiveData() fun getSIMCardInformationLiveData() = simCardInformationLiveData.toLiveData() + + fun getDisplayInformationLiveData() = displayInformationLiveData.toLiveData() } \ No newline at end of file