diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06522412..455afe1e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/MainActivity.java index e893395e..efd31b11 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainActivity.java @@ -12,6 +12,8 @@ import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; + +import android.os.StrictMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -53,7 +55,7 @@ public class MainActivity extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //ExceptionsHandler.init(this); + mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); @@ -80,9 +82,9 @@ public class MainActivity extends AppCompatActivity private void startLoginActivity(){ + this.finish(); Intent myIntent = new Intent(this, LoginActivity.class); startActivity(myIntent); - this.finish(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java index 316a4e36..4b6f7e69 100644 --- a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java @@ -4,8 +4,6 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.app.Activity; -import android.os.Handler; import android.text.SpannableString; import android.widget.TextView; @@ -31,13 +29,17 @@ public class SplashActivity extends AppCompatActivity { initAppVersion(); - PermissionsHelper.askPermissions(this, () -> { init(); }, permanentlyDenied -> { if(permanentlyDenied) { DialogSimpleMessageHelper.makeErrorDialog(this, - new SpannableString(getText(R.string.permissions_permanrntly_denied)), null, () -> { + new SpannableString(getText(R.string.permissions_permanently_denied)), null, () -> { + this.finish(); + }).show(); + } else { + DialogSimpleMessageHelper.makeErrorDialog(this, + new SpannableString(getText(R.string.permissions_denied)), null, () -> { this.finish(); }).show(); } @@ -71,19 +73,15 @@ public class SplashActivity extends AppCompatActivity { private void startLoginActivity(){ + this.finish(); Intent myIntent = new Intent(this, LoginActivity.class); startActivity(myIntent); - this.finish(); } private void startMainActivity(){ - new Handler().postDelayed(() -> { - Intent myIntent = new Intent(this, MainActivity.class); - startActivity(myIntent); - this.finish(); - }, 3000); - - + this.finish(); + Intent myIntent = new Intent(this, MainActivity.class); + startActivity(myIntent); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java b/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java new file mode 100644 index 00000000..ac8670af --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java @@ -0,0 +1,5 @@ +package it.integry.integrywmsnative.core.update; + +import androidx.core.content.FileProvider; + +public class GenericFileProvider extends FileProvider {} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java new file mode 100644 index 00000000..32f4fa16 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java @@ -0,0 +1,60 @@ +package it.integry.integrywmsnative.core.update; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class UpdateApp extends AsyncTask { + private Context context; + public void setContext(Context contextf){ + context = contextf; + } + + @Override + protected Void doInBackground(String... arg0) { + try { + URL url = new URL(arg0[0]); + HttpURLConnection c = (HttpURLConnection) url.openConnection(); + c.setRequestMethod("GET"); + c.setDoOutput(true); + c.connect(); + + File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + file.mkdirs(); + File outputFile = new File(file, "update.apk"); + if(outputFile.exists()){ + outputFile.delete(); + } + FileOutputStream fos = new FileOutputStream(outputFile); + + InputStream is = c.getInputStream(); + + byte[] buffer = new byte[1024]; + int len1 = 0; + while ((len1 = is.read(buffer)) != -1) { + fos.write(buffer, 0, len1); + } + fos.close(); + is.close(); + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)), "application/vnd.android.package-archive"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error! + context.startActivity(intent); + + + } catch (Exception e) { + Log.e("UpdateAPP", "Update error! " + e.getMessage()); + } + return null; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java index 4e70739a..930b4f6f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java @@ -1,21 +1,94 @@ package it.integry.integrywmsnative.core.update; +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; import com.github.javiersantos.appupdater.AppUpdater; +import com.github.javiersantos.appupdater.AppUpdaterUtils; +import com.github.javiersantos.appupdater.enums.AppUpdaterError; import com.github.javiersantos.appupdater.enums.Display; import com.github.javiersantos.appupdater.enums.UpdateFrom; +import com.github.javiersantos.appupdater.objects.Update; +import java.io.File; + +import androidx.core.content.FileProvider; +import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.settings.SettingsManager; public class UpdatesManager { - public static void init(Context context) { + public static void init(Activity context) { + String currentVersionUrl = "http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/currentVersion"; + String currentDownloadUrl = "http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/android-release_v2.apk"; + + AppUpdater appUpdater = new AppUpdater(context) .setDisplay(Display.DIALOG) .setUpdateFrom(UpdateFrom.JSON) - .setUpdateJSON("http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/currentVersion"); + .setUpdateJSON(currentVersionUrl) + .setButtonUpdateClickListener((dialog, which) -> { + + installAPK(context, currentDownloadUrl); + }); appUpdater.start(); } + + private static void installAPK(Activity context, String downloadURL) { + String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"; + String fileName = context.getResources().getString(R.string.app_name) + ".apk"; + destination += fileName; + final Uri uri = Uri.parse("file://" + destination); + + //Delete update file if exists + final File file = new File(destination); + if (file.exists()) + file.delete(); + + //set downloadmanager + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadURL)); + request.setDescription(context.getString(R.string.notification_update_download)); + request.setTitle(context.getString(R.string.app_name)); + + //set destination + request.setDestinationUri(uri); + + // get download service and enqueue file + final DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + manager.enqueue(request); + + //set BroadcastReceiver to install app when .apk is downloaded + BroadcastReceiver onComplete = new BroadcastReceiver() { + public void onReceive(Context ctxt, Intent i) { + + Uri fileLoc; + Intent intent; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + fileLoc = GenericFileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider", file); + } else { + intent = new Intent(Intent.ACTION_VIEW); + fileLoc = Uri.fromFile(file); + } + + intent.setDataAndType(fileLoc, "application/vnd.android.package-archive"); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + + context.startActivity(intent); + } + }; + + //register receiver for when .apk download is compete + context.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java index e62203d5..09cebce1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java @@ -1,12 +1,14 @@ package it.integry.integrywmsnative.core.utility; import android.Manifest; -import android.app.Activity; +import android.os.Build; import com.emreeran.permissionlivedata.PermissionLiveData; import com.emreeran.permissionlivedata.Status; import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import androidx.appcompat.app.AppCompatActivity; import it.integry.integrywmsnative.core.expansion.RunnableArgs; @@ -15,26 +17,62 @@ public class PermissionsHelper { public static void askPermissions(AppCompatActivity activity, Runnable onPermissionsConfirmed, RunnableArgs onPermissionsDenied) { - PermissionLiveData permissionLiveData = PermissionLiveData.create( - activity, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ); + List permissionsToAsk = new ArrayList<>(); + permissionsToAsk.add(Manifest.permission.READ_EXTERNAL_STORAGE); + permissionsToAsk.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + permissionsToAsk.add(Manifest.permission.INTERNET); + permissionsToAsk.add(Manifest.permission.ACCESS_WIFI_STATE); - permissionLiveData.observe(activity, permission -> { - if (permission.getStatus() == Status.RECEIVED) { - if (permission.getGranted()) { + + if(Build.VERSION.SDK_INT >= 23) { + //permissionsToAsk.add(Manifest.permission.REQUEST_INSTALL_PACKAGES); + } + + String[] permissionArray = new String[permissionsToAsk.size()]; + permissionsToAsk.toArray(permissionArray); + + PermissionLiveData permissionLiveData = PermissionLiveData.create( + activity, permissionArray); + + AtomicInteger permissionStatusCounter = new AtomicInteger(); + AtomicInteger permissionGrantedCounter = new AtomicInteger(); + AtomicInteger permissionPendingCounter = new AtomicInteger(); + AtomicInteger permissionDeniedCounter = new AtomicInteger(); + AtomicInteger permissionPermDeniedCounter = new AtomicInteger(); + + Runnable checkPermissionIfDone = () -> { + if(permissionStatusCounter.get() == permissionArray.length){ + + if(permissionGrantedCounter.get() == permissionStatusCounter.get()) { onPermissionsConfirmed.run(); - //UtilityToast.showToast("Permission " + permission.getName() + " was granted."); - } else if (permission.getShouldShowRequestPermissionRationale()) { + } else if(permissionPendingCounter.get() > 0) { + onPermissionsDenied.run(false); + } else if(permissionPermDeniedCounter.get() > 0) { onPermissionsDenied.run(true); - //UtilityToast.showToast("Permission " + permission.getName() + " was denied without ask never again checked."); } else { onPermissionsDenied.run(false); - //UtilityToast.showToast("Permission " + permission.getName() + " was denied."); + } + } + }; + + permissionLiveData.observe(activity, permission -> { + + permissionStatusCounter.getAndIncrement(); + + if (permission.getStatus() == Status.RECEIVED) { + if (permission.getGranted()) { + permissionGrantedCounter.getAndIncrement(); + checkPermissionIfDone.run(); + } else if (permission.getShouldShowRequestPermissionRationale()) { + permissionPermDeniedCounter.getAndIncrement(); + checkPermissionIfDone.run(); + } else { + permissionDeniedCounter.getAndIncrement(); + checkPermissionIfDone.run(); } } else if (permission.getStatus() == Status.PENDING) { - //UtilityToast.showToast(String.format("Pending request for %s", permission.getName())); + permissionPendingCounter.getAndIncrement(); + checkPermissionIfDone.run(); } }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java index 5da0036b..4ce1974e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java @@ -233,13 +233,12 @@ public class LoginViewModel { public void onLoginCompleted() { loginButtonEnabled.set(true); - SettingsManager.update(); + mActivity.finish(); + Intent myIntent = new Intent(mActivity, MainActivity.class); mActivity.startActivity(myIntent); - - mActivity.finish(); } } diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b7566829..90685803 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -163,6 +163,8 @@ Livello Non valido - + + Tutti i permessi sono stati declinati, riapri l\'applicazione per continuare. + Download aggiornamento \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b0dba4f..165ab8ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -171,6 +171,8 @@ Multiple LU found Do you want print the label? Please scan a Position barcode - Please note that all permissions are required. Application will close now. + Please note that all permissions are required. Application will close now. + All permissions are required, please reopen the app. + Downloading update diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..ffa74ab5 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file