analysis: full official-app reverse artifacts (jadx sources, ghidra libcxsdk decomp, authoritative protocol conclusions) + docs
This commit is contained in:
@@ -0,0 +1,246 @@
|
||||
package cn.com.magnity.magnitycx.sdk;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.hardware.usb.UsbDevice;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
import cn.com.magnity.magnitycx.FragmentMainCenter;
|
||||
import cn.com.magnity.magnitycx.MagApplication;
|
||||
import cn.com.magnity.magnitycx.log.Logging;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class UsbConnection extends Observable<DelegateDeviceConnected> {
|
||||
private static final String ACTION_USB_PERMISSION = "cn.com.magnity.magnitycx.USB_PERMISSION";
|
||||
private static UsbConnection instance_ = new UsbConnection();
|
||||
private FragmentMainCenter fragmentMainCenter_;
|
||||
private PhoneReceiver phoneReceiver_;
|
||||
private UsbCommunication usbComm_;
|
||||
private UsbConnectionReceiver usbConnectionReceiver_;
|
||||
private UsbPermissionReceiver usbPermissionReceiver_;
|
||||
private Context context_ = MagApplication.getInstance();
|
||||
private UsbManager usbManager_ = (UsbManager) this.context_.getSystemService("usb");
|
||||
|
||||
public static UsbConnection getInstance() {
|
||||
return instance_;
|
||||
}
|
||||
|
||||
private UsbConnection() {
|
||||
}
|
||||
|
||||
public void setCallbackReceiver(FragmentMainCenter fragment) {
|
||||
this.fragmentMainCenter_ = fragment;
|
||||
if (this.usbComm_ != null) {
|
||||
this.usbComm_.setCallbackReceiver(fragment);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean init() {
|
||||
if (this.phoneReceiver_ == null) {
|
||||
registerPhoneReceiver();
|
||||
}
|
||||
if (this.usbConnectionReceiver_ == null) {
|
||||
registerConnectionReceiver();
|
||||
}
|
||||
UsbDevice device = findDevice(33596, 1);
|
||||
if (device != null) {
|
||||
requestDevicePermission(device);
|
||||
}
|
||||
return device != null;
|
||||
}
|
||||
|
||||
public void deinit(boolean notifyUi) {
|
||||
if (this.usbConnectionReceiver_ != null) {
|
||||
this.context_.unregisterReceiver(this.usbConnectionReceiver_);
|
||||
this.usbConnectionReceiver_ = null;
|
||||
}
|
||||
if (this.usbPermissionReceiver_ != null) {
|
||||
this.context_.unregisterReceiver(this.usbPermissionReceiver_);
|
||||
this.usbPermissionReceiver_ = null;
|
||||
}
|
||||
disconnect(notifyUi);
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return this.usbComm_ != null;
|
||||
}
|
||||
|
||||
/* JADX INFO: Access modifiers changed from: private */
|
||||
public boolean connect(UsbDevice device) {
|
||||
if (this.usbComm_ != null) {
|
||||
return true;
|
||||
}
|
||||
Logging.info("Try to connect to device");
|
||||
try {
|
||||
this.usbComm_ = new UsbCommunication(this, this.usbManager_, device, this.fragmentMainCenter_);
|
||||
int ret = this.usbComm_.connect();
|
||||
if (ret == -1) {
|
||||
Logging.error("Fail to connect to device, do clean work now");
|
||||
this.usbComm_.disconnect();
|
||||
this.usbComm_ = null;
|
||||
return false;
|
||||
}
|
||||
if (ret == 0) {
|
||||
return false;
|
||||
}
|
||||
notifyObervers(1);
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
Logging.warn("Exception when connecting to device (" + ex.getMessage() + ")");
|
||||
if (this.usbComm_ != null) {
|
||||
this.usbComm_.disconnect();
|
||||
}
|
||||
this.usbComm_ = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void notifyObervers(int status) {
|
||||
synchronized (this.observers_) {
|
||||
if (status == 1) {
|
||||
for (int i = this.observers_.size() - 1; i != -1; i--) {
|
||||
((DelegateDeviceConnected) this.observers_.get(i)).onDeviceConnected(this.usbComm_);
|
||||
}
|
||||
} else if (status == 2) {
|
||||
for (int i2 = this.observers_.size() - 1; i2 != -1; i2--) {
|
||||
}
|
||||
} else if (status == 0) {
|
||||
for (int i3 = this.observers_.size() - 1; i3 != -1; i3--) {
|
||||
((DelegateDeviceConnected) this.observers_.get(i3)).onDeviceDisconnected();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* JADX INFO: Access modifiers changed from: private */
|
||||
public void disconnect(boolean notifyUi) {
|
||||
Logging.info("Try to disconnect to device");
|
||||
if (this.usbComm_ != null) {
|
||||
this.usbComm_.disconnect();
|
||||
this.usbComm_ = null;
|
||||
}
|
||||
if (notifyUi) {
|
||||
notifyObervers(0);
|
||||
}
|
||||
}
|
||||
|
||||
private UsbDevice findDevice(int vendorId, int productId) {
|
||||
for (UsbDevice device : this.usbManager_.getDeviceList().values()) {
|
||||
if (device.getVendorId() == vendorId && device.getProductId() == productId) {
|
||||
return device;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void registerConnectionReceiver() {
|
||||
this.usbConnectionReceiver_ = new UsbConnectionReceiver();
|
||||
IntentFilter localFilter = new IntentFilter();
|
||||
localFilter.addAction("android.hardware.usb.action.USB_DEVICE_ATTACHED");
|
||||
localFilter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");
|
||||
this.context_.registerReceiver(this.usbConnectionReceiver_, localFilter);
|
||||
}
|
||||
|
||||
private void registerPhoneReceiver() {
|
||||
this.phoneReceiver_ = new PhoneReceiver();
|
||||
IntentFilter localFilter = new IntentFilter();
|
||||
localFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");
|
||||
localFilter.addAction("android.intent.action.PHONE_STATE");
|
||||
this.context_.registerReceiver(this.phoneReceiver_, localFilter);
|
||||
}
|
||||
|
||||
private void requestDevicePermission(UsbDevice device) {
|
||||
if (this.usbManager_.hasPermission(device)) {
|
||||
Logging.trace("Already has permission");
|
||||
connect(device);
|
||||
return;
|
||||
}
|
||||
if (this.usbPermissionReceiver_ == null) {
|
||||
this.usbPermissionReceiver_ = new UsbPermissionReceiver();
|
||||
IntentFilter localFilter = new IntentFilter(ACTION_USB_PERMISSION);
|
||||
this.context_.registerReceiver(this.usbPermissionReceiver_, localFilter);
|
||||
}
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context_, 0, new Intent(ACTION_USB_PERMISSION), 0);
|
||||
this.usbManager_.requestPermission(device, pendingIntent);
|
||||
Logging.trace("Request permission");
|
||||
}
|
||||
|
||||
private final class UsbConnectionReceiver extends BroadcastReceiver {
|
||||
private UsbConnectionReceiver() {
|
||||
}
|
||||
|
||||
@Override // android.content.BroadcastReceiver
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case "android.hardware.usb.action.USB_DEVICE_ATTACHED":
|
||||
Logging.trace("Broadcast for usb attached received");
|
||||
UsbConnection.this.disconnect(false);
|
||||
UsbConnection.this.init();
|
||||
break;
|
||||
case "android.hardware.usb.action.USB_DEVICE_DETACHED":
|
||||
Logging.trace("Broadcast for usb detached received");
|
||||
UsbConnection.this.disconnect(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class UsbPermissionReceiver extends BroadcastReceiver {
|
||||
private UsbPermissionReceiver() {
|
||||
}
|
||||
|
||||
@Override // android.content.BroadcastReceiver
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case "cn.com.magnity.magnitycx.USB_PERMISSION":
|
||||
Logging.trace("Broadcast for usb permission received");
|
||||
if (!intent.getBooleanExtra("permission", false)) {
|
||||
Logging.warn("Permission rejected by user");
|
||||
break;
|
||||
} else {
|
||||
UsbDevice device = (UsbDevice) intent.getParcelableExtra("device");
|
||||
if (device != null) {
|
||||
UsbConnection.this.connect(device);
|
||||
UsbConnection.this.context_.unregisterReceiver(UsbConnection.this.usbPermissionReceiver_);
|
||||
UsbConnection.this.usbPermissionReceiver_ = null;
|
||||
break;
|
||||
} else {
|
||||
Logging.warn("Failed to get device");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PhoneReceiver extends BroadcastReceiver {
|
||||
private PhoneReceiver() {
|
||||
}
|
||||
|
||||
@Override // android.content.BroadcastReceiver
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case "android.intent.action.PHONE_STATE":
|
||||
if (MagApplication.magParameter.basePara1.swVersion > 100) {
|
||||
String state = intent.getStringExtra("state");
|
||||
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
|
||||
Logging.trace("ring");
|
||||
UsbConnection.this.deinit(true);
|
||||
break;
|
||||
} else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
|
||||
Logging.trace("hang up");
|
||||
UsbConnection.this.init();
|
||||
break;
|
||||
} else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
|
||||
Logging.trace("hang on");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user