Creato ExceptionHandler e PermissionsHelper.

This commit is contained in:
Gius95 2018-12-13 17:26:27 +01:00
parent 70af7b7396
commit d4ce614ab5
10 changed files with 107 additions and 358 deletions

Binary file not shown.

View File

@ -9,10 +9,11 @@ android {
applicationId "it.integry.integrywmsnative" applicationId "it.integry.integrywmsnative"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 28 targetSdkVersion 28
versionCode 5 versionCode 6
versionName "1.0.2" versionName "1.0.3"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
@ -48,6 +49,9 @@ dependencies {
implementation 'org.parceler:parceler-api:1.1.10' implementation 'org.parceler:parceler-api:1.1.10'
annotationProcessor 'org.parceler:parceler:1.1.10' annotationProcessor 'org.parceler:parceler:1.1.10'
implementation 'com.annimon:stream:1.2.1' implementation 'com.annimon:stream:1.2.1'
implementation 'com.github.someshkumar049:permissionmadeeasy:1.1.1'
//MVVM //MVVM
implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'android.arch.lifecycle:extensions:1.1.1'
annotationProcessor "android.arch.lifecycle:compiler:1.1.1" annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

View File

@ -30,6 +30,7 @@ import it.integry.integrywmsnative.core.interfaces.IRecyclerFragment;
import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment;
import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.core.update.UpdatesManager;
import it.integry.integrywmsnative.core.utility.PermissionsHelper;
import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.core.utility.UtilitySettings;
import it.integry.integrywmsnative.databinding.ActivityMainBinding; import it.integry.integrywmsnative.databinding.ActivityMainBinding;
import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment; import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment;
@ -45,18 +46,20 @@ import it.integry.plugins.waterfalltoolbar.WaterfallToolbar;
public class MainActivity extends AppCompatActivity public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener { implements NavigationView.OnNavigationItemSelectedListener {
//@BindView(R.id.drawer_username) TextView mDrawerUsername;
//@BindView(R.id.drawer_logoAzienda) ImageView mDrawerLogo;
private ActivityMainBinding mBinding; private ActivityMainBinding mBinding;
private boolean firstCheckExecution = true; private boolean firstCheckExecution = true;
private boolean mIsOnline = false; private boolean mIsOnline = false;
private PermissionsHelper permissionsHelper = new PermissionsHelper(this);
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
permissionsHelper.askPermissions();
if(SettingsManager.i().user.username == null && SettingsManager.i().user.password == null){ if(SettingsManager.i().user.username == null && SettingsManager.i().user.password == null){
startLoginActivity(); startLoginActivity();
} else { } else {

View File

@ -11,6 +11,7 @@ import com.orhanobut.logger.Logger;
import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.exception.ExceptionsHandler;
import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.settings.Stash; import it.integry.integrywmsnative.core.settings.Stash;
import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.core.update.UpdatesManager;
@ -30,6 +31,8 @@ public class MainApplication extends Application {
super.onCreate(); super.onCreate();
Stash.init(this); Stash.init(this);
new ExceptionsHandler(this);
SettingsManager.init(this); SettingsManager.init(this);
ServerStatusChecker.init(); ServerStatusChecker.init();
BarcodeManager.init(this); BarcodeManager.init(this);

View File

@ -8,375 +8,60 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Debug; import android.os.Debug;
import android.os.Environment;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.util.Log; import android.util.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
public class ExceptionsHandler implements Thread.UncaughtExceptionHandler { public class ExceptionsHandler implements Thread.UncaughtExceptionHandler {
private final static String TAG = ExceptionsHandler.class.getSimpleName();
private final static String ERROR_FILE = ExceptionsHandler.class.getSimpleName() + ".error";
private ExceptionsHandler(Activity activity){ private final Context context;
private final Thread.UncaughtExceptionHandler rootHandler;
mPackageName = getPackageName(activity); public ExceptionsHandler(Context context) {
this.context = context;
// we should store the current exception handler -- to invoke it for all not handled exceptions ...
rootHandler = Thread.getDefaultUncaughtExceptionHandler();
// we replace the exception handler now with us -- we will properly dispatch the exceptions ...
Thread.setDefaultUncaughtExceptionHandler(this);
} }
public static ExceptionsHandler getINSTANCE(Activity activity){
if (mExceptionsHandler == null){
mExceptionsHandler = new ExceptionsHandler(activity);
}
return mExceptionsHandler;
}
private static String getPackageName(Context pContext){
String packageName = "";
try{
ActivityManager activityManager = (ActivityManager) pContext
.getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT > 20){
packageName = activityManager.getRunningAppProcesses().get(0).processName;
}else{
// <uses-permission android:name="android.permission.GET_TASKS" />
packageName = activityManager.getRunningTasks(1).get(0).topActivity
.getPackageName();
}
// There is a limit to the tag length of 23.
packageName = packageName
.substring(0, packageName.length() > 22 ? 22 : packageName.length());
}catch (Exception ex){
}
if (packageName.isEmpty()){
packageName = pContext.getPackageName();
}
return packageName;
}
public static void toCatch(Activity activity){
Thread.setDefaultUncaughtExceptionHandler(getINSTANCE(activity));
}
public static void logError(String message){
if (message.isEmpty()){
return;
}
logError(new Throwable(message.trim()));
}
public static void logError(Throwable exception){
try{
logCrash(exception);
}catch (Exception e){
Log.e(mPackageName, e.getMessage());
}
}
// Return the last error message
public static String getErrorMessage(){
return mErrorMessage;
}
public static void setErrorMessage(String errMsg){
mErrorMessage = errMsg;
}
// Return the last crash information
public static ApplicationErrorReport.CrashInfo crashInfo(){
return mCrashInfo;
}
private static String getAppLabel(Context pContext){
PackageManager lPackageManager = pContext.getPackageManager();
ApplicationInfo lApplicationInfo = null;
try{
lApplicationInfo = lPackageManager
.getApplicationInfo(pContext.getApplicationInfo().packageName, 0);
}catch (final PackageManager.NameNotFoundException e){
}
return (String) (lApplicationInfo != null ? lPackageManager
.getApplicationLabel(lApplicationInfo) : "Unknown");
}
public static boolean inDebugger(){
// If in Debugger Environment
boolean debugging = Debug.isDebuggerConnected();
return debugging;
}
@NonNull
private static String errorMsg(Throwable exception, String exceptError){
if (!exceptError.contains("error")){
mReportBuilder.append(reportError(exception));
}
if (!exceptError.contains("callstack")){
mReportBuilder.append(reportCallStack(exception));
}
if (!exceptError.contains("deviceinfo")){
mReportBuilder.append(reportDeviceInfo());
}
if (!exceptError.contains("firmware")){
mReportBuilder.append(reportFirmware());
}
return mReportBuilder.toString();
}
private static String reportError(Throwable exception){
mCrashInfo = new ApplicationErrorReport.CrashInfo(exception);
if (mCrashInfo.exceptionMessage == null){
mErrorMessage = "<unknown error>";
}else{
mErrorMessage = mCrashInfo.exceptionMessage
.replace(": " + mCrashInfo.exceptionClassName, "");
}
String throwFile = mCrashInfo.throwFileName == null ? "<unknown file>"
: mCrashInfo.throwFileName;
return "\n************ " + mCrashInfo.exceptionClassName + " ************\n"
+ mErrorMessage + LINE_SEPARATOR
+ "\n File: " + throwFile
+ "\n Method: " + mCrashInfo.throwMethodName + "()"
+ "\n Line No.: " + Integer.toString(mCrashInfo.throwLineNumber)
+ LINE_SEPARATOR;
// + "Class: " + crashInfo.throwClassName + LINE_SEPARATOR
}
private static String reportCallStack(Throwable exception){
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
String callStack = stackTrace.toString();
String errMsg = exception.toString();
return "\n************ CALLSTACK ************\n"
+ callStack.replace(errMsg, "")
+ LINE_SEPARATOR;
}
private static String reportDeviceInfo(){
return "\n************ DEVICE INFORMATION ***********\n"
+ "Brand: "
+ Build.BRAND
+ LINE_SEPARATOR
+ "Device: "
+ Build.DEVICE
+ LINE_SEPARATOR
+ "Model: "
+ Build.MODEL
+ LINE_SEPARATOR
+ "Id: "
+ Build.ID
+ LINE_SEPARATOR
+ "Product: "
+ Build.PRODUCT
+ LINE_SEPARATOR;
}
private static String reportFirmware(){
return "\n************ FIRMWARE ************\n"
+ "SDK: "
+ Build.VERSION.SDK_INT
+ LINE_SEPARATOR
+ "Release: "
+ Build.VERSION.RELEASE
+ LINE_SEPARATOR
+ "Incremental: "
+ Build.VERSION.INCREMENTAL
+ LINE_SEPARATOR;
}
// Empty the report as it is begin re-populated.
private static void reportEmptied(){
// No need to empty
if (mReportBuilder.length() == 0){
return;
}
mReportBuilder.setLength(0);
mReportBuilder.trimToSize();
}
@Override @Override
public void uncaughtException(Thread thread, Throwable exception){ public void uncaughtException(final Thread thread, final Throwable ex) {
// Don't re-enter -- avoid infinite loops if crash-reporting crashes.
if (mCrashing) return;
mCrashing = true;
catchException(thread, exception);
defaultExceptionHandler(thread, exception);
}
public String catchException(Thread thread, Throwable exception){
String errorMsg = "";
try { try {
UtilityLogger.errorMe(new Exception(ex));
errorMsg = logCrash(exception); } catch (Exception e) {
Log.e(TAG, "Exception Logger failed!", e);
}catch (Exception ex){
Log.e(mPackageName, ex.getMessage());
} }
return errorMsg; appendToFile(new Exception(ex));
} }
public void appendToFile(Exception e) {
public static void defaultExceptionHandler(Thread thread, Throwable exception){
try { try {
File yourFile = new File(Environment.getExternalStorageDirectory(), "log.txt");
// Execute the old handler. //String dataFolder = yourFile.getPath();
if (mOldHandler != null){ FileWriter fstream = new FileWriter(yourFile.getPath(), true);
BufferedWriter out = new BufferedWriter(fstream);
mOldHandler.uncaughtException(thread, exception); PrintWriter pWriter = new PrintWriter(out, true);
e.printStackTrace(pWriter);
} }
catch (Exception ie) {
}catch (Exception ex){ throw new RuntimeException("Could not write Exception to file", ie);
Log.e(mPackageName, ex.getMessage());
} }
} }
public static String logCrash(Throwable exception){
return errorMsg(exception, "deviceinfo firmware");
}
public void onDestroy(){
mExceptionsHandler = null;
}
// Prevents infinite loops.
private static volatile boolean mCrashing = false;
private static final StringBuilder mReportBuilder = new StringBuilder();
private static final String LINE_SEPARATOR = "\n";
private static final Thread.UncaughtExceptionHandler mOldHandler = Thread
.getDefaultUncaughtExceptionHandler();
private static ExceptionsHandler mExceptionsHandler;
private static String mPackageName;
private static ApplicationErrorReport.CrashInfo mCrashInfo;
private static String mErrorMessage = "";
} }

View File

@ -0,0 +1,46 @@
package it.integry.integrywmsnative.core.utility;
import android.app.Activity;
import android.support.annotation.NonNull;
import com.somesh.permissionmadeeasy.enums.Permission;
import com.somesh.permissionmadeeasy.helper.PermissionHelper;
import com.somesh.permissionmadeeasy.intefaces.PermissionListener;
import java.util.ArrayList;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R;
public class PermissionsHelper implements PermissionListener {
private Activity mActivity;
private Integer REQUEST_CODE = 1;
public PermissionsHelper(Activity activity) {
this.mActivity = activity;
}
public void askPermissions() {
PermissionHelper permissionHelper = PermissionHelper.Builder()
.with(this.mActivity)
.requestCode(REQUEST_CODE)
.setPermissionResultCallback(this)
.askFor(Permission.STORAGE)
.rationalMessage(mActivity.getResources().getString(R.string.permission_request_message)) //Optional
.build();
permissionHelper.requestPermissions();
}
@Override
public void onPermissionsGranted(int i, ArrayList<String> arrayList) {
}
@Override
public void onPermissionsDenied(int i, ArrayList<String> arrayList) {
}
}

View File

@ -57,6 +57,10 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme
mBinding.setViewmodel(mRettificaGiacenzeViewModel); mBinding.setViewmodel(mRettificaGiacenzeViewModel);
init(); init();
Integer a = null;
String b = a.toString();
return mBinding.getRoot(); return mBinding.getRoot();
} }

View File

@ -22,6 +22,8 @@
<string name="reset">Resetta</string> <string name="reset">Resetta</string>
<string name="dispatched">Evasi</string> <string name="dispatched">Evasi</string>
<string name="permission_request_message">Questi permessi sono necessari al funzionamento dell\'app</string>
<string name="action_settings">Impostazioni</string> <string name="action_settings">Impostazioni</string>
<string name="action_customize_server_settings">Personalizza impostazioni azienda</string> <string name="action_customize_server_settings">Personalizza impostazioni azienda</string>

View File

@ -13,6 +13,8 @@
<string name="completed">Completed</string> <string name="completed">Completed</string>
<string name="search">Search...</string> <string name="search">Search...</string>
<string name="permission_request_message">Permissions are required for app to work properly</string>
<string name="ord_acq_testata"><![CDATA[#<b>%s</b> of <b>%s</b>]]></string> <string name="ord_acq_testata"><![CDATA[#<b>%s</b> of <b>%s</b>]]></string>
<string name="ord_ven_testata"><![CDATA[#<b>%s</b> of <b>%s</b>]]></string> <string name="ord_ven_testata"><![CDATA[#<b>%s</b> of <b>%s</b>]]></string>

View File

@ -15,7 +15,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:$gradle_version" classpath "com.android.tools.build:gradle:3.2.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong