├── .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 | [![GitHub issues](https://img.shields.io/github/issues/song-dev/device-info.svg)](https://github.com/song-dev/device-info/issues) 8 | [![GitHub forks](https://img.shields.io/github/forks/song-dev/device-info.svg)](https://github.com/song-dev/device-info/network) 9 | [![GitHub stars](https://img.shields.io/github/stars/song-dev/device-info.svg)](https://github.com/song-dev/device-info/stargazers) 10 | [![GitHub license](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](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 | drawer 45 | 46 | net 47 | 48 | battery 49 | 50 | system 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 | 4 | 9 | 14 | 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 | 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' --------------------------------------------------------------------------------