Implementato popup di Device in end of life

This commit is contained in:
Giuseppe Scorrano 2025-10-02 18:02:13 +02:00
parent b5d049aa1d
commit 24d90b58f9
12 changed files with 219 additions and 11 deletions

View File

@ -4,10 +4,10 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-05-14T09:45:15.341614500Z">
<DropdownSelection timestamp="2025-10-02T11:26:10.944286600Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=23324B682F" />
<DeviceId pluginId="PhysicalDevice" identifier="serial=7da0808" />
</handle>
</Target>
</DropdownSelection>

View File

@ -142,6 +142,8 @@ import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBat
import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotModule;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtComponent;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtModule;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeComponent;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeModule;
import it.integry.integrywmsnative.view.dialogs.extra_info.DialogExtraInfoComponent;
import it.integry.integrywmsnative.view.dialogs.extra_info.DialogExtraInfoModule;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUComponent;
@ -251,7 +253,8 @@ import it.integry.integrywmsnative.view.dialogs.update_available.DialogUpdateAva
VerificaGiacenzeModule.class,
DialogExtraInfoModule.class,
DialogAskDepositoModule.class,
DialogChooseArtFromListaArtsModule.class
DialogChooseArtFromListaArtsModule.class,
DialogDeviceEndOfLifeModule.class
})
public interface MainApplicationComponent {
@ -422,6 +425,8 @@ public interface MainApplicationComponent {
DialogChooseArtFromListaArtsComponent.Factory dialogChooseArtFromListaArtsComponent();
DialogDeviceEndOfLifeComponent.Factory dialogDeviceEndOfLifeComponent();
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.SpannableString;
@ -12,8 +13,10 @@ import android.view.LayoutInflater;
import androidx.databinding.DataBindingUtil;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import javax.inject.Inject;
@ -27,6 +30,7 @@ import it.integry.integrywmsnative.databinding.ActivitySplashBinding;
import it.integry.integrywmsnative.gest.login.LoginActivity;
import it.integry.integrywmsnative.gest.main.MainActivity;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeView;
public class SplashActivity extends BaseActivity implements MainContext.Listener {
@ -65,9 +69,24 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
UtilityContext.initMainActivity(this);
LocalDate endSupportDate = LocalDate.of(2026, 1, 31);
initAppVersion();
initPermissions(this::init);
boolean isOldAndroid = Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
executorService.execute(() -> {
if (isOldAndroid)
showDeviceEndOfLifeMessage();
handler.post(() -> {
if (LocalDate.now().isBefore(endSupportDate) || !isOldAndroid) {
initAppVersion();
initPermissions(this::init);
} else {
this.finish();
}
});
});
}
private void initAppVersion() {
@ -105,6 +124,21 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
}
}
private void showDeviceEndOfLifeMessage() {
CountDownLatch latch = new CountDownLatch(1);
DialogDeviceEndOfLifeView.newInstance(latch::countDown)
.show(this.getSupportFragmentManager(), "dialog_device_end_of_life");
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override
public void onDBDataLoading(String item) {
handler.post(() -> mBinding.loadingInfoTextview.setText("Caricamento " + item));

View File

@ -148,7 +148,7 @@ public class DialogSimpleMessageView extends BaseDialogFragment {
}
case WARNING -> {
colorBackgroundTitle = ContextCompat.getColor(requireContext(), R.color.yellow_600);
yield ResourcesCompat.getDrawable(requireContext().getResources(), R.drawable.ic_warning_white_24dp, null);
yield ResourcesCompat.getDrawable(requireContext().getResources(), R.drawable.ic_baseline_warning_24, null);
}
case ERROR -> {
colorBackgroundTitle = ContextCompat.getColor(requireContext(), R.color.red_300);

View File

@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.device_end_of_life;
import dagger.Subcomponent;
@Subcomponent
public interface DialogDeviceEndOfLifeComponent {
@Subcomponent.Factory
interface Factory {
DialogDeviceEndOfLifeComponent create();
}
void inject(DialogDeviceEndOfLifeView dialogDeviceEndOfLifeView);
}

View File

@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.device_end_of_life;
import dagger.Module;
import dagger.Provides;
@Module(subcomponents = DialogDeviceEndOfLifeComponent.class)
public class DialogDeviceEndOfLifeModule {
@Provides
DialogDeviceEndOfLifeViewModel providesDialogDeviceEndOfLifeViewModel() {
return new DialogDeviceEndOfLifeViewModel();
}
}

View File

@ -0,0 +1,77 @@
package it.integry.integrywmsnative.view.dialogs.device_end_of_life;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import javax.inject.Inject;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.databinding.DialogDeviceEndOfLifeBinding;
public class DialogDeviceEndOfLifeView extends BaseDialogFragment {
@Inject
DialogDeviceEndOfLifeViewModel mViewModel;
private DialogDeviceEndOfLifeBinding mBindings;
private Context mContext;
private final Runnable onComplete;
//Pass here all external parameters
public static DialogDeviceEndOfLifeView newInstance(Runnable onComplete) {
return new DialogDeviceEndOfLifeView(onComplete);
}
private DialogDeviceEndOfLifeView(Runnable onComplete) {
super();
this.onComplete = onComplete;
MainApplication.appComponent
.dialogDeviceEndOfLifeComponent()
.create()
.inject(this);
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
this.mContext = requireContext();
mBindings = DialogDeviceEndOfLifeBinding.inflate(LayoutInflater.from(this.mContext), null, false);
mBindings.setLifecycleOwner(this);
setCancelable(false);
var alertDialog = new MaterialAlertDialogBuilder(this.mContext)
.setView(mBindings.getRoot())
.setCancelable(isCancelable())
.setPositiveButton(R.string.i_understand_action, (dialog, which) -> {
if (onComplete != null) onComplete.run();
dismiss();
})
.create();
alertDialog.setCanceledOnTouchOutside(isCancelable());
alertDialog.setOnShowListener(this);
return alertDialog;
}
@Override
public void dismiss() {
if (getDialog() != null) getDialog().dismiss();
}
}

View File

@ -0,0 +1,5 @@
package it.integry.integrywmsnative.view.dialogs.device_end_of_life;
public class DialogDeviceEndOfLifeViewModel {
}

View File

@ -1,5 +0,0 @@
<vector android:height="76dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="76dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
</vector>

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="it.integry.integrywmsnative.R" />
<import type="androidx.core.content.ContextCompat" />
<import type="android.text.Html" />
</data>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardCornerRadius="16dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp">
<androidx.appcompat.widget.AppCompatImageView
style="@style/MaterialAlertDialog.Material3.Title.Icon.CenterStacked"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@drawable/ic_baseline_warning_24"
app:tint="?attr/colorError" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title_text"
style="@style/MaterialAlertDialog.Material3.Title.Text.CenterStacked"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:text="Fine supporto" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/description_text"
style="@style/TextAppearance.Material3.BodyLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@{Html.fromHtml(ContextCompat.getString(context, R.string.device_end_of_life_message))}"
tools:text="@string/device_end_of_life_message"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
</layout>

View File

@ -37,6 +37,7 @@
<string name="ops">Ops</string>
<string name="warning">Attenzione</string>
<string name="ok">OK</string>
<string name="i_understand_action">Ho capito</string>
<string name="abort">Annulla</string>
<string name="reset">Resetta</string>
<string name="dispatched_abbr">Evasi</string>
@ -499,4 +500,8 @@
<string name="switch_depo_title">Cambia deposito</string>
<string name="switch_depo_description">Cambia il deposito principale su cui stai lavorando tra quelli a te disponibili</string>
<string name="device_end_of_life_message"><![CDATA[A partire dal <b>1 febbraio 2026</b>, i dispositivi con una versione di <b>Android inferiore alla 8.0 non saranno più supportati</b>. Per continuare a utilizzare lapp in modo sicuro e con tutte le funzionalità, ti consigliamo di aggiornare il tuo sistema operativo o utilizzare un dispositivo compatibile.]]></string>
</resources>

View File

@ -85,6 +85,7 @@
<string name="ops">Ops</string>
<string name="warning">Warning</string>
<string name="ok">OK</string>
<string name="i_understand_action">Got it</string>
<string name="abort">Abort</string>
<string name="reset">Reset</string>
<string name="dispatched_abbr">Dspch</string>
@ -505,4 +506,6 @@
<string name="switch_depo_title">Change deposit</string>
<string name="switch_depo_description">Change the main deposit you are working on among those available to you</string>
<string name="device_end_of_life_message"><![CDATA[Starting from <b>February 1, 2026</b>, devices running <b>Android versions earlier than 8.0 will no longer be supported</b>.<br />To continue using the app securely and with full functionality, please update your operating system or switch to a compatible device.]]></string>
</resources>