• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

opensrp / opensrp-client-native-form / #61

09 Oct 2023 12:39PM UTC coverage: 66.061% (-0.1%) from 66.188%
#61

Pull #666

github-actions

web-flow
Merge c872e1480 into f8c80cf2b
Pull Request #666: [Local merge] Optbp compression merge for

8440 of 12776 relevant lines covered (66.06%)

0.66 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

64.55
android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormBaseActivity.java
1
package com.vijay.jsonwizard.activities;
2

3
import android.app.ProgressDialog;
4
import android.content.Context;
5
import android.content.Intent;
6
import android.os.Bundle;
7
import androidx.annotation.NonNull;
8
import androidx.annotation.Nullable;
9
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
10
import androidx.appcompat.widget.Toolbar;
11
import android.view.View;
12

13
import com.google.gson.Gson;
14
import com.google.gson.reflect.TypeToken;
15
import com.vijay.jsonwizard.NativeFormLibrary;
16
import com.vijay.jsonwizard.R;
17
import com.vijay.jsonwizard.constants.JsonFormConstants;
18
import com.vijay.jsonwizard.domain.Form;
19
import com.vijay.jsonwizard.fragments.JsonFormFragment;
20
import com.vijay.jsonwizard.interfaces.LifeCycleListener;
21
import com.vijay.jsonwizard.interfaces.OnActivityRequestPermissionResultListener;
22
import com.vijay.jsonwizard.interfaces.OnActivityResultListener;
23
import com.vijay.jsonwizard.interfaces.OnFieldsInvalid;
24
import com.vijay.jsonwizard.rules.RulesEngineFactory;
25
import com.vijay.jsonwizard.utils.FormUtils;
26
import com.vijay.jsonwizard.utils.PropertyManager;
27
import com.vijay.jsonwizard.utils.ValidationStatus;
28

29
import org.apache.commons.lang3.StringUtils;
30
import org.json.JSONException;
31
import org.json.JSONObject;
32
import org.smartregister.client.utils.contract.ClientFormContract;
33

34
import java.io.BufferedReader;
35
import java.io.IOException;
36
import java.io.InputStreamReader;
37
import java.io.Serializable;
38
import java.util.ArrayList;
39
import java.util.HashMap;
40
import java.util.HashSet;
41
import java.util.LinkedHashMap;
42
import java.util.List;
43
import java.util.Map;
44
import java.util.concurrent.ConcurrentHashMap;
45

46
import timber.log.Timber;
47

48
import static com.vijay.jsonwizard.utils.NativeFormLangUtils.getTranslatedString;
49

50
public abstract class JsonFormBaseActivity extends MultiLanguageActivity implements OnFieldsInvalid, ClientFormContract.View {
1✔
51
    protected static final String TAG = JsonFormActivity.class.getSimpleName();
1✔
52
    protected static final String JSON_STATE = "jsonState";
53
    protected static final String FORM_STATE = "formState";
54
    protected final HashSet<String> invisibleRequiredFields = new HashSet<>();
1✔
55
    protected JSONObject mJSONObject;
56
    protected PropertyManager propertyManager;
57
    protected Map<String, View> skipLogicViews;
58
    protected Map<String, View> calculationLogicViews;
59
    protected Map<String, View> constrainedViews;
60
    protected HashMap<Integer, OnActivityResultListener> onActivityResultListeners;
61
    protected HashMap<Integer, OnActivityRequestPermissionResultListener> onActivityRequestPermissionResultListeners;
62
    protected List<LifeCycleListener> lifeCycleListeners;
63
    protected String confirmCloseTitle;
64
    protected String confirmCloseMessage;
65
    protected Form form;
66
    protected Map<String, String> globalValues = null;
1✔
67
    protected RulesEngineFactory rulesEngineFactory = null;
1✔
68
    protected LocalBroadcastManager localBroadcastManager;
69
    protected boolean isFormFragmentInitialized;
70
    private Toolbar mToolbar;
71
    private Map<String, ValidationStatus> invalidFields = new ConcurrentHashMap<>();
1✔
72
    private boolean isPreviousPressed = false;
1✔
73
    private ProgressDialog progressDialog;
74
    protected boolean translateForm = false;
1✔
75

76
    protected boolean isVisibleFormErrorAndRollbackDialog;
77

78
    // specify where the form reads data from
79
    public static String DATA_SOURCE = JsonFormConstants.FileSource.ASSETS;
1✔
80

81
    @Override
82
    protected void onCreate(Bundle savedInstanceState) {
83
        super.onCreate(savedInstanceState);
1✔
84
        setContentView(R.layout.native_form_activity_json_form);
1✔
85
        findViewById(R.id.native_form_activity).setFilterTouchesWhenObscured(true);
1✔
86
        mToolbar = findViewById(R.id.tb_top);
1✔
87
        setSupportActionBar(mToolbar);
1✔
88
        skipLogicViews = new ConcurrentHashMap<>();
1✔
89
        calculationLogicViews = new ConcurrentHashMap<>();
1✔
90
        constrainedViews = new LinkedHashMap<>();
1✔
91
        onActivityResultListeners = new HashMap<>();
1✔
92
        onActivityRequestPermissionResultListeners = new HashMap<>();
1✔
93
        lifeCycleListeners = new ArrayList<>();
1✔
94
        isFormFragmentInitialized = false;
1✔
95
        translateForm = getIntent().hasExtra(JsonFormConstants.PERFORM_FORM_TRANSLATION) ?
1✔
96
                getIntent().getBooleanExtra(JsonFormConstants.PERFORM_FORM_TRANSLATION, false) :
1✔
97
                NativeFormLibrary.getInstance().isPerformFormTranslation();
1✔
98

99
        if (savedInstanceState == null) {
1✔
100
            this.form = extractForm(getIntent().getSerializableExtra(JsonFormConstants.JSON_FORM_KEY.FORM));
1✔
101
            init(getJsonForm());
1✔
102
            initializeFormFragment();
1✔
103
            onFormStart();
1✔
104
            DATA_SOURCE = readDataSource();
1✔
105
        } else {
106
            this.form = extractForm(savedInstanceState.getSerializable(FORM_STATE));
1✔
107
            init(savedInstanceState.getString(JSON_STATE));
1✔
108
        }
109
        for (LifeCycleListener lifeCycleListener : lifeCycleListeners) {
1✔
110
            lifeCycleListener.onCreate(savedInstanceState);
×
111
        }
×
112
    }
1✔
113

114
    private String readDataSource() {
115
        String source = getIntent().getStringExtra(JsonFormConstants.FROM_DATA_SOURCE);
1✔
116
        return StringUtils.isBlank(source) ? JsonFormConstants.FileSource.ASSETS : source;
1✔
117
    }
118

119
    protected String getJsonForm() {
120
        String jsonForm = getIntent().getStringExtra(JsonFormConstants.JSON_FORM_KEY.JSON);
1✔
121
        if (translateForm) {
1✔
122
            jsonForm = getTranslatedString(jsonForm, this);
1✔
123
        }
124
        return jsonForm;
1✔
125
    }
126

127
    public void init(String json) {
128
        try {
129
            setmJSONObject(new JSONObject(json));
1✔
130
            if (!mJSONObject.has(JsonFormConstants.ENCOUNTER_TYPE)) {
1✔
131
                mJSONObject = new JSONObject();
×
132
                throw new JSONException("Form encounter_type not set");
×
133
            }
134

135
            //populate them global values
136
            if (mJSONObject.has(JsonFormConstants.JSON_FORM_KEY.GLOBAL)) {
1✔
137
                globalValues = new Gson()
×
138
                        .fromJson(mJSONObject.getJSONObject(JsonFormConstants.JSON_FORM_KEY.GLOBAL).toString(),
×
139
                                new TypeToken<HashMap<String, String>>() {
×
140
                                }.getType());
×
141
            } else {
142
                globalValues = new HashMap<>();
1✔
143
            }
144

145
            rulesEngineFactory = new RulesEngineFactory(this, globalValues);
1✔
146

147
            confirmCloseTitle = getString(R.string.confirm_form_close);
1✔
148
            confirmCloseMessage = getString(R.string.confirm_form_close_explanation);
1✔
149
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
1✔
150

151
        } catch (JSONException e) {
×
152
            Timber.e(e, "Initialization error. Json passed is invalid");
×
153
        }
1✔
154
    }
1✔
155

156
    protected abstract void initiateFormUpdate(JSONObject json);
157

158
    public synchronized void initializeFormFragment() {
159
        isFormFragmentInitialized = true;
1✔
160
        JsonFormFragment formFragment = JsonFormFragment.getFormFragment(JsonFormConstants.FIRST_STEP_NAME);
1✔
161
        getSupportFragmentManager().beginTransaction()
1✔
162
                .add(R.id.container, formFragment).commitAllowingStateLoss();
1✔
163
    }
1✔
164

165
    public void onFormStart() {
166
        try {
167
            if (propertyManager == null) {
1✔
168
                propertyManager = new PropertyManager(this);
1✔
169
            }
170
            FormUtils.updateStartProperties(propertyManager, mJSONObject);
1✔
171
        } catch (Exception e) {
×
172
            Timber.e(e);
×
173
        }
1✔
174
    }
1✔
175

176
    private Form extractForm(Serializable serializable) {
177
        if (serializable instanceof Form) {
1✔
178
            return (Form) serializable;
×
179
        } else {
180
            return null;
1✔
181
        }
182
    }
183

184
    public void setmJSONObject(JSONObject mJSONObject) {
185
        initiateFormUpdate(mJSONObject);
1✔
186
        this.mJSONObject = mJSONObject;
1✔
187
    }
1✔
188

189
    @Override
190
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
191
        Timber.e("JsonFromBaseActivity optib requestCode %s resultCode %s", requestCode, resultCode);
×
192
        if(data != null)
×
193
            Timber.e(" data %s",data.getStringExtra(Intent.EXTRA_TEXT));
×
194
        else Timber.e("JsonFormBaseActivity data is null");
×
195
        if (onActivityResultListeners.containsKey(requestCode)) {
×
196
            onActivityResultListeners.get(requestCode).onActivityResult(requestCode, resultCode, data);
×
197
        } else {
198
            super.onActivityResult(requestCode, resultCode, data);
×
199
        }
200
    }
×
201

202
    @Override
203
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
204
        if (onActivityRequestPermissionResultListeners.containsKey(requestCode)) {
×
205
            onActivityRequestPermissionResultListeners.get(requestCode).onRequestPermissionResult(requestCode, permissions, grantResults);
×
206
        } else {
207
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
×
208
        }
209
    }
×
210

211
    public Toolbar getToolbar() {
212
        return mToolbar;
×
213
    }
214

215
    @Override
216
    public void passInvalidFields(Map<String, ValidationStatus> invalidFields) {
217
        this.invalidFields = invalidFields;
×
218
    }
×
219

220
    public boolean isPreviousPressed() {
221
        return isPreviousPressed;
1✔
222
    }
223

224
    public void setPreviousPressed(boolean previousPressed) {
225
        isPreviousPressed = previousPressed;
×
226
    }
×
227

228
    @Override
229
    public Map<String, ValidationStatus> getPassedInvalidFields() {
230
        return getInvalidFields();
1✔
231
    }
232

233
    public Map<String, ValidationStatus> getInvalidFields() {
234
        return invalidFields;
1✔
235
    }
236

237
    public RulesEngineFactory getRulesEngineFactory() {
238
        return rulesEngineFactory;
×
239
    }
240

241
    public void setRulesEngineFactory(RulesEngineFactory rulesEngineFactory) {
242
        this.rulesEngineFactory = rulesEngineFactory;
×
243
    }
×
244

245
    public ProgressDialog getProgressDialog() {
246
        return progressDialog;
×
247
    }
248

249
    public void setProgressDialog(ProgressDialog progressDialog) {
250
        this.progressDialog = progressDialog;
×
251
    }
×
252

253
    @Nullable
254
    @Override
255
    public JSONObject getSubForm(String formIdentity, String subFormsLocation,
256
                                 Context context, boolean translateSubForm) throws Exception {
257
        return FormUtils.getSubFormJson(formIdentity, subFormsLocation, getApplicationContext(), translateForm);
1✔
258
    }
259

260
    @Nullable
261
    @Override
262
    public BufferedReader getRules(@NonNull Context context, @NonNull String fileName) throws IOException {
263
        return new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
×
264
    }
265

266
    @Override
267
    public void handleFormError(boolean isRulesFile, @NonNull String formIdentifier) {
268
        // Do nothing here
269
    }
×
270

271
    @Override
272
    public void setVisibleFormErrorAndRollbackDialog(boolean isVisible) {
273
        isVisibleFormErrorAndRollbackDialog = isVisible;
1✔
274
    }
1✔
275

276
    @Override
277
    public boolean isVisibleFormErrorAndRollbackDialog() {
278
        return isVisibleFormErrorAndRollbackDialog;
×
279
    }
280

281

282
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc