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

opensrp / opensrp-client-native-form / #57

12 Sep 2023 07:43AM UTC coverage: 66.18% (+0.2%) from 66.013%
#57

push

github-actions

web-flow
Merge pull request #667 from opensrp/fix_tech_debt_660

Add tests for setUpOptiBpActivityResultListener

8432 of 12741 relevant lines covered (66.18%)

0.66 hits per line

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

70.59
android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/BarcodeFactory.java
1
package com.vijay.jsonwizard.widgets;
2

3
import android.Manifest;
4
import android.app.Activity;
5
import android.content.Context;
6
import android.content.Intent;
7
import android.graphics.drawable.ColorDrawable;
8
import android.text.TextUtils;
9
import android.view.LayoutInflater;
10
import android.view.View;
11
import android.view.inputmethod.InputMethodManager;
12
import android.widget.RelativeLayout;
13

14
import com.google.android.gms.vision.barcode.Barcode;
15
import com.rengwuxian.materialedittext.MaterialEditText;
16
import com.rey.material.util.ViewUtil;
17
import com.rey.material.widget.Button;
18
import com.vijay.jsonwizard.R;
19
import com.vijay.jsonwizard.activities.JsonFormBarcodeScanActivity;
20
import com.vijay.jsonwizard.constants.JsonFormConstants;
21
import com.vijay.jsonwizard.customviews.GenericTextWatcher;
22
import com.vijay.jsonwizard.fragments.JsonFormFragment;
23
import com.vijay.jsonwizard.interfaces.CommonListener;
24
import com.vijay.jsonwizard.interfaces.FormWidgetFactory;
25
import com.vijay.jsonwizard.interfaces.JsonApi;
26
import com.vijay.jsonwizard.interfaces.OnActivityResultListener;
27
import com.vijay.jsonwizard.utils.FormUtils;
28
import com.vijay.jsonwizard.utils.PermissionUtils;
29
import com.vijay.jsonwizard.utils.Utils;
30
import com.vijay.jsonwizard.validators.edittext.RequiredValidator;
31

32
import org.json.JSONArray;
33
import org.json.JSONException;
34
import org.json.JSONObject;
35

36
import java.util.ArrayList;
37
import java.util.HashSet;
38
import java.util.List;
39
import java.util.Set;
40

41
import timber.log.Timber;
42

43
import static android.app.Activity.RESULT_OK;
44
import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS;
45

46
/**
47
 * Created by Jason Rogena - jrogena@ona.io on 20/03/2017.
48
 */
49

50
public class BarcodeFactory implements FormWidgetFactory {
1✔
51
    private static final String TYPE_QR = "qrcode";
52
    public static final String SCAN_BUTTON_TEXT = "scanButtonText";
53

54

55
    @Override
56
    public List<View> getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception {
57
        return getViewsFromJson(stepName, context, formFragment, jsonObject, listener, false);
1✔
58
    }
59

60
    @Override
61
    public Set<String> getCustomTranslatableWidgetFields() {
62
        Set<String> customTranslatableWidgetFields = new HashSet<>();
1✔
63
        customTranslatableWidgetFields.add(SCAN_BUTTON_TEXT);
1✔
64
        return customTranslatableWidgetFields;
1✔
65
    }
66

67
    @Override
68
    public List<View> getViewsFromJson(final String stepName, final Context context,
69
                                       final JsonFormFragment formFragment, final JSONObject jsonObject,
70
                                       CommonListener listener, final boolean popup) throws Exception {
71

72
        List<View> views = new ArrayList<>(1);
1✔
73
        final RelativeLayout rootLayout = getRootLayout(context);
1✔
74
        final int canvasId = ViewUtil.generateViewId();
1✔
75
        formFragment.getJsonApi().getAppExecutors().mainThread().execute(() -> {
1✔
76
            try {
77
                rootLayout.setId(canvasId);
1✔
78
                final MaterialEditText editText = createEditText(rootLayout, jsonObject, canvasId, stepName, popup);
1✔
79
                attachJson(rootLayout, stepName, context, formFragment, jsonObject, editText);
1✔
80
                ((JsonApi) context).addFormDataView(editText);
1✔
81
            } catch (JSONException e) {
×
82
                Timber.e(e);
×
83
            }
1✔
84
        });
1✔
85
        views.add(rootLayout);
1✔
86
        return views;
1✔
87
    }
88

89
    private void attachJson(final RelativeLayout rootLayout, final String stepName, final Context context, final JsonFormFragment formFragment,
90
                            final JSONObject jsonObject, final MaterialEditText editText) throws JSONException {
91
        final String relevance = jsonObject.optString(JsonFormConstants.RELEVANCE);
1✔
92
        final String calculation = jsonObject.optString(JsonFormConstants.CALCULATION);
1✔
93
        final String constraints = jsonObject.optString(JsonFormConstants.CONSTRAINTS);
1✔
94
        final String value = jsonObject.optString(JsonFormConstants.VALUE, null);
1✔
95

96

97
        if (value != null && !checkValue(value)) {
1✔
98
            editText.setText(value);
1✔
99
        }
100

101
        editText.setOnClickListener(new View.OnClickListener() {
1✔
102
            @Override
103
            public void onClick(View v) {
104
                addOnClickActions(context, editText, jsonObject.optString(JsonFormConstants.BARCODE_TYPE));
×
105
            }
×
106
        });
107

108
        editText.setOnLongClickListener(new View.OnLongClickListener() {
1✔
109
            @Override
110
            public boolean onLongClick(View v) {
111
                editText.setText("");
×
112
                return true;
×
113
            }
114
        });
115

116
        GenericTextWatcher textWatcher = new GenericTextWatcher(stepName, formFragment, editText);
1✔
117
        textWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() {
1✔
118
            @Override
119
            public void onFocusChange(View v, boolean hasFocus) {
120
                if (hasFocus) {
×
121
                    addOnClickActions(context, editText, jsonObject.optString(JsonFormConstants.BARCODE_TYPE));
×
122
                }
123
            }
×
124
        });
125

126
        addScanButton(context, jsonObject, editText, rootLayout);
1✔
127

128
        editText.addTextChangedListener(textWatcher);
1✔
129
        attachRefreshLogic(context, relevance, calculation, constraints, editText);
1✔
130
    }
1✔
131

132
    private void attachRefreshLogic(Context context, String relevance, String calculation, String constraints, MaterialEditText editText) {
133
        if (!TextUtils.isEmpty(relevance) && context instanceof JsonApi) {
1✔
134
            editText.setTag(R.id.relevance, relevance);
1✔
135
            ((JsonApi) context).addSkipLogicView(editText);
1✔
136
        }
137
        if (!TextUtils.isEmpty(constraints) && context instanceof JsonApi) {
1✔
138
            editText.setTag(R.id.constraints, constraints);
1✔
139
            ((JsonApi) context).addConstrainedView(editText);
1✔
140
        }
141
        if (!TextUtils.isEmpty(calculation) && context instanceof JsonApi) {
1✔
142
            editText.setTag(R.id.calculation, calculation);
1✔
143
            ((JsonApi) context).addCalculationLogicView(editText);
1✔
144
        }
145
    }
1✔
146

147
    public RelativeLayout getRootLayout(Context context) {
148
        return (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.native_form_item_barcode, null);
1✔
149
    }
150

151
    private void addOnClickActions(Context context, MaterialEditText editText, String barcodeType) {
152
        addOnBarCodeResultListeners(context, editText);
×
153
        launchBarcodeScanner((Activity) context, editText, barcodeType);
×
154
    }
×
155

156
    protected void addOnBarCodeResultListeners(final Context context, final MaterialEditText editText) {
157
        if (context instanceof JsonApi) {
×
158
            JsonApi jsonApi = (JsonApi) context;
×
159
            jsonApi.addOnActivityResultListener(JsonFormConstants.BARCODE_CONSTANTS.BARCODE_REQUEST_CODE,
×
160
                    (requestCode, resultCode, data) -> {
161
                        if (requestCode == JsonFormConstants.BARCODE_CONSTANTS.BARCODE_REQUEST_CODE && resultCode == RESULT_OK) {
×
162
                            if (data != null) {
×
163
                                Barcode barcode = data.getParcelableExtra(JsonFormConstants.BARCODE_CONSTANTS.BARCODE_KEY);
×
164
                                Timber.d("Scanned QR Code %s ", barcode.displayValue);
×
165
                                editText.setText(barcode.displayValue);
×
166
                            } else
×
167
                                Timber.i("NO RESULT FOR QR CODE");
×
168
                        }
169
                    });
×
170
        }
171
    }
×
172

173
    private MaterialEditText createEditText(RelativeLayout rootLayout, JSONObject jsonObject, int canvasId, String stepName, boolean popup) throws JSONException {
174
        final MaterialEditText editText = rootLayout.findViewById(R.id.edit_text);
1✔
175
        String openMrsEntityParent = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY_PARENT);
1✔
176
        String openMrsEntity = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY);
1✔
177
        String openMrsEntityId = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY_ID);
1✔
178
        editText.setHint(jsonObject.getString(JsonFormConstants.HINT));
1✔
179
        JSONArray canvasIdsArray = new JSONArray();
1✔
180
        canvasIdsArray.put(canvasId);
1✔
181
        editText.setTag(R.id.canvas_ids, canvasIdsArray.toString());
1✔
182
        editText.setTag(R.id.address, stepName + ":" + jsonObject.getString(JsonFormConstants.KEY));
1✔
183
        editText.setFloatingLabelText(jsonObject.getString(JsonFormConstants.HINT));
1✔
184
        editText.setId(ViewUtil.generateViewId());
1✔
185
        editText.setTag(R.id.key, jsonObject.getString(JsonFormConstants.KEY));
1✔
186
        editText.setTag(R.id.openmrs_entity_parent, openMrsEntityParent);
1✔
187
        editText.setTag(R.id.extraPopup, popup);
1✔
188
        editText.setTag(R.id.openmrs_entity, openMrsEntity);
1✔
189
        editText.setTag(R.id.openmrs_entity_id, openMrsEntityId);
1✔
190
        if (jsonObject.has(JsonFormConstants.V_REQUIRED)) {
1✔
191
            JSONObject requiredObject = jsonObject.optJSONObject(JsonFormConstants.V_REQUIRED);
1✔
192
            boolean requiredValue = requiredObject.getBoolean(JsonFormConstants.VALUE);
1✔
193
            if (Boolean.TRUE.equals(requiredValue)) {
1✔
194
                editText.addValidator(
1✔
195
                        new RequiredValidator(requiredObject.getString(JsonFormConstants.ERR)));
1✔
196
                FormUtils.setRequiredOnHint(editText);
1✔
197
            }
198
        }
199
        return editText;
1✔
200
    }
201

202
    private void addScanButton(final Context context, final JSONObject jsonObject, final MaterialEditText editText, RelativeLayout rootLayout) throws JSONException {
203
        Button scanButton = rootLayout.findViewById(R.id.scan_button);
1✔
204
        scanButton.setBackgroundColor(context.getResources().getColor(R.color.primary));
1✔
205
        scanButton.setMinHeight(0);
1✔
206
        scanButton.setMinimumHeight(0);
1✔
207
        scanButton.setText(jsonObject.getString(SCAN_BUTTON_TEXT));
1✔
208
        scanButton.setOnClickListener(new View.OnClickListener() {
1✔
209
            @Override
210
            public void onClick(View v) {
211
                addOnClickActions(context, editText, jsonObject.optString(JsonFormConstants.BARCODE_TYPE));
×
212
            }
×
213
        });
214

215
        if (jsonObject.has(JsonFormConstants.READ_ONLY)) {
1✔
216
            boolean readOnly = jsonObject.getBoolean(JsonFormConstants.READ_ONLY);
1✔
217
            editText.setEnabled(!readOnly);
1✔
218
            editText.setFocusable(!readOnly);
1✔
219
            if (readOnly) {
1✔
220
                scanButton.setBackgroundDrawable(new ColorDrawable(context.getResources()
1✔
221
                        .getColor(android.R.color.darker_gray)));
1✔
222
                scanButton.setClickable(false);
1✔
223
                scanButton.setEnabled(false);
1✔
224
                scanButton.setFocusable(false);
1✔
225
            }
226
        }
227
    }
1✔
228

229
    protected void launchBarcodeScanner(Activity activity, MaterialEditText editText, String barcodeType) {
230
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(
×
231
                Context.INPUT_METHOD_SERVICE);
232
        inputManager.hideSoftInputFromWindow(editText.getWindowToken(), HIDE_NOT_ALWAYS);
×
233
        if (barcodeType != null && barcodeType.equals(TYPE_QR) && PermissionUtils.isPermissionGranted(activity, Manifest.permission.CAMERA, PermissionUtils.CAMERA_PERMISSION_REQUEST_CODE)) {
×
234
            try {
235
                Intent intent = new Intent(activity, JsonFormBarcodeScanActivity.class);
×
236
                activity.startActivityForResult(intent, JsonFormConstants.BARCODE_CONSTANTS.BARCODE_REQUEST_CODE);
×
237
            } catch (SecurityException e) {
×
238
                Utils.showToast(activity, activity.getApplicationContext().getResources().getString(R.string.allow_camera_management));
×
239
            }
×
240
        }
241
    }
×
242

243
    private boolean checkValue(String value) {
244
        return value.contains("ABC");
1✔
245
    }
246
}
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