diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 52e0ed9e..097402c2 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 2105900b..6962af3e 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -10,6 +10,7 @@
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 70316e59..99b16dc1 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -5,6 +5,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index 9377e8b9..d47376d9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -80,6 +80,10 @@ android {
lintOptions {
abortOnError false
}
+
+ dynamicFeatures = [":dynamic_vgalimenti"]
+
+
}
dependencies {
@@ -89,16 +93,16 @@ dependencies {
})
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.orhanobut:logger:2.2.0'
- implementation 'com.google.firebase:firebase-core:16.0.6'
+ implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.google.firebase:firebase-crash:16.2.1'
implementation 'com.google.firebase:firebase-perf:16.2.3'
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.8'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'com.google.android.material:material:1.1.0-alpha02'
+ implementation 'com.google.android.material:material:1.1.0-alpha03'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
implementation 'androidx.cardview:cardview:1.0.0'
- implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01'
+ implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha02'
implementation 'androidx.preference:preference:1.1.0-alpha02'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
@@ -108,8 +112,8 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.0.0'
kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
- //implementation "com.emreeran.permissionlivedata:permissionlivedata:1.0.4"
- //implementation 'com.karumi:dexter:5.0.0'
+ implementation 'com.danielpuiu:ghostfish:2.0.0'
+ annotationProcessor "com.danielpuiu:ghostfish-compiler:2.0.0"
//MVVM
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0"
@@ -122,7 +126,6 @@ dependencies {
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
implementation 'br.com.zbra:android-linq:1.1.0'
//FAB
- //implementation 'com.getbase:floatingactionbutton:1.10.1'
implementation 'com.github.clans:fab:1.6.4'
//CUSTOM VIEWS
implementation 'com.github.NaimishTrivedi:FBToast:1.0'
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/BaseRouter.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/BaseRouter.java
new file mode 100644
index 00000000..97bc2959
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/BaseRouter.java
@@ -0,0 +1,78 @@
+package it.integry.integrywmsnative.core.class_router;
+
+import android.util.Pair;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import it.integry.integrywmsnative.core.class_router.exceptions.MethodParameterTypeNotMatchException;
+import it.integry.integrywmsnative.core.class_router.exceptions.MethodParamsCountException;
+import it.integry.integrywmsnative.core.class_router.exceptions.MethodPathAlreadyDeclaredException;
+import it.integry.integrywmsnative.core.class_router.exceptions.MethodPathNotRegisteredException;
+
+public class BaseRouter {
+
+
+ private static List> mRoutePaths = new ArrayList<>();
+
+ private static boolean checkIfMethodExists(String path) {
+ boolean methodAlreadyDeclared = false;
+
+ for(int i = 0; i < mRoutePaths.size() && !methodAlreadyDeclared; i++) {
+ if(mRoutePaths.get(i).first.equalsIgnoreCase(path)) methodAlreadyDeclared = true;
+ }
+
+ return methodAlreadyDeclared;
+ }
+
+ private static int getMethodIndex(String path) {
+ for(int i = 0; i < mRoutePaths.size(); i++) {
+ if(mRoutePaths.get(i).first.equalsIgnoreCase(path)) return i;
+ }
+
+ return -1;
+ }
+
+ public static void registerPath(String path, MethodDTO method) throws MethodPathAlreadyDeclaredException {
+ if(checkIfMethodExists(path)) {
+ throw new MethodPathAlreadyDeclaredException(path);
+ }
+
+ mRoutePaths.add(new Pair<>(path, method));
+ }
+
+ public static void deregisterPath(String path) {
+ if(checkIfMethodExists(path)) {
+ mRoutePaths.remove(getMethodIndex(path));
+ }
+ }
+
+
+ public static void invokePath(String path, Object... params) throws MethodPathNotRegisteredException, MethodParamsCountException, MethodParameterTypeNotMatchException, InvocationTargetException, IllegalAccessException {
+ if(!checkIfMethodExists(path)) {
+ throw new MethodPathNotRegisteredException(path);
+ }
+
+ MethodDTO methodDTO = mRoutePaths.get(getMethodIndex(path)).second;
+
+ Class[] methodParameters = methodDTO.getMethod().getParameterTypes();
+
+ if(methodParameters.length != params.length) {
+ throw new MethodParamsCountException(path);
+ }
+
+ for(int i = 0; i < params.length; i++) {
+ if(params[i].getClass() != methodParameters[i] && methodParameters[i].cast(params[i]) == null) {
+ throw new MethodParameterTypeNotMatchException(params[i].getClass().getCanonicalName(), path, methodParameters[i].getCanonicalName());
+ }
+ }
+
+
+ methodDTO.getMethod().invoke(null, params);
+
+
+ }
+
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/MethodDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/MethodDTO.java
new file mode 100644
index 00000000..0c94f194
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/MethodDTO.java
@@ -0,0 +1,29 @@
+package it.integry.integrywmsnative.core.class_router;
+
+import java.lang.reflect.Method;
+
+public class MethodDTO {
+
+ private Method method;
+
+ public Method getMethod() {
+ return method;
+ }
+
+ public MethodDTO setMethod(Method method) {
+ this.method = method;
+ return this;
+ }
+
+ public static MethodDTO fromName(Class clazz, String methodName) {
+ Method[] methods = clazz.getMethods();
+ for (Method m : methods) {
+ if (methodName.equals(m.getName())) {
+ return new MethodDTO().setMethod(m);
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParameterTypeNotMatchException.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParameterTypeNotMatchException.java
new file mode 100644
index 00000000..7565948e
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParameterTypeNotMatchException.java
@@ -0,0 +1,9 @@
+package it.integry.integrywmsnative.core.class_router.exceptions;
+
+public class MethodParameterTypeNotMatchException extends Exception{
+
+ public MethodParameterTypeNotMatchException(String path, String type1, String type2) {
+ super(String.format("The given parameter (%s) to %s don't match the required type %s", type1, path, type2));
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParamsCountException.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParamsCountException.java
new file mode 100644
index 00000000..08e838f8
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodParamsCountException.java
@@ -0,0 +1,9 @@
+package it.integry.integrywmsnative.core.class_router.exceptions;
+
+public class MethodParamsCountException extends Exception {
+
+ public MethodParamsCountException(String path) {
+ super(String.format("Given parameters to path %s do not match the real method declaration", path));
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathAlreadyDeclaredException.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathAlreadyDeclaredException.java
new file mode 100644
index 00000000..58c05fe8
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathAlreadyDeclaredException.java
@@ -0,0 +1,11 @@
+package it.integry.integrywmsnative.core.class_router.exceptions;
+
+public class MethodPathAlreadyDeclaredException extends Exception {
+
+ public MethodPathAlreadyDeclaredException(String path) {
+
+ super(String.format("Method %s is already declared in this scope", path));
+
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathNotRegisteredException.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathNotRegisteredException.java
new file mode 100644
index 00000000..01b400c7
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/exceptions/MethodPathNotRegisteredException.java
@@ -0,0 +1,9 @@
+package it.integry.integrywmsnative.core.class_router.exceptions;
+
+public class MethodPathNotRegisteredException extends Exception{
+
+ public MethodPathNotRegisteredException(String path){
+ super(String.format("Method path %s isn't registered at the moment. Please call BaseRouter.registerPath before call invoke.", path));
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java
index 8109b3a8..cbea32b2 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java
@@ -3,21 +3,19 @@ package it.integry.integrywmsnative.core.context;
import android.content.Context;
import com.crashlytics.android.Crashlytics;
+import com.danielpuiu.ghostfish.GhostFish;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.Logger;
+import java.lang.reflect.Method;
+
import io.fabric.sdk.android.Fabric;
import it.integry.integrywmsnative.BuildConfig;
-import it.integry.integrywmsnative.core.REST.consumers.ColliMagazzinoRESTConsumer;
-import it.integry.integrywmsnative.core.REST.model.DistribuzioneColloDTO;
import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.data_recover.ColliDataRecover;
-import it.integry.integrywmsnative.core.model.MtbColt;
-import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.settings.Stash;
-import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityResources;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.core.utility.UtilityToast;
@@ -47,6 +45,8 @@ public class AppContext {
this.initLogger();
this.initRecoverColli();
+
+ this.initReflections();
}
@@ -90,4 +90,27 @@ public class AppContext {
ColliDataRecover.init(mContext);
}
+ private void initReflections() {
+ GhostFish.create(mContext);
+
+ try {
+ String initMethod = "init";
+
+ Class dynamicContextClass = Class.forName("it.integry.wms.dynamic_customization.DynamicContext");
+
+ Method[] methods = dynamicContextClass.getMethods();
+ for (Method m : methods) {
+ if (initMethod.equals(m.getName())) {
+ // for static methods we can use null as instance of class
+ m.invoke(null);
+ break;
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
index 5d159429..584e79a9 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
@@ -1,8 +1,11 @@
package it.integry.integrywmsnative.core.context;
+import android.content.Context;
import android.text.SpannableString;
+import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
+import it.integry.integrywmsnative.core.class_router.BaseRouter;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper;
@@ -19,6 +22,14 @@ public class MainContext {
this.initDBData(() -> {
onContextInitialized.run();
});
+
+
+ try {
+ BaseRouter.invokePath("testToast", mContext);
+ } catch (Exception ex) {
+ Log.e("PIF", ex.getMessage());
+ }
+
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d14c8b6..69aa8176 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -182,5 +182,6 @@
Recovering data
Wait a moment
+ Personalizzazione VGAlimenti
diff --git a/build.gradle b/build.gradle
index df7f4a2f..525955e1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,7 +15,7 @@ buildscript {
google()
}
dependencies {
- classpath "com.android.tools.build:gradle:3.3.0"
+ classpath 'com.android.tools.build:gradle:3.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.2.0'
classpath 'com.google.firebase:firebase-plugins:1.1.5'
diff --git a/device-2019-01-21-111733.png b/device-2019-01-21-111733.png
deleted file mode 100644
index e72511ed..00000000
Binary files a/device-2019-01-21-111733.png and /dev/null differ
diff --git a/device-2019-01-21-125259.png b/device-2019-01-21-125259.png
deleted file mode 100644
index 8ca4c2ad..00000000
Binary files a/device-2019-01-21-125259.png and /dev/null differ
diff --git a/dynamic_vgalimenti/.gitignore b/dynamic_vgalimenti/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/dynamic_vgalimenti/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/dynamic_vgalimenti/Integry.jks b/dynamic_vgalimenti/Integry.jks
new file mode 100644
index 00000000..1b30e196
Binary files /dev/null and b/dynamic_vgalimenti/Integry.jks differ
diff --git a/dynamic_vgalimenti/build.gradle b/dynamic_vgalimenti/build.gradle
new file mode 100644
index 00000000..1174ac1a
--- /dev/null
+++ b/dynamic_vgalimenti/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.dynamic-feature'
+
+android {
+ signingConfigs {
+ release {
+ keyAlias 'wms key'
+ keyPassword 'inpmiy'
+ storeFile file('Integry.jks')
+ storePassword 'inpmiy'
+ }
+ }
+ compileSdkVersion 28
+ defaultConfig {
+ minSdkVersion 21
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+
+
+ }
+ buildToolsVersion '28.0.3'
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ implementation project(':app')
+}
diff --git a/dynamic_vgalimenti/src/main/AndroidManifest.xml b/dynamic_vgalimenti/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..317da564
--- /dev/null
+++ b/dynamic_vgalimenti/src/main/AndroidManifest.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java
new file mode 100644
index 00000000..af0199ff
--- /dev/null
+++ b/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java
@@ -0,0 +1,26 @@
+package it.integry.wms.dynamic_customization;
+
+import android.util.Log;
+
+import it.integry.integrywmsnative.core.class_router.BaseRouter;
+import it.integry.integrywmsnative.core.class_router.MethodDTO;
+import it.integry.integrywmsnative.core.class_router.exceptions.MethodPathAlreadyDeclaredException;
+
+public class DynamicContext {
+
+ public static void init() {
+ Log.d("DynamicContext", "Caricamento personalizzazioni per VGAlimenti");
+
+ try {
+ BaseRouter.registerPath("testToast", MethodDTO.fromName(OrdineVendita.class, "testMe"));
+ BaseRouter.registerPath("distribuzioneColloV", MethodDTO.fromName(OrdineVendita.class, "distribuisciColloV"));
+
+ } catch (MethodPathAlreadyDeclaredException ex) {
+
+ }
+
+ Log.d("DynamicContext", "Caricamento personalizzazioni per VGAlimenti COMPLETATO");
+
+ }
+
+}
diff --git a/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/OrdineVendita.java b/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/OrdineVendita.java
new file mode 100644
index 00000000..8ce9f79f
--- /dev/null
+++ b/dynamic_vgalimenti/src/main/java/it/integry/wms/dynamic_customization/OrdineVendita.java
@@ -0,0 +1,18 @@
+package it.integry.wms.dynamic_customization;
+
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+
+public class OrdineVendita {
+
+
+ public static void testMe(Context context) {
+ Toast.makeText(context, "Questo รจ un fottuto test di questo maledetto framework", Toast.LENGTH_SHORT).show();
+ }
+
+ public static void distribuisciColloV() {
+ Log.d("OrdineVendita", "Completata distribuzione collo");
+ }
+
+}
diff --git a/images/RoundLogoWithText.ai b/ext_sources/RoundLogoWithText.ai
similarity index 100%
rename from images/RoundLogoWithText.ai
rename to ext_sources/RoundLogoWithText.ai
diff --git a/settings.gradle b/settings.gradle
index d6bcdaf1..0f8ee31e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':pointmobilescannerlibrary', ':waterfall_toolbar', ':barcode_base_library'
+include ':app', ':pointmobilescannerlibrary', ':waterfall_toolbar', ':barcode_base_library', ':dynamic_vgalimenti'