├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle
├── google-services.json
├── libs
│ └── miit_mdid_1.0.10.aar
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── song
│ │ └── deviceinfo
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── cpu_exynos.json
│ │ ├── cpu_family.json
│ │ ├── cpu_hisilicon.json
│ │ ├── cpu_mtk_helio.json
│ │ ├── cpu_snapdragon.json
│ │ ├── emmc_vendors.json
│ │ └── supplierconfig.json
│ ├── cpp
│ │ ├── CMakeLists.txt
│ │ ├── app-utils.cpp
│ │ ├── debug-check.cpp
│ │ ├── emulator-check.cpp
│ │ ├── include
│ │ │ ├── app-utils.h
│ │ │ ├── debug-check.h
│ │ │ ├── emulator-check.h
│ │ │ ├── log.h
│ │ │ ├── utils.h
│ │ │ └── virtual-apk-check.h
│ │ ├── native-lib.cpp
│ │ ├── utils.cpp
│ │ └── virtual-apk-check.cpp
│ ├── java
│ │ └── com
│ │ │ └── song
│ │ │ └── deviceinfo
│ │ │ ├── APP.java
│ │ │ ├── MainActivity.java
│ │ │ ├── info
│ │ │ ├── AppInfo.java
│ │ │ ├── AppListInfo.java
│ │ │ ├── BatteryInfo.java
│ │ │ ├── BluetoothInfo.java
│ │ │ ├── BuildInfo.java
│ │ │ ├── CameraInfo.java
│ │ │ ├── DebugInfo.java
│ │ │ ├── DeviceInfo.java
│ │ │ ├── EmulatorInfo.java
│ │ │ ├── HardwareInfo.java
│ │ │ ├── HookInfo.java
│ │ │ ├── InputInfo.java
│ │ │ ├── MapsInfo.java
│ │ │ ├── MediaCodecInfo.java
│ │ │ ├── NetWorkInfo.java
│ │ │ ├── OthersInfo.java
│ │ │ ├── PartitionsInfo.java
│ │ │ ├── RootInfo.java
│ │ │ ├── SOCInfo.java
│ │ │ ├── StoreInfo.java
│ │ │ ├── SystemInfo.java
│ │ │ ├── ThermalInfo.java
│ │ │ ├── USBInfo.java
│ │ │ ├── VirtualAppInfo.java
│ │ │ └── WifiInfo.java
│ │ │ ├── model
│ │ │ ├── Test.java
│ │ │ └── beans
│ │ │ │ ├── ApplicationBean.java
│ │ │ │ ├── CpuBean.java
│ │ │ │ ├── InputBean.java
│ │ │ │ ├── PartitionsBean.java
│ │ │ │ ├── SimBean.java
│ │ │ │ ├── StorageBean.java
│ │ │ │ ├── USBBean.java
│ │ │ │ └── XposedHookBean.java
│ │ │ ├── ui
│ │ │ ├── about
│ │ │ │ ├── AboutFragment.java
│ │ │ │ └── AboutViewModel.java
│ │ │ ├── app
│ │ │ │ ├── AppFragment.java
│ │ │ │ └── AppViewModel.java
│ │ │ ├── applist
│ │ │ │ ├── AppListAdapter.java
│ │ │ │ ├── AppListFragment.java
│ │ │ │ └── AppListViewModel.java
│ │ │ ├── base
│ │ │ │ ├── BaseAdapter.java
│ │ │ │ ├── BaseFragment.java
│ │ │ │ ├── BaseViewModel.java
│ │ │ │ ├── NormalAdapter.java
│ │ │ │ ├── NormalFragment.java
│ │ │ │ └── NormalViewModel.java
│ │ │ ├── battery
│ │ │ │ ├── BatteryFragment.java
│ │ │ │ └── BatteryViewModel.java
│ │ │ ├── bluetooth
│ │ │ │ ├── BluetoothFragment.java
│ │ │ │ └── BluetoothViewModel.java
│ │ │ ├── build
│ │ │ │ ├── BuildInfoFragment.java
│ │ │ │ └── BuildInfoViewModel.java
│ │ │ ├── camera
│ │ │ │ ├── CameraFragment.java
│ │ │ │ └── CameraViewModel.java
│ │ │ ├── codecs
│ │ │ │ ├── CodecAdapter.java
│ │ │ │ ├── CodecFragment.java
│ │ │ │ └── CodecViewModel.java
│ │ │ ├── debug
│ │ │ │ ├── DebugFragment.java
│ │ │ │ └── DebugViewModel.java
│ │ │ ├── device
│ │ │ │ ├── DeviceFragment.java
│ │ │ │ └── DeviceViewModel.java
│ │ │ ├── emulator
│ │ │ │ ├── EmulatorFragment.java
│ │ │ │ └── EmulatorViewModel.java
│ │ │ ├── hardware
│ │ │ │ ├── HardwareFragment.java
│ │ │ │ └── HardwareViewModel.java
│ │ │ ├── hook
│ │ │ │ ├── HookFragment.java
│ │ │ │ └── HookViewModel.java
│ │ │ ├── input
│ │ │ │ ├── InputAdapter.java
│ │ │ │ ├── InputFragment.java
│ │ │ │ └── InputViewModel.java
│ │ │ ├── maps
│ │ │ │ ├── MapsFragment.java
│ │ │ │ └── MapsViewModel.java
│ │ │ ├── net
│ │ │ │ ├── NetFragment.java
│ │ │ │ └── NetViewModel.java
│ │ │ ├── oneline
│ │ │ │ ├── OneLineAdapter.java
│ │ │ │ ├── OneLineFragment.java
│ │ │ │ └── OneLineViewModel.java
│ │ │ ├── others
│ │ │ │ ├── OthersFragment.java
│ │ │ │ └── OthersViewModel.java
│ │ │ ├── partitions
│ │ │ │ ├── PartitionsAdapter.java
│ │ │ │ ├── PartitionsFragment.java
│ │ │ │ └── PartitionsViewModel.java
│ │ │ ├── root
│ │ │ │ ├── RootFragment.java
│ │ │ │ └── RootViewModel.java
│ │ │ ├── settings
│ │ │ │ └── SettingsFragment.java
│ │ │ ├── soc
│ │ │ │ ├── SOCFragment.java
│ │ │ │ └── SOCViewModel.java
│ │ │ ├── store
│ │ │ │ ├── StoreAdapter.java
│ │ │ │ ├── StoreFragment.java
│ │ │ │ └── StoreViewModel.java
│ │ │ ├── system
│ │ │ │ ├── SystemFragment.java
│ │ │ │ └── SystemViewModel.java
│ │ │ ├── thermal
│ │ │ │ ├── ThermalFragment.java
│ │ │ │ └── ThermalViewModel.java
│ │ │ ├── usb
│ │ │ │ ├── USBFragment.java
│ │ │ │ └── USBViewModel.java
│ │ │ ├── virtual
│ │ │ │ ├── VirtualAppFragment.java
│ │ │ │ └── VirtualAppViewModel.java
│ │ │ └── wifi
│ │ │ │ ├── WifiFragment.java
│ │ │ │ └── WifiViewModel.java
│ │ │ └── utils
│ │ │ ├── ApplicationUtils.java
│ │ │ ├── BatteryUtils.java
│ │ │ ├── CommandUtils.java
│ │ │ ├── Constants.java
│ │ │ ├── DebugUtils.java
│ │ │ ├── DecimalUtils.java
│ │ │ ├── DensityUtils.java
│ │ │ ├── DeviceUtils.java
│ │ │ ├── EmulatorUtils.java
│ │ │ ├── FileUtils.java
│ │ │ ├── GatewayUtils.java
│ │ │ ├── HashUtils.java
│ │ │ ├── HexUtils.java
│ │ │ ├── HookUtils.java
│ │ │ ├── LanguageUtils.java
│ │ │ ├── LogUtils.java
│ │ │ ├── MemoryUtils.java
│ │ │ ├── NetRequestUtils.java
│ │ │ ├── NetWorkUtils.java
│ │ │ ├── OaidUtils.java
│ │ │ ├── OkHttpUtils.java
│ │ │ ├── RootUtils.java
│ │ │ ├── SdUtils.java
│ │ │ ├── SocUtils.java
│ │ │ ├── SystemConfigUtils.java
│ │ │ ├── ThreadPoolUtils.java
│ │ │ ├── TimeUtils.java
│ │ │ └── XposedHookUtils.java
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── ic_action_bluetooth_scan_black_24dp.xml
│ │ ├── ic_action_others_black_24dp.xml
│ │ ├── ic_action_wifi_scan_black_24dp.xml
│ │ ├── ic_language_black_24dp.xml
│ │ ├── ic_launcher_background.xml
│ │ └── side_nav_bar.xml
│ │ ├── layout
│ │ ├── activity_main.xml
│ │ ├── app_bar_main.xml
│ │ ├── content_main.xml
│ │ ├── fragment_about.xml
│ │ ├── fragment_base.xml
│ │ ├── item_applist.xml
│ │ ├── item_codecs.xml
│ │ ├── item_input.xml
│ │ ├── item_normal.xml
│ │ ├── item_one_line.xml
│ │ ├── item_partitions.xml
│ │ ├── item_store.xml
│ │ ├── nav_header_main.xml
│ │ └── settings_activity.xml
│ │ ├── menu
│ │ ├── activity_main_drawer.xml
│ │ └── main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_action_about.png
│ │ ├── ic_action_app.png
│ │ ├── ic_action_applications.png
│ │ ├── ic_action_battery.png
│ │ ├── ic_action_build.png
│ │ ├── ic_action_camera.png
│ │ ├── ic_action_codecs.png
│ │ ├── ic_action_debug.png
│ │ ├── ic_action_devices.png
│ │ ├── ic_action_drivers.png
│ │ ├── ic_action_engineer_menu_nav.png
│ │ ├── ic_action_general.png
│ │ ├── ic_action_home.png
│ │ ├── ic_action_hook.png
│ │ ├── ic_action_info_center.png
│ │ ├── ic_action_input.png
│ │ ├── ic_action_lcd_test.png
│ │ ├── ic_action_maps.png
│ │ ├── ic_action_memory.png
│ │ ├── ic_action_more_open.png
│ │ ├── ic_action_multitouch.png
│ │ ├── ic_action_net.png
│ │ ├── ic_action_partitions.png
│ │ ├── ic_action_pmic.png
│ │ ├── ic_action_project.png
│ │ ├── ic_action_rate_app.png
│ │ ├── ic_action_root.png
│ │ ├── ic_action_screen_test.png
│ │ ├── ic_action_sensors.png
│ │ ├── ic_action_settings.png
│ │ ├── ic_action_soc.png
│ │ ├── ic_action_thermal.png
│ │ ├── ic_action_touch_drawing.png
│ │ ├── ic_action_upgrade_to_pro.png
│ │ ├── ic_action_usb.png
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ └── ic_system_apps.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_action_about.png
│ │ ├── ic_action_app.png
│ │ ├── ic_action_applications.png
│ │ ├── ic_action_battery.png
│ │ ├── ic_action_build.png
│ │ ├── ic_action_camera.png
│ │ ├── ic_action_codecs.png
│ │ ├── ic_action_debug.png
│ │ ├── ic_action_devices.png
│ │ ├── ic_action_drivers.png
│ │ ├── ic_action_engineer_menu_nav.png
│ │ ├── ic_action_general.png
│ │ ├── ic_action_home.png
│ │ ├── ic_action_hook.png
│ │ ├── ic_action_info_center.png
│ │ ├── ic_action_input.png
│ │ ├── ic_action_lcd_test.png
│ │ ├── ic_action_maps.png
│ │ ├── ic_action_memory.png
│ │ ├── ic_action_more_open.png
│ │ ├── ic_action_multitouch.png
│ │ ├── ic_action_net.png
│ │ ├── ic_action_partitions.png
│ │ ├── ic_action_pmic.png
│ │ ├── ic_action_project.png
│ │ ├── ic_action_rate_app.png
│ │ ├── ic_action_root.png
│ │ ├── ic_action_screen_test.png
│ │ ├── ic_action_sensors.png
│ │ ├── ic_action_settings.png
│ │ ├── ic_action_soc.png
│ │ ├── ic_action_system.png
│ │ ├── ic_action_thermal.png
│ │ ├── ic_action_touch_drawing.png
│ │ ├── ic_action_upgrade_to_pro.png
│ │ ├── ic_action_usb.png
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ └── ic_system_apps.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_action_about.png
│ │ ├── ic_action_app.png
│ │ ├── ic_action_applications.png
│ │ ├── ic_action_battery.png
│ │ ├── ic_action_build.png
│ │ ├── ic_action_camera.png
│ │ ├── ic_action_codecs.png
│ │ ├── ic_action_debug.png
│ │ ├── ic_action_devices.png
│ │ ├── ic_action_drivers.png
│ │ ├── ic_action_engineer_menu_nav.png
│ │ ├── ic_action_general.png
│ │ ├── ic_action_home.png
│ │ ├── ic_action_hook.png
│ │ ├── ic_action_info_center.png
│ │ ├── ic_action_input.png
│ │ ├── ic_action_lcd_test.png
│ │ ├── ic_action_maps.png
│ │ ├── ic_action_memory.png
│ │ ├── ic_action_more_open.png
│ │ ├── ic_action_multitouch.png
│ │ ├── ic_action_net.png
│ │ ├── ic_action_partitions.png
│ │ ├── ic_action_pmic.png
│ │ ├── ic_action_project.png
│ │ ├── ic_action_rate_app.png
│ │ ├── ic_action_root.png
│ │ ├── ic_action_screen_test.png
│ │ ├── ic_action_sensors.png
│ │ ├── ic_action_settings.png
│ │ ├── ic_action_soc.png
│ │ ├── ic_action_system.png
│ │ ├── ic_action_thermal.png
│ │ ├── ic_action_touch_drawing.png
│ │ ├── ic_action_upgrade_to_pro.png
│ │ ├── ic_action_usb.png
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ └── ic_system_apps.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_action_about.png
│ │ ├── ic_action_app.png
│ │ ├── ic_action_applications.png
│ │ ├── ic_action_battery.png
│ │ ├── ic_action_build.png
│ │ ├── ic_action_camera.png
│ │ ├── ic_action_codecs.png
│ │ ├── ic_action_debug.png
│ │ ├── ic_action_devices.png
│ │ ├── ic_action_drivers.png
│ │ ├── ic_action_engineer_menu_nav.png
│ │ ├── ic_action_general.png
│ │ ├── ic_action_home.png
│ │ ├── ic_action_hook.png
│ │ ├── ic_action_info_center.png
│ │ ├── ic_action_input.png
│ │ ├── ic_action_lcd_test.png
│ │ ├── ic_action_maps.png
│ │ ├── ic_action_memory.png
│ │ ├── ic_action_more_open.png
│ │ ├── ic_action_multitouch.png
│ │ ├── ic_action_net.png
│ │ ├── ic_action_partitions.png
│ │ ├── ic_action_pmic.png
│ │ ├── ic_action_project.png
│ │ ├── ic_action_rate_app.png
│ │ ├── ic_action_root.png
│ │ ├── ic_action_screen_test.png
│ │ ├── ic_action_sensors.png
│ │ ├── ic_action_settings.png
│ │ ├── ic_action_soc.png
│ │ ├── ic_action_system.png
│ │ ├── ic_action_thermal.png
│ │ ├── ic_action_touch_drawing.png
│ │ ├── ic_action_upgrade_to_pro.png
│ │ ├── ic_action_usb.png
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ └── ic_system_apps.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── navigation
│ │ └── mobile_navigation.xml
│ │ ├── values-en
│ │ └── strings.xml
│ │ ├── values-v21
│ │ └── styles.xml
│ │ ├── values-zh
│ │ └── strings.xml
│ │ ├── values
│ │ ├── arrays.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── drawables.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ │ └── xml
│ │ └── messages_preferences.xml
│ └── test
│ └── java
│ └── com
│ └── song
│ └── deviceinfo
│ └── ExampleUnitTest.java
├── build.gradle
├── geetest_android_public.jks
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── imgs
├── battery.jpg
├── drawer.jpeg
├── net.jpg
└── thermal.jpg
├── release
└── device_info_0.2.1_20211012.apk
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | .idea
5 | .DS_Store
6 | /build
7 | /captures
8 | .externalNativeBuild
9 | .cxx
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 设备信息
2 |
3 | **获取 `Android` 设备信息采集**
4 |
5 |
6 |
7 | [](https://github.com/song-dev/device-info/issues)
8 | [](https://github.com/song-dev/device-info/network)
9 | [](https://github.com/song-dev/device-info/stargazers)
10 | [](https://www.apache.org/licenses/LICENSE-2.0.html)
11 |
12 |
13 |
14 | ## 信息采集模块
15 | - 网络信息
16 | - 电池信息
17 | - 温度监控信息
18 | - 系统参数信息
19 | - 分区文件信息
20 | - 内存信息
21 | - 应用程序信息
22 | - 输出驱动信息采集
23 | - USB 设备信息采集
24 | - 芯片信息采集
25 | - 模拟器信息采集
26 | - 多开信息采集
27 | - debug 信息采集
28 | - root 信息采集
29 | - hook 信息采集
30 | - 设备信息采集
31 | - 应用信息采集
32 | - WIFI、蓝牙扫描
33 | - 其他信息类采集
34 | - 相机信息采集
35 | - SOC 信息采集
36 | - Build 信息采集
37 | - Maps 信息采集
38 | - 硬件信息采集
39 |
40 | > 后续还会不断添加
41 |
42 | ## 截图
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | ## ChangeLog
53 |
54 | 版本 | 更新内容 | 更新日期
55 | -----|-----|-----
56 | **0.2.1** | 1、新增 Logcat 日志打印;
2、Build 信息采集;
3、Maps 信息采集;
4、硬件信息采集 | 2021-10-12
57 | **0.2.0** | 1、设备信息采集;
2、应用信息采集;
3、WIFi、蓝牙扫描;
4、相机、SOC 信息采集 | 2020-11-12
58 | **0.1.10** | 1、debug 信息采集;
2、root 信息采集;
3、hook 信息采集;
4、新增应用内语言切换 | 2020-08-27
59 | **0.1.9** | 1、多开信息采集;
2、模拟器信息采集 | 2020-07-14
60 | **0.1.8** | 1、USB 设备信息采集; | 2020-06-08
61 | **0.1.7** | 1、输出驱动信息采集; | 2020-06-05
62 | **0.1.6** | 1、编解码器信息采集; | 2020-06-03
63 | **0.1.5** | 1、应用程序信息采集; | 2020-06-03
64 | **0.1.4** | 1、内存信息采集; | 2020-06-02
65 | **0.1.3** | 1、分区文件信息采集; | 2020-06-01
66 | **0.1.2** | 1、新增电池信息采集模块;
2、新增系统信息采集模块 | 2020-05-28
67 | **0.1.1** | 1、新增温度信息采集模块 | 2020-05-27
68 | **0.1.0** | 1、搭建整体框架;
2、新增网络信息采集模块 | 2020-05-26
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /release
3 | /debug
4 |
--------------------------------------------------------------------------------
/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "1060499451852",
4 | "firebase_url": "https://sensebot-28240.firebaseio.com",
5 | "project_id": "sensebot-28240",
6 | "storage_bucket": "sensebot-28240.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:1060499451852:android:235bb079fc42f7c2183769",
12 | "android_client_info": {
13 | "package_name": "com.geetest.sensebot.demo"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "1060499451852-km6f8cphc4ksa6djl90lgdo90plu370l.apps.googleusercontent.com",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": "AIzaSyDR-9KuvDeVModyh_xANMCwpbRB0e3QbUM"
25 | }
26 | ],
27 | "services": {
28 | "appinvite_service": {
29 | "other_platform_oauth_client": [
30 | {
31 | "client_id": "1060499451852-km6f8cphc4ksa6djl90lgdo90plu370l.apps.googleusercontent.com",
32 | "client_type": 3
33 | }
34 | ]
35 | }
36 | }
37 | },
38 | {
39 | "client_info": {
40 | "mobilesdk_app_id": "1:1060499451852:android:68e511a27936c451183769",
41 | "android_client_info": {
42 | "package_name": "com.song.deviceinfo"
43 | }
44 | },
45 | "oauth_client": [
46 | {
47 | "client_id": "1060499451852-km6f8cphc4ksa6djl90lgdo90plu370l.apps.googleusercontent.com",
48 | "client_type": 3
49 | }
50 | ],
51 | "api_key": [
52 | {
53 | "current_key": "AIzaSyDR-9KuvDeVModyh_xANMCwpbRB0e3QbUM"
54 | }
55 | ],
56 | "services": {
57 | "appinvite_service": {
58 | "other_platform_oauth_client": [
59 | {
60 | "client_id": "1060499451852-km6f8cphc4ksa6djl90lgdo90plu370l.apps.googleusercontent.com",
61 | "client_type": 3
62 | }
63 | ]
64 | }
65 | }
66 | }
67 | ],
68 | "configuration_version": "1"
69 | }
--------------------------------------------------------------------------------
/app/libs/miit_mdid_1.0.10.aar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/libs/miit_mdid_1.0.10.aar
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/song/deviceinfo/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 |
25 | assertEquals("com.song.deviceinfo", appContext.getPackageName());
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/assets/cpu_exynos.json:
--------------------------------------------------------------------------------
1 | [
2 | {"id": "8890", "name": "", "ddr": "4", "tp": "14"},
3 | {"id": "8895", "name": "", "ddr": "4X", "tp": "10"},
4 | {"id": "9810", "name": "", "ddr": "4X", "tp": "10"},
5 | {"id": "9820", "name": "", "ddr": "4X", "tp": "8"},
6 | {"id": "9825", "name": "", "ddr": "4X", "tp": "7"},
7 |
8 | {"id": "980", "name": "", "ddr": "4X", "tp": "8"},
9 | {"id": "990", "name": "", "ddr": "5", "tp": "7"},
10 |
11 | {"id": "9610", "name": "", "ddr": "4X", "tp": "10"},
12 | {"id": "9611", "name": "", "ddr": "4X", "tp": "10"}
13 | ]
14 |
--------------------------------------------------------------------------------
/app/src/main/assets/cpu_family.json:
--------------------------------------------------------------------------------
1 | [
2 | {"vid": "0x41", "id": "0xc05", "name": "Cortex-A5"},
3 | {"vid": "0x41", "id": "0xc07", "name": "Cortex-A7"},
4 | {"vid": "0x41", "id": "0xc08", "name": "Cortex-A8"},
5 | {"vid": "0x41", "id": "0xc09", "name": "Cortex-A9"},
6 |
7 | {"vid": "0x41", "id": "0xc0d", "name": "Cortex-A17(ex-A12)"},
8 | {"vid": "0x41", "id": "0xc0e", "name": "Cortex-A17"},
9 | {"vid": "0x41", "id": "0xc0f", "name": "Cortex-A15"},
10 |
11 | {"vid": "0x41", "id": "0xd01", "name": "Cortex-A32"},
12 | {"vid": "0x41", "id": "0xd03", "name": "Cortex-A53"},
13 | {"vid": "0x41", "id": "0xd04", "name": "Cortex-A35"},
14 | {"vid": "0x41", "id": "0xd05", "name": "Cortex-A55"},
15 | {"vid": "0x41", "id": "0xd07", "name": "Cortex-A57"},
16 | {"vid": "0x41", "id": "0xd08", "name": "Cortex-A72"},
17 | {"vid": "0x41", "id": "0xd09", "name": "Cortex-A73"},
18 |
19 | {"vid": "0x41", "id": "0xd0a", "name": "Cortex-A75"},
20 | {"vid": "0x41", "id": "0xd0b", "name": "Cortex-A76"},
21 | {"vid": "0x41", "id": "0xd0d", "name": "Cortex-A77"},
22 |
23 | {"vid": "0x48", "id": "0xd40", "name": "Cortex-A76H"},
24 |
25 | {"vid": "0x4e", "id": "0x0", "name": "Denver"},
26 |
27 | {"vid": "0x51", "id": "0xf", "name": "Scorpion"},
28 | {"vid": "0x51", "id": "0x2d", "name": "Scorpion"},
29 | {"vid": "0x51", "id": "0x4d", "name": "Krait"},
30 | {"vid": "0x51", "id": "0x6f", "name": "Krait"},
31 |
32 | {"vid": "0x51", "id": "0x201", "name": "Kryo"},
33 | {"vid": "0x51", "id": "0x205", "name": "Kryo"},
34 | {"vid": "0x51", "id": "0x211", "name": "Kryo"},
35 |
36 | {"vid": "0x51", "id": "0x800", "name": "Kryo-2xx-a73"},
37 | {"vid": "0x51", "id": "0x801", "name": "Kryo-2xx-a53"},
38 |
39 | {"vid": "0x51", "id": "0x802", "name": "Kryo-3xx-a75"},
40 | {"vid": "0x51", "id": "0x803", "name": "Kryo-3xx-a55"},
41 |
42 | {"vid": "0x51", "id": "0x804", "name": "Kryo-4xx-a76"},
43 | {"vid": "0x51", "id": "0x805", "name": "Kryo-4xx-a55"},
44 |
45 | {"vid": "0x53", "id": "0x1", "name": "Mongoose"},
46 | {"vid": "0x53", "id": "0x2", "name": "Mongoose-M3"},
47 | {"vid": "0x53", "id": "0x3", "name": "Mongoose-M4"},
48 | {"vid": "0x53", "id": "0x4", "name": "Mongoose-M5"},
49 |
50 | {"vid": "0x69", "id": "0x1", "name": "Intel"}
51 | ]
--------------------------------------------------------------------------------
/app/src/main/assets/cpu_hisilicon.json:
--------------------------------------------------------------------------------
1 | [
2 | {"id": "hi6210", "name": "620", "ddr": "", "tp": "28"},
3 | {"id": "hi6620oem", "name": "910", "ddr": "", "tp": "28"},
4 |
5 | {"id": "hi3630", "name": "920", "ddr": "", "tp": "28"},
6 | {"id": "hi3635", "name": "930", "ddr": "", "tp": "28"},
7 |
8 | {"id": "hi6250", "name": "650", "ddr": "", "tp": "16"},
9 |
10 | {"id": "hi3650", "name": "950", "ddr": "", "tp": "16"},
11 | {"id": "hi3660", "name": "960", "ddr": "", "tp": "16"},
12 |
13 | {"id": "kirin710", "name": "710", "ddr": "4", "tp": "12"},
14 |
15 | {"id": "kirin810", "name": "810", "ddr": "4X", "tp": "7"},
16 | {"id": "kirin820", "name": "820", "ddr": "4X", "tp": "7"},
17 | {"id": "kirin985", "name": "985", "ddr": "4X", "tp": "7"},
18 |
19 | {"id": "kirin970", "name": "970", "ddr": "4X", "tp": "10"},
20 | {"id": "kirin980", "name": "980", "ddr": "4X", "tp": "7"},
21 | {"id": "kirin990", "name": "990", "ddr": "4X", "tp": "7"}
22 | ]
23 |
--------------------------------------------------------------------------------
/app/src/main/assets/cpu_mtk_helio.json:
--------------------------------------------------------------------------------
1 | [
2 | {"id": "mt6755", "name": "P10 series", "tp": "28"},
3 | {"id": "mt6757", "name": "P20 series", "tp": "16"},
4 | {"id": "mt6759", "name": "P30 series"},
5 |
6 | {"id": "mt6763", "name": "P23", "ddr": "", "tp": "16"},
7 |
8 | {"id": "mt6761", "name": "A22", "tp": "12"},
9 | {"id": "mt6762m", "name": "A22", "tp": "12"},
10 | {"id": "mt6762", "name": "P22", "tp": "12"},
11 |
12 | {"id": "mt6765", "name": "P35", "tp": "12"},
13 | {"id": "mt6768", "name": "P65", "tp": "12"},
14 | {"id": "mt6769", "name": "G70", "tp": "12"},
15 |
16 | {"id": "mt6771", "name": "P60 series", "ddr": "", "tp": "12"},
17 | {"id": "mt6779", "name": "P90", "ddr": "4X", "tp": "12"},
18 |
19 | {"id": "mt6785", "name": "G90", "ddr": "4X", "tp": "12"},
20 | {"id": "mt6885", "name": "D1000", "ddr": "4X", "tp": "7"},
21 | {"id": "mt6889", "name": "D1000+", "ddr": "4X", "tp": "7"},
22 |
23 | {"id": "mt6795", "name": "X10 series", "tp": "28"},
24 | {"id": "mt6797", "name": "X20 series", "tp": "20"},
25 | {"id": "mt6799", "name": "X30 series", "tp": "10"}
26 | ]
27 |
--------------------------------------------------------------------------------
/app/src/main/assets/emmc_vendors.json:
--------------------------------------------------------------------------------
1 | [
2 | {"id": "0x13", "name": "Micron"},
3 | {"id": "0x15", "name": "Samsung"},
4 | {"id": "0x90", "name": "Hynix"},
5 | {"id": "0x45", "name": "Sandisk"},
6 | {"id": "0x11", "name": "Toshiba"},
7 | {"id": "0x70", "name": "Kingston"},
8 | {"id": "0x74", "name": "Transcend"},
9 | {"id": "0xFE", "name": "Micron"},
10 | {"id": "0x88", "name": "Foresee"}
11 | ]
12 |
--------------------------------------------------------------------------------
/app/src/main/assets/supplierconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "supplier":{
3 | "vivo":{
4 | "appid":"100215079"
5 | },
6 | "xiaomi":{
7 |
8 | },
9 | "huawei":{
10 |
11 | },
12 | "oppo":{
13 |
14 | }
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/cpp/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # For more information about using CMake with Android Studio, read the
2 | # documentation: https://d.android.com/studio/projects/add-native-code.html
3 |
4 | # Sets the minimum version of CMake required to build the native library.
5 |
6 | cmake_minimum_required(VERSION 3.4.1)
7 |
8 | # Creates and names a library, sets it as either STATIC
9 | # or SHARED, and provides the relative paths to its source code.
10 | # You can define multiple libraries, and CMake builds them for you.
11 | # Gradle automatically packages shared libraries with your APK.
12 |
13 | add_library( # Sets the name of the library.
14 | native-lib
15 |
16 | # Sets the library as a shared library.
17 | SHARED
18 |
19 | # Provides a relative path to your source file(s).
20 | native-lib.cpp
21 | emulator-check.cpp
22 | utils.cpp
23 | app-utils.cpp
24 | virtual-apk-check.cpp
25 | # root-check.cpp
26 | # hook-check.cpp
27 | debug-check.cpp
28 | # daemon-check.cpp
29 | )
30 |
31 | # Searches for a specified prebuilt library and stores the path as a
32 | # variable. Because CMake includes system libraries in the search path by
33 | # default, you only need to specify the name of the public NDK library
34 | # you want to add. CMake verifies that the library exists before
35 | # completing its build.
36 |
37 | find_library( # Sets the name of the path variable.
38 | log-lib
39 |
40 | # Specifies the name of the NDK library that
41 | # you want CMake to locate.
42 | log)
43 |
44 | # Specifies libraries CMake should link to your target library. You
45 | # can link multiple libraries, such as libraries you define in this
46 | # build script, prebuilt third-party libraries, or system libraries.
47 |
48 | target_link_libraries( # Specifies the target library.
49 | native-lib
50 |
51 | # Links the target library to the log library
52 | # included in the NDK.
53 | ${log-lib})
--------------------------------------------------------------------------------
/app/src/main/cpp/app-utils.cpp:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/30.
3 | //
4 |
5 | #include "include/app-utils.h"
6 | #include "include/utils.h"
7 | #include
8 | #include
9 | #include
10 |
11 | /**
12 | * 获取当前 app 包名
13 | * @param packageName
14 | * @return
15 | */
16 | int getPackageName(char *packageName) {
17 |
18 | char path[64];
19 | sprintf(path, "/proc/%d/cmdline", getpid());
20 |
21 | FILE *f = NULL;
22 | f = fopen(path, "r");
23 | if (f == NULL) {
24 | return 1;
25 | }
26 | fgets(packageName, BUF_SIZE_64, f);
27 | fclose(f);
28 | return 0;
29 |
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/cpp/debug-check.cpp:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2020/1/4.
3 | //
4 |
5 | #include "include/debug-check.h"
6 | #include "include/utils.h"
7 | #include "include/log.h"
8 |
9 | #include
10 | #include
11 | #include
12 |
13 | /**
14 | * 获取 TracerPid
15 | * @return
16 | */
17 | int getTracerPid() {
18 | FILE *f = NULL;
19 | char path[BUF_SIZE_64] = {0};
20 | sprintf(path, "/proc/%d/status", getpid());
21 | char line[BUF_SIZE_256] = {0};
22 | f = fopen(path, "r");
23 | while (fgets(line, BUF_SIZE_256, f)) {
24 | if (strstr(line, "TracerPid")) {
25 | LOGI("TracerPid line: %s", line);
26 | int statue = atoi(&line[10]);
27 | LOGW("TracerPid: %d", statue);
28 | return statue;
29 | }
30 | }
31 | return -1;
32 | }
33 |
34 | /**
35 | * /proc/net/tcp 文件检测
36 | * @return
37 | * @deprecated 失效
38 | */
39 | int tcpCheck() {
40 |
41 | FILE *f = NULL;
42 | char path[BUF_SIZE_64] = "/proc/net/tcp";
43 | char line[BUF_SIZE_512];
44 |
45 | f = fopen(path, "r");
46 | while (fgets(line, BUF_SIZE_512, f)) {
47 | LOGI("TCP line: %s", line);
48 | }
49 |
50 | return 0;
51 |
52 | }
53 |
54 | /**
55 | * 括号后第一个字符为 t 则为调试状态
56 | * @return
57 | * @deprecated 失效
58 | */
59 | int statCheck() {
60 | FILE *f = NULL;
61 | char path[BUF_SIZE_64];
62 | sprintf(path, "/proc/%d/stat", getpid());
63 |
64 | char line[BUF_SIZE_512];
65 | f = fopen(path, "r");
66 | while (fgets(line, BUF_SIZE_512, f)) {
67 | LOGI("stat line: %s", line);
68 | }
69 |
70 | return 0;
71 | }
72 |
73 | /**
74 | * wchan 内容为 ptrace_stop 则为调试状态
75 | * @return
76 | * @deprecated 失效
77 | */
78 | int wchanCheck() {
79 | FILE *f = NULL;
80 | char path[BUF_SIZE_64];
81 | sprintf(path, "/proc/%d/wchan", getpid());
82 |
83 | char line[BUF_SIZE_512];
84 | f = fopen(path, "r");
85 | while (fgets(line, BUF_SIZE_512, f)) {
86 | LOGI("wchan line: %s", line);
87 | }
88 |
89 | return 0;
90 | }
91 |
92 | /**
93 | * 每个进程只能被一个进程 trace
94 | * @return
95 | * @deprecated 失效,只能在 fork 单独的进程中使用
96 | */
97 | int ptraceCheck() {
98 | int trace = ptrace(PTRACE_TRACEME, 0, 0, 0);
99 | LOGW("ptrace: %d", trace);
100 | return trace;
101 | }
102 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/app-utils.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/30.
3 | //
4 |
5 | #ifndef SECURITY_CHECK_ANDROID_APP_UTILS_H
6 | #define SECURITY_CHECK_ANDROID_APP_UTILS_H
7 |
8 | /**
9 | * 获取当前 app 包名
10 | * @param packageName
11 | * @return
12 | */
13 | int getPackageName(char *packageName);
14 |
15 | #endif //SECURITY_CHECK_ANDROID_APP_UTILS_H
16 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/debug-check.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2020/1/4.
3 | //
4 |
5 | #ifndef SECURITY_CHECK_ANDROID_DEBUG_CHECK_H
6 | #define SECURITY_CHECK_ANDROID_DEBUG_CHECK_H
7 |
8 | /**
9 | * 检测 TracerPid 若不为 0 则为debug 状态
10 | * @return
11 | */
12 | int getTracerPid();
13 |
14 | int tcpCheck();
15 |
16 | int statCheck();
17 |
18 | int wchanCheck();
19 |
20 | /**
21 | * 每个进程只能被一个进程 trace
22 | * @return
23 | */
24 | int ptraceCheck();
25 |
26 | #endif //SECURITY_CHECK_ANDROID_DEBUG_CHECK_H
27 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/emulator-check.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/27.
3 | //
4 |
5 | #ifndef SECURITY_CHECK_ANDROID_EMULATOR_CHECK_H
6 | #define SECURITY_CHECK_ANDROID_EMULATOR_CHECK_H
7 |
8 | #include
9 |
10 | /**
11 | * 检测模拟器不存在的相关文件
12 | * @param env
13 | * @return
14 | */
15 | jint specialFilesEmulatorcheck();
16 |
17 | /**
18 | * 检测特殊目录,/sys/class/thermal/thermal_zoneX/temp(温度挂载文件)
19 | * @return 大于 0 为真机,等于 0 为模拟器
20 | */
21 | jint thermalCheck();
22 |
23 | ///**
24 | // * build 文件检测示例
25 | // * @return
26 | // */
27 | //jboolean buildCheck();
28 |
29 | /**
30 | * 蓝牙文件检测
31 | * @return
32 | */
33 | jint bluetoothCheck();
34 |
35 | ///**
36 | // * 获取当前
37 | // * @return
38 | // */
39 | //int getApiVersion();
40 |
41 | /**
42 | * 获取当前架构类型
43 | * @return
44 | */
45 | int getArch();
46 |
47 | /**
48 | * 从 maps 读取当前运行的架构
49 | * @param dst
50 | * @return
51 | */
52 | int getMapsArch(char *dst);
53 |
54 | #endif //SECURITY_CHECK_ANDROID_EMULATOR_CHECK_H
55 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/log.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/27.
3 | //
4 |
5 | #ifdef __cplusplus
6 | extern "C" {
7 | #endif
8 |
9 | #ifndef SECURITY_CHECK_ANDROID_LOG_H
10 | #define SECURITY_CHECK_ANDROID_LOG_H
11 |
12 | #include
13 |
14 | #if 1
15 | #define TAG "Device_Info"
16 | #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
17 | #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
18 | #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
19 | #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, TAG ,__VA_ARGS__)
20 | #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG ,__VA_ARGS__)
21 | #else
22 | #define LOGI(...)
23 | #define LOGD(...)
24 | #define LOGE(...)
25 | #define LOGF(...)
26 | #define LOGW(...)
27 | #endif
28 |
29 | #endif //SECURITY_CHECK_ANDROID_LOG_H
30 |
31 | #ifdef __cplusplus
32 | }
33 | #endif
34 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/utils.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/27.
3 | //
4 |
5 | #ifndef SECURITY_CHECK_ANDROID_UTILS_H
6 | #define SECURITY_CHECK_ANDROID_UTILS_H
7 |
8 | #include
9 | #include
10 |
11 | #define BUF_SIZE_32 32
12 | #define BUF_SIZE_64 64
13 | #define BUF_SIZE_128 128
14 | #define BUF_SIZE_256 256
15 | #define BUF_SIZE_512 512
16 | #define BUF_SIZE_1024 1024
17 |
18 | #define UNKNOWN "$unknown"
19 |
20 | /**
21 | * path: 路径
22 | * 返回值 1:文件存在; 0:文件不存在
23 | */
24 | int exists(const char *path);
25 |
26 | int getProperty(const char *name, char *dest);
27 |
28 | int shellExecute(const char *cmdStr, char *dest, int len);
29 |
30 | int errorCatch(JNIEnv *env);
31 |
32 | jstring getPackageName(JNIEnv *env, jobject context);
33 |
34 | #endif //SECURITY_CHECK_ANDROID_UTILS_H
35 |
--------------------------------------------------------------------------------
/app/src/main/cpp/include/virtual-apk-check.h:
--------------------------------------------------------------------------------
1 | //
2 | // Created by 陈颂颂 on 2019/12/30.
3 | //
4 |
5 | #ifndef SECURITY_CHECK_ANDROID_VIRTUAL_APK_CHECK_H
6 | #define SECURITY_CHECK_ANDROID_VIRTUAL_APK_CHECK_H
7 |
8 | #include
9 |
10 | /**
11 | * 0. 多开检测 false
12 | * 1. 多开检测 true
13 | * 2. 检测失败($unknown)
14 | * 检测多开
15 | * @return
16 | */
17 | int moreOpenCheck(JNIEnv *env, jobject context);
18 |
19 | #endif //SECURITY_CHECK_ANDROID_VIRTUAL_APK_CHECK_H
20 |
--------------------------------------------------------------------------------
/app/src/main/cpp/native-lib.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "include/utils.h"
4 | #include "include/log.h"
5 | #include "include/emulator-check.h"
6 | #include "include/virtual-apk-check.h"
7 | #include "include/debug-check.h"
8 |
9 | extern "C"
10 | JNIEXPORT jint JNICALL
11 | Java_com_song_deviceinfo_utils_EmulatorUtils_bluetoothCheck(JNIEnv *env, jclass thiz) {
12 | return bluetoothCheck();
13 | }
14 |
15 | extern "C"
16 | JNIEXPORT jint JNICALL
17 | Java_com_song_deviceinfo_utils_EmulatorUtils_getArch(JNIEnv *env, jclass thiz) {
18 | return getArch();
19 | }
20 |
21 | extern "C"
22 | JNIEXPORT jstring JNICALL
23 | Java_com_song_deviceinfo_utils_EmulatorUtils_getMapsArch(JNIEnv *env, jclass thiz) {
24 | char dst[BUF_SIZE_64] = UNKNOWN;
25 | getMapsArch(dst);
26 | return env->NewStringUTF(dst);
27 | }
28 |
29 | extern "C"
30 | JNIEXPORT jint JNICALL
31 | Java_com_song_deviceinfo_utils_EmulatorUtils_specialFilesEmulatorCheck(JNIEnv *env, jclass clazz) {
32 | return specialFilesEmulatorcheck();
33 | }
34 |
35 | extern "C"
36 | JNIEXPORT jint JNICALL
37 | Java_com_song_deviceinfo_utils_EmulatorUtils_thermalCheck(JNIEnv *env, jclass clazz) {
38 | return thermalCheck();
39 | }
40 |
41 | extern "C"
42 | JNIEXPORT jint JNICALL
43 | Java_com_song_deviceinfo_info_VirtualAppInfo_moreOpenCheck(JNIEnv *env, jclass clazz,
44 | jobject context) {
45 | return moreOpenCheck(env, context);
46 | }
47 |
48 | extern "C"
49 | JNIEXPORT jint JNICALL
50 | Java_com_song_deviceinfo_utils_DebugUtils_getTracerPid(JNIEnv *env, jclass clazz) {
51 | return getTracerPid();
52 | }
--------------------------------------------------------------------------------
/app/src/main/cpp/virtual-apk-check.cpp:
--------------------------------------------------------------------------------
1 | //
2 | // 多开 app 检测
3 | // Created by 陈颂颂 on 2019/12/30.
4 | //
5 |
6 | #include
7 | #include "include/virtual-apk-check.h"
8 | #include "include/utils.h"
9 | #include "include/log.h"
10 | #include "include/app-utils.h"
11 | #include
12 | #include
13 |
14 | /**
15 | * 0. 多开检测 false
16 | * 1. 多开检测 true
17 | * -1. 检测失败($unknown)
18 | * 检测多开, 若可访问规定目录则为正常,否则为多开环境
19 | * @return
20 | */
21 | int moreOpenCheck(JNIEnv *env, jobject context) {
22 |
23 | // 判断是否支持ls命令
24 | if (exists("/system/bin/ls")) {
25 | char path[BUF_SIZE_256] = {0};
26 | jstring packageName = getPackageName(env, context);
27 | if (packageName == NULL) {
28 | return -1;
29 | }
30 | const char *name = env->GetStringUTFChars(packageName, 0);
31 | sprintf(path, "ls /data/data/%s", name);
32 | LOGD("moreOpenCheck: path %s", path);
33 | FILE *f = NULL;
34 | f = popen(path, "r");
35 | if (f != NULL) {
36 | char buff[BUF_SIZE_32];
37 | if (fgets(buff, BUF_SIZE_32, f)) {
38 | if (strlen(buff) != 0) {
39 | LOGD("moreOpenCheck: buff %s", buff);
40 | pclose(f);
41 | env->ReleaseStringUTFChars(packageName, name);
42 | return 0;
43 | }
44 | }
45 | pclose(f);
46 | env->ReleaseStringUTFChars(packageName, name);
47 | return 1;
48 | } else {
49 | LOGD("file pointer is null.");
50 | env->ReleaseStringUTFChars(packageName, name);
51 | return -1;
52 | }
53 | } else {
54 | return -1;
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/APP.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 | import android.os.Build;
6 |
7 | import com.bun.miitmdid.core.JLibrary;
8 | import com.didichuxing.doraemonkit.DoraemonKit;
9 | import com.song.deviceinfo.utils.LanguageUtils;
10 | import com.tencent.bugly.crashreport.CrashReport;
11 |
12 | import androidx.multidex.MultiDex;
13 |
14 | /**
15 | * Created by chensongsong on 2020/6/9.
16 | */
17 | public class APP extends Application {
18 |
19 | @Override
20 | protected void attachBaseContext(Context base) {
21 | super.attachBaseContext(base);
22 | MultiDex.install(this);
23 | }
24 |
25 | @Override
26 | public void onCreate() {
27 | super.onCreate();
28 | JLibrary.InitEntry(getApplicationContext());
29 | CrashReport.initCrashReport(getApplicationContext(), "0334b35dea", false);
30 | DoraemonKit.install(this);
31 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
32 | LanguageUtils.changeAppLanguage(this, LanguageUtils.getDefaultLanguage(this));
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/AppInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.content.pm.ApplicationInfo;
6 | import android.content.pm.PackageInfo;
7 | import android.content.pm.PackageManager;
8 | import android.content.pm.Signature;
9 | import android.os.Build;
10 |
11 | import com.google.firebase.perf.metrics.AddTrace;
12 | import com.song.deviceinfo.utils.HashUtils;
13 | import com.song.deviceinfo.utils.TimeUtils;
14 |
15 | import java.util.ArrayList;
16 | import java.util.List;
17 |
18 | import androidx.core.util.Pair;
19 |
20 | /**
21 | * Created by chensongsong on 2020/9/22.
22 | */
23 | public class AppInfo {
24 |
25 | @SuppressLint("PackageManagerGetSignatures")
26 | @AddTrace(name = "AppInfo.getAppInfo")
27 | public static List> getAppInfo(Context context) {
28 | List> list = new ArrayList<>();
29 | PackageManager packageManager = context.getPackageManager();
30 | ApplicationInfo applicationInfo = context.getApplicationInfo();
31 | String packageName = context.getPackageName();
32 | list.add(new Pair<>("AppName", applicationInfo.loadLabel(packageManager).toString()));
33 | list.add(new Pair<>("PackageName", packageName));
34 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
35 | list.add(new Pair<>("MinSdkVersion", applicationInfo.minSdkVersion + ""));
36 | }
37 | list.add(new Pair<>("TargetSdkVersion", applicationInfo.targetSdkVersion + ""));
38 | try {
39 | PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
40 | list.add(new Pair<>("VersionName", packageInfo.versionName));
41 | list.add(new Pair<>("VersionCode", packageInfo.versionCode + ""));
42 | list.add(new Pair<>("FirstInstallTime", TimeUtils.formatDate(packageInfo.firstInstallTime)));
43 | list.add(new Pair<>("LastUpdateTime", TimeUtils.formatDate(packageInfo.lastUpdateTime)));
44 | Signature signature = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0];
45 | list.add(new Pair<>("Sign", HashUtils.md5Encode(signature.toByteArray())));
46 | } catch (Exception e) {
47 | e.printStackTrace();
48 | }
49 | return list;
50 | }
51 |
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/AppListInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 | import android.content.pm.ApplicationInfo;
5 | import android.content.pm.PackageInfo;
6 | import android.content.pm.PackageManager;
7 |
8 | import com.song.deviceinfo.model.beans.ApplicationBean;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | /**
14 | * Created by chensongsong on 2020/6/3.
15 | */
16 | public class AppListInfo {
17 |
18 | /**
19 | * 获取应用列表
20 | *
21 | * @param context
22 | * @return
23 | */
24 | public static List getAppListInfo(Context context) {
25 | List list = new ArrayList<>();
26 | PackageManager packageManager = context.getApplicationContext().getPackageManager();
27 | List installedPackages = packageManager.getInstalledPackages(0);
28 | for (PackageInfo info : installedPackages) {
29 | ApplicationBean bean = new ApplicationBean();
30 | bean.setName(info.applicationInfo.loadLabel(packageManager).toString());
31 | bean.setPackageName(info.packageName);
32 | bean.setVersion(info.versionName);
33 | bean.setIcon(info.applicationInfo.loadIcon(packageManager));
34 | bean.setBuildVersion(info.applicationInfo.targetSdkVersion);
35 | if ((ApplicationInfo.FLAG_SYSTEM & info.applicationInfo.flags) == 0) {
36 | bean.setSystemApp(false);
37 | } else {
38 | bean.setSystemApp(true);
39 | }
40 | list.add(bean);
41 | }
42 | return list;
43 | }
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/BatteryInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.utils.BatteryUtils;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/6/1.
14 | */
15 | public class BatteryInfo {
16 |
17 | /**
18 | * 获取电池信息
19 | *
20 | * @return 电池JSON
21 | */
22 | public static List> getBatteryInfo(Context context) {
23 | ArrayList> list = new ArrayList<>();
24 | BatteryUtils.getBatteryInfo(context, list);
25 | return list;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/BluetoothInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.bluetooth.BluetoothAdapter;
4 | import android.bluetooth.BluetoothDevice;
5 | import android.bluetooth.BluetoothManager;
6 | import android.content.Context;
7 |
8 | import com.google.firebase.perf.metrics.AddTrace;
9 | import com.song.deviceinfo.R;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 | import java.util.Set;
14 |
15 | import androidx.core.util.Pair;
16 |
17 | /**
18 | * Created by chensongsong on 2020/9/22.
19 | */
20 | public class BluetoothInfo {
21 |
22 | @AddTrace(name = "BluetoothInfo.getBluetoothInfo")
23 | public static List> getBluetoothInfo(Context context) {
24 | boolean enable = false;
25 | List> list = new ArrayList<>();
26 | if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
27 | BluetoothManager manager = ((BluetoothManager) context.getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE));
28 | if (manager != null) {
29 | // 仅依赖 BLUETOOTH、ACCESS_WIFI_STATE 权限,TODO 蓝牙需要打开
30 | BluetoothAdapter adapter = manager.getAdapter();
31 | enable = adapter.isEnabled();
32 | Set devices = adapter.getBondedDevices();
33 | for (BluetoothDevice device : devices) {
34 | list.add(new Pair<>("Bluetooth Name", device.getName()));
35 | list.add(new Pair<>("Bluetooth Mac", device.getAddress()));
36 | list.add(new Pair<>("Type", device.getType() + ""));
37 | list.add(new Pair<>("State", device.getBondState() + ""));
38 | list.add(new Pair<>("", ""));
39 | }
40 | }
41 | }
42 | if (list.isEmpty()) {
43 | if (enable) {
44 | list.add(new Pair<>("Bluetooth Scan", context.getString(R.string.usb_not_found)));
45 | } else {
46 | list.add(new Pair<>("Bluetooth Scan", "Please turn on the Bluetooth switch."));
47 | }
48 | }
49 | return list;
50 | }
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/BuildInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 | import android.text.TextUtils;
5 |
6 | import com.song.deviceinfo.utils.CommandUtils;
7 | import com.song.deviceinfo.utils.Constants;
8 |
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | import androidx.core.util.Pair;
13 |
14 | /**
15 | * Created by chensongsong on 2021/9/9.
16 | */
17 | public class BuildInfo {
18 |
19 | public static List> getBuildInfo(Context context) {
20 | List> list = new ArrayList<>();
21 | String[] array = CommandUtils.exec("getprop");
22 | for (String item : array) {
23 | if (!TextUtils.isEmpty(item)) {
24 | try {
25 | String[] split = item.split(":");
26 | if (split.length == 1) {
27 | list.add(new Pair<>(split[0].trim(), Constants.UNKNOWN));
28 | } else if (split.length == 2) {
29 | list.add(new Pair<>(split[0].trim(), split[1].trim()));
30 | }
31 | } catch (Exception e) {
32 | e.printStackTrace();
33 | }
34 | }
35 | }
36 | return list;
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/DebugInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.utils.DebugUtils;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/14.
14 | */
15 | public class DebugInfo {
16 |
17 | public static List> getDebugInfo(Context context) {
18 | List> list = new ArrayList<>();
19 | list.add(new Pair<>("DebugOpen", DebugUtils.isOpenDebug(context) + ""));
20 | list.add(new Pair<>("UsbDebugStatus", DebugUtils.getUsbDebugStatus()));
21 | list.add(new Pair<>("TracerPid", DebugUtils.getTracerPid() + ""));
22 | list.add(new Pair<>("DebugVersion", DebugUtils.isDebugVersion(context) + ""));
23 | list.add(new Pair<>("DebugConnected", DebugUtils.isDebugConnected() + ""));
24 | list.add(new Pair<>("AllowMockLocation", DebugUtils.isAllowMockLocation(context) + ""));
25 | return list;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/DeviceInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.google.firebase.perf.metrics.AddTrace;
6 | import com.song.deviceinfo.utils.DeviceUtils;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | import androidx.core.util.Pair;
12 |
13 | /**
14 | * Created by chensongsong on 2020/8/3.
15 | */
16 | public class DeviceInfo {
17 |
18 | @AddTrace(name = "DeviceInfo.getDeviceInfo")
19 | public static List> getDeviceInfo(Context context) {
20 | List> list = new ArrayList<>();
21 | list.add(new Pair<>("AndroidId", DeviceUtils.getAndroidId(context)));
22 | list.add(new Pair<>("IMEI", DeviceUtils.getIMEI(context)));
23 | DeviceUtils.getDeviceInfo(context,list);
24 | list.add(new Pair<>("ICCID", DeviceUtils.getIccId(context)));
25 | DeviceUtils.getSimInfo(context,list);
26 | DeviceUtils.getOtherInfo(context,list);
27 | return list;
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/HardwareInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 | import android.hardware.Sensor;
5 | import android.hardware.SensorManager;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | import static android.content.Context.SENSOR_SERVICE;
13 |
14 | /**
15 | * Created by chensongsong on 2020/9/22.
16 | */
17 | public class HardwareInfo {
18 |
19 | public static List> getHardwareInfo(Context context) {
20 | List> list = new ArrayList<>();
21 | SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
22 | Sensor gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
23 | list.add(new Pair<>("GYROSCOPE", gyroscope.getName()));
24 | Sensor magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
25 | list.add(new Pair<>("MAGNETIC", magnetic.getName()));
26 | Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
27 | list.add(new Pair<>("ACCELEROMETER", accelerometer.getName()));
28 | return list;
29 | }
30 |
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/HookInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.utils.HookUtils;
6 | import com.song.deviceinfo.utils.XposedHookUtils;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | import androidx.core.util.Pair;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/16.
15 | */
16 | public class HookInfo {
17 |
18 | public static List> getHookInfo(Context context) {
19 | List> list = new ArrayList<>();
20 | list.add(new Pair<>("Process", HookUtils.checkRunningProcesses(context) + ""));
21 | list.add(new Pair<>("XposedHookMethod", HookUtils.chargeXposedHookMethod()));
22 | list.add(new Pair<>("XposedJars", HookUtils.chargeXposedJars()));
23 | list.add(new Pair<>("XposedPackage", HookUtils.chargeXposedPackage(context)));
24 | list.add(new Pair<>("XposedInject", XposedHookUtils.checkXposedInjet(context).toString()));
25 | list.add(new Pair<>("XposedClass", HookUtils.classCheck() + ""));
26 | return list;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/MapsInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.utils.LogUtils;
6 |
7 | import java.io.BufferedReader;
8 | import java.io.FileReader;
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | /**
13 | * Created by chensongsong on 2021/9/10.
14 | */
15 | public class MapsInfo {
16 |
17 | public static List getMapsInfo(Context context) {
18 | List list = new ArrayList<>();
19 | String mapsFilename = "/proc/" + android.os.Process.myPid() + "/maps";
20 | BufferedReader bufferedReader = null;
21 | FileReader fileReader = null;
22 | try {
23 | fileReader = new FileReader(mapsFilename);
24 | bufferedReader = new BufferedReader(fileReader);
25 | String line;
26 | while ((line = bufferedReader.readLine()) != null) {
27 | LogUtils.d("maps line: " + line);
28 | list.add(line);
29 | }
30 | } catch (Exception e) {
31 | e.printStackTrace();
32 | } finally {
33 | try {
34 | if (bufferedReader != null) {
35 | bufferedReader.close();
36 | }
37 | } catch (Exception e) {
38 | e.printStackTrace();
39 | }
40 | try {
41 | if (fileReader != null) {
42 | fileReader.close();
43 | }
44 | } catch (Exception e) {
45 | e.printStackTrace();
46 | }
47 |
48 | }
49 | return list;
50 | }
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/MediaCodecInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.media.MediaCodecList;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | import androidx.core.util.Pair;
9 |
10 | /**
11 | * Created by chensongsong on 2020/6/3.
12 | */
13 | public class MediaCodecInfo {
14 |
15 | public static List> getCodeCInfo() {
16 | ArrayList> list = new ArrayList<>();
17 | int codecCount = MediaCodecList.getCodecCount();
18 | for (int i = 0; i < codecCount; i++) {
19 | android.media.MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
20 | if (codecInfo != null) {
21 | String[] types = codecInfo.getSupportedTypes();
22 | if (types != null) {
23 | for (String type : types) {
24 | list.add(new Pair<>(codecInfo.getName(), type));
25 | }
26 | }
27 | }
28 |
29 | }
30 | return list;
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/RootInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.utils.CommandUtils;
6 | import com.song.deviceinfo.utils.RootUtils;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | import androidx.core.util.Pair;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/15.
15 | */
16 | public class RootInfo {
17 |
18 | public static List> getRootInfo(Context context) {
19 | List> list = new ArrayList<>();
20 | list.add(new Pair<>("Su_v", CommandUtils.execute("su -v")));
21 | list.add(new Pair<>("RwPaths", RootUtils.existingRWPaths().toString()));
22 | list.add(new Pair<>("DangerousProperties", RootUtils.existingDangerousProperties().toString()));
23 | list.add(new Pair<>("RootFiles", RootUtils.existingRootFiles().toString()));
24 | list.add(new Pair<>("RootPackages", RootUtils.existingRootPackages(context).toString()));
25 | return list;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/StoreInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.model.beans.StorageBean;
6 | import com.song.deviceinfo.utils.MemoryUtils;
7 | import com.song.deviceinfo.utils.SdUtils;
8 |
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | /**
13 | * Created by chensongsong on 2020/6/1.
14 | */
15 | public class StoreInfo {
16 |
17 | /**
18 | * 获取内存信息
19 | *
20 | * @param context
21 | * @return
22 | */
23 | public static List getStoreInfo(Context context) {
24 | List list = new ArrayList<>();
25 | StorageBean bean = new StorageBean();
26 | SdUtils.getStoreInfo(context, bean);
27 | MemoryUtils.getMemoryInfo(context, bean);
28 | list.add(bean);
29 | return list;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/ThermalInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.text.TextUtils;
4 |
5 | import com.song.deviceinfo.utils.FileUtils;
6 |
7 | import java.io.File;
8 | import java.io.FilenameFilter;
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | import androidx.core.util.Pair;
13 |
14 | /**
15 | * Created by chensongsong on 2020/6/1.
16 | */
17 | public class ThermalInfo {
18 |
19 | public static List> getThermalInfo() {
20 | List> list = new ArrayList<>();
21 | File[] files = filter("/sys/class/thermal/", new ThermalFilter("thermal_zone"));
22 | if (files != null && files.length > 0) {
23 | for (File file : files) {
24 | String type = FileUtils.readFile(new File(file, "type"));
25 | if (!TextUtils.isEmpty(type)) {
26 | String temp = FileUtils.readFile(new File(file, "temp"));
27 | if (!TextUtils.isEmpty(temp)) {
28 | list.add(new Pair<>(type.trim(), temp.trim()));
29 | }
30 | }
31 | }
32 | }
33 | return list;
34 | }
35 |
36 | private static File[] filter(String path, FilenameFilter filter) {
37 | File file = new File(path);
38 | if (file.exists()) {
39 | return file.listFiles(filter);
40 | }
41 | return null;
42 | }
43 |
44 | private static class ThermalFilter implements FilenameFilter {
45 |
46 | private String condition;
47 |
48 | public ThermalFilter(String condition) {
49 | this.condition = condition;
50 | }
51 |
52 | @Override
53 | public boolean accept(File dir, String name) {
54 | return name.startsWith(condition);
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/info/WifiInfo.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.info;
2 |
3 | import android.content.Context;
4 | import android.net.wifi.ScanResult;
5 | import android.net.wifi.WifiManager;
6 |
7 | import com.google.firebase.perf.metrics.AddTrace;
8 | import com.song.deviceinfo.R;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | import androidx.core.util.Pair;
14 |
15 | /**
16 | * Created by chensongsong on 2020/9/22.
17 | */
18 | public class WifiInfo {
19 |
20 | @AddTrace(name = "WifiInfo.getWifiInfo")
21 | public static List> getWifiInfo(Context context) {
22 | boolean enable = false;
23 | List> list = new ArrayList<>();
24 | WifiManager manager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
25 | if (manager != null) {
26 | // 依赖 ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE 权限,需要 WIFI 打开,TODO Android Q 之后 WiFi 扫描获取 BSSID 为随机生成
27 | List scanResults = manager.getScanResults();
28 | enable = manager.isWifiEnabled();
29 | if (scanResults != null && !scanResults.isEmpty()) {
30 | for (ScanResult scanResult : scanResults) {
31 | list.add(new Pair<>("SSID", scanResult.SSID));
32 | list.add(new Pair<>("BSSID", scanResult.BSSID));
33 | list.add(new Pair<>("Capabilities", scanResult.capabilities));
34 | list.add(new Pair<>("Frequency", scanResult.frequency + ""));
35 | list.add(new Pair<>("Level", scanResult.level + ""));
36 | list.add(new Pair<>("", ""));
37 | }
38 | }
39 | try {
40 | // 依赖 CHANGE_WIFI_STATE 权限
41 | manager.startScan();
42 | } catch (Exception e) {
43 | e.printStackTrace();
44 | }
45 | }
46 | if (list.isEmpty()) {
47 | if (enable) {
48 | list.add(new Pair<>("WIFI Scan", context.getString(R.string.usb_not_found)));
49 | } else {
50 | list.add(new Pair<>("WIFI Scan", "Please turn on WiFi switch"));
51 | }
52 | }
53 | return list;
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/model/Test.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.model;
2 |
3 | public class Test {
4 | }
5 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/model/beans/CpuBean.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.model.beans;
2 |
3 | public class CpuBean {
4 |
5 | private String[] parts;
6 | private String[] implementers;
7 | private String hardware;
8 | private String features;
9 |
10 | public String[] getParts() {
11 | return parts;
12 | }
13 |
14 | public void setParts(String[] parts) {
15 | this.parts = parts;
16 | }
17 |
18 | public String[] getImplementers() {
19 | return implementers;
20 | }
21 |
22 | public void setImplementers(String[] implementers) {
23 | this.implementers = implementers;
24 | }
25 |
26 | public String getHardware() {
27 | return hardware;
28 | }
29 |
30 | public void setHardware(String hardware) {
31 | this.hardware = hardware;
32 | }
33 |
34 | public String getFeatures() {
35 | return features;
36 | }
37 |
38 | public void setFeatures(String features) {
39 | this.features = features;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/model/beans/InputBean.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.model.beans;
2 |
3 | import org.json.JSONObject;
4 |
5 | /**
6 | * Created by chensongsong on 2020/6/4.
7 | */
8 | public class InputBean {
9 |
10 | private String name;
11 | private String attribute;
12 | private String sys;
13 | private String handlers;
14 |
15 | public String getName() {
16 | return name;
17 | }
18 |
19 | public void setName(String name) {
20 | this.name = name;
21 | }
22 |
23 | public String getAttribute() {
24 | return attribute;
25 | }
26 |
27 | public void setAttribute(String attribute) {
28 | this.attribute = attribute;
29 | }
30 |
31 | public String getSys() {
32 | return sys;
33 | }
34 |
35 | public void setSys(String sys) {
36 | this.sys = sys;
37 | }
38 |
39 | public String getHandlers() {
40 | return handlers;
41 | }
42 |
43 | public void setHandlers(String handlers) {
44 | this.handlers = handlers;
45 | }
46 |
47 | @Override
48 | public String toString() {
49 | return "InputBean{" +
50 | "name='" + name + '\'' +
51 | ", attribute='" + attribute + '\'' +
52 | ", sys='" + sys + '\'' +
53 | ", handlers='" + handlers + '\'' +
54 | '}';
55 | }
56 |
57 | public JSONObject toJSON() {
58 | JSONObject jsonObject = new JSONObject();
59 | try {
60 | jsonObject.put("name", name);
61 | jsonObject.put("attribute", attribute);
62 | jsonObject.put("sys", sys);
63 | jsonObject.put("handlers", handlers);
64 | } catch (Exception e) {
65 | e.printStackTrace();
66 | }
67 | return jsonObject;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/model/beans/SimBean.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.model.beans;
2 |
3 | /**
4 | * Created by chensongsong on 2020/9/11.
5 | */
6 | public class SimBean {
7 |
8 | private int id;
9 | private int simId;
10 | private String iccId;
11 | private String carrierName;
12 | private String displayName;
13 | private String number;
14 | private String mcc;
15 | private String mnc;
16 |
17 | public SimBean(int id, int simId, String iccId, String carrierName, String displayName, String number, String mcc, String mnc) {
18 | this.id = id;
19 | this.simId = simId;
20 | this.iccId = iccId;
21 | this.carrierName = carrierName;
22 | this.displayName = displayName;
23 | this.number = number;
24 | this.mcc = mcc;
25 | this.mnc = mnc;
26 | }
27 |
28 | public int getId() {
29 | return id;
30 | }
31 |
32 | public void setId(int id) {
33 | this.id = id;
34 | }
35 |
36 | public int getSimId() {
37 | return simId;
38 | }
39 |
40 | public void setSimId(int simId) {
41 | this.simId = simId;
42 | }
43 |
44 | public String getIccId() {
45 | return iccId;
46 | }
47 |
48 | public void setIccId(String iccId) {
49 | this.iccId = iccId;
50 | }
51 |
52 | public String getCarrierName() {
53 | return carrierName;
54 | }
55 |
56 | public void setCarrierName(String carrierName) {
57 | this.carrierName = carrierName;
58 | }
59 |
60 | public String getDisplayName() {
61 | return displayName;
62 | }
63 |
64 | public void setDisplayName(String displayName) {
65 | this.displayName = displayName;
66 | }
67 |
68 | public String getNumber() {
69 | return number;
70 | }
71 |
72 | public void setNumber(String number) {
73 | this.number = number;
74 | }
75 |
76 | public String getMcc() {
77 | return mcc;
78 | }
79 |
80 | public void setMcc(String mcc) {
81 | this.mcc = mcc;
82 | }
83 |
84 | public String getMnc() {
85 | return mnc;
86 | }
87 |
88 | public void setMnc(String mnc) {
89 | this.mnc = mnc;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/model/beans/USBBean.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.model.beans;
2 |
3 | import org.jetbrains.annotations.NotNull;
4 |
5 | /**
6 | * Created by chensongsong on 2020/6/8.
7 | */
8 | public class USBBean {
9 |
10 | public String path;
11 |
12 | public String num;
13 |
14 | public String manufacturerName;
15 |
16 | public String productName;
17 |
18 | public String version;
19 |
20 | public String serialNumber;
21 |
22 | public String vendorId;
23 |
24 | public String productId;
25 |
26 | @NotNull
27 | @Override
28 | public String toString() {
29 | StringBuilder sb = new StringBuilder();
30 | sb.append("UsbDevice[mName=");
31 | sb.append(this.path);
32 | sb.append(",mVendorId=");
33 | sb.append(this.vendorId);
34 | sb.append(",mProductId=");
35 | sb.append(this.productId);
36 | sb.append(",mManufacturerName=");
37 | sb.append(this.manufacturerName);
38 | sb.append(",mProductName=");
39 | sb.append(this.productName);
40 | sb.append(",mVersion=");
41 | sb.append(this.version);
42 | sb.append(",mSerialNumber=");
43 | sb.append(this.serialNumber);
44 | sb.append(",mConfigurations=[");
45 | sb = new StringBuilder(sb.toString());
46 | sb.append("]");
47 | return sb.toString();
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/about/AboutFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.about;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.song.deviceinfo.R;
10 |
11 | import androidx.annotation.NonNull;
12 | import androidx.annotation.Nullable;
13 | import androidx.fragment.app.Fragment;
14 | import androidx.lifecycle.Observer;
15 | import androidx.lifecycle.ViewModelProviders;
16 | import butterknife.BindView;
17 | import butterknife.ButterKnife;
18 | import butterknife.Unbinder;
19 |
20 | /**
21 | * Created by chensongsong on 2020/5/26.
22 | */
23 | public class AboutFragment extends Fragment {
24 |
25 | private AboutViewModel aboutViewModel;
26 | private Unbinder bind;
27 | @BindView(R.id.tv_about_version)
28 | TextView versionTv;
29 |
30 | @Override
31 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
32 | @Nullable Bundle savedInstanceState) {
33 | View root = inflater.inflate(R.layout.fragment_about, container, false);
34 | bind = ButterKnife.bind(this, root);
35 | return root;
36 | }
37 |
38 | @Override
39 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
40 | super.onActivityCreated(savedInstanceState);
41 | aboutViewModel =
42 | ViewModelProviders.of(this).get(AboutViewModel.class);
43 | aboutViewModel.getText().observe(getViewLifecycleOwner(), new Observer() {
44 | @Override
45 | public void onChanged(@Nullable String s) {
46 | versionTv.setText(s);
47 | }
48 | });
49 | aboutViewModel.setData(getContext());
50 | }
51 |
52 | @Override
53 | public void onDestroyView() {
54 | super.onDestroyView();
55 | bind.unbind();
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/about/AboutViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.about;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.R;
6 | import com.song.deviceinfo.utils.Constants;
7 |
8 | import androidx.lifecycle.LiveData;
9 | import androidx.lifecycle.MutableLiveData;
10 | import androidx.lifecycle.ViewModel;
11 |
12 | public class AboutViewModel extends ViewModel {
13 |
14 | private MutableLiveData mText;
15 |
16 | public AboutViewModel() {
17 | mText = new MutableLiveData<>();
18 | }
19 |
20 | public LiveData getText() {
21 | return mText;
22 | }
23 |
24 | public void setData(Context context) {
25 | mText.setValue(String.format(context.getString(R.string.about_version), Constants.VERSION));
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/app/AppFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.app;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/9/22.
15 | */
16 | public class AppFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(AppViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((AppViewModel) viewModel).getAppInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/app/AppViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.app;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.AppInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/9/22.
14 | */
15 | public class AppViewModel extends NormalViewModel {
16 |
17 | public List> getAppInfo(Context context) {
18 | return AppInfo.getAppInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/applist/AppListFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.applist;
2 |
3 | import com.song.deviceinfo.model.beans.ApplicationBean;
4 | import com.song.deviceinfo.ui.base.BaseAdapter;
5 | import com.song.deviceinfo.ui.base.BaseFragment;
6 | import com.song.deviceinfo.ui.base.BaseViewModel;
7 | import com.song.deviceinfo.utils.LogUtils;
8 | import com.song.deviceinfo.utils.ThreadPoolUtils;
9 |
10 | import org.json.JSONArray;
11 |
12 | import java.util.List;
13 |
14 | import androidx.lifecycle.ViewModelProviders;
15 |
16 | /**
17 | * Created by chensongsong on 2020/6/3.
18 | */
19 | public class AppListFragment extends BaseFragment {
20 |
21 | @Override
22 | protected BaseAdapter crateAdapter() {
23 | return new AppListAdapter(getContext());
24 | }
25 |
26 | @Override
27 | protected BaseViewModel crateViewModel() {
28 | return ViewModelProviders.of(this).get(AppListViewModel.class);
29 | }
30 |
31 | @Override
32 | protected void refreshData() {
33 | ThreadPoolUtils.getInstance().execute(() -> {
34 | final List list = getAppListInfo();
35 | JSONArray jsonArray = new JSONArray();
36 | for (ApplicationBean bean : list) {
37 | try {
38 | jsonArray.put(bean.toJSON());
39 | } catch (Exception e) {
40 | e.printStackTrace();
41 | }
42 | }
43 | LogUtils.printLongString(jsonArray.toString());
44 | mainHandler.post(() -> {
45 | viewModel.setValue(list);
46 | });
47 | });
48 | }
49 |
50 | private List getAppListInfo() {
51 | return ((AppListViewModel) viewModel).getAppListInfo(getContext());
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/applist/AppListViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.applist;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.AppListInfo;
6 | import com.song.deviceinfo.model.beans.ApplicationBean;
7 | import com.song.deviceinfo.ui.base.BaseViewModel;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * Created by chensongsong on 2020/6/3.
13 | */
14 | public class AppListViewModel extends BaseViewModel {
15 |
16 | protected List getAppListInfo(Context context) {
17 | return AppListInfo.getAppListInfo(context);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/base/BaseAdapter.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.base;
2 |
3 | import android.content.Context;
4 |
5 | import java.util.List;
6 |
7 | import androidx.recyclerview.widget.RecyclerView;
8 |
9 | /**
10 | * Created by chensongsong on 2020/5/25.
11 | */
12 | public abstract class BaseAdapter extends RecyclerView.Adapter {
13 |
14 | protected List data = null;
15 | protected Context context;
16 |
17 | public BaseAdapter(Context context) {
18 | this.context = context;
19 | }
20 |
21 | public void updateData(List data) {
22 | this.data = data;
23 | notifyDataSetChanged();
24 | }
25 |
26 | @Override
27 | public int getItemCount() {
28 | return data == null ? 0 : data.size();
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/base/BaseViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.base;
2 |
3 | import java.util.List;
4 |
5 | import androidx.lifecycle.LiveData;
6 | import androidx.lifecycle.MutableLiveData;
7 | import androidx.lifecycle.ViewModel;
8 |
9 | /**
10 | * Created by chensongsong on 2020/5/26.
11 | */
12 | public class BaseViewModel extends ViewModel {
13 |
14 | private MutableLiveData> mRecyclerView;
15 |
16 | public BaseViewModel() {
17 | mRecyclerView = new MutableLiveData<>();
18 | }
19 |
20 | public LiveData> getRecyclerView() {
21 | return mRecyclerView;
22 | }
23 |
24 | public void setValue(List list) {
25 | mRecyclerView.setValue(list);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/base/NormalAdapter.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.base;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.song.deviceinfo.R;
10 |
11 | import androidx.annotation.NonNull;
12 | import androidx.core.util.Pair;
13 | import androidx.recyclerview.widget.RecyclerView;
14 |
15 | /**
16 | * Created by chensongsong on 2020/5/27.
17 | */
18 | public class NormalAdapter extends BaseAdapter, NormalAdapter.NormalHolder> {
19 |
20 | public NormalAdapter(Context context) {
21 | super(context);
22 | }
23 |
24 | @NonNull
25 | @Override
26 | public NormalHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
27 | View root = LayoutInflater.from(context).inflate(R.layout.item_normal, parent, false);
28 | return new NormalHolder(root);
29 | }
30 |
31 | @Override
32 | public void onBindViewHolder(@NonNull NormalHolder holder, int position) {
33 | if (position % 2 == 0) {
34 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_white));
35 | } else {
36 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_E8E8E8));
37 | }
38 | Pair pair = data.get(position);
39 | String key = pair.first;
40 | String value = pair.second;
41 | holder.keyTv.setText(key);
42 | holder.valueTv.setText(value);
43 | }
44 |
45 | static class NormalHolder extends RecyclerView.ViewHolder {
46 |
47 | View root;
48 | TextView keyTv;
49 | TextView valueTv;
50 |
51 | public NormalHolder(View view) {
52 | super(view);
53 | root = view;
54 | keyTv = view.findViewById(R.id.tv_key);
55 | valueTv = view.findViewById(R.id.tv_value);
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/base/NormalFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.base;
2 |
3 | import com.song.deviceinfo.utils.LogUtils;
4 | import com.song.deviceinfo.utils.ThreadPoolUtils;
5 |
6 | import org.json.JSONObject;
7 |
8 | import java.util.List;
9 | import java.util.Objects;
10 |
11 | import androidx.core.util.Pair;
12 |
13 | /**
14 | * Created by chensongsong on 2020/5/27.
15 | */
16 | public abstract class NormalFragment extends BaseFragment> {
17 |
18 | @Override
19 | protected void refreshData() {
20 | ThreadPoolUtils.getInstance().execute(() -> {
21 | final List> list = getNormalInfo();
22 | JSONObject jsonObject = new JSONObject();
23 | for (Pair pair : list) {
24 | try {
25 | jsonObject.put(Objects.requireNonNull(pair.first), pair.second);
26 | } catch (Exception e) {
27 | e.printStackTrace();
28 | }
29 | }
30 | LogUtils.printLongString(jsonObject.toString());
31 | mainHandler.post(() -> {
32 | viewModel.setValue(list);
33 | });
34 | });
35 | }
36 |
37 | protected abstract List> getNormalInfo();
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/base/NormalViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.base;
2 |
3 | import androidx.core.util.Pair;
4 |
5 | /**
6 | * Created by chensongsong on 2020/5/27.
7 | */
8 | public abstract class NormalViewModel extends BaseViewModel> {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/battery/BatteryFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.battery;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/5/27.
15 | */
16 | public class BatteryFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(BatteryViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((BatteryViewModel)viewModel).getBatteryInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/battery/BatteryViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.battery;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.BatteryInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/5/27.
14 | */
15 | public class BatteryViewModel extends NormalViewModel {
16 |
17 | public List> getBatteryInfo(Context context) {
18 | return BatteryInfo.getBatteryInfo(context);
19 | }
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/bluetooth/BluetoothFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.bluetooth;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/9/22.
15 | */
16 | public class BluetoothFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(BluetoothViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((BluetoothViewModel) viewModel).getBluetoothInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/bluetooth/BluetoothViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.bluetooth;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.BluetoothInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/9/22.
14 | */
15 | public class BluetoothViewModel extends NormalViewModel {
16 |
17 | public List> getBluetoothInfo(Context context) {
18 | return BluetoothInfo.getBluetoothInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/build/BuildInfoFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.build;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2021/9/9.
15 | */
16 | public class BuildInfoFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(BuildInfoViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((BuildInfoViewModel) viewModel).getBuildInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/build/BuildInfoViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.build;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.BuildInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2021/9/9.
14 | */
15 | public class BuildInfoViewModel extends NormalViewModel {
16 |
17 | public List> getBuildInfo(Context context) {
18 | return BuildInfo.getBuildInfo(context);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/camera/CameraFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.camera;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/9/30.
15 | */
16 | public class CameraFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(CameraViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((CameraViewModel) viewModel).getCameraInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/camera/CameraViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.camera;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.CameraInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/9/30.
14 | */
15 | public class CameraViewModel extends NormalViewModel {
16 |
17 | public List> getCameraInfo(Context context) {
18 | return CameraInfo.getCameraInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/codecs/CodecAdapter.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.codecs;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.song.deviceinfo.R;
10 | import com.song.deviceinfo.ui.base.BaseAdapter;
11 |
12 | import androidx.annotation.NonNull;
13 | import androidx.core.util.Pair;
14 | import androidx.recyclerview.widget.RecyclerView;
15 | import butterknife.BindView;
16 | import butterknife.ButterKnife;
17 |
18 | /**
19 | * Created by chensongsong on 2020/6/3.
20 | */
21 | public class CodecAdapter extends BaseAdapter, CodecAdapter.CodecHolder> {
22 |
23 | public CodecAdapter(Context context) {
24 | super(context);
25 | }
26 |
27 | @NonNull
28 | @Override
29 | public CodecHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
30 | View root = LayoutInflater.from(context).inflate(R.layout.item_codecs, parent, false);
31 | return new CodecHolder(root);
32 | }
33 |
34 | @Override
35 | public void onBindViewHolder(@NonNull CodecHolder holder, int position) {
36 | if (position % 2 == 0) {
37 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_white));
38 | } else {
39 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_E8E8E8));
40 | }
41 | Pair bean = data.get(position);
42 | holder.nameTv.setText(bean.first);
43 | holder.typeTv.setText(bean.second);
44 | }
45 |
46 | static class CodecHolder extends RecyclerView.ViewHolder {
47 |
48 | View root;
49 | @BindView(R.id.tv_codecs_name)
50 | TextView nameTv;
51 | @BindView(R.id.tv_codecs_type)
52 | TextView typeTv;
53 |
54 | public CodecHolder(View view) {
55 | super(view);
56 | root = view;
57 | ButterKnife.bind(this, root);
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/codecs/CodecFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.codecs;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseFragment;
5 | import com.song.deviceinfo.ui.base.BaseViewModel;
6 | import com.song.deviceinfo.utils.LogUtils;
7 | import com.song.deviceinfo.utils.ThreadPoolUtils;
8 |
9 | import org.json.JSONObject;
10 |
11 | import java.util.List;
12 | import java.util.Objects;
13 |
14 | import androidx.core.util.Pair;
15 | import androidx.lifecycle.ViewModelProviders;
16 |
17 | /**
18 | * Created by chensongsong on 2020/6/3.
19 | */
20 | public class CodecFragment extends BaseFragment> {
21 |
22 | @Override
23 | protected BaseAdapter crateAdapter() {
24 | return new CodecAdapter(getContext());
25 | }
26 |
27 | @Override
28 | protected BaseViewModel crateViewModel() {
29 | return ViewModelProviders.of(this).get(CodecViewModel.class);
30 | }
31 |
32 | @Override
33 | protected void refreshData() {
34 | ThreadPoolUtils.getInstance().execute(() -> {
35 | final List> list = getCodeCInfo();
36 | JSONObject jsonObject = new JSONObject();
37 | for (Pair pair : list) {
38 | try {
39 | jsonObject.put(Objects.requireNonNull(pair.first), pair.second);
40 | } catch (Exception e) {
41 | e.printStackTrace();
42 | }
43 | }
44 | LogUtils.printLongString(jsonObject.toString());
45 | mainHandler.post(() -> {
46 | viewModel.setValue(list);
47 | });
48 | });
49 | }
50 |
51 | private List> getCodeCInfo() {
52 | return ((CodecViewModel) viewModel).getCodeCInfo();
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/codecs/CodecViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.codecs;
2 |
3 | import com.song.deviceinfo.info.MediaCodecInfo;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 |
6 | import java.util.List;
7 |
8 | import androidx.core.util.Pair;
9 |
10 | /**
11 | * Created by chensongsong on 2020/6/3.
12 | */
13 | public class CodecViewModel extends BaseViewModel {
14 |
15 | protected List> getCodeCInfo() {
16 | return MediaCodecInfo.getCodeCInfo();
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/debug/DebugFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.debug;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/14.
15 | */
16 | public class DebugFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(DebugViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((DebugViewModel) viewModel).getDebugInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/debug/DebugViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.debug;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.DebugInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/14.
14 | */
15 | public class DebugViewModel extends NormalViewModel {
16 |
17 | public List> getDebugInfo(Context context) {
18 | return DebugInfo.getDebugInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/device/DeviceFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.device;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/8/3.
15 | */
16 | public class DeviceFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(DeviceViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((DeviceViewModel) viewModel).getDeviceInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/device/DeviceViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.device;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.DeviceInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/8/3.
14 | */
15 | public class DeviceViewModel extends NormalViewModel {
16 |
17 | public List> getDeviceInfo(Context context) {
18 | return DeviceInfo.getDeviceInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/emulator/EmulatorFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.emulator;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/9.
15 | */
16 | public class EmulatorFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(EmulatorViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((EmulatorViewModel) viewModel).getEmulatorInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/emulator/EmulatorViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.emulator;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.EmulatorInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/9.
14 | */
15 | public class EmulatorViewModel extends NormalViewModel {
16 |
17 | public List> getEmulatorInfo(Context context) {
18 | return EmulatorInfo.getEmulatorInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/hardware/HardwareFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.hardware;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2021/9/29.
15 | */
16 | public class HardwareFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(HardwareViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((HardwareViewModel) viewModel).getHardwareInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/hardware/HardwareViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.hardware;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.HardwareInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2021/9/29.
14 | */
15 | public class HardwareViewModel extends NormalViewModel {
16 |
17 | public List> getHardwareInfo(Context context) {
18 | return HardwareInfo.getHardwareInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/hook/HookFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.hook;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/16.
15 | */
16 | public class HookFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(HookViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((HookViewModel) viewModel).getHookInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/hook/HookViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.hook;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.HookInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/16.
14 | */
15 | public class HookViewModel extends NormalViewModel {
16 |
17 | public List> getHookInfo(Context context) {
18 | return HookInfo.getHookInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/input/InputFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.input;
2 |
3 | import com.song.deviceinfo.model.beans.InputBean;
4 | import com.song.deviceinfo.ui.base.BaseAdapter;
5 | import com.song.deviceinfo.ui.base.BaseFragment;
6 | import com.song.deviceinfo.ui.base.BaseViewModel;
7 | import com.song.deviceinfo.utils.LogUtils;
8 | import com.song.deviceinfo.utils.ThreadPoolUtils;
9 |
10 | import org.json.JSONArray;
11 |
12 | import java.util.List;
13 |
14 | import androidx.lifecycle.ViewModelProviders;
15 |
16 | /**
17 | * Created by chensongsong on 2020/6/4.
18 | */
19 | public class InputFragment extends BaseFragment {
20 |
21 | @Override
22 | protected BaseAdapter crateAdapter() {
23 | return new InputAdapter(getContext());
24 | }
25 |
26 | @Override
27 | protected BaseViewModel crateViewModel() {
28 | return ViewModelProviders.of(this).get(InputViewModel.class);
29 | }
30 |
31 | @Override
32 | protected void refreshData() {
33 | ThreadPoolUtils.getInstance().execute(() -> {
34 | final List list = getInputInfo();
35 | JSONArray jsonArray = new JSONArray();
36 | for (InputBean bean : list) {
37 | try {
38 | jsonArray.put(bean.toJSON());
39 | } catch (Exception e) {
40 | e.printStackTrace();
41 | }
42 | }
43 | LogUtils.printLongString(jsonArray.toString());
44 | mainHandler.post(() -> {
45 | viewModel.setValue(list);
46 | });
47 | });
48 | }
49 |
50 | private List getInputInfo() {
51 | return ((InputViewModel) viewModel).getInputInfo();
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/input/InputViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.input;
2 |
3 | import com.song.deviceinfo.info.InputInfo;
4 | import com.song.deviceinfo.model.beans.InputBean;
5 | import com.song.deviceinfo.ui.base.BaseViewModel;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | * Created by chensongsong on 2020/6/4.
11 | */
12 | public class InputViewModel extends BaseViewModel {
13 |
14 | protected List getInputInfo() {
15 | return InputInfo.getInputInfo();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/maps/MapsFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.maps;
2 |
3 | import com.song.deviceinfo.ui.base.BaseViewModel;
4 | import com.song.deviceinfo.ui.oneline.OneLineFragment;
5 | import com.song.deviceinfo.utils.LogUtils;
6 | import com.song.deviceinfo.utils.ThreadPoolUtils;
7 |
8 | import org.json.JSONArray;
9 |
10 | import java.util.List;
11 |
12 | import androidx.lifecycle.ViewModelProviders;
13 |
14 | /**
15 | * Created by chensongsong on 2021/9/10.
16 | */
17 | public class MapsFragment extends OneLineFragment {
18 |
19 | @Override
20 | protected BaseViewModel crateViewModel() {
21 | return ViewModelProviders.of(this).get(MapsViewModel.class);
22 | }
23 |
24 | @Override
25 | protected void refreshData() {
26 | ThreadPoolUtils.getInstance().execute(() -> {
27 | final List list = getMapsInfo();
28 | JSONArray jsonArray = new JSONArray();
29 | for (String item : list) {
30 | try {
31 | jsonArray.put(item);
32 | } catch (Exception e) {
33 | e.printStackTrace();
34 | }
35 | }
36 | LogUtils.printLongString(jsonArray.toString());
37 | mainHandler.post(() -> {
38 | viewModel.setValue(list);
39 | });
40 | });
41 | }
42 |
43 | private List getMapsInfo() {
44 | return ((MapsViewModel) viewModel).getMapsInfo(getContext());
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/maps/MapsViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.maps;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.MapsInfo;
6 | import com.song.deviceinfo.ui.base.BaseViewModel;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * Created by chensongsong on 2021/9/10.
12 | */
13 | public class MapsViewModel extends BaseViewModel {
14 |
15 | protected List getMapsInfo(Context context){
16 | return MapsInfo.getMapsInfo(context);
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/net/NetFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.net;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/5/25.
15 | */
16 | public class NetFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(NetViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((NetViewModel) viewModel).getNetWorkInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/net/NetViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.net;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.NetWorkInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | public class NetViewModel extends NormalViewModel {
13 |
14 | public List> getNetWorkInfo(Context context) {
15 | return NetWorkInfo.getNetWorkInfo(context);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/oneline/OneLineAdapter.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.oneline;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.song.deviceinfo.R;
10 | import com.song.deviceinfo.ui.base.BaseAdapter;
11 |
12 | import androidx.annotation.NonNull;
13 | import androidx.recyclerview.widget.RecyclerView;
14 | import butterknife.BindView;
15 | import butterknife.ButterKnife;
16 |
17 | /**
18 | * Created by chensongsong on 2021/9/10.
19 | */
20 | public class OneLineAdapter extends BaseAdapter {
21 |
22 | public OneLineAdapter(Context context) {
23 | super(context);
24 | }
25 |
26 | @NonNull
27 | @Override
28 | public CodecHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
29 | View root = LayoutInflater.from(context).inflate(R.layout.item_one_line, parent, false);
30 | return new CodecHolder(root);
31 | }
32 |
33 | @Override
34 | public void onBindViewHolder(@NonNull CodecHolder holder, int position) {
35 | if (position % 2 == 0) {
36 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_white));
37 | } else {
38 | holder.root.setBackgroundColor(context.getResources().getColor(R.color.color_E8E8E8));
39 | }
40 | String bean = data.get(position);
41 | holder.nameTv.setText(bean);
42 | }
43 |
44 | static class CodecHolder extends RecyclerView.ViewHolder {
45 |
46 | View root;
47 | @BindView(R.id.tv_one_line)
48 | TextView nameTv;
49 |
50 | public CodecHolder(View view) {
51 | super(view);
52 | root = view;
53 | ButterKnife.bind(this, root);
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/oneline/OneLineFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.oneline;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseFragment;
5 | import com.song.deviceinfo.ui.base.BaseViewModel;
6 | import com.song.deviceinfo.utils.LogUtils;
7 | import com.song.deviceinfo.utils.ThreadPoolUtils;
8 |
9 | import org.json.JSONArray;
10 |
11 | import java.util.List;
12 |
13 | import androidx.lifecycle.ViewModelProviders;
14 |
15 | /**
16 | * Created by chensongsong on 2021/9/10.
17 | */
18 | public class OneLineFragment extends BaseFragment> {
19 |
20 | @Override
21 | protected BaseAdapter crateAdapter() {
22 | return new OneLineAdapter(getContext());
23 | }
24 |
25 | @Override
26 | protected BaseViewModel crateViewModel() {
27 | return ViewModelProviders.of(this).get(OneLineViewModel.class);
28 | }
29 |
30 | @Override
31 | protected void refreshData() {
32 | ThreadPoolUtils.getInstance().execute(() -> {
33 | final List list = getOneLineInfo();
34 | JSONArray jsonArray = new JSONArray();
35 | for (String item : list) {
36 | try {
37 | jsonArray.put(item);
38 | } catch (Exception e) {
39 | e.printStackTrace();
40 | }
41 | }
42 | LogUtils.printLongString(jsonArray.toString());
43 | mainHandler.post(() -> {
44 | viewModel.setValue(list);
45 | });
46 | });
47 | }
48 |
49 | private List getOneLineInfo() {
50 | return ((OneLineViewModel) viewModel).getOneLineInfo();
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/oneline/OneLineViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.oneline;
2 |
3 | import com.song.deviceinfo.ui.base.BaseViewModel;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * Created by chensongsong on 2021/9/10.
9 | */
10 | public abstract class OneLineViewModel extends BaseViewModel {
11 |
12 | protected abstract List getOneLineInfo();
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/others/OthersFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.others;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/9/22.
15 | */
16 | public class OthersFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(OthersViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((OthersViewModel) viewModel).getOthersInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/others/OthersViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.others;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.OthersInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/9/22.
14 | */
15 | public class OthersViewModel extends NormalViewModel {
16 |
17 | public List> getOthersInfo(Context context) {
18 | return OthersInfo.getOthersInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/partitions/PartitionsFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.partitions;
2 |
3 | import com.song.deviceinfo.model.beans.PartitionsBean;
4 | import com.song.deviceinfo.ui.base.BaseAdapter;
5 | import com.song.deviceinfo.ui.base.BaseFragment;
6 | import com.song.deviceinfo.ui.base.BaseViewModel;
7 | import com.song.deviceinfo.utils.LogUtils;
8 | import com.song.deviceinfo.utils.ThreadPoolUtils;
9 |
10 | import org.json.JSONArray;
11 |
12 | import java.util.List;
13 |
14 | import androidx.lifecycle.ViewModelProviders;
15 |
16 | /**
17 | * Created by chensongsong on 2020/5/29.
18 | */
19 | public class PartitionsFragment extends BaseFragment {
20 |
21 | @Override
22 | protected BaseAdapter crateAdapter() {
23 | return new PartitionsAdapter(getContext());
24 | }
25 |
26 | @Override
27 | protected BaseViewModel crateViewModel() {
28 | return ViewModelProviders.of(this).get(PartitionsViewModel.class);
29 | }
30 |
31 | @Override
32 | protected void refreshData() {
33 | ThreadPoolUtils.getInstance().execute(() -> {
34 | final List list = getPartitionsInfo();
35 | JSONArray jsonArray = new JSONArray();
36 | for (PartitionsBean bean : list) {
37 | try {
38 | jsonArray.put(bean.toJSON());
39 | } catch (Exception e) {
40 | e.printStackTrace();
41 | }
42 | }
43 | LogUtils.printLongString(jsonArray.toString());
44 | mainHandler.post(() -> {
45 | viewModel.setValue(list);
46 | });
47 | });
48 | }
49 |
50 | private List getPartitionsInfo() {
51 | return ((PartitionsViewModel) viewModel).getPartitionsInfo();
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/partitions/PartitionsViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.partitions;
2 |
3 | import com.song.deviceinfo.info.PartitionsInfo;
4 | import com.song.deviceinfo.model.beans.PartitionsBean;
5 | import com.song.deviceinfo.ui.base.BaseViewModel;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | * Created by chensongsong on 2020/5/29.
11 | */
12 | public class PartitionsViewModel extends BaseViewModel {
13 |
14 | protected List getPartitionsInfo(){
15 | return PartitionsInfo.getPartitionsInfo();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/root/RootFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.root;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/15.
15 | */
16 | public class RootFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(RootViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((RootViewModel) viewModel).getRootInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/root/RootViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.root;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.RootInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/15.
14 | */
15 | public class RootViewModel extends NormalViewModel {
16 |
17 | public List> getRootInfo(Context context) {
18 | return RootInfo.getRootInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/settings/SettingsFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.settings;
2 |
3 | import android.content.Intent;
4 | import android.content.SharedPreferences;
5 | import android.os.Bundle;
6 | import android.text.TextUtils;
7 |
8 | import com.song.deviceinfo.MainActivity;
9 | import com.song.deviceinfo.R;
10 |
11 | import androidx.preference.PreferenceFragmentCompat;
12 |
13 | public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener{
14 |
15 | @Override
16 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
17 | setPreferencesFromResource(R.xml.messages_preferences, rootKey);
18 | }
19 |
20 | @Override
21 | public void onResume() {
22 | super.onResume();
23 | getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
24 | }
25 |
26 | @Override
27 | public void onPause() {
28 | super.onPause();
29 | getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
30 | }
31 |
32 | @Override
33 | public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
34 | if (TextUtils.equals(key, "settings_language")) {
35 | Intent intent = new Intent(getContext(), MainActivity.class);
36 | intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
37 | startActivity(intent);
38 | }
39 | }
40 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/soc/SOCFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.soc;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/6/8.
15 | */
16 | public class SOCFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(SOCViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((SOCViewModel) viewModel).getSOCInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/soc/SOCViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.soc;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.SOCInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/6/8.
14 | */
15 | public class SOCViewModel extends NormalViewModel {
16 |
17 | public List> getSOCInfo(Context context) {
18 | return SOCInfo.getSOCInfo(context);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/store/StoreFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.store;
2 |
3 | import com.song.deviceinfo.model.beans.StorageBean;
4 | import com.song.deviceinfo.ui.base.BaseAdapter;
5 | import com.song.deviceinfo.ui.base.BaseFragment;
6 | import com.song.deviceinfo.ui.base.BaseViewModel;
7 | import com.song.deviceinfo.utils.LogUtils;
8 | import com.song.deviceinfo.utils.ThreadPoolUtils;
9 |
10 | import org.json.JSONArray;
11 |
12 | import java.util.List;
13 |
14 | import androidx.lifecycle.ViewModelProviders;
15 |
16 | /**
17 | * Created by chensongsong on 2020/6/1.
18 | */
19 | public class StoreFragment extends BaseFragment {
20 |
21 | @Override
22 | protected BaseAdapter crateAdapter() {
23 | return new StoreAdapter(getContext());
24 | }
25 |
26 | @Override
27 | protected BaseViewModel crateViewModel() {
28 | return ViewModelProviders.of(this).get(StoreViewModel.class);
29 | }
30 |
31 | @Override
32 | protected void refreshData() {
33 | ThreadPoolUtils.getInstance().execute(() -> {
34 | final List list = getStoreInfo();
35 | JSONArray jsonArray = new JSONArray();
36 | for (StorageBean bean : list) {
37 | try {
38 | jsonArray.put(bean.toJSON());
39 | } catch (Exception e) {
40 | e.printStackTrace();
41 | }
42 | }
43 | LogUtils.release(jsonArray.toString());
44 | mainHandler.post(() -> {
45 | viewModel.setValue(list);
46 | });
47 | });
48 | }
49 |
50 | private List getStoreInfo() {
51 | return ((StoreViewModel) viewModel).getStoreInfo(getContext());
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/store/StoreViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.store;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.StoreInfo;
6 | import com.song.deviceinfo.model.beans.StorageBean;
7 | import com.song.deviceinfo.ui.base.BaseViewModel;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * Created by chensongsong on 2020/6/1.
13 | */
14 | public class StoreViewModel extends BaseViewModel {
15 |
16 | protected List getStoreInfo(Context context) {
17 | return StoreInfo.getStoreInfo(context);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/system/SystemFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.system;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/5/27.
15 | */
16 | public class SystemFragment extends NormalFragment {
17 |
18 | @Override
19 | protected List> getNormalInfo() {
20 | return ((SystemViewModel) viewModel).getSystemInfo(getActivity());
21 | }
22 |
23 | @Override
24 | protected BaseAdapter crateAdapter() {
25 | return new NormalAdapter(getContext());
26 | }
27 |
28 | @Override
29 | protected BaseViewModel crateViewModel() {
30 | return ViewModelProviders.of(this).get(SystemViewModel.class);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/system/SystemViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.system;
2 |
3 | import android.app.Activity;
4 |
5 | import com.song.deviceinfo.info.SystemInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/5/27.
14 | */
15 | public class SystemViewModel extends NormalViewModel {
16 |
17 | public List> getSystemInfo(Activity activity) {
18 | return SystemInfo.getSystemInfo(activity);
19 | }
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/thermal/ThermalFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.thermal;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/5/27.
15 | */
16 | public class ThermalFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(ThermalViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((ThermalViewModel) viewModel).getThermalInfo();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/thermal/ThermalViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.thermal;
2 |
3 | import com.song.deviceinfo.info.ThermalInfo;
4 | import com.song.deviceinfo.ui.base.NormalViewModel;
5 |
6 | import java.util.List;
7 |
8 | import androidx.core.util.Pair;
9 |
10 | /**
11 | * Created by chensongsong on 2020/5/27.
12 | */
13 | public class ThermalViewModel extends NormalViewModel {
14 |
15 | public List> getThermalInfo() {
16 | return ThermalInfo.getThermalInfo();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/usb/USBFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.usb;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/6/8.
15 | */
16 | public class USBFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(USBViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((USBViewModel) viewModel).getUsbInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/usb/USBViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.usb;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.USBInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/6/8.
14 | */
15 | public class USBViewModel extends NormalViewModel {
16 |
17 | public List> getUsbInfo(Context context) {
18 | return USBInfo.getUSBInfo(context);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/virtual/VirtualAppFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.virtual;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/7/10.
15 | */
16 | public class VirtualAppFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(VirtualAppViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((VirtualAppViewModel) viewModel).getVirtualAppInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/virtual/VirtualAppViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.virtual;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.VirtualAppInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/7/10.
14 | */
15 | public class VirtualAppViewModel extends NormalViewModel {
16 |
17 | public List> getVirtualAppInfo(Context context) {
18 | return VirtualAppInfo.getVirtualAppInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/wifi/WifiFragment.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.wifi;
2 |
3 | import com.song.deviceinfo.ui.base.BaseAdapter;
4 | import com.song.deviceinfo.ui.base.BaseViewModel;
5 | import com.song.deviceinfo.ui.base.NormalAdapter;
6 | import com.song.deviceinfo.ui.base.NormalFragment;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 | import androidx.lifecycle.ViewModelProviders;
12 |
13 | /**
14 | * Created by chensongsong on 2020/9/22.
15 | */
16 | public class WifiFragment extends NormalFragment {
17 |
18 | @Override
19 | protected BaseAdapter crateAdapter() {
20 | return new NormalAdapter(getContext());
21 | }
22 |
23 | @Override
24 | protected BaseViewModel crateViewModel() {
25 | return ViewModelProviders.of(this).get(WifiViewModel.class);
26 | }
27 |
28 | @Override
29 | protected List> getNormalInfo() {
30 | return ((WifiViewModel) viewModel).getWifiInfo(getContext());
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/ui/wifi/WifiViewModel.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.ui.wifi;
2 |
3 | import android.content.Context;
4 |
5 | import com.song.deviceinfo.info.WifiInfo;
6 | import com.song.deviceinfo.ui.base.NormalViewModel;
7 |
8 | import java.util.List;
9 |
10 | import androidx.core.util.Pair;
11 |
12 | /**
13 | * Created by chensongsong on 2020/9/22.
14 | */
15 | public class WifiViewModel extends NormalViewModel {
16 |
17 | public List> getWifiInfo(Context context) {
18 | return WifiInfo.getWifiInfo(context);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/ApplicationUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import android.content.Context;
4 | import android.content.pm.PackageInfo;
5 |
6 | /**
7 | * Created by chensongsong on 2021/9/28.
8 | */
9 | public class ApplicationUtils {
10 |
11 | public static boolean isPkgInstalled(Context context, String pkgName) {
12 | PackageInfo packageInfo;
13 | try {
14 | packageInfo = context.getPackageManager().getPackageInfo(pkgName, 0);
15 | } catch (Exception e) {
16 | packageInfo = null;
17 | }
18 | return packageInfo != null;
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/Constants.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | /**
4 | * Created by chensongsong on 2020/5/25.
5 | */
6 | public class Constants {
7 |
8 | public final static String VERSION = "0.2.1";
9 | public final static String UNKNOWN = "$unknown";
10 | public final static String TAG = "Device_Info";
11 |
12 | public static final int BUF_1024 = 1024;
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/FileUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.File;
5 | import java.io.FileReader;
6 | import java.io.IOException;
7 |
8 | /**
9 | * Created by chensongsong on 2020/6/1.
10 | */
11 | public class FileUtils {
12 |
13 | /**
14 | * 是否存在
15 | *
16 | * @param name
17 | * @return
18 | */
19 | public static boolean exists(String name) {
20 | return new File(name).exists();
21 | }
22 |
23 | public static String readFile(String name) {
24 | return readFile(new File(name));
25 | }
26 |
27 | public static String readFile(File file) {
28 | FileReader fileReader = null;
29 | BufferedReader reader = null;
30 | try {
31 | String line;
32 | StringBuffer sb = new StringBuffer();
33 | fileReader = new FileReader(file);
34 | reader = new BufferedReader(fileReader);
35 | while ((line = reader.readLine()) != null) {
36 | sb.append(line);
37 | sb.append('\n');
38 | }
39 | if (sb.length() > 0) {
40 | sb.deleteCharAt(sb.length() - 1);
41 | }
42 | return sb.toString();
43 | } catch (Exception e) {
44 | e.printStackTrace();
45 | } finally {
46 | if (reader != null) {
47 | try {
48 | reader.close();
49 | } catch (IOException e) {
50 | e.printStackTrace();
51 | }
52 | }
53 | if (fileReader != null) {
54 | try {
55 | fileReader.close();
56 | } catch (IOException e) {
57 | e.printStackTrace();
58 | }
59 | }
60 | }
61 | return null;
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/HashUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import java.security.MessageDigest;
4 |
5 | public class HashUtils {
6 |
7 | /**
8 | * md5摘要
9 | *
10 | * @param content
11 | * @return
12 | */
13 | public static String md5Encode(byte[] content) {
14 | try {
15 | return HexUtils.bytesToHex(digest(content, "MD5"));
16 | } catch (Exception e) {
17 | e.printStackTrace();
18 | }
19 | return null;
20 | }
21 |
22 | public static String sha1Encode(byte[] content) {
23 | try {
24 | return HexUtils.bytesToHex(digest(content, "SHA-1"));
25 | } catch (Exception e) {
26 | e.printStackTrace();
27 | }
28 | return null;
29 | }
30 |
31 | /**
32 | * SHA256摘要处理
33 | *
34 | * @param content 内容
35 | * @return 哈希摘要字符串
36 | */
37 | public static String sha256Encode(byte[] content) {
38 | try {
39 | return HexUtils.bytesToHex(digest(content, "SHA-256"));
40 | } catch (Exception e) {
41 | e.printStackTrace();
42 | }
43 | return null;
44 | }
45 |
46 | /**
47 | * hash 计算
48 | *
49 | * @param content 内容
50 | * @param algorithm 算法
51 | * @return
52 | * @throws Exception
53 | */
54 | private static byte[] digest(byte[] content, String algorithm) throws Exception {
55 | // 将此 algorithm 换成MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512等参数
56 | MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
57 | messageDigest.update(content);
58 | return messageDigest.digest();
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/HexUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | public class HexUtils {
4 |
5 | private final static char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
6 |
7 | /**
8 | * 将 byte 数组转换为十六进制字符串
9 | *
10 | * @param bytes
11 | * @return
12 | */
13 | public static String bytesToHex(byte[] bytes) {
14 | StringBuilder sb = new StringBuilder();
15 | for (int i = 0; i < bytes.length; i++) {
16 | sb.append(HEX[(bytes[i] >> 4) & 0x0f]).append(HEX[bytes[i] & 0x0f]);
17 | }
18 | return sb.toString();
19 | }
20 |
21 | /**
22 | * 将十六进制字符串转换为 byte 数组
23 | *
24 | * @param content
25 | * @return
26 | */
27 | public static byte[] hexToBytes(String content) {
28 | char[] chars = content.toCharArray();
29 | int length = chars.length / 2;
30 | byte[] raw = new byte[length];
31 | for (int i = 0; i < length; i++) {
32 | int high = Character.digit(chars[i * 2], 16);
33 | int low = Character.digit(chars[i * 2 + 1], 16);
34 | int value = (high << 4) | low;
35 | if (value > 127) {
36 | value -= 256;
37 | }
38 | raw[i] = (byte) value;
39 | }
40 | return raw;
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/OaidUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import android.content.Context;
4 |
5 | import com.bun.miitmdid.core.ErrorCode;
6 | import com.bun.miitmdid.core.IIdentifierListener;
7 | import com.bun.miitmdid.core.MdidSdkHelper;
8 | import com.bun.miitmdid.supplier.IdSupplier;
9 |
10 | import java.util.List;
11 |
12 | import androidx.core.util.Pair;
13 |
14 | /**
15 | * Created by chensongsong on 2020/9/22.
16 | */
17 | public class OaidUtils {
18 |
19 | public void getOaidsInfo(Context context, List> list) {
20 |
21 | int code = MdidSdkHelper.InitSdk(context, true, new IIdentifierListener() {
22 | @Override
23 | public void OnSupport(boolean b, IdSupplier idSupplier) {
24 | LogUtils.d("MdidSdkHelper isSupported: " + b);
25 | if (b) {
26 | list.add(new Pair<>("OAID", idSupplier.getOAID()));
27 | list.add(new Pair<>("VAID", idSupplier.getVAID()));
28 | list.add(new Pair<>("AAID", idSupplier.getAAID()));
29 | idSupplier.shutDown();
30 | }
31 | }
32 | });
33 | LogUtils.d("MdidSdkHelper Code: " + code);
34 | }
35 |
36 | private String descriptionCode(int code) {
37 | switch (code) {
38 | case ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT:
39 | return "DEVICE_NOSUPPORT";
40 | case ErrorCode.INIT_ERROR_LOAD_CONFIGFILE:
41 | return "LOAD_CONFIGFILE";
42 | case ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT:
43 | return "MANUFACTURER_NOSUPPORT";
44 | case ErrorCode.INIT_ERROR_RESULT_DELAY:
45 | return "RESULT_DELAY";
46 | case ErrorCode.INIT_HELPER_CALL_ERROR:
47 | return "HELPER_CALL_ERROR";
48 | default:
49 | return "SUCCESS";
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/OkHttpUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import android.util.Log;
4 |
5 | import java.util.concurrent.TimeUnit;
6 |
7 | import javax.net.ssl.HostnameVerifier;
8 | import javax.net.ssl.SSLSession;
9 |
10 | import okhttp3.MediaType;
11 | import okhttp3.OkHttpClient;
12 | import okhttp3.Request;
13 | import okhttp3.RequestBody;
14 | import okhttp3.Response;
15 |
16 | /**
17 | * Created by chensongsong on 2020/6/1.
18 | */
19 | public class OkHttpUtils {
20 |
21 | private static final String TAG = "OkHttpUtils";
22 |
23 | private static final MediaType JSON
24 | = MediaType.get("application/json; charset=utf-8");
25 |
26 | private static OkHttpClient getInstance() {
27 | return Client.okHttpClient;
28 | }
29 |
30 | private static class Client {
31 |
32 | private static OkHttpClient okHttpClient = new OkHttpClient()
33 | .newBuilder()
34 | .connectTimeout(10, TimeUnit.SECONDS)
35 | .readTimeout(5, TimeUnit.SECONDS)
36 | .writeTimeout(5, TimeUnit.SECONDS)
37 | .hostnameVerifier(new SongHostnameVerifier())
38 | .build();
39 |
40 | }
41 |
42 | private static class SongHostnameVerifier implements HostnameVerifier {
43 | @Override
44 | public boolean verify(String hostname, SSLSession session) {
45 | return true;
46 | }
47 | }
48 |
49 | public static String post(String url, String json) {
50 | Log.e(TAG, "REQUEST URL: " + url);
51 | RequestBody body = RequestBody.create(json, JSON);
52 | Request request = new Request.Builder()
53 | .url(url)
54 | .post(body)
55 | .build();
56 | Response response = null;
57 | try {
58 | response = getInstance().newCall(request).execute();
59 | return response.body().string();
60 | } catch (Exception e) {
61 | e.printStackTrace();
62 | }
63 | return null;
64 | }
65 |
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/SystemConfigUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import android.content.Context;
4 | import android.os.SystemClock;
5 |
6 | import java.util.Locale;
7 | import java.util.TimeZone;
8 |
9 | /**
10 | * Created by chensongsong on 2020/6/1.
11 | */
12 | public class SystemConfigUtils {
13 |
14 | /**
15 | * 获取当前时区
16 | *
17 | * @return
18 | */
19 | public static String getCurrentTimeZone() {
20 | TimeZone tz = TimeZone.getDefault();
21 | return tz.getDisplayName(false, TimeZone.SHORT);
22 | }
23 |
24 |
25 | /**
26 | * 获取当前系统语言格式
27 | *
28 | * @param context
29 | * @return
30 | */
31 | public static String getCurrentLanguage(Context context) {
32 | Locale locale = context.getResources().getConfiguration().locale;
33 | String language = locale.getLanguage();
34 | String country = locale.getCountry();
35 | String lc = language + "_" + country;
36 | return locale.getDisplayLanguage();
37 | }
38 |
39 | /**
40 | * 获取当前系统运行时间
41 | */
42 | public static String getSystemUpdate() {
43 | long nanoTime = SystemClock.elapsedRealtime();
44 | long DAY = 1000 * 60 * 60 * 24;
45 | long HOUR = 1000 * 60 * 60;
46 | long MINUTES = 1000 * 60;
47 | long day = nanoTime / DAY;
48 | if (day > 0) {
49 | return nanoTime / DAY + " days " + nanoTime % DAY / HOUR + ":" + nanoTime % DAY % HOUR / MINUTES;
50 | } else {
51 | return nanoTime % DAY / HOUR + ":" + nanoTime % DAY % HOUR / MINUTES;
52 | }
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/app/src/main/java/com/song/deviceinfo/utils/TimeUtils.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo.utils;
2 |
3 | import android.annotation.SuppressLint;
4 |
5 | import java.text.SimpleDateFormat;
6 | import java.util.Calendar;
7 | import java.util.Date;
8 |
9 | /**
10 | * Created by chensongsong on 2020/9/22.
11 | */
12 | public class TimeUtils {
13 |
14 | @SuppressLint("SimpleDateFormat")
15 | public static String formatDate(long time) {
16 | return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time));
17 | }
18 |
19 | private void test(){
20 | Calendar calendar = Calendar.getInstance();
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_action_bluetooth_scan_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_action_others_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_action_wifi_scan_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_language_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/side_nav_bar.xml:
--------------------------------------------------------------------------------
1 |
3 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
15 |
16 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/app_bar_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_base.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_applist.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
20 |
21 |
31 |
32 |
41 |
42 |
51 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_codecs.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
18 |
19 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_input.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
30 |
31 |
41 |
42 |
53 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
21 |
22 |
28 |
29 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_one_line.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/nav_header_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
22 |
23 |
29 |
30 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/settings_activity.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_about.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_applications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_applications.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_battery.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_build.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_camera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_camera.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_codecs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_codecs.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_debug.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_devices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_devices.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_drivers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_drivers.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_engineer_menu_nav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_engineer_menu_nav.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_general.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_general.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_home.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_hook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_hook.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_info_center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_info_center.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_input.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_input.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_lcd_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_lcd_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_maps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_maps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_memory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_memory.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_more_open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_more_open.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_multitouch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_multitouch.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_net.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_partitions.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_pmic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_pmic.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_project.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_rate_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_rate_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_root.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_root.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_screen_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_screen_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_sensors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_sensors.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_settings.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_soc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_soc.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_thermal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_thermal.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_touch_drawing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_touch_drawing.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_upgrade_to_pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_upgrade_to_pro.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_action_usb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_action_usb.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_system_apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-hdpi/ic_system_apps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_about.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_applications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_applications.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_battery.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_build.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_camera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_camera.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_codecs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_codecs.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_debug.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_devices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_devices.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_drivers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_drivers.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_engineer_menu_nav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_engineer_menu_nav.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_general.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_general.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_home.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_hook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_hook.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_info_center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_info_center.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_input.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_input.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_lcd_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_lcd_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_maps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_maps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_memory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_memory.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_more_open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_more_open.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_multitouch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_multitouch.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_net.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_partitions.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_pmic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_pmic.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_project.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_rate_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_rate_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_root.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_root.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_screen_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_screen_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_sensors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_sensors.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_settings.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_soc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_soc.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_system.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_system.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_thermal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_thermal.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_touch_drawing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_touch_drawing.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_upgrade_to_pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_upgrade_to_pro.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_action_usb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_action_usb.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_system_apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-mdpi/ic_system_apps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_about.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_applications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_applications.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_battery.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_build.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_camera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_camera.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_codecs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_codecs.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_debug.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_devices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_devices.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_drivers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_drivers.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_engineer_menu_nav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_engineer_menu_nav.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_general.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_general.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_home.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_hook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_hook.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_info_center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_info_center.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_input.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_input.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_lcd_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_lcd_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_maps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_maps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_memory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_memory.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_more_open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_more_open.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_multitouch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_multitouch.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_net.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_partitions.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_pmic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_pmic.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_project.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_rate_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_rate_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_root.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_root.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_screen_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_screen_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_sensors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_sensors.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_settings.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_soc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_soc.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_system.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_system.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_thermal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_thermal.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_touch_drawing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_touch_drawing.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_upgrade_to_pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_upgrade_to_pro.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_action_usb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_action_usb.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_system_apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xhdpi/ic_system_apps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_about.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_applications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_applications.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_battery.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_build.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_camera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_camera.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_codecs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_codecs.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_debug.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_devices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_devices.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_drivers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_drivers.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_engineer_menu_nav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_engineer_menu_nav.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_general.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_general.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_home.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_hook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_hook.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_info_center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_info_center.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_input.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_input.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_lcd_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_lcd_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_maps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_maps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_memory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_memory.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_more_open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_more_open.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_multitouch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_multitouch.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_net.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_partitions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_partitions.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_pmic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_pmic.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_project.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_rate_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_rate_app.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_root.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_root.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_screen_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_screen_test.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_sensors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_sensors.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_settings.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_soc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_soc.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_system.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_system.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_thermal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_thermal.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_touch_drawing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_touch_drawing.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_upgrade_to_pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_upgrade_to_pro.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_action_usb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_action_usb.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_system_apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxhdpi/ic_system_apps.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @string/settings_language_default
5 | - 中文(简体)
6 | - English
7 |
8 |
9 |
10 | - default
11 | - zh-cn
12 | - en
13 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #ff01946f
4 | #ff016c51
5 | #ff01946f
6 | #ff0ac8b4
7 |
8 | #666666
9 | #E8E8E8
10 | #F9F9F9
11 | #FFFFFF
12 | #9f000000
13 | #00FFFFFF
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 8dp
6 | 176dp
7 | 16dp
8 | 8dp
9 |
10 | 20dp
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values/drawables.xml:
--------------------------------------------------------------------------------
1 |
2 | - @android:drawable/ic_menu_camera
3 | - @android:drawable/ic_menu_gallery
4 | - @android:drawable/ic_menu_slideshow
5 | - @android:drawable/ic_menu_manage
6 | - @android:drawable/ic_menu_share
7 | - @android:drawable/ic_menu_send
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/messages_preferences.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/test/java/com/song/deviceinfo/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.song.deviceinfo;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 |
9 | }
10 | dependencies {
11 | classpath 'com.android.tools.build:gradle:4.1.0'
12 | classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
13 | classpath 'com.google.gms:google-services:4.3.4'
14 | classpath 'com.google.firebase:perf-plugin:1.3.3'
15 | // NOTE: Do not place your application dependencies here; they belong
16 | // in the individual module build.gradle files
17 | }
18 | }
19 |
20 | allprojects {
21 | repositories {
22 | google()
23 | jcenter()
24 |
25 | }
26 | }
27 |
28 | task clean(type: Delete) {
29 | delete rootProject.buildDir
30 | }
31 |
--------------------------------------------------------------------------------
/geetest_android_public.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/geetest_android_public.jks
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 | COMPILE_SDK_VERSION=30
21 | BUILD_TOOLS_VERSION=30.0.2
22 | MIN_SDK_VERSION=16
23 | TARGET_SDK_VERSION=30
24 | VERSION_CODE=002010
25 | VERSION_NAME=0.2.1
26 |
27 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon May 25 14:14:27 CST 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
7 |
--------------------------------------------------------------------------------
/imgs/battery.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/imgs/battery.jpg
--------------------------------------------------------------------------------
/imgs/drawer.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/imgs/drawer.jpeg
--------------------------------------------------------------------------------
/imgs/net.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/imgs/net.jpg
--------------------------------------------------------------------------------
/imgs/thermal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/imgs/thermal.jpg
--------------------------------------------------------------------------------
/release/device_info_0.2.1_20211012.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/song-dev/device-info/e8ee378e3bdd8d2183c0a2411bb167baef6aea0e/release/device_info_0.2.1_20211012.apk
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'device-info'
2 | include ':app'
--------------------------------------------------------------------------------