Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ secrets.tar.gz
medic-official.keystore
playstore-secret.json
*.iml
*.jks
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ dependencies {
exclude module: 'jcip-annotations'
}

implementation 'com.journeyapps:zxing-android-embedded:3.6.0' // Check for the latest version that supports API 16
implementation 'com.google.zxing:core:3.3.0'

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}

Expand Down
10 changes: 9 additions & 1 deletion src/generic/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SMS Gateway</string>
</resources>
<string name="cancelledScan">Cancelled scan.</string>
<string name="txtPermissionsPrompt_cameraAccess">
<![CDATA[
<b>Warning: <i>%1$s</i> does not currently have permissions to access the camera.</b><br>
<br>This permission is required so you can configure the CHT-Core URL with a QR code.
]]>
</string>
<string name="scanQrCode">Scan Qr code</string>
</resources>
3 changes: 3 additions & 0 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
https://github.com/medic/cht-gateway/issues/103 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<!-- Required to scan QR code -->
<uses-permission android:name="android.permission.CAMERA"/>

<application android:label="@string/app_name"
android:icon="@mipmap/icn_launcher"
android:allowBackup="false"
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/medic/gateway/alert/GatewayLog.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public static void warnEvent(Context ctx, String message, Object... extras) {

public static void trace(Object caller, String message, Object... extras) {
if(!DEBUG) return;
message = String.format(message, extras);
message = String.format(message.replace("%", "%%"), extras);
Class callerClass = caller instanceof Class ? (Class) caller : caller.getClass();
d(LOG_TAG, String.format("%s :: %s", callerClass.getName(), message));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,22 @@ public class PromptForPermissionsActivity extends Activity implements ActivityCo
private static final String X_IS_DEMAND = "isDemand";
private static final String X_PERMISSIONS_TYPE = "permissionsType";

private static final Object[][] PERMISSIONS_REQUESTS = {
/* sms */ { R.string.txtPermissionsPrompt_sms, new String[] { permission.SEND_SMS, permission.RECEIVE_SMS, permission.READ_PHONE_STATE } },
/* file access */ { R.string.txtPermissionsPrompt_fileAccess, new String[] { permission.WRITE_EXTERNAL_STORAGE } },
};
private static final Object[][] PERMISSIONS_REQUESTS = buildPermissionsRequests();
private static Object[][] buildPermissionsRequests() {
if (IS_MEDIC_FLAVOUR) {
return new Object[][]{
/* sms */ {R.string.txtPermissionsPrompt_sms, new String[]{permission.SEND_SMS, permission.RECEIVE_SMS, permission.READ_PHONE_STATE}},
/* file access */ {R.string.txtPermissionsPrompt_fileAccess, new String[]{permission.WRITE_EXTERNAL_STORAGE}},
// No camera permission needed for MEDIC flavour
};
} else {
return new Object[][]{
/* sms */ {R.string.txtPermissionsPrompt_sms, new String[]{permission.SEND_SMS, permission.RECEIVE_SMS, permission.READ_PHONE_STATE}},
/* file access */ {R.string.txtPermissionsPrompt_fileAccess, new String[]{permission.WRITE_EXTERNAL_STORAGE}},
/* camera access */ {R.string.txtPermissionsPrompt_cameraAccess, new String[]{permission.CAMERA}},
};
}
}

private boolean isDemand;
private boolean deniedBefore;
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/medic/gateway/alert/SettingsDialogActivity.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package medic.gateway.alert;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
Expand All @@ -11,6 +13,7 @@
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -26,6 +29,8 @@
import static medic.gateway.alert.SimpleJsonClient2.redactUrl;
import static medic.gateway.alert.Utils.includeVersionNameInActivityTitle;
import static medic.gateway.alert.Utils.startMainActivity;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

@SuppressWarnings({"PMD.GodClass", "PMD.TooManyMethods"})
public class SettingsDialogActivity extends Activity {
Expand Down Expand Up @@ -62,6 +67,20 @@ public class SettingsDialogActivity extends Activity {
cancelButton().setVisibility(View.GONE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if (result.getContents() == null) {
Toast.makeText(this, R.string.cancelledScan, Toast.LENGTH_LONG).show();
} else {
EditText urlEditText = findViewById(R.id.txtWebappUrl);
urlEditText.setText(result.getContents());
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}

//> CUSTOM EVENT HANDLERS
public void doSave(View view) {
Expand All @@ -88,6 +107,16 @@ public void cancelSettingsEdit(View view) {
backToMessageListsView();
}

public void openCamera(View view) {
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
integrator.setPrompt(getString(R.string.scanQrCode));
integrator.setCameraId(0);
integrator.setBeepEnabled(true);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();
}

public void onBackPressed() {
if(hasPreviousSettings) {
backToMessageListsView();
Expand Down
127 changes: 81 additions & 46 deletions src/main/res/layout/settings_dialog_generic.xml
Original file line number Diff line number Diff line change
@@ -1,57 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:fillViewport="true">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:scrollbars="vertical">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical">
<EditText android:id="@+id/txtWebappUrl"
android:hint="@string/txtWebappUrl"
android:autofillHints=""
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10">

<EditText
android:id="@+id/txtWebappUrl"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_marginTop="16dp"
android:inputType="textUri"/>
<CheckBox android:id="@+id/cbxEnablePolling"
android:layout_width="fill_parent"
android:layout_weight="8.5"
android:autofillHints=""
android:hint="@string/txtWebappUrl"
android:inputType="textUri" />

<ImageView
android:id="@+id/cameraIcon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.5"
android:clickable="false"
android:contentDescription="@string/scanQrCode"
android:onClick="openCamera"
android:src="@android:drawable/ic_menu_camera"
android:tint="@android:color/background_dark"
android:translationX="5dp"
android:translationY="5dp" />
</LinearLayout>

<CheckBox
android:id="@+id/cbxEnablePolling"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:layout_marginTop="16dp"
android:checked="true"
android:text="@string/cbxEnablePolling" />

<CheckBox
android:id="@+id/cbxEnableCdmaCompatMode"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:layout_marginTop="16dp"
android:checked="false"
android:text="@string/cbxEnableCdmaCompatMode" />

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="16dp"
android:orientation="vertical">

<Button
android:id="@+id/btnCancelSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/cbxEnablePolling"
android:checked="true"/>
<CheckBox android:id="@+id/cbxEnableCdmaCompatMode"
android:layout_width="fill_parent"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/btnSaveSettings"
android:onClick="cancelSettingsEdit"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/btnCancel" />

<Button
android:id="@+id/btnSaveSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/cbxEnableCdmaCompatMode"
android:checked="false"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_marginTop="16dp">
<Button android:id="@+id/btnCancelSettings"
android:text="@string/btnCancel"
android:onClick="cancelSettingsEdit"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/btnSaveSettings"/>
<Button android:id="@+id/btnSaveSettings"
android:text="@string/btnSave"
android:onClick="doSave"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"/>
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:onClick="doSave"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/btnSave" />
</RelativeLayout>

</LinearLayout>
</ScrollView>