Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6a41b02
MRK-5213 Реализация API для проверки марок в ЕСМ
Mar 25, 2026
7886f66
MRK-5213
Mar 25, 2026
2c1238b
MRK-5213
Mar 25, 2026
306f3bc
MRK-5213
Mar 30, 2026
4ca8363
MRK-5213 Добавление версий для Parcelable классов
Apr 1, 2026
8bc2f19
MRK-5213 Замена callback-ов в ITsPioTService.aidl на возвращаемый TsP…
Apr 7, 2026
2635c4e
MRK-5213
Apr 7, 2026
a5c028c
MRK-5213
Apr 9, 2026
511fdba
MRK-5213
May 6, 2026
621fbeb
MRK-5213
May 7, 2026
cdac980
MRK-5213 Поправил нейминг ошибок ТС ПИоТ
May 19, 2026
00c2338
Merge branch 'rc_v0.6.33' of https://github.com/evotor/integration-li…
May 19, 2026
ab61b4a
MRK-5213 Некоторые поля помечены nullable
May 27, 2026
1c1b3cf
MRK-5213 gtin тоже nullable с некорректными марками
May 27, 2026
a93f99f
MRK-5213 Исправил логирование полей groupIds и printView класса BaseC…
Jun 4, 2026
c0e5770
STDEV-25309 Добавил toString для ошибок
Jun 9, 2026
efae757
STDEV-25310 Поправил поле cis в MarkingCode.java
Jun 9, 2026
69882cf
STDEV-25315 Убрал метод isOffline из CodesCheckResult.java за ненадоб…
Jun 9, 2026
e601b97
Merge pull request #624 from evotor/STDEV-25309
Angeba Jun 9, 2026
395eaf3
Merge pull request #625 from evotor/STDEV-25310
Angeba Jun 9, 2026
bf2d8b8
Merge pull request #626 from evotor/STDEV-25315
Angeba Jun 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified gradlew
100644 → 100755
Empty file.
10 changes: 10 additions & 0 deletions src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.evotor.tspiot;

import ru.evotor.tspiot.model.MarkingCode;
import ru.evotor.tspiot.result.TsPioTResult;

interface ITsPioTService {
TsPioTResult getKktInfo();

TsPioTResult getMarkedProductsInfo(in List<MarkingCode> codes, in String userUuid);
}
3 changes: 3 additions & 0 deletions src/main/aidl/ru/evotor/tspiot/model/MarkingCode.aidl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.evotor.tspiot.model;

parcelable MarkingCode;
3 changes: 3 additions & 0 deletions src/main/aidl/ru/evotor/tspiot/result/TsPioTResult.aidl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.evotor.tspiot.result;

parcelable TsPioTResult;
64 changes: 64 additions & 0 deletions src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package ru.evotor.tspiot;

import android.content.Context;
import android.os.DeadObjectException;
import java.util.concurrent.CopyOnWriteArrayList;
import ru.evotor.tspiot.exceptions.ServiceNotConnectedException;
import ru.evotor.tspiot.exceptions.TsPioTServiceOperationOnMainThreadException;
import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;
import ru.evotor.tspiot.exceptions.TsPioTServiceRuntimeException;
import ru.evotor.tspiot.service.ITsPioTConnectionWrapper;
import ru.evotor.tspiot.service.ITsPioTServiceWrapper;
import ru.evotor.tspiot.service.TsPioTService;

public class TsPioTServiceConnector {

protected static final String TAG = "TsPioTServiceConnector";

public static final String ACTION_TSPIOT_SERVICE = "evotor.intent.action.TSPIOT_SERVICE";
public static final String TARGET_PACKAGE = "ru.esp.umesm";
public static final String TARGET_CLASS_NAME = "ru.esp.worker.worker.IntegrationMarksCheckService";

protected final static TsPioTService tsPioTService = new TsPioTService();

protected final static CopyOnWriteArrayList<ITsPioTConnectionWrapper> connectionWrappers = new CopyOnWriteArrayList<>();

public static CopyOnWriteArrayList<ITsPioTConnectionWrapper> getConnectionWrappers() {
return connectionWrappers;
}

public static void addConnectionWrapper(ITsPioTConnectionWrapper connectionWrapper) {
connectionWrappers.add(connectionWrapper);
}

public static void removeConnectionWrapper(ITsPioTConnectionWrapper connectionWrapper) {
connectionWrappers.remove(connectionWrapper);
}

public static void clearConnectionWrappers() {
connectionWrappers.clear();
}

public static ITsPioTServiceWrapper connectTsPioTService(Context context) throws TsPioTServiceException {
TsPioTServiceOperationOnMainThreadException.throwIfMainThread();

tsPioTService.connectService(context, false);
return tsPioTService;
}

public static void disconnectTsPioTService() throws TsPioTServiceException {
TsPioTServiceOperationOnMainThreadException.throwIfMainThread();

tsPioTService.disconnectService();
}

public static void processException(Exception exc) throws TsPioTServiceException {
if (exc instanceof DeadObjectException) {
tsPioTService.reconnectService();
throw new ServiceNotConnectedException(exc);
} else if (exc instanceof RuntimeException) {
throw new TsPioTServiceRuntimeException(exc);
}
exc.printStackTrace();
}
}
104 changes: 104 additions & 0 deletions src/main/java/ru/evotor/tspiot/Utils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package ru.evotor.tspiot;

import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.Nullable;
import java.io.Serializable;

public final class Utils {

@Nullable
public static Integer readInteger(Parcel parcel) {
try {
return (Integer) parcel.readValue(Integer.class.getClassLoader());
} catch (Exception ex) {
return null;
}
}

@Nullable
public static Boolean readBoolean(Parcel parcel) {
try {
return (Boolean) parcel.readValue(Boolean.class.getClassLoader());
} catch (Exception ex) {
return null;
}
}

@SuppressWarnings("unchecked")
@Nullable
public static <T> Class<T> readClass(Parcel parcel) {
Serializable serializable = parcel.readSerializable();

if (serializable == null) {
return null;
}

try {
return (Class<T>) serializable;
} catch (Exception exception) {
return null;
}
}

@Nullable
public static <T extends Parcelable> T readData(Class<? extends T> classType, Parcel parcel) {
try {
if (classType == null) {
return parcel.readParcelable(null);
}

return parcel.readParcelable(classType.getClassLoader());
} catch (Exception exception) {
return null;
}
}

public static String toString(@Nullable Object object) {
return object == null ? "null" : object.toString();
}

public static String toString(@Nullable int[] ints) {
if (ints == null) {
return "null";
} else if (ints.length == 0) {
return "[]";
} else {
StringBuilder sb = new StringBuilder();

sb.append("[");
for (int i = 0; i < ints.length; i++) {
sb.append(ints[i]);

if (i != ints.length - 1) {
sb.append(", ");
}
}
sb.append("]");

return sb.toString();
}
}

public static String toString(@Nullable Object[] objects) {
if (objects == null) {
return "null";
} else if (objects.length == 0) {
return "[]";
} else {
StringBuilder sb = new StringBuilder();

sb.append("[");
for (int i = 0; i < objects.length; i++) {
sb.append(objects[i]);

if (i != objects.length - 1) {
sb.append(", ");
}
}
sb.append("]");

return sb.toString();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class NullContextException extends TsPioTServiceException { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class ServiceAlreadyConnectedException extends TsPioTServiceException { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class ServiceNotConnectedException extends TsPioTServiceException {

public ServiceNotConnectedException(Exception ex) { super(ex); }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;
import ru.evotor.tspiot.result.model.base.ErrorDescription;
import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescriptionWrapper;

/** Исключение обёртка для передачи ошибок от драйвера ТС ПИоТ */
public class TsPioTErrorHolderException extends TsPioTServiceException {

public final TsPioTErrorsDescriptionWrapper<? extends ErrorDescription> errorDescriptionWrapper;

public TsPioTErrorHolderException(TsPioTErrorsDescriptionWrapper<? extends ErrorDescription> errorDescriptionWrapper) {
super();
this.errorDescriptionWrapper = errorDescriptionWrapper;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.evotor.tspiot.exceptions;

import android.os.Looper;
import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class TsPioTServiceOperationOnMainThreadException extends TsPioTServiceException {
public TsPioTServiceOperationOnMainThreadException() {
super("It is forbidden to perform operations with TS PIoT service in the main thread, it can be time-consuming");
}

public static void throwIfMainThread() throws TsPioTServiceOperationOnMainThreadException {
if (Looper.getMainLooper() == Looper.myLooper()) {
throw new TsPioTServiceOperationOnMainThreadException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class TsPioTServiceRuntimeException extends TsPioTServiceException {

public TsPioTServiceRuntimeException(Exception ex) { super(ex); }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.evotor.tspiot.exceptions;

import ru.evotor.tspiot.exceptions.base.TsPioTServiceException;

public class UnknownException extends TsPioTServiceException {

public UnknownException(String message) { super(message); }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.evotor.tspiot.exceptions.base;

/** Базовый класс для исключений, которые могу возникнуть на стороне клиента ТС ПИоТ*/
public class TsPioTServiceException extends Exception {

public TsPioTServiceException() {
super();
}

public TsPioTServiceException(String message) {
super(message);
}

public TsPioTServiceException(Exception e) {
super(e);
}
}
59 changes: 59 additions & 0 deletions src/main/java/ru/evotor/tspiot/model/MarkingCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package ru.evotor.tspiot.model;

import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.Nullable;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import ru.evotor.tspiot.Utils;

public class MarkingCode implements Parcelable {

/** Версия MarkingCode */
private static final int VERSION = 1;

/** Код маркировки */
@NotNull private final String cis;

/** Опциональный параметр идентификатора товарной группы */
@Nullable private final Integer productType;

public MarkingCode(@NotNull String cis, @Nullable Integer productType) {
this.cis = cis;
this.productType = productType;
}

private MarkingCode(Parcel parcel) {
int version = parcel.readInt();
this.cis = Objects.requireNonNull(parcel.readString());
this.productType = Utils.readInteger(parcel);
}

@NotNull
public String getCis() { return cis; }

@Nullable
public Integer getProductType() { return productType; }

@Override
public int describeContents() { return 0; }

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(VERSION);
parcel.writeString(cis);
parcel.writeValue(productType);
}

public static Creator<MarkingCode> CREATOR = new Creator<>() {
@Override
public MarkingCode createFromParcel(Parcel parcel) {
return new MarkingCode(parcel);
}

@Override
public MarkingCode[] newArray(int i) {
return new MarkingCode[i];
}
};
}
54 changes: 54 additions & 0 deletions src/main/java/ru/evotor/tspiot/result/TsPioTError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package ru.evotor.tspiot.result;

import android.os.Parcel;
import android.os.Parcelable;
import ru.evotor.tspiot.Utils;
import ru.evotor.tspiot.result.model.base.ErrorDescription;
import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescriptionWrapper;

public class TsPioTError implements Parcelable {

/** Версия TsPioTError */
private final static int VERSION = 1;

/** Описание ошибки */
private final TsPioTErrorsDescriptionWrapper<? extends ErrorDescription> error;

private final Class<? extends TsPioTErrorsDescriptionWrapper<? extends ErrorDescription>> errorType;

private TsPioTError(Parcel parcel) {
int version = parcel.readInt();
errorType = Utils.readClass(parcel);
error = Utils.readData(errorType, parcel);
}

@SuppressWarnings("unchecked")
public TsPioTError(TsPioTErrorsDescriptionWrapper<? extends ErrorDescription> error) {
this.error = error;
this.errorType = (Class<? extends TsPioTErrorsDescriptionWrapper<? extends ErrorDescription>>) error.getClass();
}

public TsPioTErrorsDescriptionWrapper<? extends ErrorDescription> getError() { return error; }

@Override
public int describeContents() { return 0; }

@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(VERSION);
parcel.writeSerializable(errorType);
parcel.writeParcelable(error, flags);
}

public static final Creator<TsPioTError> CREATOR = new Creator<>() {
@Override
public TsPioTError createFromParcel(Parcel parcel) {
return new TsPioTError(parcel);
}

@Override
public TsPioTError[] newArray(int size) {
return new TsPioTError[size];
}
};
}
Loading