ButtonlessDfuImpl.smali
.class abstract Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;
.super Lno/nordicsemi/android/dfu/BaseButtonlessDfuImpl;
.source "ButtonlessDfuImpl.java"
# static fields
.field private static final DFU_STATUS_SUCCESS:I = 0x1
.field private static final OP_CODE_ENTER_BOOTLOADER:[B
.field private static final OP_CODE_ENTER_BOOTLOADER_KEY:I = 0x1
.field private static final OP_CODE_RESPONSE_CODE_KEY:I = 0x20
# direct methods
.method static constructor <clinit>()V
.registers 3
.prologue
const/4 v2, 0x1
.line 23
new-array v0, v2, [B
const/4 v1, 0x0
aput-byte v2, v0, v1
sput-object v0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->OP_CODE_ENTER_BOOTLOADER:[B
return-void
.end method
.method constructor <init>(Landroid/content/Intent;Lno/nordicsemi/android/dfu/DfuBaseService;)V
.registers 3
.prologue
.line 26
invoke-direct {p0, p1, p2}, Lno/nordicsemi/android/dfu/BaseButtonlessDfuImpl;-><init>(Landroid/content/Intent;Lno/nordicsemi/android/dfu/DfuBaseService;)V
.line 27
return-void
.end method
.method private getStatusCode([BI)I
.registers 8
.prologue
const/16 v4, 0x20
const/4 v3, 0x1
const/4 v2, 0x2
.line 145
if-eqz p1, :cond_20
array-length v0, p1
const/4 v1, 0x3
if-lt v0, v1, :cond_20
const/4 v0, 0x0
aget-byte v0, p1, v0
if-ne v0, v4, :cond_20
aget-byte v0, p1, v3
if-ne v0, p2, :cond_20
aget-byte v0, p1, v2
if-eq v0, v3, :cond_28
aget-byte v0, p1, v2
if-eq v0, v2, :cond_28
aget-byte v0, p1, v2
const/4 v1, 0x4
if-eq v0, v1, :cond_28
.line 147
:cond_20
new-instance v0, Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException;
const-string v1, "Invalid response received"
invoke-direct {v0, v1, p1, v4, p2}, Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException;-><init>(Ljava/lang/String;[BII)V
throw v0
.line 148
:cond_28
aget-byte v0, p1, v2
return v0
.end method
# virtual methods
.method protected abstract getButtonlessDfuCharacteristic()Landroid/bluetooth/BluetoothGattCharacteristic;
.end method
.method protected abstract getResponseType()I
.end method
.method public performDfu(Landroid/content/Intent;)V
.registers 13
.prologue
const/16 v10, 0x3e8
const/16 v9, 0x14
const/4 v8, 0x0
const/16 v6, 0xa
const/4 v7, 0x1
.line 51
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mProgressInfo:Lno/nordicsemi/android/dfu/DfuProgressInfo;
const/4 v1, -0x2
invoke-virtual {v0, v1}, Lno/nordicsemi/android/dfu/DfuProgressInfo;->setProgress(I)V
.line 57
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
invoke-virtual {v0, v10}, Lno/nordicsemi/android/dfu/DfuBaseService;->waitFor(I)V
.line 60
iget-object v1, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mGatt:Landroid/bluetooth/BluetoothGatt;
.line 63
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const/16 v2, 0xf
const-string v3, "Application with buttonless update found"
invoke-virtual {v0, v2, v3}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 65
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const-string v2, "Jumping to the DFU Bootloader..."
invoke-virtual {v0, v7, v2}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 67
invoke-virtual {p0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->getButtonlessDfuCharacteristic()Landroid/bluetooth/BluetoothGattCharacteristic;
move-result-object v2
.line 69
invoke-virtual {p0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->getResponseType()I
move-result v0
.line 70
invoke-virtual {p0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->getResponseType()I
move-result v3
invoke-virtual {p0, v2, v3}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->enableCCCD(Landroid/bluetooth/BluetoothGattCharacteristic;I)V
.line 71
iget-object v3, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
new-instance v4, Ljava/lang/StringBuilder;
invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
const/4 v5, 0x2
if-ne v0, v5, :cond_ec
const-string v0, "Indications"
:goto_40
invoke-virtual {v4, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
const-string v4, " enabled"
invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v3, v6, v0}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 76
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
invoke-virtual {v0, v10}, Lno/nordicsemi/android/dfu/DfuBaseService;->waitFor(I)V
.line 81
:try_start_56
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mProgressInfo:Lno/nordicsemi/android/dfu/DfuProgressInfo;
const/4 v3, -0x3
invoke-virtual {v0, v3}, Lno/nordicsemi/android/dfu/DfuProgressInfo;->setProgress(I)V
.line 82
const-string v0, "Sending Enter Bootloader (Op Code = 1)"
invoke-virtual {p0, v0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->logi(Ljava/lang/String;)V
.line 83
sget-object v0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->OP_CODE_ENTER_BOOTLOADER:[B
const/4 v3, 0x1
invoke-virtual {p0, v2, v0, v3}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->writeOpCode(Landroid/bluetooth/BluetoothGattCharacteristic;[BZ)V
.line 84
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const/16 v2, 0xa
const-string v3, "Enter bootloader sent (Op Code = 1)"
invoke-virtual {v0, v2, v3}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
:try_end_70
.catch Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException; {:try_start_56 .. :try_end_70} :catch_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException; {:try_start_56 .. :try_end_70} :catch_10a
.line 91
:try_start_70
invoke-virtual {p0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->readNotificationResponse()[B
:try_end_73
.catch Lno/nordicsemi/android/dfu/internal/exception/DeviceDisconnectedException; {:try_start_70 .. :try_end_73} :catch_f0
.catch Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException; {:try_start_70 .. :try_end_73} :catch_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException; {:try_start_70 .. :try_end_73} :catch_10a
move-result-object v0
.line 98
:goto_74
if-eqz v0, :cond_133
.line 109
const/4 v2, 0x1
:try_start_77
invoke-direct {p0, v0, v2}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->getStatusCode([BI)I
move-result v2
.line 110
new-instance v3, Ljava/lang/StringBuilder;
const-string v4, "Response received (Op Code = "
invoke-direct {v3, v4}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
const/4 v4, 0x1
aget-byte v4, v0, v4
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
const-string v4, ", Status = "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
const-string v4, ")"
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-virtual {p0, v3}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->logi(Ljava/lang/String;)V
.line 111
iget-object v3, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const/16 v4, 0xa
new-instance v5, Ljava/lang/StringBuilder;
const-string v6, "Response received (Op Code = "
invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
const/4 v6, 0x1
aget-byte v0, v0, v6
invoke-virtual {v5, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v0
const-string v5, ", Status = "
invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v0
const-string v5, ")"
invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v3, v4, v0}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 112
if-eq v2, v7, :cond_f4
.line 113
new-instance v0, Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException;
const-string v3, "Device returned error after sending Enter Bootloader"
invoke-direct {v0, v3, v2}, Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException;-><init>(Ljava/lang/String;I)V
throw v0
:try_end_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException; {:try_start_77 .. :try_end_d3} :catch_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException; {:try_start_77 .. :try_end_d3} :catch_10a
.line 123
:catch_d3
move-exception v0
.line 125
invoke-virtual {v0}, Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException;->getMessage()Ljava/lang/String;
move-result-object v2
invoke-virtual {p0, v2}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->loge(Ljava/lang/String;)V
.line 126
iget-object v2, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
invoke-virtual {v0}, Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-virtual {v2, v9, v0}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 127
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const/16 v2, 0x1008
invoke-virtual {v0, v1, v2}, Lno/nordicsemi/android/dfu/DfuBaseService;->terminateConnection(Landroid/bluetooth/BluetoothGatt;I)V
.line 134
:goto_eb
return-void
.line 71
:cond_ec
const-string v0, "Notifications"
goto/16 :goto_40
.line 95
:catch_f0
move-exception v0
:try_start_f1
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mReceivedData:[B
goto :goto_74
.line 115
:cond_f4
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
invoke-virtual {v0}, Lno/nordicsemi/android/dfu/DfuBaseService;->waitUntilDisconnected()V
.line 120
:goto_f9
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const/4 v2, 0x5
const-string v3, "Disconnected by the remote device"
invoke-virtual {v0, v2, v3}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 122
const/4 v0, 0x0
invoke-virtual {p0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->shouldScanForBootloader()Z
move-result v2
invoke-virtual {p0, p1, v0, v2}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->finalize(Landroid/content/Intent;ZZ)V
:try_end_109
.catch Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException; {:try_start_f1 .. :try_end_109} :catch_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException; {:try_start_f1 .. :try_end_109} :catch_10a
goto :goto_eb
.line 128
:catch_10a
move-exception v0
.line 129
invoke-virtual {v0}, Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException;->getErrorNumber()I
move-result v2
or-int/lit16 v2, v2, 0x800
.line 130
invoke-virtual {v0}, Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-virtual {p0, v0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->loge(Ljava/lang/String;)V
.line 131
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
const-string v3, "Remote DFU error: %s"
new-array v4, v7, [Ljava/lang/Object;
invoke-static {v2}, Lno/nordicsemi/android/a/c;->fp(I)Ljava/lang/String;
move-result-object v5
aput-object v5, v4, v8
invoke-static {v3, v4}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
move-result-object v3
invoke-virtual {v0, v9, v3}, Lno/nordicsemi/android/dfu/DfuBaseService;->sendLogBroadcast(ILjava/lang/String;)V
.line 132
iget-object v0, p0, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->mService:Lno/nordicsemi/android/dfu/DfuBaseService;
or-int/lit16 v2, v2, 0x2000
invoke-virtual {v0, v1, v2}, Lno/nordicsemi/android/dfu/DfuBaseService;->terminateConnection(Landroid/bluetooth/BluetoothGatt;I)V
goto :goto_eb
.line 117
:cond_133
:try_start_133
const-string v0, "Device disconnected before receiving notification"
invoke-virtual {p0, v0}, Lno/nordicsemi/android/dfu/ButtonlessDfuImpl;->logi(Ljava/lang/String;)V
:try_end_138
.catch Lno/nordicsemi/android/dfu/internal/exception/UnknownResponseException; {:try_start_133 .. :try_end_138} :catch_d3
.catch Lno/nordicsemi/android/dfu/internal/exception/RemoteDfuException; {:try_start_133 .. :try_end_138} :catch_10a
goto :goto_f9
.end method
.method protected abstract shouldScanForBootloader()Z
.end method