DeviceUtils.smali

.class public Lcn/rongcloud/rtc/utils/DeviceUtils;
.super Ljava/lang/Object;
.source "DeviceUtils.java"


# static fields
.field private static final CPU_FILTER:Ljava/io/FileFilter;

.field private static final TAG:Ljava/lang/String; = "DeviceUtils"


# direct methods
.method static constructor <clinit>()V
    .registers 1

    .line 1
    new-instance v0, Lcn/rongcloud/rtc/utils/DeviceUtils$1;

    invoke-direct {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils$1;-><init>()V

    sput-object v0, Lcn/rongcloud/rtc/utils/DeviceUtils;->CPU_FILTER:Ljava/io/FileFilter;

    return-void
.end method

.method public constructor <init>()V
    .registers 1

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method private static closeStream(Ljava/io/Closeable;)V
    .registers 1

    if-eqz p0, :cond_5

    .line 1
    :try_start_2
    invoke-interface {p0}, Ljava/io/Closeable;->close()V
    :try_end_5
    .catch Ljava/io/IOException; {:try_start_2 .. :try_end_5} :catch_5

    :catch_5
    :cond_5
    return-void
.end method

.method public static getAvaiableCoreCurFreq(I)J
    .registers 3

    .line 1
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "/sys/devices/system/cpu/cpu"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    const-string p0, "/cpufreq/scaling_cur_freq"

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p0

    .line 2
    invoke-static {p0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->readProcFile(Ljava/lang/String;)Ljava/lang/String;

    move-result-object p0

    .line 3
    invoke-static {p0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

    move-result v0

    if-eqz v0, :cond_23

    const-wide/16 v0, 0x0

    return-wide v0

    .line 4
    :cond_23
    invoke-static {p0}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J

    move-result-wide v0

    return-wide v0
.end method

.method public static getCoreMaxFreq(I)J
    .registers 3

    .line 1
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "/sys/devices/system/cpu/cpu"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    const-string p0, "/cpufreq/cpuinfo_max_freq"

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p0

    .line 2
    invoke-static {p0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->readProcFile(Ljava/lang/String;)Ljava/lang/String;

    move-result-object p0

    .line 3
    invoke-static {p0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

    move-result v0

    if-eqz v0, :cond_23

    const-wide/16 v0, 0x0

    return-wide v0

    .line 4
    :cond_23
    invoke-static {p0}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J

    move-result-wide v0

    return-wide v0
.end method

.method public static getCoreMinFreq(I)J
    .registers 3

    .line 1
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "/sys/devices/system/cpu/cpu"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    const-string p0, "/cpufreq/cpuinfo_min_freq"

    invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p0

    .line 2
    invoke-static {p0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->readProcFile(Ljava/lang/String;)Ljava/lang/String;

    move-result-object p0

    .line 3
    invoke-static {p0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

    move-result v0

    if-eqz v0, :cond_23

    const-wide/16 v0, 0x0

    return-wide v0

    .line 4
    :cond_23
    invoke-static {p0}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J

    move-result-wide v0

    return-wide v0
.end method

.method private static getCoresFromCPUFileList()I
    .registers 2

    .line 1
    new-instance v0, Ljava/io/File;

    const-string v1, "/sys/devices/system/cpu"

    invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V

    sget-object v1, Lcn/rongcloud/rtc/utils/DeviceUtils;->CPU_FILTER:Ljava/io/FileFilter;

    invoke-virtual {v0, v1}, Ljava/io/File;->listFiles(Ljava/io/FileFilter;)[Ljava/io/File;

    move-result-object v0

    array-length v0, v0

    return v0
.end method

.method private static getCoresFromFileInfo(Ljava/lang/String;)I
    .registers 5

    const/4 v0, 0x0

    .line 1
    :try_start_1
    new-instance v1, Ljava/io/FileInputStream;

    invoke-direct {v1, p0}, Ljava/io/FileInputStream;-><init>(Ljava/lang/String;)V
    :try_end_6
    .catch Ljava/io/IOException; {:try_start_1 .. :try_end_6} :catch_32
    .catchall {:try_start_1 .. :try_end_6} :catchall_29

    .line 2
    :try_start_6
    new-instance p0, Ljava/io/BufferedReader;

    new-instance v2, Ljava/io/InputStreamReader;

    invoke-direct {v2, v1}, Ljava/io/InputStreamReader;-><init>(Ljava/io/InputStream;)V

    invoke-direct {p0, v2}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
    :try_end_10
    .catch Ljava/io/IOException; {:try_start_6 .. :try_end_10} :catch_33
    .catchall {:try_start_6 .. :try_end_10} :catchall_27

    .line 3
    :try_start_10
    invoke-virtual {p0}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;

    move-result-object v0

    .line 4
    invoke-static {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoresFromFileString(Ljava/lang/String;)I

    move-result v0
    :try_end_18
    .catch Ljava/io/IOException; {:try_start_10 .. :try_end_18} :catch_25
    .catchall {:try_start_10 .. :try_end_18} :catchall_20

    .line 5
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 6
    invoke-static {p0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    move p0, v0

    goto :goto_3a

    :catchall_20
    move-exception v0

    move-object v3, v0

    move-object v0, p0

    move-object p0, v3

    goto :goto_2b

    :catch_25
    move-object v0, p0

    goto :goto_33

    :catchall_27
    move-exception p0

    goto :goto_2b

    :catchall_29
    move-exception p0

    move-object v1, v0

    .line 7
    :goto_2b
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 8
    invoke-static {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    throw p0

    :catch_32
    move-object v1, v0

    :catch_33
    :goto_33
    const/4 p0, -0x1

    .line 9
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 10
    invoke-static {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    :goto_3a
    return p0
.end method

.method private static getCoresFromFileString(Ljava/lang/String;)I
    .registers 2

    if-eqz p0, :cond_1a

    const-string v0, "0-[\\d]+$"

    .line 1
    invoke-virtual {p0, v0}, Ljava/lang/String;->matches(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_1a

    const/4 v0, 0x2

    .line 2
    invoke-virtual {p0, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String;

    move-result-object p0

    invoke-static {p0}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;

    move-result-object p0

    invoke-virtual {p0}, Ljava/lang/Integer;->intValue()I

    move-result p0

    add-int/lit8 p0, p0, 0x1

    return p0

    :cond_1a
    const/4 p0, -0x1

    return p0
.end method

.method public static getNumberOfCPUCores()I
    .registers 2

    .line 1
    sget v0, Landroid/os/Build$VERSION;->SDK_INT:I

    const/16 v1, 0xa

    if-gt v0, v1, :cond_8

    const/4 v0, 0x1

    return v0

    :cond_8
    const/4 v0, -0x1

    :try_start_9
    const-string v1, "/sys/devices/system/cpu/possible"

    .line 2
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoresFromFileInfo(Ljava/lang/String;)I

    move-result v1

    if-ne v1, v0, :cond_17

    const-string v1, "/sys/devices/system/cpu/present"

    .line 3
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoresFromFileInfo(Ljava/lang/String;)I

    move-result v1

    :cond_17
    if-ne v1, v0, :cond_1e

    .line 4
    invoke-static {}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoresFromCPUFileList()I

    move-result v0
    :try_end_1d
    .catch Ljava/lang/SecurityException; {:try_start_9 .. :try_end_1d} :catch_1f
    .catch Ljava/lang/NullPointerException; {:try_start_9 .. :try_end_1d} :catch_1f

    goto :goto_1f

    :cond_1e
    move v0, v1

    :catch_1f
    :goto_1f
    return v0
.end method

.method public static getProcessCpuRate(I)F
    .registers 19

    move/from16 v0, p0

    .line 1
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J

    .line 2
    invoke-static {}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getNumberOfCPUCores()I

    move-result v1

    .line 3
    new-array v2, v0, [F

    const/4 v3, 0x0

    const/4 v4, 0x0

    :goto_d
    if-ge v4, v0, :cond_44

    const/high16 v5, 0x3f800000    # 1.0f

    int-to-float v6, v1

    div-float/2addr v5, v6

    const/4 v6, 0x0

    const/4 v7, 0x0

    const/4 v8, 0x0

    :goto_16
    if-ge v7, v1, :cond_3f

    .line 4
    invoke-static {v7}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getAvaiableCoreCurFreq(I)J

    move-result-wide v9

    .line 5
    invoke-static {v7}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoreMaxFreq(I)J

    move-result-wide v11

    .line 6
    invoke-static {v7}, Lcn/rongcloud/rtc/utils/DeviceUtils;->getCoreMinFreq(I)J

    move-result-wide v13

    const-wide/16 v15, 0x0

    cmp-long v17, v11, v15

    if-eqz v17, :cond_3e

    sub-long/2addr v11, v13

    cmp-long v17, v11, v15

    if-nez v17, :cond_30

    goto :goto_3e

    :cond_30
    const/high16 v15, 0x42c80000    # 100.0f

    mul-float v15, v15, v5

    sub-long/2addr v9, v13

    long-to-float v9, v9

    mul-float v15, v15, v9

    long-to-float v9, v11

    div-float/2addr v15, v9

    add-float/2addr v8, v15

    add-int/lit8 v7, v7, 0x1

    goto :goto_16

    :cond_3e
    :goto_3e
    return v6

    .line 7
    :cond_3f
    aput v8, v2, v4

    add-int/lit8 v4, v4, 0x1

    goto :goto_d

    .line 8
    :cond_44
    invoke-static {v2}, Ljava/util/Arrays;->sort([F)V

    add-int/lit8 v0, v0, -0x1

    .line 9
    div-int/lit8 v0, v0, 0x2

    aget v0, v2, v0

    return v0
.end method

.method private static readProcFile(Ljava/lang/String;)Ljava/lang/String;
    .registers 5

    const/4 v0, 0x0

    .line 1
    :try_start_1
    new-instance v1, Ljava/io/FileInputStream;

    invoke-direct {v1, p0}, Ljava/io/FileInputStream;-><init>(Ljava/lang/String;)V
    :try_end_6
    .catch Ljava/io/IOException; {:try_start_1 .. :try_end_6} :catch_2f
    .catchall {:try_start_1 .. :try_end_6} :catchall_2c

    .line 2
    :try_start_6
    new-instance p0, Ljava/io/BufferedReader;

    new-instance v2, Ljava/io/InputStreamReader;

    invoke-direct {v2, v1}, Ljava/io/InputStreamReader;-><init>(Ljava/io/InputStream;)V

    invoke-direct {p0, v2}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
    :try_end_10
    .catch Ljava/io/IOException; {:try_start_6 .. :try_end_10} :catch_27
    .catchall {:try_start_6 .. :try_end_10} :catchall_25

    .line 3
    :try_start_10
    invoke-virtual {p0}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;

    move-result-object v0
    :try_end_14
    .catch Ljava/io/IOException; {:try_start_10 .. :try_end_14} :catch_20
    .catchall {:try_start_10 .. :try_end_14} :catchall_1b

    .line 4
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 5
    invoke-static {p0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    goto :goto_3c

    :catchall_1b
    move-exception v0

    move-object v3, v0

    move-object v0, p0

    move-object p0, v3

    goto :goto_41

    :catch_20
    move-exception v0

    move-object v3, v1

    move-object v1, p0

    move-object p0, v0

    goto :goto_2a

    :catchall_25
    move-exception p0

    goto :goto_41

    :catch_27
    move-exception p0

    move-object v3, v1

    move-object v1, v0

    :goto_2a
    move-object v0, v3

    goto :goto_31

    :catchall_2c
    move-exception p0

    move-object v1, v0

    goto :goto_41

    :catch_2f
    move-exception p0

    move-object v1, v0

    .line 6
    :goto_31
    :try_start_31
    invoke-virtual {p0}, Ljava/io/IOException;->printStackTrace()V
    :try_end_34
    .catchall {:try_start_31 .. :try_end_34} :catchall_3d

    .line 7
    invoke-static {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 8
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    const-string v0, ""

    :goto_3c
    return-object v0

    :catchall_3d
    move-exception p0

    move-object v3, v1

    move-object v1, v0

    move-object v0, v3

    .line 9
    :goto_41
    invoke-static {v1}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    .line 10
    invoke-static {v0}, Lcn/rongcloud/rtc/utils/DeviceUtils;->closeStream(Ljava/io/Closeable;)V

    throw p0
.end method