AppIdentifier.smali
.class public Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;
.super Ljava/lang/Object;
.source "AppIdentifier.java"
# static fields
.field public static final DEFAULT_APP_NAME:Ljava/lang/String; = "unknown"
.field private static final NETSTAT_CACHE_TIME:J = 0x1388L
.field private static final UID_CACHE_MAX_TIME:I = 0x1388
.field private static final UID_CACHE_MIN_COUNT:I = 0x3
# instance fields
.field private mLastFoundUid:Ljava/lang/Integer;
.field private mLastFoundUidCount:I
.field private mLastFoundUidTime:J
.field private mLastNetstatTime:J
.field private mNetstatFetcher:Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;
.field private mPackageManager:Landroid/content/pm/PackageManager;
.field private mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
# direct methods
.method public constructor <init>(Landroid/content/Context;)V
.registers 6
.prologue
const-wide/16 v2, 0x0
.line 42
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 44
invoke-virtual {p1}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPackageManager:Landroid/content/pm/PackageManager;
.line 45
iput-wide v2, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastNetstatTime:J
.line 46
new-instance v0, Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
invoke-direct {v0}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;-><init>()V
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
.line 47
new-instance v0, Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;
invoke-direct {v0}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;-><init>()V
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mNetstatFetcher:Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;
.line 48
const/4 v0, -0x1
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUid:Ljava/lang/Integer;
.line 49
const/4 v0, 0x0
iput v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidCount:I
.line 50
iput-wide v2, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidTime:J
.line 52
return-void
.end method
# virtual methods
.method public identifyBySocket(Ljava/net/Socket;)Ljava/lang/String;
.registers 9
.prologue
const/4 v6, -0x1
.line 88
const-string v0, "unknown"
.line 89
invoke-virtual {p1}, Ljava/net/Socket;->getPort()I
move-result v1
.line 90
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {p0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->queryUID(Ljava/lang/Integer;)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
move-result v1
.line 92
if-eq v1, v6, :cond_38
.line 93
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUid:Ljava/lang/Integer;
invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
move-result v0
if-ne v1, v0, :cond_2e
.line 94
iget v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidCount:I
add-int/lit8 v0, v0, 0x1
iput v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidCount:I
.line 99
:goto_23
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
iput-wide v2, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidTime:J
.line 100
invoke-virtual {p0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->uidToAppName(I)Ljava/lang/String;
move-result-object v0
.line 114
:cond_2d
:goto_2d
return-object v0
.line 96
:cond_2e
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUid:Ljava/lang/Integer;
.line 97
const/4 v0, 0x1
iput v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidCount:I
goto :goto_23
.line 103
:cond_38
iget v1, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidCount:I
const/4 v2, 0x3
if-gt v1, v2, :cond_2d
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
iget-wide v4, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUidTime:J
sub-long/2addr v2, v4
const-wide/16 v4, 0x1388
cmp-long v1, v2, v4
if-gtz v1, :cond_2d
.line 106
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUid:Ljava/lang/Integer;
invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
move-result v1
.line 107
if-eq v1, v6, :cond_56
.line 108
invoke-virtual {p0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->uidToAppName(I)Ljava/lang/String;
move-result-object v0
.line 111
:cond_56
invoke-static {v6}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
iput-object v1, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastFoundUid:Ljava/lang/Integer;
goto :goto_2d
.end method
.method public queryUID(Ljava/lang/Integer;)Ljava/lang/Integer;
.registers 10
.prologue
.line 56
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
invoke-virtual {p1}, Ljava/lang/Integer;->intValue()I
move-result v1
invoke-virtual {v0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;->get(I)I
move-result v0
.line 58
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
.line 59
iget-wide v4, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastNetstatTime:J
sub-long v4, v2, v4
iput-wide v4, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastNetstatTime:J
.line 61
const/4 v1, -0x1
if-eq v1, v0, :cond_1f
iget-wide v4, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastNetstatTime:J
const-wide/16 v6, 0x1388
cmp-long v1, v4, v6
if-ltz v1, :cond_37
.line 62
:cond_1f
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
invoke-virtual {v0}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;->clear()V
.line 63
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mNetstatFetcher:Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
invoke-virtual {v0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatFetcher;->getTcpLocalPortUIDs(Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;)V
.line 64
iput-wide v2, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mLastNetstatTime:J
.line 65
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPortNetstatHash:Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;
invoke-virtual {p1}, Ljava/lang/Integer;->intValue()I
move-result v1
invoke-virtual {v0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/NetstatTable;->get(I)I
move-result v0
.line 67
:cond_37
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v0
return-object v0
.end method
.method public uidToAppName(I)Ljava/lang/String;
.registers 5
.prologue
.line 72
const-string v1, "unknown"
.line 74
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->mPackageManager:Landroid/content/pm/PackageManager;
invoke-virtual {v0, p1}, Landroid/content/pm/PackageManager;->getNameForUid(I)Ljava/lang/String;
move-result-object v0
.line 75
if-eqz v0, :cond_1e
.line 76
const-string v1, ":"
invoke-virtual {v0, v1}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
move-result v1
if-eqz v1, :cond_1d
.line 77
const/4 v1, 0x0
const-string v2, "."
invoke-virtual {v0, v2}, Ljava/lang/String;->lastIndexOf(Ljava/lang/String;)I
move-result v2
invoke-virtual {v0, v1, v2}, Ljava/lang/String;->substring(II)Ljava/lang/String;
move-result-object v0
.line 82
:cond_1d
:goto_1d
return-object v0
:cond_1e
move-object v0, v1
goto :goto_1d
.end method