Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
db8471f
Adds a generic view model class that can be used to retain any data
shubham1g5 Apr 18, 2025
ea55fad
Refactor alert dialog to get rid of setRetainInstance and rely on the…
shubham1g5 Apr 18, 2025
d9bcb13
ContainerFragment -> ContainerViewModel
shubham1g5 Apr 18, 2025
9ee39cf
TaskConnectorFragment -> TaskConnectorViewModel
shubham1g5 Apr 21, 2025
a23cdd7
breadcrumb fragment to view model
shubham1g5 Apr 21, 2025
d663f4c
use activity context for view model
shubham1g5 Apr 21, 2025
fec6f87
use weakreference
shubham1g5 Apr 21, 2025
8c87121
release wake lock in onCleared
shubham1g5 Apr 21, 2025
a1fda22
Fixes NPE by accessing right context
shubham1g5 Apr 22, 2025
5c9a52c
correct return value for shouldShowBreadcrumb bar
shubham1g5 Apr 22, 2025
ab47f05
fix breadcrumb bar addition by moving to onStart so that the activity…
shubham1g5 Apr 22, 2025
87788fc
It doesn't seem like we need to retain any state for breadcrumb views…
shubham1g5 Apr 22, 2025
775f4fe
Disable animations on BS devices
shubham1g5 Apr 18, 2025
6da9613
Refactor dialogs to build view from data to allow us to better retain…
shubham1g5 Apr 23, 2025
e00d198
Call dimiss on the dialog instance instead of the fragment
shubham1g5 Apr 23, 2025
d249533
Adapt container view model to handle multiple objects with associated…
shubham1g5 Apr 23, 2025
db5bece
Refactor dialogs to retain only dialog data instead of whole view
shubham1g5 Apr 23, 2025
1dfb8b8
somehow textcolor shows in white resulting in text not appearing, set…
shubham1g5 Apr 24, 2025
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
5 changes: 4 additions & 1 deletion app/res/layout/choice_dialog_three_panel.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

<Button
android:id="@+id/choice_dialog_panel_1"
android:textColor="@color/black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
Expand All @@ -37,6 +38,7 @@

<Button
android:id="@+id/choice_dialog_panel_2"
android:textColor="@color/black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
Expand All @@ -50,6 +52,7 @@

<Button
android:id="@+id/choice_dialog_panel_3"
android:textColor="@color/black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
Expand All @@ -61,4 +64,4 @@

</LinearLayout>

</LinearLayout>
</LinearLayout>
10 changes: 5 additions & 5 deletions app/src/org/commcare/activities/AppManagerActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;

import org.commcare.CommCareApplication;
import org.commcare.adapters.AppManagerAdapter;
import org.commcare.dalvik.R;
Expand All @@ -24,8 +26,6 @@
import org.commcare.views.dialogs.StandardAlertDialog;
import org.javarosa.core.services.locale.Localization;

import androidx.appcompat.app.AlertDialog;

/**
* The activity that starts up when a user launches into the app manager.
* Displays a list of all installed apps, each of which can be clicked to launch
Expand Down Expand Up @@ -165,7 +165,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent)
String msg = getString(R.string.skipped_verification_warning);
showAlertDialog(
StandardAlertDialog.getBasicAlertDialog(
this, title, msg, (dialog, which) -> dismissAlertDialog()));
title, msg, (dialog, which) -> dialog.dismiss()));
} else if (resultCode == RESULT_OK) {
Toast.makeText(this, R.string.media_verified, Toast.LENGTH_LONG).show();
}
Expand Down Expand Up @@ -195,9 +195,9 @@ public void onItemClick(AdapterView<?> parent, View view, int position,
private void triggerLogoutWarning() {
String title = getString(R.string.logging_out);
String message = getString(R.string.logout_warning);
StandardAlertDialog d = new StandardAlertDialog(this, title, message);
StandardAlertDialog d = new StandardAlertDialog(title, message);
DialogInterface.OnClickListener listener = (dialog, which) -> {
dismissAlertDialog();
dialog.dismiss();
if (which == AlertDialog.BUTTON_POSITIVE) {
CommCareApplication.instance().expireUserSession();
installApp();
Expand Down
4 changes: 2 additions & 2 deletions app/src/org/commcare/activities/CallOutActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private void showChoiceDialog() {
setResult(RESULT_CANCELED, i);
finish();
});
dialog.showNonPersistentDialog();
dialog.showNonPersistentDialog(this);
}

@Override
Expand All @@ -132,7 +132,7 @@ private void dispatchActionWithPermissions() {
CALL_OR_SMS_PERMISSION_REQUEST,
Localization.get("permission.case.callout.title"),
Localization.get("permission.case.callout.message"));
dialog.showNonPersistentDialog();
dialog.showNonPersistentDialog(this);
} else {
requestNeededPermissions(CALL_OR_SMS_PERMISSION_REQUEST);
}
Expand Down
92 changes: 40 additions & 52 deletions app/src/org/commcare/activities/CommCareActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,18 @@
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;

import org.commcare.CommCareApplication;
import org.commcare.android.database.user.models.ACase;
import org.commcare.fragments.BreadcrumbBarFragment;
import org.commcare.fragments.ContainerFragment;
import org.commcare.fragments.TaskConnectorFragment;
import org.commcare.fragments.BreadcrumbBarHelper;
import org.commcare.fragments.ContainerViewModel;
import org.commcare.fragments.TaskConnectorViewModel;
import org.commcare.interfaces.WithUIController;
import org.commcare.logic.DetailCalloutListenerDefaultImpl;
import org.commcare.preferences.LocalePreferences;
Expand Down Expand Up @@ -63,12 +70,6 @@
import org.javarosa.core.services.locale.Localization;
import org.javarosa.core.util.NoLocalizedTextException;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewbinding.ViewBinding;

import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;

Expand All @@ -87,9 +88,10 @@ public abstract class CommCareActivity<R> extends AppCompatActivity
private static final String KEY_PROGRESS_DIALOG_FRAG = "progress-dialog-fragment";
private static final String KEY_ALERT_DIALOG_FRAG = "alert-dialog-fragment";
private static final int UNDEFINED_TASK_ID = -1;
private static final String MANAGED_UI_STATE_KEY = "managed-ui-state-key";

private int invalidTaskIdMessageThrown = -2;
private TaskConnectorFragment<R> stateHolder;
private TaskConnectorViewModel<R> stateHolder;

CompositeDisposable disposableEventHost = new CompositeDisposable();

Expand Down Expand Up @@ -127,10 +129,11 @@ public abstract class CommCareActivity<R> extends AppCompatActivity
* on activity pause/resume.
*/
private int dialogId = -1;
private ContainerFragment<Bundle> managedUiState;
private ContainerViewModel<Bundle> containerViewModel;
private boolean isMainScreenBlocked;

private DataSyncCompleteBroadcastReceiver dataSyncCompleteBroadcastReceiver;
private BreadcrumbBarHelper mBreadcrumbBarHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -141,16 +144,11 @@ protected void onCreate(Bundle savedInstanceState) {
}

FragmentManager fm = this.getSupportFragmentManager();
stateHolder = new ViewModelProvider(this).get(TaskConnectorViewModel.class);
stateHolder.attach(this);

stateHolder = (TaskConnectorFragment<R>)fm.findFragmentByTag("state");

// stateHolder and its previous state aren't null if the activity is
// being created due to an orientation change.
if (stateHolder == null) {
stateHolder = new TaskConnectorFragment<>();
fm.beginTransaction().add(stateHolder, "state").commit();
// entering new activity, not just rotating one, so release old
// media
if (savedInstanceState == null) {
// entering new activity, not just rotating one, so release old media
AudioController.INSTANCE.releaseCurrentMediaEntity();
}

Expand All @@ -160,7 +158,7 @@ protected void onCreate(Bundle savedInstanceState) {
}

if (!isFinishing()) {
persistManagedUiState(fm);
persistManagedUiState();

if (getSupportActionBar() != null) {
getSupportActionBar().setLogo(org.commcare.dalvik.R.drawable.commcare_actionbar_logo_spacing);
Expand All @@ -170,17 +168,8 @@ protected void onCreate(Bundle savedInstanceState) {
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayShowCustomEnabled(true);
}

// Add breadcrumb bar
BreadcrumbBarFragment bar = (BreadcrumbBarFragment)fm.findFragmentByTag("breadcrumbs");

// If the state holder is null, create a new one for this activity
if (bar == null) {
bar = new BreadcrumbBarFragment();
fm.beginTransaction().add(bar, "breadcrumbs").commit();
}
mBreadcrumbBarHelper = new BreadcrumbBarHelper();
}

mGestureDetector = new GestureDetector(this, this);
}
}
Expand All @@ -189,23 +178,17 @@ public ViewBinding getViewBinding() {
return null;
}

private void persistManagedUiState(FragmentManager fm) {
private void persistManagedUiState() {
if (isManagedUiActivity()) {
managedUiState = (ContainerFragment)fm.findFragmentByTag("ui-state");

if (managedUiState == null) {
managedUiState = new ContainerFragment<>();
fm.beginTransaction().add(managedUiState, "ui-state").commit();
loadUiElementState(null);
} else {
loadUiElementState(managedUiState.getData());
if (containerViewModel == null) {
containerViewModel = new ViewModelProvider(this).get(ContainerViewModel.class);
}
loadUiElementState(containerViewModel.getData(MANAGED_UI_STATE_KEY));
}
}

private void loadUiElementState(Bundle savedInstanceState) {
ManagedUiFramework.setContentView(this);

if (savedInstanceState != null) {
ManagedUiFramework.restoreUiElements(this, savedInstanceState);
} else {
Expand Down Expand Up @@ -289,11 +272,19 @@ private void showPendingUserMessage() {
String[] messageAndTitle = CommCareApplication.instance().getPendingUserMessage();
if (messageAndTitle != null) {
showAlertDialog(StandardAlertDialog.getBasicAlertDialog(
this, messageAndTitle[1], messageAndTitle[0], null));
messageAndTitle[1], messageAndTitle[0], null));
CommCareApplication.instance().clearPendingUserMessage();
}
}

@Override
protected void onStart() {
super.onStart();
if (mBreadcrumbBarHelper != null) {
mBreadcrumbBarHelper.attachBreadcrumbBar(this);
}
}

@Override
protected void onResume() {
super.onResume();
Expand Down Expand Up @@ -335,7 +326,7 @@ protected void onPause() {
super.onPause();

if (isManagedUiActivity()) {
managedUiState.setData(ManagedUiFramework.saveUiStateToBundle(this));
containerViewModel.setData(MANAGED_UI_STATE_KEY, ManagedUiFramework.saveUiStateToBundle(this));
}

areFragmentsPaused = true;
Expand All @@ -349,6 +340,7 @@ protected void onPause() {
@Override
protected void onDestroy() {
super.onDestroy();
stateHolder.detach();
disposableEventHost.dispose();
}

Expand Down Expand Up @@ -461,7 +453,7 @@ private void displayException(String title, String message) {
break;
}
};
showAlertDialog(StandardAlertDialog.getBasicAlertDialogWithIcon(this, title,
showAlertDialog(StandardAlertDialog.getBasicAlertDialogWithIcon(title,
message, android.R.drawable.ic_dialog_info, listener));
}

Expand Down Expand Up @@ -832,10 +824,8 @@ protected boolean onBackwardSwipe() {

@Override
public void onBackPressed() {
FragmentManager fm = this.getSupportFragmentManager();
BreadcrumbBarFragment bar = (BreadcrumbBarFragment)fm.findFragmentByTag("breadcrumbs");
if (bar != null) {
if (bar.collapseTileIfExpanded(this)) {
if (mBreadcrumbBarHelper != null) {
if (mBreadcrumbBarHelper.collapseTileIfExpanded(this)) {
return;
}
}
Expand Down Expand Up @@ -914,9 +904,7 @@ public Spannable localize(String key, String[] args) {

public void refreshActionBar() {
if (shouldShowBreadcrumbBar()) {
FragmentManager fm = this.getSupportFragmentManager();
BreadcrumbBarFragment bar = (BreadcrumbBarFragment)fm.findFragmentByTag("breadcrumbs");
bar.refresh(this);
mBreadcrumbBarHelper.attachBreadcrumbBar(this);
}
}

Expand Down Expand Up @@ -948,7 +936,7 @@ private boolean isManagedUiActivity() {
return ManagedUiFramework.isManagedUi(getUIManager().getClass());
}

public void setStateHolder(TaskConnectorFragment<R> stateHolder) {
public void setStateHolder(TaskConnectorViewModel<R> stateHolder) {
this.stateHolder = stateHolder;
}

Expand Down
11 changes: 5 additions & 6 deletions app/src/org/commcare/activities/CommCareFormDumpActivity.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
package org.commcare.activities;

import androidx.appcompat.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AlertDialog;

import org.commcare.CommCareApplication;
import org.commcare.android.database.user.models.FormRecord;
import org.commcare.dalvik.R;
import org.commcare.models.database.SqlStorage;
import org.commcare.preferences.AdvancedActionsPreferences;
import org.commcare.preferences.ServerUrls;
import org.commcare.preferences.HiddenPreferences;
import org.commcare.preferences.ServerUrls;
import org.commcare.tasks.DumpTask;
import org.commcare.tasks.SendTask;
import org.commcare.util.LogTypes;
Expand Down Expand Up @@ -183,13 +182,13 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) {
}

private void showWarningMessage() {
StandardAlertDialog d = new StandardAlertDialog(this,
StandardAlertDialog d = new StandardAlertDialog(
Localization.get("bulk.form.alert.title"), Localization.get("bulk.form.warning"));
DialogInterface.OnClickListener listener = (dialog, id) -> {
dialog.dismiss();
if (id == AlertDialog.BUTTON_POSITIVE) {
acknowledgedRisk = true;
dismissAlertDialog();
dialog.dismiss();
} else {
exitDump();
}
Expand Down
Loading
Loading