Added new dashboard, scanning, registration UI & functionality.
This commit is contained in:
@@ -41,6 +41,9 @@ android {
|
|||||||
// but continue the build even when errors are found:
|
// but continue the build even when errors are found:
|
||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
|
buildFeatures {
|
||||||
|
viewBinding true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -49,6 +52,9 @@ dependencies {
|
|||||||
implementation 'androidx.appcompat:appcompat:1.5.1'
|
implementation 'androidx.appcompat:appcompat:1.5.1'
|
||||||
implementation 'com.google.android.material:material:1.7.0'
|
implementation 'com.google.android.material:material:1.7.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
|
||||||
|
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
|
||||||
|
implementation 'androidx.navigation:navigation-ui-ktx:2.5.2'
|
||||||
// implementation 'androidx.core:core-ktx:+'
|
// implementation 'androidx.core:core-ktx:+'
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
@@ -67,6 +73,9 @@ dependencies {
|
|||||||
// Barcode scanner
|
// Barcode scanner
|
||||||
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
|
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
|
||||||
|
|
||||||
|
// Google ML Kit usign play services
|
||||||
|
implementation 'com.google.android.gms:play-services-code-scanner:16.0.0'
|
||||||
|
|
||||||
}
|
}
|
||||||
//repositories {
|
//repositories {
|
||||||
// mavenCentral()
|
// mavenCentral()
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
<uses-feature android:name="android.hardware.camera" />
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
@@ -23,40 +25,48 @@
|
|||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.HPOS"
|
android:theme="@style/Theme.HPOS"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
|
<activity
|
||||||
|
android:name=".presentation.dashboard.DashboardActivity"
|
||||||
|
android:exported="false"
|
||||||
|
android:label="@string/title_activity_dashboard"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@style/Theme.HPOS.NoActionBar" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="com.example.hpos.presentation.testRight.UsbService"
|
android:name=".presentation.testRight.UsbService"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpos.presentation.SplashActivity"
|
android:name=".presentation.SplashActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
android:theme="@style/AppTheme.NoActionBar">
|
android:theme="@style/AppTheme.NoActionBar">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpos.presentation.testRight.TestRightActivity"
|
android:name=".presentation.testRight.TestRightActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:windowSoftInputMode="adjustPan"
|
android:parentActivityName=".presentation.MainActivity"
|
||||||
android:parentActivityName="com.example.hpos.presentation.MainActivity">
|
android:windowSoftInputMode="adjustPan">
|
||||||
<!-- <intent-filter>-->
|
|
||||||
<!-- <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />-->
|
|
||||||
<!-- </intent-filter>-->
|
|
||||||
|
|
||||||
<!-- <meta-data-->
|
<!-- <intent-filter> -->
|
||||||
<!-- android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"-->
|
<!-- <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> -->
|
||||||
<!-- android:resource="@xml/device_filter" />-->
|
<!-- </intent-filter> -->
|
||||||
</activity>
|
|
||||||
|
|
||||||
<!-- android:theme="@style/Theme.HPOS.ActionBar"-->
|
|
||||||
|
<!-- <meta-data -->
|
||||||
|
<!-- android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" -->
|
||||||
|
<!-- android:resource="@xml/device_filter" /> -->
|
||||||
|
</activity> <!-- android:theme="@style/Theme.HPOS.ActionBar" -->
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpos.presentation.MainActivity"
|
android:name=".presentation.MainActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
||||||
@@ -65,12 +75,17 @@
|
|||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
|
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
|
||||||
android:resource="@xml/device_filter" />
|
android:resource="@xml/device_filter" />
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.journeyapps.barcodescanner.CaptureActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
tools:replace="android:screenOrientation"
|
||||||
|
android:stateNotNeeded="true"/>
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="preloaded_fonts"
|
android:name="preloaded_fonts"
|
||||||
android:resource="@array/preloaded_fonts" />
|
android:resource="@array/preloaded_fonts" />
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.example.hpos.data
|
package com.example.hpos.data
|
||||||
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import com.example.hpos.data.model.TestRightDeviceConstants
|
import com.example.hpos.data.model.test.TestRightDeviceConstants
|
||||||
import com.example.hpos.data.model.TestType
|
import com.example.hpos.data.model.test.TestType
|
||||||
|
|
||||||
object DataHolder {
|
object DataHolder {
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.example.hpos.data
|
package com.example.hpos.data
|
||||||
|
|
||||||
import com.example.hpos.data.model.TestInfo
|
import com.example.hpos.data.model.test.TestInfo
|
||||||
|
|
||||||
interface Repository {
|
interface Repository {
|
||||||
suspend fun saveToDatabase(info: TestInfo)
|
suspend fun saveToDatabase(info: TestInfo)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.example.hpos.data
|
package com.example.hpos.data
|
||||||
|
|
||||||
import com.example.hpos.data.model.TestInfo
|
import com.example.hpos.data.model.test.TestInfo
|
||||||
|
|
||||||
class RepositoryImpl : Repository {
|
class RepositoryImpl : Repository {
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.example.hpos.data.constant
|
|||||||
object Constants {
|
object Constants {
|
||||||
const val ACTION_USB_PERMISSION = "shanmukha.in.sickle_cell.USB_PERMISSION"
|
const val ACTION_USB_PERMISSION = "shanmukha.in.sickle_cell.USB_PERMISSION"
|
||||||
|
|
||||||
|
const val ABHA_APP_PACKAGE = "in.ndhm.phr"
|
||||||
|
|
||||||
const val WRITE_TIMEOUT_MILLIS = 30000 // 30 sec
|
const val WRITE_TIMEOUT_MILLIS = 30000 // 30 sec
|
||||||
const val READ_TIMEOUT_MILLIS = 60000 // 1 min
|
const val READ_TIMEOUT_MILLIS = 60000 // 1 min
|
||||||
const val DELAY_BETWEEN_COMMANDS: Long = 1000
|
const val DELAY_BETWEEN_COMMANDS: Long = 1000
|
||||||
|
|||||||
174
app/src/main/java/com/example/hpos/data/model/AadharCard.java
Normal file
174
app/src/main/java/com/example/hpos/data/model/AadharCard.java
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
package com.example.hpos.data.model;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
|
public class AadharCard {
|
||||||
|
private String uuid;
|
||||||
|
private String name;
|
||||||
|
private String dateOfBirth;
|
||||||
|
private String gender;
|
||||||
|
private String careOf;
|
||||||
|
private String district;
|
||||||
|
private String landmark;
|
||||||
|
private String house;
|
||||||
|
private String location;
|
||||||
|
private String pinCode;
|
||||||
|
private String postOffice;
|
||||||
|
private String state;
|
||||||
|
private String street;
|
||||||
|
private String subDistrict;
|
||||||
|
private String vtc;
|
||||||
|
private Bitmap image;
|
||||||
|
private String email;
|
||||||
|
private String mobile;
|
||||||
|
private String signature;
|
||||||
|
|
||||||
|
public void setUuid(String aUuid){ name = aUuid; }
|
||||||
|
public void setName(String aName){ name = aName; }
|
||||||
|
public void setDateOfBirth(String aDateOfBirth){
|
||||||
|
dateOfBirth = aDateOfBirth;
|
||||||
|
}
|
||||||
|
public void setGender(String aGender){
|
||||||
|
gender = aGender;
|
||||||
|
}
|
||||||
|
public void setCareOf(String aCareOf){
|
||||||
|
careOf = aCareOf;
|
||||||
|
}
|
||||||
|
public void setDistrict(String aDistrict){
|
||||||
|
district = aDistrict;
|
||||||
|
}
|
||||||
|
public void setLandmark(String aLandmark){
|
||||||
|
landmark = aLandmark;
|
||||||
|
}
|
||||||
|
public void setHouse(String aHouse){
|
||||||
|
house = aHouse;
|
||||||
|
}
|
||||||
|
public void setLocation(String aLocation){ location = aLocation; }
|
||||||
|
public void setPinCode(String aPinCode){
|
||||||
|
pinCode = aPinCode;
|
||||||
|
}
|
||||||
|
public void setPostOffice(String aPostOffice){
|
||||||
|
postOffice = aPostOffice;
|
||||||
|
}
|
||||||
|
public void setState(String aState){
|
||||||
|
state = aState;
|
||||||
|
}
|
||||||
|
public void setStreet(String aStreet){
|
||||||
|
street = aStreet;
|
||||||
|
}
|
||||||
|
public void setSubDistrict(String aSubDistrict){
|
||||||
|
subDistrict = aSubDistrict;
|
||||||
|
}
|
||||||
|
public void setVtc(String aVtc){
|
||||||
|
vtc = aVtc;
|
||||||
|
}
|
||||||
|
public void setImage(Bitmap aImage){
|
||||||
|
image = aImage;
|
||||||
|
}
|
||||||
|
public void setEmail(String aEmail){
|
||||||
|
email = aEmail;
|
||||||
|
}
|
||||||
|
public void setMobile(String aMobile){
|
||||||
|
mobile = aMobile;
|
||||||
|
}
|
||||||
|
public void setSignature(String aSignature){
|
||||||
|
signature = aSignature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AadharCard(){
|
||||||
|
uuid = "";
|
||||||
|
name = "";
|
||||||
|
dateOfBirth = "";
|
||||||
|
gender = "";
|
||||||
|
careOf = "";
|
||||||
|
district = "";
|
||||||
|
landmark = "";
|
||||||
|
house = "";
|
||||||
|
location = "";
|
||||||
|
pinCode = "";
|
||||||
|
postOffice = "";
|
||||||
|
state = "";
|
||||||
|
street = "";
|
||||||
|
subDistrict = "";
|
||||||
|
vtc = "";
|
||||||
|
email = "";
|
||||||
|
mobile = "";
|
||||||
|
signature = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDateOfBirth() {
|
||||||
|
return dateOfBirth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGender() {
|
||||||
|
return gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCareOf() {
|
||||||
|
return careOf;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDistrict() {
|
||||||
|
return district;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLandmark() {
|
||||||
|
return landmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHouse() {
|
||||||
|
return house;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPinCode() {
|
||||||
|
return pinCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPostOffice() {
|
||||||
|
return postOffice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreet() {
|
||||||
|
return street;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSubDistrict() {
|
||||||
|
return subDistrict;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVtc() {
|
||||||
|
return vtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getImage() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMobile() {
|
||||||
|
return mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSignature() {
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package com.example.hpos.data.model
|
|
||||||
|
|
||||||
data class PatientAadhaarData(
|
|
||||||
val uuid: String?,
|
|
||||||
val name: String,
|
|
||||||
val gender: Gender,
|
|
||||||
val careOf: String,
|
|
||||||
val yob: String,
|
|
||||||
val address: Address,
|
|
||||||
val pinCode: String,
|
|
||||||
val mobile: String?,
|
|
||||||
|
|
||||||
val isMarried: Boolean?,
|
|
||||||
val bloodGroup: BloodGroup?,
|
|
||||||
) {
|
|
||||||
enum class Gender {
|
|
||||||
MALE,
|
|
||||||
FEMALE,
|
|
||||||
OTHER
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class BloodGroup {
|
|
||||||
O_POSITIVE, O_NEGATIVE,
|
|
||||||
A_POSITIVE, A_NEGATIVE,
|
|
||||||
B_POSITIVE, B_NEGATIVE,
|
|
||||||
AB_POSITIVE, AB_NEGATIVE,
|
|
||||||
}
|
|
||||||
|
|
||||||
data class Address(
|
|
||||||
val house: String?,
|
|
||||||
val street: String?,
|
|
||||||
val location: String?,
|
|
||||||
val landMark: String?,
|
|
||||||
val postOffice: String?,
|
|
||||||
val district: String,
|
|
||||||
val subDistrict: String,
|
|
||||||
val state: String,
|
|
||||||
val vtc: String?,
|
|
||||||
val pinCode: Int,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model
|
||||||
|
|
||||||
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
|
|
||||||
data class PatientData(
|
data class PatientData(
|
||||||
val name: String,
|
val name: String,
|
||||||
val age: Int,
|
val age: Int,
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.example.hpos.data.model.patient
|
||||||
|
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
data class PatientDetails(
|
||||||
|
var id: String,
|
||||||
|
var isIdABHA: Boolean,
|
||||||
|
var name: String?,
|
||||||
|
var yob: Int?,
|
||||||
|
var gender: Gender?,
|
||||||
|
var mobile: String?,
|
||||||
|
var isUnderMedication: Boolean?,
|
||||||
|
var isUnderTransfusion: Boolean?,
|
||||||
|
val photoUrl: String?,
|
||||||
|
var careOf: String?,
|
||||||
|
var isMarried: Boolean?,
|
||||||
|
var bloodGroup: String?,
|
||||||
|
var address: Address?,
|
||||||
|
var category: Category?,
|
||||||
|
var registerDate: Date?,
|
||||||
|
val uploadDate: Date?
|
||||||
|
) {
|
||||||
|
constructor() : this(
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
enum class Gender {
|
||||||
|
MALE,
|
||||||
|
FEMALE,
|
||||||
|
OTHER
|
||||||
|
}
|
||||||
|
|
||||||
|
// enum class BloodGroup {
|
||||||
|
// O_POSITIVE, O_NEGATIVE,
|
||||||
|
// A_POSITIVE, A_NEGATIVE,
|
||||||
|
// B_POSITIVE, B_NEGATIVE,
|
||||||
|
// AB_POSITIVE, AB_NEGATIVE,
|
||||||
|
// }
|
||||||
|
|
||||||
|
data class Address(
|
||||||
|
var house: String?,
|
||||||
|
val street: String?,
|
||||||
|
var city: String?,
|
||||||
|
val landMark: String?,
|
||||||
|
var postOffice: String?,
|
||||||
|
var district: String?,
|
||||||
|
val subDistrict: String?,
|
||||||
|
var state: String?,
|
||||||
|
val vtc: String?,
|
||||||
|
var pinCode: Int?,
|
||||||
|
) {
|
||||||
|
constructor() : this(null, null, null, null, null, null, null, null, null, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Category {
|
||||||
|
GENERAL,
|
||||||
|
OBC,
|
||||||
|
SC,
|
||||||
|
ST,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model.test
|
||||||
|
|
||||||
data class TestInfo(
|
data class TestInfo(
|
||||||
val value: String,
|
val value: String,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model.test
|
||||||
|
|
||||||
data class TestRightCalculationData(
|
data class TestRightCalculationData(
|
||||||
var absorbanceOne: Double?,
|
var absorbanceOne: Double?,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model.test
|
||||||
|
|
||||||
data class TestRightDeviceConstants(
|
data class TestRightDeviceConstants(
|
||||||
var a: String,
|
var a: String,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model.test
|
||||||
|
|
||||||
enum class TestRightResultType {
|
enum class TestRightResultType {
|
||||||
NORMAL,
|
NORMAL,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.hpos.data.model
|
package com.example.hpos.data.model.test
|
||||||
|
|
||||||
enum class TestType {
|
enum class TestType {
|
||||||
SICKLECERT,
|
SICKLECERT,
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.example.hpos.domain.AadhaarScanner;
|
||||||
|
/**
|
||||||
|
* QrCodeException wraps all the exceptions which occurs while scanning and decoding secure Aadharcard
|
||||||
|
* Qr Code
|
||||||
|
* @author Raj Deol
|
||||||
|
*/
|
||||||
|
public class QrCodeException extends Exception {
|
||||||
|
|
||||||
|
public QrCodeException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public QrCodeException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public QrCodeException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,304 @@
|
|||||||
|
package com.example.hpos.domain.AadhaarScanner;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.example.hpos.data.model.AadharCard;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to decode scanned QRcode
|
||||||
|
*/
|
||||||
|
public class SecureQrCode {
|
||||||
|
protected Context mContext;
|
||||||
|
protected static final byte SEPARATOR_BYTE = (byte)255;
|
||||||
|
protected static final int REFERENCE_ID_INDEX = 1,
|
||||||
|
NAME_INDEX = 2,
|
||||||
|
DATE_OF_BIRTH_INDEX = 3,
|
||||||
|
GENDER_INDEX = 4,
|
||||||
|
CARE_OF_INDEX = 5,
|
||||||
|
DISTRICT_INDEX = 6,
|
||||||
|
LANDMARK_INDEX = 7,
|
||||||
|
HOUSE_INDEX = 8,
|
||||||
|
LOCATION_INDEX = 9,
|
||||||
|
PIN_CODE_INDEX = 10,
|
||||||
|
POST_OFFICE_INDEX = 11,
|
||||||
|
STATE_INDEX = 12,
|
||||||
|
STREET_INDEX = 13,
|
||||||
|
SUB_DISTRICT_INDEX = 14,
|
||||||
|
VTC_INDEX = 15;
|
||||||
|
protected int emailMobilePresent, imageStartIndex, imageEndIndex;
|
||||||
|
protected ArrayList<String> decodedData;
|
||||||
|
protected String signature,email,mobile;
|
||||||
|
protected AadharCard scannedAadharCard;
|
||||||
|
|
||||||
|
public SecureQrCode(Context activity, String scanData) throws QrCodeException{
|
||||||
|
mContext = activity;
|
||||||
|
scannedAadharCard = new AadharCard();
|
||||||
|
|
||||||
|
// 1. Convert Base10 to BigInt
|
||||||
|
final BigInteger bigIntScanData = new BigInteger(scanData,10);
|
||||||
|
|
||||||
|
// 2. Convert BigInt to Byte Array
|
||||||
|
final byte byteScanData[] = bigIntScanData.toByteArray();
|
||||||
|
|
||||||
|
// 3. Decompress Byte Array
|
||||||
|
final byte[] decompByteScanData = decompressData(byteScanData);
|
||||||
|
|
||||||
|
// 4. Split the byte array using delimiter
|
||||||
|
List<byte[]> parts = separateData(decompByteScanData);
|
||||||
|
// Throw error if there are no parts
|
||||||
|
if(parts.size() == 0){
|
||||||
|
throw new QrCodeException("Invalid QR Code Data, no parts found after splitting by delimiter");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. decode extracted data to string
|
||||||
|
decodeData(parts);
|
||||||
|
|
||||||
|
// 6. Extract Signature
|
||||||
|
decodeSignature(decompByteScanData);
|
||||||
|
|
||||||
|
// 7. Email and Mobile number
|
||||||
|
decodeMobileEmail(decompByteScanData);
|
||||||
|
|
||||||
|
// 8. Extract Image
|
||||||
|
decodeImage(decompByteScanData);
|
||||||
|
Log.d("Rajdeol","Data Decoded");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decompress the byte array, compression used is GZIP
|
||||||
|
* @param byteScanData compressed byte array
|
||||||
|
* @return uncompressed byte array
|
||||||
|
* @throws QrCodeException
|
||||||
|
*/
|
||||||
|
protected byte[] decompressData(byte[] byteScanData) throws QrCodeException {
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream(byteScanData.length);
|
||||||
|
ByteArrayInputStream bin = new ByteArrayInputStream(byteScanData);
|
||||||
|
GZIPInputStream gis = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
gis = new GZIPInputStream(bin);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("Exception", "Decompressing QRcode, Opening byte stream failed: " + e.toString());
|
||||||
|
throw new QrCodeException("Error in opening Gzip byte stream while decompressing QRcode",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
int size = 0;
|
||||||
|
byte[] buf = new byte[1024];
|
||||||
|
while (size >= 0) {
|
||||||
|
try {
|
||||||
|
size = gis.read(buf,0,buf.length);
|
||||||
|
if(size > 0){
|
||||||
|
bos.write(buf,0,size);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("Exception", "Decompressing QRcode, writing byte stream failed: " + e.toString());
|
||||||
|
throw new QrCodeException("Error in writing byte stream while decompressing QRcode",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
gis.close();
|
||||||
|
bin.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("Exception", "Decompressing QRcode, closing byte stream failed: " + e.toString());
|
||||||
|
throw new QrCodeException("Error in closing byte stream while decompressing QRcode",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bos.toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to split byte array with delimiter
|
||||||
|
* @param source source byte array
|
||||||
|
* @return list of separated byte arrays
|
||||||
|
*/
|
||||||
|
protected List<byte[]> separateData(byte[] source) {
|
||||||
|
List<byte[]> separatedParts = new LinkedList<>();
|
||||||
|
int begin = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < source.length; i++) {
|
||||||
|
if(source[i] == SEPARATOR_BYTE){
|
||||||
|
// skip if first or last byte is separator
|
||||||
|
if(i != 0 && i != (source.length -1)){
|
||||||
|
separatedParts.add(Arrays.copyOfRange(source, begin, i));
|
||||||
|
}
|
||||||
|
begin = i + 1;
|
||||||
|
// check if we have got all the parts of text data
|
||||||
|
if(separatedParts.size() == (VTC_INDEX + 1)){
|
||||||
|
// this is required to extract image data
|
||||||
|
imageStartIndex = begin;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return separatedParts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* function to decode string values
|
||||||
|
* @param encodedData
|
||||||
|
* @throws QrCodeException
|
||||||
|
*/
|
||||||
|
protected void decodeData(List<byte[]> encodedData) throws QrCodeException{
|
||||||
|
Iterator<byte[]> i = encodedData.iterator();
|
||||||
|
decodedData = new ArrayList<String>();
|
||||||
|
while(i.hasNext()){
|
||||||
|
try {
|
||||||
|
decodedData.add(new String(i.next(), "ISO-8859-1"));
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
Log.e("Exception", "Decoding QRcode, ISO-8859-1 not supported: " + e.toString());
|
||||||
|
throw new QrCodeException("Decoding QRcode, ISO-8859-1 not supported",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// set the value of email/mobile present flag
|
||||||
|
emailMobilePresent = Integer.parseInt(decodedData.get(0));
|
||||||
|
|
||||||
|
// populate decoded data
|
||||||
|
scannedAadharCard.setName(decodedData.get(2));
|
||||||
|
scannedAadharCard.setDateOfBirth(decodedData.get(3));
|
||||||
|
scannedAadharCard.setGender(decodedData.get(4));
|
||||||
|
scannedAadharCard.setCareOf(decodedData.get(5));
|
||||||
|
scannedAadharCard.setDistrict(decodedData.get(6));
|
||||||
|
scannedAadharCard.setLandmark(decodedData.get(7));
|
||||||
|
scannedAadharCard.setHouse(decodedData.get(8));
|
||||||
|
scannedAadharCard.setLocation(decodedData.get(9));
|
||||||
|
scannedAadharCard.setPinCode(decodedData.get(10));
|
||||||
|
scannedAadharCard.setPostOffice(decodedData.get(11));
|
||||||
|
scannedAadharCard.setState(decodedData.get(12));
|
||||||
|
scannedAadharCard.setStreet(decodedData.get(13));
|
||||||
|
scannedAadharCard.setSubDistrict(decodedData.get(14));
|
||||||
|
scannedAadharCard.setVtc(decodedData.get(15));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ref : https://uidai.gov.in/2-uncategorised/11320-aadhaar-paperless-offline-e-kyc-3.html
|
||||||
|
* Hashing logic for Email ID :
|
||||||
|
* Sha256(Sha256(Email+SharePhrase))*number of times last digit of Aadhaar number
|
||||||
|
* (Ref ID field contains last 4 digits).
|
||||||
|
*
|
||||||
|
* Example :
|
||||||
|
* Email: abc@gm.com
|
||||||
|
* Aadhaar Number:XXXX XXXX 3632
|
||||||
|
* Passcode : Lock@487
|
||||||
|
* Hash : Sha256(Sha256(abc@gm.comLock@487))*2
|
||||||
|
* In case of Aadhaar number ends with Zero we will hashed one time.
|
||||||
|
* **********************************************************************
|
||||||
|
* **********************************************************************
|
||||||
|
* Hashing logic for Mobile Number :
|
||||||
|
* Sha256(Sha256(Mobile+SharePhrase))*number of times last digit of Aadhaar number
|
||||||
|
* (Ref ID field contains last 4 digits).
|
||||||
|
*
|
||||||
|
* Example :
|
||||||
|
* Mobile: 1234567890
|
||||||
|
* Aadhaar Number:XXXX XXXX 3632
|
||||||
|
* Passcode : Lock@487
|
||||||
|
* Hash: Sha256(Sha256(1234567890Lock@487))*2
|
||||||
|
* In case of Aadhaar number ends with Zero we will hashed one time.
|
||||||
|
* @param decompressedData
|
||||||
|
* @throws QrCodeException
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void decodeMobileEmail(byte[] decompressedData) throws QrCodeException{
|
||||||
|
int mobileStartIndex = 0,mobileEndIndex = 0,emailStartIndex = 0,emailEndIndex = 0;
|
||||||
|
switch (emailMobilePresent){
|
||||||
|
case 3:
|
||||||
|
// both email mobile present
|
||||||
|
mobileStartIndex = decompressedData.length - 289; // length -1 -256 -32
|
||||||
|
mobileEndIndex = decompressedData.length - 257; // length -1 -256
|
||||||
|
emailStartIndex = decompressedData.length - 322;// length -1 -256 -32 -1 -32
|
||||||
|
emailEndIndex = decompressedData.length - 290;// length -1 -256 -32 -1
|
||||||
|
|
||||||
|
mobile = bytesToHex (Arrays.copyOfRange(decompressedData,mobileStartIndex,mobileEndIndex+1));
|
||||||
|
email = bytesToHex (Arrays.copyOfRange(decompressedData,emailStartIndex,emailEndIndex+1));
|
||||||
|
// set image end index, it will be used to extract image data
|
||||||
|
imageEndIndex = decompressedData.length - 323;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
// only mobile
|
||||||
|
email = "";
|
||||||
|
mobileStartIndex = decompressedData.length - 289; // length -1 -256 -32
|
||||||
|
mobileEndIndex = decompressedData.length - 257; // length -1 -256
|
||||||
|
|
||||||
|
mobile = bytesToHex (Arrays.copyOfRange(decompressedData,mobileStartIndex,mobileEndIndex+1));
|
||||||
|
// set image end index, it will be used to extract image data
|
||||||
|
imageEndIndex = decompressedData.length - 290;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
// only email
|
||||||
|
mobile = "";
|
||||||
|
emailStartIndex = decompressedData.length - 289; // length -1 -256 -32
|
||||||
|
emailEndIndex = decompressedData.length - 257; // length -1 -256
|
||||||
|
|
||||||
|
email = bytesToHex (Arrays.copyOfRange(decompressedData,emailStartIndex,emailEndIndex+1));
|
||||||
|
// set image end index, it will be used to extract image data
|
||||||
|
imageEndIndex = decompressedData.length - 290;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// no mobile or email
|
||||||
|
mobile = "";
|
||||||
|
email = "";
|
||||||
|
// set image end index, it will be used to extract image data
|
||||||
|
imageEndIndex = decompressedData.length - 257;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void decodeImage(byte[] decompressedData) throws QrCodeException{
|
||||||
|
// image start and end indexes are calculated in functions : separateData and decodeMobileEmail
|
||||||
|
byte[] imageBytes = Arrays.copyOfRange(decompressedData,imageStartIndex,imageEndIndex+1);
|
||||||
|
|
||||||
|
// Bitmap bmp = new JP2Decoder(imageBytes).decode();
|
||||||
|
// scannedAadharCard.setImage(bmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void decodeSignature(byte[] decompressedData) throws QrCodeException{
|
||||||
|
// extract 256 bytes from the end of the byte array
|
||||||
|
int startIndex = decompressedData.length - 257,
|
||||||
|
noOfBytes = 256;
|
||||||
|
try {
|
||||||
|
signature = new String (decompressedData,startIndex,noOfBytes,"ISO-8859-1");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
Log.e("Exception", "Decoding Signature of QRcode, ISO-8859-1 not supported: " + e.toString());
|
||||||
|
throw new QrCodeException("Decoding Signature of QRcode, ISO-8859-1 not supported",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AadharCard getScannedAadharCard(){
|
||||||
|
return scannedAadharCard;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert byte array to hex string
|
||||||
|
* @param bytes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String bytesToHex(byte[] bytes) {
|
||||||
|
final char[] hexArray = "0123456789ABCDEF".toCharArray();
|
||||||
|
|
||||||
|
char[] hexChars = new char[bytes.length * 2];
|
||||||
|
for ( int j = 0; j < bytes.length; j++ ) {
|
||||||
|
int v = bytes[j] & 0xFF;
|
||||||
|
hexChars[j * 2] = hexArray[v >>> 4];
|
||||||
|
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
|
||||||
|
}
|
||||||
|
return new String(hexChars);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.example.hpos.domain
|
package com.example.hpos.domain
|
||||||
|
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestRightCalculationData
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
|
|
||||||
class ResultCalculationWithAvgImpl : TestRightResultCalculation {
|
class ResultCalculationWithAvgImpl : TestRightResultCalculation {
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.example.hpos.domain
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
import kotlin.math.log10
|
import kotlin.math.log10
|
||||||
|
|
||||||
class ResultCalculationWithFirstImpl {
|
class ResultCalculationWithFirstImpl {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.example.hpos.domain
|
package com.example.hpos.domain
|
||||||
|
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestRightCalculationData
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
|
|
||||||
class ResultCalculationWithMaxImpl : TestRightResultCalculation {
|
class ResultCalculationWithMaxImpl : TestRightResultCalculation {
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,7 @@ import android.util.Log
|
|||||||
import com.example.hpos.data.LocalFileRepository
|
import com.example.hpos.data.LocalFileRepository
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.PatientData
|
import com.example.hpos.data.model.PatientData
|
||||||
import com.example.hpos.data.model.TestRightCalculationData
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
import com.opencsv.CSVWriter
|
|
||||||
import java.io.File
|
|
||||||
import java.io.FileWriter
|
|
||||||
import java.util.Collections.sort
|
import java.util.Collections.sort
|
||||||
|
|
||||||
class SaveRawData(private val localFileRepository: LocalFileRepository) {
|
class SaveRawData(private val localFileRepository: LocalFileRepository) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.example.hpos.domain
|
package com.example.hpos.domain
|
||||||
|
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestRightCalculationData
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
|
|
||||||
class SickleFindResultCaluculationWithMaxImpl : TestRightResultCalculation{
|
class SickleFindResultCaluculationWithMaxImpl : TestRightResultCalculation{
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.example.hpos.domain
|
package com.example.hpos.domain
|
||||||
|
|
||||||
import com.example.hpos.data.model.TestRightCalculationData
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
|
|
||||||
interface TestRightResultCalculation {
|
interface TestRightResultCalculation {
|
||||||
fun getResults(
|
fun getResults(
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.example.hpos.presentation
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import com.example.hpos.R
|
|
||||||
|
|
||||||
class DashboardFragment : Fragment() {
|
|
||||||
|
|
||||||
override fun onCreateView(
|
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
|
||||||
savedInstanceState: Bundle?
|
|
||||||
): View? {
|
|
||||||
// Inflate the layout for this fragment
|
|
||||||
return inflater.inflate(R.layout.fragment_dashboard, container, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -4,11 +4,9 @@ import android.content.BroadcastReceiver
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.hardware.usb.UsbDevice
|
|
||||||
import android.hardware.usb.UsbManager
|
import android.hardware.usb.UsbManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.Gravity
|
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
@@ -18,7 +16,7 @@ import androidx.lifecycle.ViewModelProvider
|
|||||||
import com.example.hpos.R
|
import com.example.hpos.R
|
||||||
import com.example.hpos.data.DataHolder
|
import com.example.hpos.data.DataHolder
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestType
|
import com.example.hpos.data.model.test.TestType
|
||||||
import com.example.hpos.databinding.ActivityMainBinding
|
import com.example.hpos.databinding.ActivityMainBinding
|
||||||
import com.example.hpos.presentation.testRight.TestRightActivity
|
import com.example.hpos.presentation.testRight.TestRightActivity
|
||||||
import com.example.hpos.util.MyViewModelFactory
|
import com.example.hpos.util.MyViewModelFactory
|
||||||
@@ -26,7 +24,6 @@ import com.hoho.android.usbserial.driver.UsbSerialProber
|
|||||||
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity()
|
class MainActivity : AppCompatActivity()
|
||||||
// , SerialInputOutputManager.Listener
|
|
||||||
{
|
{
|
||||||
|
|
||||||
private lateinit var binding: ActivityMainBinding
|
private lateinit var binding: ActivityMainBinding
|
||||||
@@ -67,6 +64,8 @@ class MainActivity : AppCompatActivity()
|
|||||||
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
|
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
|
||||||
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
|
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
|
||||||
registerReceiver(mUsbReceiver, filter)
|
registerReceiver(mUsbReceiver, filter)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAndUpdateUsbConnection() {
|
private fun checkAndUpdateUsbConnection() {
|
||||||
@@ -107,6 +106,13 @@ class MainActivity : AppCompatActivity()
|
|||||||
myMenu?.get(0)?.icon = ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_off_24)
|
myMenu?.get(0)?.icon = ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_off_24)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO Scan: Remove this line
|
||||||
|
binding.cvItem3.setOnClickListener {
|
||||||
|
val i = Intent(applicationContext, TestRightActivity::class.java)
|
||||||
|
startActivity(i)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.example.hpos.presentation
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import com.example.hpos.R
|
|
||||||
|
|
||||||
class RegisterOneScanAbhaFragment : Fragment() {
|
|
||||||
|
|
||||||
override fun onCreateView(
|
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
|
||||||
savedInstanceState: Bundle?
|
|
||||||
): View? {
|
|
||||||
// Inflate the layout for this fragment
|
|
||||||
return inflater.inflate(R.layout.fragment_register_one_scan_abha, container, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -8,32 +8,53 @@ import android.os.Build
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.example.hpos.data.DataHolder
|
import com.example.hpos.data.DataHolder
|
||||||
import com.example.hpos.databinding.ActivitySplashBinding
|
import com.example.hpos.databinding.ActivitySplashBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardActivity
|
||||||
import com.example.hpos.util.MyUtils
|
import com.example.hpos.util.MyUtils
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Splash Activity
|
* Splash Activity
|
||||||
* Used for preprocessing of data, permissions
|
* Used for preprocessing of data, permissions
|
||||||
*/
|
*/
|
||||||
class SplashActivity : AppCompatActivity() {
|
class SplashActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private val MY_CAMERA_REQUEST_CODE: Int = 100
|
||||||
private lateinit var binding: ActivitySplashBinding
|
private lateinit var binding: ActivitySplashBinding
|
||||||
|
var permissionStorage = false
|
||||||
|
var permissionLocation = false
|
||||||
|
var permissionCamera = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
binding = ActivitySplashBinding.inflate(layoutInflater)
|
binding = ActivitySplashBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
checkForPermissions()
|
checkForStoragePermissions()
|
||||||
|
checkForLocationPermission()
|
||||||
|
// Keep this in last permission check, as checking all given or not after this
|
||||||
|
checkForCameraPermission()
|
||||||
|
|
||||||
|
// Log.d("surya_permission", "passed first")
|
||||||
|
checkAllPermissionsGiven()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkForPermissions() {
|
private fun checkAllPermissionsGiven() {
|
||||||
|
// Log.d("surya_permission", "inside checkAllPermissionsGiven")
|
||||||
|
if (permissionStorage && permissionCamera && permissionLocation)
|
||||||
|
moveToLandingPage()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkForStoragePermissions() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
getPermissionsAboveAndroidR()
|
getPermissionsAboveAndroidR()
|
||||||
} else {
|
} else {
|
||||||
@@ -49,7 +70,8 @@ class SplashActivity : AppCompatActivity() {
|
|||||||
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
if (Environment.isExternalStorageManager()) {
|
if (Environment.isExternalStorageManager()) {
|
||||||
DataHolder.isStoragePermissionGranted = true
|
DataHolder.isStoragePermissionGranted = true
|
||||||
moveToLandingPage()
|
// moveToLandingPage()
|
||||||
|
permissionStorage = true
|
||||||
} else {
|
} else {
|
||||||
DataHolder.isStoragePermissionGranted = false
|
DataHolder.isStoragePermissionGranted = false
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
@@ -66,7 +88,8 @@ class SplashActivity : AppCompatActivity() {
|
|||||||
storagePermissionResultLauncher.launch(intent)
|
storagePermissionResultLauncher.launch(intent)
|
||||||
} else {
|
} else {
|
||||||
DataHolder.isStoragePermissionGranted = true
|
DataHolder.isStoragePermissionGranted = true
|
||||||
moveToLandingPage()
|
// moveToLandingPage()
|
||||||
|
permissionStorage = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +98,8 @@ class SplashActivity : AppCompatActivity() {
|
|||||||
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
|
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
|
||||||
if (isGranted) {
|
if (isGranted) {
|
||||||
DataHolder.isStoragePermissionGranted = true
|
DataHolder.isStoragePermissionGranted = true
|
||||||
moveToLandingPage()
|
// moveToLandingPage()
|
||||||
|
permissionStorage = true
|
||||||
} else {
|
} else {
|
||||||
DataHolder.isStoragePermissionGranted = false
|
DataHolder.isStoragePermissionGranted = false
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
@@ -97,19 +121,71 @@ class SplashActivity : AppCompatActivity() {
|
|||||||
requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||||
} else {
|
} else {
|
||||||
DataHolder.isStoragePermissionGranted = true
|
DataHolder.isStoragePermissionGranted = true
|
||||||
moveToLandingPage()
|
// moveToLandingPage()
|
||||||
|
permissionStorage = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkForCameraPermission() {
|
||||||
|
if (ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.CAMERA)
|
||||||
|
== PackageManager.PERMISSION_DENIED
|
||||||
|
) {
|
||||||
|
val requestPermissionLauncher =
|
||||||
|
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
|
||||||
|
if (isGranted) {
|
||||||
|
permissionCamera = true
|
||||||
|
checkAllPermissionsGiven()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
this,
|
||||||
|
"You must grant permission to Camera to use the app",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
|
||||||
|
} else {
|
||||||
|
permissionCamera = true
|
||||||
|
checkAllPermissionsGiven()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkForLocationPermission() {
|
||||||
|
if (ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_COARSE_LOCATION)
|
||||||
|
== PackageManager.PERMISSION_DENIED
|
||||||
|
) {
|
||||||
|
val requestPermissionLauncher =
|
||||||
|
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
|
||||||
|
if (isGranted) {
|
||||||
|
permissionLocation = true
|
||||||
|
checkAllPermissionsGiven()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
this,
|
||||||
|
"You must grant permission to Location to use the app",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION)
|
||||||
|
} else {
|
||||||
|
permissionLocation = true
|
||||||
|
checkAllPermissionsGiven()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun moveToLandingPage() {
|
private fun moveToLandingPage() {
|
||||||
createAppFolder()
|
createAppFolder()
|
||||||
val i = Intent(applicationContext, MainActivity::class.java)
|
// val i = Intent(applicationContext, MainActivity::class.java)
|
||||||
|
val i = Intent(applicationContext, DashboardActivity::class.java)
|
||||||
startActivity(i)
|
startActivity(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAppFolder() {
|
private fun createAppFolder() {
|
||||||
val folderPath = MyUtils.createAppFolder(applicationContext)
|
val folderPath = MyUtils.createAppFolder(applicationContext)
|
||||||
if (folderPath != null){
|
if (folderPath != null) {
|
||||||
DataHolder.isAppFolderCreated = true
|
DataHolder.isAppFolderCreated = true
|
||||||
DataHolder.appFolderPath = folderPath
|
DataHolder.appFolderPath = folderPath
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Menu
|
||||||
|
import com.google.android.material.navigation.NavigationView
|
||||||
|
import androidx.navigation.findNavController
|
||||||
|
import androidx.navigation.ui.AppBarConfiguration
|
||||||
|
import androidx.navigation.ui.navigateUp
|
||||||
|
import androidx.navigation.ui.setupActionBarWithNavController
|
||||||
|
import androidx.navigation.ui.setupWithNavController
|
||||||
|
import androidx.drawerlayout.widget.DrawerLayout
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.databinding.ActivityDashboardBinding
|
||||||
|
import com.example.hpos.presentation.testRight.TestRightViewModel
|
||||||
|
import com.example.hpos.util.MyViewModelFactory
|
||||||
|
|
||||||
|
class DashboardActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var appBarConfiguration: AppBarConfiguration
|
||||||
|
private lateinit var binding: ActivityDashboardBinding
|
||||||
|
private lateinit var viewModel: DashboardViewModel
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
binding = ActivityDashboardBinding.inflate(layoutInflater)
|
||||||
|
setContentView(binding.root)
|
||||||
|
|
||||||
|
setSupportActionBar(binding.appBarDashboard.toolbar)
|
||||||
|
|
||||||
|
val drawerLayout: DrawerLayout = binding.drawerLayout
|
||||||
|
val navView: NavigationView = binding.navView
|
||||||
|
val navController = findNavController(R.id.nav_host_fragment_content_dashboard)
|
||||||
|
// Passing each menu ID as a set of Ids because each
|
||||||
|
// menu should be considered as top level destinations.
|
||||||
|
appBarConfiguration = AppBarConfiguration(
|
||||||
|
setOf(
|
||||||
|
R.id.nav_home, R.id.nav_profile, R.id.nav_settings
|
||||||
|
), drawerLayout
|
||||||
|
)
|
||||||
|
setupActionBarWithNavController(navController, appBarConfiguration)
|
||||||
|
navView.setupWithNavController(navController)
|
||||||
|
|
||||||
|
// val i = Intent(applicationContext, MainActivity::class.java)
|
||||||
|
// startActivity(i)
|
||||||
|
|
||||||
|
viewModel = ViewModelProvider(
|
||||||
|
this,
|
||||||
|
MyViewModelFactory(this.applicationContext)
|
||||||
|
)[DashboardViewModel::class.java]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
menuInflater.inflate(R.menu.dashboard, menu)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSupportNavigateUp(): Boolean {
|
||||||
|
val navController = findNavController(R.id.nav_host_fragment_content_dashboard)
|
||||||
|
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import com.example.hpos.data.model.AadharCard
|
||||||
|
import com.example.hpos.data.model.patient.PatientDetails
|
||||||
|
import com.example.hpos.util.MyUtils.fetchYOBFromDOB
|
||||||
|
import com.example.hpos.util.MyUtils.mapToGender
|
||||||
|
|
||||||
|
class DashboardViewModel : ViewModel() {
|
||||||
|
lateinit var aadharCard: AadharCard
|
||||||
|
lateinit var patientDetails: PatientDetails
|
||||||
|
|
||||||
|
|
||||||
|
fun initializePatientDetails(patient: PatientDetails) {
|
||||||
|
patientDetails = patient
|
||||||
|
}
|
||||||
|
|
||||||
|
fun mapAadhaarDataToPatient() {
|
||||||
|
if (patientDetails.name.isNullOrEmpty())
|
||||||
|
patientDetails.name = aadharCard.name
|
||||||
|
if (patientDetails.yob == null)
|
||||||
|
patientDetails.yob = aadharCard.dateOfBirth.fetchYOBFromDOB()
|
||||||
|
if (patientDetails.gender == null)
|
||||||
|
patientDetails.gender = aadharCard.gender.mapToGender()
|
||||||
|
if (patientDetails.mobile.isNullOrEmpty())
|
||||||
|
patientDetails.mobile = aadharCard.mobile
|
||||||
|
if (patientDetails.careOf.isNullOrEmpty())
|
||||||
|
patientDetails.careOf = aadharCard.careOf
|
||||||
|
|
||||||
|
if (patientDetails.address == null) {
|
||||||
|
patientDetails.address = PatientDetails.Address()
|
||||||
|
patientDetails.address?.house = aadharCard.house
|
||||||
|
patientDetails.address?.city = aadharCard.location
|
||||||
|
patientDetails.address?.postOffice = aadharCard.postOffice
|
||||||
|
patientDetails.address?.district = aadharCard.district
|
||||||
|
patientDetails.address?.state = aadharCard.state
|
||||||
|
patientDetails.address?.pinCode = aadharCard.pinCode.toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- Cloud Actions ------------------------------------------
|
||||||
|
|
||||||
|
fun pushPatientDetailsToCloud() {
|
||||||
|
// Synchronous Call Require
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createTest() {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import com.example.hpos.databinding.FragmentGalleryBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.ui.gallery.GalleryViewModel
|
||||||
|
|
||||||
|
class GalleryFragment : Fragment() {
|
||||||
|
|
||||||
|
private var _binding: FragmentGalleryBinding? = null
|
||||||
|
|
||||||
|
// This property is only valid between onCreateView and
|
||||||
|
// onDestroyView.
|
||||||
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
val galleryViewModel =
|
||||||
|
ViewModelProvider(this).get(GalleryViewModel::class.java)
|
||||||
|
|
||||||
|
_binding = FragmentGalleryBinding.inflate(inflater, container, false)
|
||||||
|
val root: View = binding.root
|
||||||
|
|
||||||
|
val textView: TextView = binding.textGallery
|
||||||
|
galleryViewModel.text.observe(viewLifecycleOwner) {
|
||||||
|
textView.text = it
|
||||||
|
}
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
super.onDestroyView()
|
||||||
|
_binding = null
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.data.model.patient.PatientDetails
|
||||||
|
import com.example.hpos.databinding.FragmentHomeBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.ui.home.HomeViewModel
|
||||||
|
|
||||||
|
class HomeFragment : Fragment() {
|
||||||
|
|
||||||
|
private var _binding: FragmentHomeBinding? = null
|
||||||
|
private val binding get() = _binding!!
|
||||||
|
private val viewModel: DashboardViewModel by activityViewModels()
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
_binding = FragmentHomeBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
binding.btnAdd.setOnClickListener {
|
||||||
|
viewModel.initializePatientDetails(PatientDetails())
|
||||||
|
findNavController().navigate(R.id.action_nav_home_to_registerOneScanAbhaFragment)
|
||||||
|
}
|
||||||
|
binding.btnTest.setOnClickListener {
|
||||||
|
findNavController().navigate(R.id.action_nav_home_to_mainActivity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
super.onDestroyView()
|
||||||
|
_binding = null
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import com.example.hpos.databinding.FragmentSlideshowBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.ui.slideshow.SlideshowViewModel
|
||||||
|
|
||||||
|
class SlideshowFragment : Fragment() {
|
||||||
|
|
||||||
|
private var _binding: FragmentSlideshowBinding? = null
|
||||||
|
|
||||||
|
// This property is only valid between onCreateView and
|
||||||
|
// onDestroyView.
|
||||||
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
val slideshowViewModel =
|
||||||
|
ViewModelProvider(this).get(SlideshowViewModel::class.java)
|
||||||
|
|
||||||
|
_binding = FragmentSlideshowBinding.inflate(inflater, container, false)
|
||||||
|
val root: View = binding.root
|
||||||
|
|
||||||
|
val textView: TextView = binding.textSlideshow
|
||||||
|
slideshowViewModel.text.observe(viewLifecycleOwner) {
|
||||||
|
textView.text = it
|
||||||
|
}
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
super.onDestroyView()
|
||||||
|
_binding = null
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.register
|
||||||
|
|
||||||
|
import android.content.ActivityNotFoundException
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.data.constant.Constants
|
||||||
|
import com.example.hpos.databinding.FragmentRegisterOneCreateAbhaBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardViewModel
|
||||||
|
|
||||||
|
|
||||||
|
class RegisterOneCreateAbha : Fragment() {
|
||||||
|
|
||||||
|
private val TAG = "RegisterOneCreateAbha"
|
||||||
|
private lateinit var binding: FragmentRegisterOneCreateAbhaBinding
|
||||||
|
private val viewModel: DashboardViewModel by activityViewModels()
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
binding = FragmentRegisterOneCreateAbhaBinding.inflate(inflater, container, false)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
binding.btnRedirect.setOnClickListener {
|
||||||
|
redirectApp()
|
||||||
|
}
|
||||||
|
binding.tvSkip.setOnClickListener {
|
||||||
|
// Taking to aadhaar page if ABHA is skipped
|
||||||
|
findNavController().navigate(R.id.action_registerOneCreateAbha_to_registerTwoAadhaarFragment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun redirectApp() {
|
||||||
|
val launchIntent: Intent? = requireActivity().packageManager
|
||||||
|
.getLaunchIntentForPackage(Constants.ABHA_APP_PACKAGE)
|
||||||
|
|
||||||
|
if (launchIntent != null) {
|
||||||
|
startActivity(launchIntent)
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=${Constants.ABHA_APP_PACKAGE}")))
|
||||||
|
} catch (e: ActivityNotFoundException) {
|
||||||
|
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=${Constants.ABHA_APP_PACKAGE}")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private fun appInstalledOrNot(uri: String): Boolean {
|
||||||
|
// val pm: PackageManager = requireActivity().packageManager
|
||||||
|
// try {
|
||||||
|
// pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
|
||||||
|
// return true
|
||||||
|
// } catch (e: PackageManager.NameNotFoundException) {
|
||||||
|
// }
|
||||||
|
// return false
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.register
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.data.model.patient.PatientDetails
|
||||||
|
import com.example.hpos.databinding.FragmentRegisterOneScanAbhaBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardViewModel
|
||||||
|
import com.example.hpos.util.MyUtils.fetchYOBFromDOB
|
||||||
|
import com.example.hpos.util.MyUtils.mapToGender
|
||||||
|
import com.google.mlkit.vision.barcode.common.Barcode
|
||||||
|
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions
|
||||||
|
import com.google.mlkit.vision.codescanner.GmsBarcodeScanning
|
||||||
|
import com.journeyapps.barcodescanner.ScanContract
|
||||||
|
import com.journeyapps.barcodescanner.ScanIntentResult
|
||||||
|
import com.journeyapps.barcodescanner.ScanOptions
|
||||||
|
import org.json.JSONObject
|
||||||
|
import java.lang.Exception
|
||||||
|
|
||||||
|
|
||||||
|
class RegisterOneScanAbhaFragment : Fragment() {
|
||||||
|
|
||||||
|
private val TAG = "RegisterOneScanAbha"
|
||||||
|
private lateinit var binding: FragmentRegisterOneScanAbhaBinding
|
||||||
|
private val viewModel: DashboardViewModel by activityViewModels()
|
||||||
|
|
||||||
|
private val barcodeLauncher = registerForActivityResult(
|
||||||
|
ScanContract()
|
||||||
|
) { result: ScanIntentResult ->
|
||||||
|
if (result.contents == null) {
|
||||||
|
Toast.makeText(requireContext(), "Cancelled: Unable to scan, Try Again!!", Toast.LENGTH_LONG).show()
|
||||||
|
} else {
|
||||||
|
Log.d(TAG, result.contents)
|
||||||
|
processScannedData(result.contents)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
binding = FragmentRegisterOneScanAbhaBinding.inflate(inflater, container, false)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
binding.btnScanNow.setOnClickListener {
|
||||||
|
// Todo: Remove this, add later
|
||||||
|
// viewModel.patientDetails.name = "Surya"
|
||||||
|
// viewModel.patientDetails.gender = PatientDetails.Gender.MALE
|
||||||
|
// moveToRegisterThree()
|
||||||
|
startScanningNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.btnGo.setOnClickListener {
|
||||||
|
val abhaID = validateAndReturnId()
|
||||||
|
if (abhaID == null) {
|
||||||
|
Toast.makeText(requireContext(), "Invalid ID Entered", Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.id = abhaID
|
||||||
|
viewModel.patientDetails.isIdABHA = true
|
||||||
|
|
||||||
|
// Scan aadhaar card to get more details
|
||||||
|
moveToRegisterTwo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.btnClickHere.setOnClickListener {
|
||||||
|
findNavController().navigate(R.id.action_registerOneScanAbhaFragment_to_registerOneCreateAbha)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateAndReturnId(): String? {
|
||||||
|
if (binding.nameEditText.text.isNullOrEmpty() || binding.nameEditText.text?.length != 14){
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return binding.nameEditText.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startScanningNow() {
|
||||||
|
val options = ScanOptions()
|
||||||
|
options.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
|
||||||
|
options.setPrompt("Scan a barcode")
|
||||||
|
options.setCameraId(0) // Use a specific camera of the device
|
||||||
|
|
||||||
|
options.setBeepEnabled(true)
|
||||||
|
options.setBarcodeImageEnabled(true)
|
||||||
|
|
||||||
|
options.setPrompt("Start Scanning")
|
||||||
|
options.setOrientationLocked(false)
|
||||||
|
// options.setTimeout(10000) // in ms
|
||||||
|
|
||||||
|
barcodeLauncher.launch(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun processScannedData(contents: String) {
|
||||||
|
try {
|
||||||
|
val obj = JSONObject(contents)
|
||||||
|
// Log.d(TAG, obj.get("hidn").toString())
|
||||||
|
// Log.d(TAG, obj.get("name").toString())
|
||||||
|
// Log.d(TAG, obj.get("address").toString())
|
||||||
|
|
||||||
|
// Details mapping
|
||||||
|
viewModel.patientDetails.id = obj.get("hidn").toString().replace("-", "")
|
||||||
|
viewModel.patientDetails.isIdABHA = true
|
||||||
|
viewModel.patientDetails.name = obj.get("name").toString()
|
||||||
|
viewModel.patientDetails.gender = obj.get("gender").toString().mapToGender()
|
||||||
|
viewModel.patientDetails.yob = obj.get("dob").toString().fetchYOBFromDOB()
|
||||||
|
viewModel.patientDetails.mobile = obj.get("mobile").toString()
|
||||||
|
|
||||||
|
// Address mapping
|
||||||
|
viewModel.patientDetails.address = PatientDetails.Address()
|
||||||
|
viewModel.patientDetails.address!!.state = obj.get("state name").toString()
|
||||||
|
viewModel.patientDetails.address!!.district = obj.get("district_name").toString()
|
||||||
|
viewModel.patientDetails.address!!.house = obj.get("address").toString()
|
||||||
|
|
||||||
|
moveToRegisterThree()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Unable to parse json")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToRegisterThree() {
|
||||||
|
findNavController().navigate(R.id.action_registerOneScanAbhaFragment_to_registerThreeEnterPatientDetails)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToRegisterTwo() {
|
||||||
|
findNavController().navigate(R.id.action_registerOneScanAbhaFragment_to_registerTwoAadhaarFragment)
|
||||||
|
}
|
||||||
|
|
||||||
|
// fun String.mapToGender(): PatientDetails.Gender {
|
||||||
|
// if (this.lowercase() == "m"|| this.lowercase() == "male") {
|
||||||
|
// return PatientDetails.Gender.MALE
|
||||||
|
// } else if (this.lowercase() == "f"|| this.lowercase() == "female") {
|
||||||
|
// return PatientDetails.Gender.FEMALE
|
||||||
|
// } else {
|
||||||
|
// return PatientDetails.Gender.OTHER
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
private fun startScanningNow2() {
|
||||||
|
val options = GmsBarcodeScannerOptions.Builder()
|
||||||
|
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
|
||||||
|
.build()
|
||||||
|
val scanner = GmsBarcodeScanning.getClient(requireActivity(), options)
|
||||||
|
scanner.startScan()
|
||||||
|
.addOnSuccessListener { barcode ->
|
||||||
|
Log.d(TAG, barcode.rawValue!!)
|
||||||
|
}
|
||||||
|
.addOnCanceledListener {
|
||||||
|
// Task canceled
|
||||||
|
Log.d(TAG, "cancelled")
|
||||||
|
}
|
||||||
|
.addOnFailureListener { e ->
|
||||||
|
Log.d(TAG, "failed")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.register
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.data.model.PatientData
|
||||||
|
import com.example.hpos.data.model.patient.PatientDetails
|
||||||
|
import com.example.hpos.databinding.FragmentRegisterOneScanAbhaBinding
|
||||||
|
import com.example.hpos.databinding.FragmentRegisterThreeEnterPatientDetailsBinding
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardViewModel
|
||||||
|
import com.example.hpos.util.MyUtils
|
||||||
|
import com.example.hpos.util.MyUtils.mapToCategory
|
||||||
|
import com.example.hpos.util.MyUtils.mapToGender
|
||||||
|
import com.example.hpos.util.MyUtils.mapYesNoStringToBool
|
||||||
|
import java.util.Calendar
|
||||||
|
|
||||||
|
class RegisterThreeEnterPatientDetails : Fragment() {
|
||||||
|
|
||||||
|
private val TAG = "RegisterThreeEnterPatientDetails"
|
||||||
|
private lateinit var binding: FragmentRegisterThreeEnterPatientDetailsBinding
|
||||||
|
private val viewModel: DashboardViewModel by activityViewModels()
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
binding = FragmentRegisterThreeEnterPatientDetailsBinding.inflate(inflater, container, false)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
prefillTexts()
|
||||||
|
|
||||||
|
binding.btnSubmit.setOnClickListener {
|
||||||
|
val mPatient = validateAndReturnPatientData()
|
||||||
|
if(mPatient != null){
|
||||||
|
viewModel.patientDetails = mPatient
|
||||||
|
viewModel.pushPatientDetailsToCloud()
|
||||||
|
viewModel.createTest()
|
||||||
|
moveToNextPage()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(requireContext(), "Fields can't be empty", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToNextPage() {
|
||||||
|
findNavController().navigate(R.id.action_registerThreeEnterPatientDetails_to_mainActivity)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun prefillTexts() {
|
||||||
|
viewModel.patientDetails.name?.let { binding.etName.setText(it) }
|
||||||
|
viewModel.patientDetails.yob?.let { binding.etYob.setText(it.toString()) }
|
||||||
|
viewModel.patientDetails.gender?.let { binding.etGenderBlock.setText(it.toString(), false) }
|
||||||
|
viewModel.patientDetails.mobile?.let { binding.etMobile.setText(it) }
|
||||||
|
viewModel.patientDetails.address?.house?.let { binding.etHouse.setText(it) }
|
||||||
|
viewModel.patientDetails.address?.district?.let { binding.etDistrict.setText(it) }
|
||||||
|
viewModel.patientDetails.address?.state?.let { binding.etState.setText(it) }
|
||||||
|
viewModel.patientDetails.address?.pinCode?.let { binding.etPincode.setText(it.toString()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateAndReturnPatientData(): PatientDetails? {
|
||||||
|
if (viewModel.patientDetails.id.isEmpty()){
|
||||||
|
Toast.makeText(requireContext(), "Unable to get \"ABHA ID\" or \"AADHAAR NO\", please try again", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.patientDetails.address == null){
|
||||||
|
viewModel.patientDetails.address = PatientDetails.Address()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etName.text.isNullOrEmpty()) {
|
||||||
|
binding.etName.error = getString(R.string.name_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.name = binding.etName.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etYob.text.isNullOrEmpty()) {
|
||||||
|
binding.etYob.error = getString(R.string.yob_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.yob = binding.etYob.text.toString().toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etGenderBlock.text.isNullOrEmpty()) {
|
||||||
|
binding.etGenderBlock.error = getString(R.string.gender_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.gender = binding.etGenderBlock.text.toString().mapToGender()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etMobile.text.isNullOrEmpty()) {
|
||||||
|
binding.etMobile.error = getString(R.string.mobile_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.mobile = binding.etMobile.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etCareof.text.isNullOrEmpty()) {
|
||||||
|
binding.etCareof.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.careOf = binding.etCareof.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etIsMarried.text.isNullOrEmpty()) {
|
||||||
|
binding.etIsMarried.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.isMarried = binding.etIsMarried.text.toString().mapYesNoStringToBool()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etCategory.text.isNullOrEmpty()) {
|
||||||
|
binding.etCategory.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.category = binding.etCategory.text.toString().mapToCategory()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etHouse.text.isNullOrEmpty()) {
|
||||||
|
binding.etHouse.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.address?.house = binding.etHouse.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etCity.text.isNullOrEmpty()) {
|
||||||
|
binding.etCity.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.address?.city = binding.etCity.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etState.text.isNullOrEmpty()) {
|
||||||
|
binding.etState.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.address?.state = binding.etState.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etPincode.text.isNullOrEmpty() || binding.etPincode.text?.length != 6) {
|
||||||
|
binding.etPincode.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.address?.pinCode = binding.etPincode.text.toString().toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.etBloodGroup.text.isNullOrEmpty()) {
|
||||||
|
binding.etBloodGroup.error = getString(R.string.this_error)
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.bloodGroup = binding.etBloodGroup.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.patientDetails.isUnderMedication = binding.cbItem1.isChecked
|
||||||
|
viewModel.patientDetails.isUnderTransfusion = binding.cbItem2.isChecked
|
||||||
|
|
||||||
|
viewModel.patientDetails.registerDate = Calendar.getInstance().time
|
||||||
|
return viewModel.patientDetails
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.register
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.databinding.FragmentRegisterTwoAadhaarBinding
|
||||||
|
import com.example.hpos.domain.AadhaarScanner.QrCodeException
|
||||||
|
import com.example.hpos.domain.AadhaarScanner.SecureQrCode
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardViewModel
|
||||||
|
import com.journeyapps.barcodescanner.ScanContract
|
||||||
|
import com.journeyapps.barcodescanner.ScanIntentResult
|
||||||
|
import com.journeyapps.barcodescanner.ScanOptions
|
||||||
|
|
||||||
|
class RegisterTwoAadhaarFragment : Fragment() {
|
||||||
|
|
||||||
|
private val TAG = "RegisterTwoAadhaarFrag"
|
||||||
|
private lateinit var binding: FragmentRegisterTwoAadhaarBinding
|
||||||
|
private val viewModel: DashboardViewModel by activityViewModels()
|
||||||
|
|
||||||
|
private val barcodeLauncher = registerForActivityResult(
|
||||||
|
ScanContract()
|
||||||
|
) { result: ScanIntentResult ->
|
||||||
|
if (result.contents == null) {
|
||||||
|
Toast.makeText(requireContext(), "Cancelled: Unable to scan, Try Again!!", Toast.LENGTH_LONG).show()
|
||||||
|
} else {
|
||||||
|
Log.d(TAG, result.contents)
|
||||||
|
processScannedData(result.contents)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
binding = FragmentRegisterTwoAadhaarBinding.inflate(inflater, container, false)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
binding.btnScanNow.setOnClickListener {
|
||||||
|
startScanningNow()
|
||||||
|
}
|
||||||
|
binding.btnGo.setOnClickListener {
|
||||||
|
val aadhaarId = validateAndReturnId()
|
||||||
|
if (aadhaarId == null) {
|
||||||
|
binding.etAbhaId.error = getString(R.string.please_enter_aadhaar)
|
||||||
|
Toast.makeText(requireContext(), "Invalid ID Entered", Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
viewModel.patientDetails.id = aadhaarId
|
||||||
|
viewModel.patientDetails.isIdABHA = false
|
||||||
|
|
||||||
|
checkForIdThenMove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
binding.etAbhaId.setOnClickListener { binding.etAbhaId.isErrorEnabled = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateAndReturnId(): String? {
|
||||||
|
if (binding.nameEditText.text.isNullOrEmpty() || binding.nameEditText.text?.length != 12){
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return binding.nameEditText.text.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startScanningNow() {
|
||||||
|
val options = ScanOptions()
|
||||||
|
options.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
|
||||||
|
options.setPrompt("Scan a barcode")
|
||||||
|
options.setCameraId(0) // Use a specific camera of the device
|
||||||
|
|
||||||
|
options.setBeepEnabled(true)
|
||||||
|
options.setBarcodeImageEnabled(true)
|
||||||
|
|
||||||
|
options.setPrompt("Start Scanning")
|
||||||
|
options.setOrientationLocked(false)
|
||||||
|
// options.setTimeout(10000) // in ms
|
||||||
|
|
||||||
|
barcodeLauncher.launch(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun processScannedData(scanData: String) {
|
||||||
|
try {
|
||||||
|
val decodedData = SecureQrCode(requireActivity(), scanData)
|
||||||
|
viewModel.aadharCard = decodedData.scannedAadharCard
|
||||||
|
|
||||||
|
Toast.makeText(requireContext(), "Scanned Aadhar Card Successfully", Toast.LENGTH_SHORT).show()
|
||||||
|
Log.d(TAG, viewModel.aadharCard.toString())
|
||||||
|
|
||||||
|
viewModel.mapAadhaarDataToPatient()
|
||||||
|
|
||||||
|
checkForIdThenMove()
|
||||||
|
|
||||||
|
} catch (e: QrCodeException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
Toast.makeText(requireContext(), "Unable to Fetch data, please try again!!", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkForIdThenMove() {
|
||||||
|
Log.d(TAG, "Inside: checkForIdThenMove()")
|
||||||
|
Log.d(TAG, "ID is ${viewModel.patientDetails.id}")
|
||||||
|
|
||||||
|
if (viewModel.patientDetails.id.isNullOrEmpty()){
|
||||||
|
binding.etAbhaId.error = getString(R.string.please_enter_aadhaar)
|
||||||
|
binding.btnScanNow.alpha = 0.2f
|
||||||
|
binding.btnScanNow.isEnabled = false
|
||||||
|
} else {
|
||||||
|
moveToRegisterThree()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToRegisterThree() {
|
||||||
|
findNavController().navigate(R.id.action_registerTwoAadhaarFragment_to_registerThreeEnterPatientDetails)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.ui.gallery
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
|
||||||
|
class GalleryViewModel : ViewModel() {
|
||||||
|
|
||||||
|
private val _text = MutableLiveData<String>().apply {
|
||||||
|
value = "This is gallery Fragment"
|
||||||
|
}
|
||||||
|
val text: LiveData<String> = _text
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.ui.home
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
|
||||||
|
class HomeViewModel : ViewModel() {
|
||||||
|
|
||||||
|
private val _text = MutableLiveData<String>().apply {
|
||||||
|
value = "This is home Fragment"
|
||||||
|
}
|
||||||
|
val text: LiveData<String> = _text
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.hpos.presentation.dashboard.ui.slideshow
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
|
||||||
|
class SlideshowViewModel : ViewModel() {
|
||||||
|
|
||||||
|
private val _text = MutableLiveData<String>().apply {
|
||||||
|
value = "This is slideshow Fragment"
|
||||||
|
}
|
||||||
|
val text: LiveData<String> = _text
|
||||||
|
}
|
||||||
@@ -79,8 +79,13 @@ class TestRightActivity : AppCompatActivity() {
|
|||||||
setSupportActionBar(binding.myToolbar)
|
setSupportActionBar(binding.myToolbar)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
|
|
||||||
|
// TODO Scan: Remove this line
|
||||||
|
// supportFragmentManager.beginTransaction()
|
||||||
|
// .replace(binding.flMain.id, TestRightExpScanner()).commit()
|
||||||
|
|
||||||
setupListener()
|
setupListener()
|
||||||
|
|
||||||
|
// TODO Scan: uncomment this line
|
||||||
connectUsb(false)
|
connectUsb(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,7 +154,7 @@ class TestRightActivity : AppCompatActivity() {
|
|||||||
this,
|
this,
|
||||||
0,
|
0,
|
||||||
Intent(Constants.ACTION_USB_PERMISSION),
|
Intent(Constants.ACTION_USB_PERMISSION),
|
||||||
PendingIntent.FLAG_ONE_SHOT
|
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import com.example.hpos.data.constant.Constants
|
|||||||
import com.example.hpos.data.constant.TestRightCommands
|
import com.example.hpos.data.constant.TestRightCommands
|
||||||
import com.example.hpos.data.model.ErrorMessage
|
import com.example.hpos.data.model.ErrorMessage
|
||||||
import com.example.hpos.data.model.PatientData
|
import com.example.hpos.data.model.PatientData
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
import com.example.hpos.data.model.TestType
|
import com.example.hpos.data.model.test.TestType
|
||||||
import com.example.hpos.databinding.FragmentTestRightExpSampleBinding
|
import com.example.hpos.databinding.FragmentTestRightExpSampleBinding
|
||||||
import com.example.hpos.presentation.UsbServiceListener
|
import com.example.hpos.presentation.UsbServiceListener
|
||||||
import com.example.hpos.presentation.utils.MyDialogListener
|
import com.example.hpos.presentation.utils.MyDialogListener
|
||||||
|
|||||||
@@ -13,11 +13,10 @@ import com.example.hpos.R
|
|||||||
import com.example.hpos.data.DataHolder
|
import com.example.hpos.data.DataHolder
|
||||||
import com.example.hpos.data.PreferenceUtility
|
import com.example.hpos.data.PreferenceUtility
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
import com.example.hpos.data.model.TestType
|
import com.example.hpos.data.model.test.TestType
|
||||||
import com.example.hpos.databinding.FragmentTestRightResultsBinding
|
import com.example.hpos.databinding.FragmentTestRightResultsBinding
|
||||||
import com.example.hpos.presentation.MainActivity
|
import com.example.hpos.presentation.MainActivity
|
||||||
import com.example.hpos.util.MyUtils
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ import android.util.Log
|
|||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import com.example.hpos.data.DataHolder
|
import com.example.hpos.data.DataHolder
|
||||||
import com.example.hpos.data.LocalFileRepository
|
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.*
|
import com.example.hpos.data.model.*
|
||||||
|
import com.example.hpos.data.model.test.TestRightCalculationData
|
||||||
|
import com.example.hpos.data.model.test.TestRightDeviceConstants
|
||||||
import com.example.hpos.domain.*
|
import com.example.hpos.domain.*
|
||||||
import com.example.hpos.util.MyUtils
|
import com.example.hpos.util.MyUtils
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.Collections.sort
|
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.math.log10
|
import kotlin.math.log10
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ package com.example.hpos.util
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import com.example.hpos.R
|
import com.example.hpos.R
|
||||||
|
import com.example.hpos.data.model.patient.PatientDetails
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.InetAddress
|
||||||
|
|
||||||
|
|
||||||
object MyUtils {
|
object MyUtils {
|
||||||
|
|
||||||
@@ -22,4 +25,43 @@ object MyUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isInternetConnected(): Boolean {
|
||||||
|
return try {
|
||||||
|
val ipAddr: InetAddress = InetAddress.getByName("google.com")
|
||||||
|
ipAddr.equals("hpos")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.mapToGender(): PatientDetails.Gender {
|
||||||
|
return if (this.lowercase() == "m"|| this.lowercase() == "male") {
|
||||||
|
PatientDetails.Gender.MALE
|
||||||
|
} else if (this.lowercase() == "f"|| this.lowercase() == "female") {
|
||||||
|
PatientDetails.Gender.FEMALE
|
||||||
|
} else {
|
||||||
|
PatientDetails.Gender.OTHER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.mapToCategory(): PatientDetails.Category {
|
||||||
|
return when (this.lowercase()){
|
||||||
|
"gen" -> PatientDetails.Category.GENERAL
|
||||||
|
"general" -> PatientDetails.Category.GENERAL
|
||||||
|
"obc" -> PatientDetails.Category.OBC
|
||||||
|
"sc" -> PatientDetails.Category.SC
|
||||||
|
"st" -> PatientDetails.Category.ST
|
||||||
|
else -> {PatientDetails.Category.GENERAL}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.fetchYOBFromDOB(): Int {
|
||||||
|
val startIndex = if (this.length >= 4) this.length - 4 else 0
|
||||||
|
return this.substring(startIndex).toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.mapYesNoStringToBool(): Boolean {
|
||||||
|
return this.lowercase() == "yes"
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ import com.example.hpos.data.datasource.LocalFileDataSource
|
|||||||
import com.example.hpos.domain.SaveRawData
|
import com.example.hpos.domain.SaveRawData
|
||||||
import com.example.hpos.domain.SaveRawDataTest
|
import com.example.hpos.domain.SaveRawDataTest
|
||||||
import com.example.hpos.presentation.MainViewModel
|
import com.example.hpos.presentation.MainViewModel
|
||||||
|
import com.example.hpos.presentation.dashboard.DashboardViewModel
|
||||||
import com.example.hpos.presentation.testRight.TestRightViewModel
|
import com.example.hpos.presentation.testRight.TestRightViewModel
|
||||||
|
|
||||||
class MyViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
|
class MyViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
|
||||||
@@ -18,8 +19,10 @@ class MyViewModelFactory(private val context: Context) : ViewModelProvider.Facto
|
|||||||
else if (modelClass.isAssignableFrom(TestRightViewModel::class.java)) {
|
else if (modelClass.isAssignableFrom(TestRightViewModel::class.java)) {
|
||||||
val repository = LocalFileRepository(LocalFileDataSource())
|
val repository = LocalFileRepository(LocalFileDataSource())
|
||||||
return TestRightViewModel(SaveRawData(repository), SaveRawDataTest(repository)) as T
|
return TestRightViewModel(SaveRawData(repository), SaveRawDataTest(repository)) as T
|
||||||
}
|
} else if (modelClass.isAssignableFrom(DashboardViewModel::class.java)) {
|
||||||
else
|
// val repository = LocalFileRepository(LocalFileDataSource())
|
||||||
|
return DashboardViewModel() as T
|
||||||
|
} else
|
||||||
throw IllegalArgumentException("Unknown ViewModel class");
|
throw IllegalArgumentException("Unknown ViewModel class");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
5
app/src/main/res/drawable/baseline_home_24.xml
Normal file
5
app/src/main/res/drawable/baseline_home_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#005DB3" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
|
||||||
|
</vector>
|
||||||
5
app/src/main/res/drawable/baseline_person_24.xml
Normal file
5
app/src/main/res/drawable/baseline_person_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#005DB3" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
|
||||||
|
</vector>
|
||||||
5
app/src/main/res/drawable/baseline_settings_24.xml
Normal file
5
app/src/main/res/drawable/baseline_settings_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#005DB3" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
|
||||||
|
</vector>
|
||||||
12
app/src/main/res/drawable/ic_menu_camera.xml
Normal file
12
app/src/main/res/drawable/ic_menu_camera.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M9,2L7.17,4H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2H9zm3,15c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" />
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/side_nav_bar.xml
Normal file
9
app/src/main/res/drawable/side_nav_bar.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="135"
|
||||||
|
android:centerColor="#009688"
|
||||||
|
android:endColor="#00695C"
|
||||||
|
android:startColor="#4DB6AC"
|
||||||
|
android:type="linear" />
|
||||||
|
</shape>
|
||||||
26
app/src/main/res/layout/activity_dashboard.xml
Normal file
26
app/src/main/res/layout/activity_dashboard.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/drawer_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
tools:openDrawer="start">
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/app_bar_dashboard"
|
||||||
|
layout="@layout/app_bar_dashboard"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.navigation.NavigationView
|
||||||
|
android:id="@+id/nav_view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="start"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
app:headerLayout="@layout/nav_header_dashboard"
|
||||||
|
app:menu="@menu/activity_main_drawer" />
|
||||||
|
|
||||||
|
</androidx.drawerlayout.widget.DrawerLayout>
|
||||||
34
app/src/main/res/layout/app_bar_dashboard.xml
Normal file
34
app/src/main/res/layout/app_bar_dashboard.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".presentation.dashboard.DashboardActivity">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/Theme.HPOS.AppBarOverlay">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
app:popupTheme="@style/Theme.HPOS.PopupOverlay" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<include layout="@layout/content_dashboard" />
|
||||||
|
|
||||||
|
<!-- <com.google.android.material.floatingactionbutton.FloatingActionButton-->
|
||||||
|
<!-- android:id="@+id/fab"-->
|
||||||
|
<!-- android:layout_width="wrap_content"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:layout_gravity="bottom|end"-->
|
||||||
|
<!-- android:layout_marginEnd="@dimen/fab_margin"-->
|
||||||
|
<!-- android:layout_marginBottom="16dp"-->
|
||||||
|
<!-- app:srcCompat="@android:drawable/ic_dialog_email" />-->
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
20
app/src/main/res/layout/content_dashboard.xml
Normal file
20
app/src/main/res/layout/content_dashboard.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
tools:showIn="@layout/app_bar_dashboard">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/nav_host_fragment_content_dashboard"
|
||||||
|
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:defaultNavHost="true"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:navGraph="@navigation/dashboard_navigation" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
22
app/src/main/res/layout/fragment_gallery.xml
Normal file
22
app/src/main/res/layout/fragment_gallery.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".presentation.dashboard.GalleryFragment">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_gallery"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:textSize="20sp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
tools:context=".presentation.DashboardFragment">
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -37,18 +36,19 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_margin="16dp"
|
android:layout_margin="16dp"
|
||||||
app:layout_constraintBottom_toTopOf="@id/btn_go"
|
app:layout_constraintBottom_toTopOf="@id/btn_add"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_title"
|
app:layout_constraintTop_toBottomOf="@id/tv_title"
|
||||||
tools:listitem="@layout/table_item" />
|
tools:listitem="@layout/table_item" />
|
||||||
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/btn_go"
|
android:id="@+id/btn_add"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="24dp"
|
android:layout_margin="24dp"
|
||||||
android:drawableLeft="@drawable/baseline_add_24"
|
android:drawableLeft="@drawable/baseline_add_24"
|
||||||
android:text="@string/add"
|
android:text="@string/add"
|
||||||
|
android:textColor="@color/white"
|
||||||
app:cornerRadius="16dp"
|
app:cornerRadius="16dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
@@ -60,6 +60,7 @@
|
|||||||
android:layout_margin="24dp"
|
android:layout_margin="24dp"
|
||||||
android:drawableLeft="@drawable/test_tube"
|
android:drawableLeft="@drawable/test_tube"
|
||||||
android:text="@string/test"
|
android:text="@string/test"
|
||||||
|
android:textColor="@color/white"
|
||||||
app:cornerRadius="16dp"
|
app:cornerRadius="16dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent" />
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
tools:context=".presentation.dashboard.register.RegisterOneCreateAbha">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/create_abha_id_card"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title2"
|
||||||
|
style="@style/title1_2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/please_use_official_abha_app_to_create_abha_id_and_come_back"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/tv_title" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_redirect"
|
||||||
|
android:layout_width="258dp"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_margin="24dp"
|
||||||
|
android:text="@string/official_abha_app"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
app:backgroundTint="@color/blue_app_light"
|
||||||
|
app:cornerRadius="100dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/tv_title2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_skip"
|
||||||
|
style="@style/title1_2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="36dp"
|
||||||
|
android:text="Skip ABHA ID Creation"
|
||||||
|
android:textColor="@color/blue_app_dark"
|
||||||
|
android:textStyle="italic"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/btn_redirect" />
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
</layout>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
tools:context=".presentation.RegisterOneScanAbhaFragment">
|
tools:context=".presentation.dashboard.register.RegisterOneScanAbhaFragment">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -21,9 +21,10 @@
|
|||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/btn_scan_now"
|
android:id="@+id/btn_scan_now"
|
||||||
android:layout_width="298dp"
|
android:layout_width="258dp"
|
||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_margin="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
android:drawableLeft="@drawable/baseline_qr_code_scanner_24"
|
android:drawableLeft="@drawable/baseline_qr_code_scanner_24"
|
||||||
android:text="@string/scan_now"
|
android:text="@string/scan_now"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
@@ -90,7 +91,7 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="24dp"
|
android:layout_marginStart="24dp"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_marginTop="16dp"
|
||||||
app:layout_constraintEnd_toStartOf="@id/btn_go"
|
app:layout_constraintEnd_toStartOf="@id/btn_go"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_title2">
|
app:layout_constraintTop_toBottomOf="@id/tv_title2">
|
||||||
@@ -99,7 +100,9 @@
|
|||||||
android:id="@+id/name_edit_text"
|
android:id="@+id/name_edit_text"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/abha_id" />
|
android:hint="@string/abha_id"
|
||||||
|
android:maxLength="14"
|
||||||
|
android:inputType="number" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
@@ -121,7 +124,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_marginHorizontal="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
android:layout_marginTop="58dp"
|
android:layout_marginTop="48dp"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/et_abha_id">
|
app:layout_constraintTop_toBottomOf="@id/et_abha_id">
|
||||||
|
|
||||||
@@ -160,15 +163,16 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
android:layout_marginTop="48dp"
|
android:layout_marginTop="48dp"
|
||||||
android:text="@string/enter_abha_number_manualy"
|
android:text="Create ABHA ID card"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/seperator2" />
|
app:layout_constraintTop_toBottomOf="@id/seperator2" />
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/btn_click_here"
|
android:id="@+id/btn_click_here"
|
||||||
android:layout_width="298dp"
|
android:layout_width="258dp"
|
||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_margin="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
android:text="@string/click_here"
|
android:text="@string/click_here"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
app:backgroundTint="@color/blue_app_light"
|
app:backgroundTint="@color/blue_app_light"
|
||||||
|
|||||||
@@ -0,0 +1,364 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
tools:context=".presentation.dashboard.register.RegisterOneScanAbhaFragment">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/enter_patient_details"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_name"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_name"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/patient_name" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_yob"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_name">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_yob"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/year_of_birth"
|
||||||
|
android:inputType="number"
|
||||||
|
android:maxLength="4" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_gender"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_yob">
|
||||||
|
|
||||||
|
<AutoCompleteTextView
|
||||||
|
android:id="@+id/et_gender_block"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/gender"
|
||||||
|
android:inputType="none"
|
||||||
|
android:labelFor="@id/til_gender"
|
||||||
|
app:simpleItems="@array/gender" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_mobile"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_gender">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_mobile"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="Mobile Number"
|
||||||
|
android:inputType="number" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_careof"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_mobile">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_careof"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/father_s_name_husband_s_name" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_is_married"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_careof">
|
||||||
|
|
||||||
|
<AutoCompleteTextView
|
||||||
|
android:id="@+id/et_is_married"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/is_patient_married_yes_no"
|
||||||
|
android:inputType="none"
|
||||||
|
android:labelFor="@id/til_is_married"
|
||||||
|
app:simpleItems="@array/yes_no" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_category"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_is_married">
|
||||||
|
|
||||||
|
<AutoCompleteTextView
|
||||||
|
android:id="@+id/et_category"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/category"
|
||||||
|
android:inputType="none"
|
||||||
|
android:labelFor="@id/til_category"
|
||||||
|
app:simpleItems="@array/category" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title2"
|
||||||
|
style="@style/title1_2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="30dp"
|
||||||
|
android:text="@string/patient_address_details"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_category" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_house"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title2">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_house"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="House" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_city"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_house">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_city"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/city_town" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_district"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_city">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_district"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/district" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_state"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_district">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_state"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/state" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_pincode"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_state">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/et_pincode"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:inputType="number"
|
||||||
|
android:maxLength="6"
|
||||||
|
android:hint="@string/pincode" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title3"
|
||||||
|
style="@style/title1_2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="30dp"
|
||||||
|
android:text="@string/patient_medical_records"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_pincode" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_blood_group"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title3">
|
||||||
|
|
||||||
|
<AutoCompleteTextView
|
||||||
|
android:id="@+id/et_blood_group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/blood_group"
|
||||||
|
android:inputType="none"
|
||||||
|
android:labelFor="@id/til_blood_group"
|
||||||
|
app:simpleItems="@array/blood_group" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
|
android:id="@+id/cb_item1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/is_patient_under_any_medication"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_blood_group" />
|
||||||
|
|
||||||
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
|
android:id="@+id/cb_item2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@string/is_patient_undergoing_any_blood_transfusion"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/cb_item1" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_seperator"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginVertical="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/threedots"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/cb_item2" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_submit"
|
||||||
|
android:layout_width="258dp"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_margin="24dp"
|
||||||
|
android:text="@string/submit"
|
||||||
|
app:cornerRadius="100dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/tv_seperator" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</layout>
|
||||||
123
app/src/main/res/layout/fragment_register_two_aadhaar.xml
Normal file
123
app/src/main/res/layout/fragment_register_two_aadhaar.xml
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
tools:context=".presentation.dashboard.register.RegisterTwoAadhaarFragment">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/scan_patient_aadhaar_card"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_scan_now"
|
||||||
|
android:layout_width="258dp"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_margin="24dp"
|
||||||
|
android:drawableLeft="@drawable/baseline_qr_code_scanner_24"
|
||||||
|
android:text="@string/scan_now"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
app:backgroundTint="@color/blue_app_light"
|
||||||
|
app:cornerRadius="100dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/tv_title" />
|
||||||
|
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/seperator1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="48dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/btn_scan_now">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvText1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:text="@string/or"
|
||||||
|
android:textColor="@color/gray" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_toLeftOf="@id/tvText1"
|
||||||
|
android:background="@color/gray" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_toRightOf="@id/tvText1"
|
||||||
|
android:background="@color/gray" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title2"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="48dp"
|
||||||
|
android:text="@string/enter_aadhaar_number_manualy"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/seperator1" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/et_abha_id"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/btn_go"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title2">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/name_edit_text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxLength="12"
|
||||||
|
android:inputType="number"
|
||||||
|
android:hint="@string/aadhaar_number" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_go"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="24dp"
|
||||||
|
android:text="@string/go"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/et_abha_id"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="1.0"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/et_abha_id"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/et_abha_id" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
</layout>
|
||||||
22
app/src/main/res/layout/fragment_slideshow.xml
Normal file
22
app/src/main/res/layout/fragment_slideshow.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".presentation.dashboard.SlideshowFragment">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_slideshow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:textSize="20sp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
35
app/src/main/res/layout/nav_header_dashboard.xml
Normal file
35
app/src/main/res/layout/nav_header_dashboard.xml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/nav_header_height"
|
||||||
|
android:background="@drawable/side_nav_bar"
|
||||||
|
android:gravity="bottom"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:theme="@style/ThemeOverlay.AppCompat.Dark">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:contentDescription="@string/nav_header_desc"
|
||||||
|
android:paddingTop="@dimen/nav_header_vertical_spacing"
|
||||||
|
app:srcCompat="@mipmap/ic_launcher_round" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="@dimen/nav_header_vertical_spacing"
|
||||||
|
android:text="@string/nav_header_title"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/nav_header_subtitle" />
|
||||||
|
</LinearLayout>
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
20
app/src/main/res/menu/activity_main_drawer.xml
Normal file
20
app/src/main/res/menu/activity_main_drawer.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
tools:showIn="navigation_view">
|
||||||
|
|
||||||
|
<group android:checkableBehavior="single">
|
||||||
|
<item
|
||||||
|
android:id="@+id/nav_home"
|
||||||
|
android:icon="@drawable/ic_baseline_home_24"
|
||||||
|
android:title="@string/menu_home" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/nav_profile"
|
||||||
|
android:icon="@drawable/baseline_person_24"
|
||||||
|
android:title="@string/profile" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/nav_settings"
|
||||||
|
android:icon="@drawable/baseline_settings_24"
|
||||||
|
android:title="@string/menu_slideshow" />
|
||||||
|
</group>
|
||||||
|
</menu>
|
||||||
10
app/src/main/res/menu/dashboard.xml
Normal file
10
app/src/main/res/menu/dashboard.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:title="@string/action_settings"
|
||||||
|
android:visible="false"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
77
app/src/main/res/navigation/dashboard_navigation.xml
Normal file
77
app/src/main/res/navigation/dashboard_navigation.xml
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/mobile_navigation"
|
||||||
|
app:startDestination="@+id/nav_home">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/nav_home"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.HomeFragment"
|
||||||
|
android:label="@string/menu_home"
|
||||||
|
tools:layout="@layout/fragment_home" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_nav_home_to_registerOneScanAbhaFragment"
|
||||||
|
app:destination="@id/registerOneScanAbhaFragment" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_nav_home_to_mainActivity"
|
||||||
|
app:destination="@id/mainActivity" />
|
||||||
|
</fragment>
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/nav_profile"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.GalleryFragment"
|
||||||
|
android:label="@string/menu_gallery"
|
||||||
|
tools:layout="@layout/fragment_gallery" />
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/nav_settings"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.SlideshowFragment"
|
||||||
|
android:label="@string/menu_slideshow"
|
||||||
|
tools:layout="@layout/fragment_slideshow" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/registerOneScanAbhaFragment"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.register.RegisterOneScanAbhaFragment"
|
||||||
|
android:label="Registration (1/3)"
|
||||||
|
tools:layout="@layout/fragment_register_one_scan_abha" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerOneScanAbhaFragment_to_registerThreeEnterPatientDetails"
|
||||||
|
app:destination="@id/registerThreeEnterPatientDetails" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerOneScanAbhaFragment_to_registerOneCreateAbha"
|
||||||
|
app:destination="@id/registerOneCreateAbha" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerOneScanAbhaFragment_to_registerTwoAadhaarFragment"
|
||||||
|
app:destination="@id/registerTwoAadhaarFragment" />
|
||||||
|
</fragment>
|
||||||
|
<activity
|
||||||
|
android:id="@+id/mainActivity"
|
||||||
|
android:name="com.example.hpos.presentation.MainActivity"
|
||||||
|
android:label="MainActivity" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/registerThreeEnterPatientDetails"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.register.RegisterThreeEnterPatientDetails"
|
||||||
|
android:label="Registration (3/3)" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerThreeEnterPatientDetails_to_mainActivity"
|
||||||
|
app:destination="@id/mainActivity" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/registerOneCreateAbha"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.register.RegisterOneCreateAbha"
|
||||||
|
android:label="Registration (1/3)"
|
||||||
|
tools:layout="@layout/fragment_register_one_create_abha" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerOneCreateAbha_to_registerTwoAadhaarFragment"
|
||||||
|
app:destination="@id/registerTwoAadhaarFragment" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/registerTwoAadhaarFragment"
|
||||||
|
android:name="com.example.hpos.presentation.dashboard.register.RegisterTwoAadhaarFragment"
|
||||||
|
android:label="Registration (2/3)"
|
||||||
|
tools:layout="@layout/fragment_register_two_aadhaar" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_registerTwoAadhaarFragment_to_registerThreeEnterPatientDetails"
|
||||||
|
app:destination="@id/registerThreeEnterPatientDetails" />
|
||||||
|
</fragment>
|
||||||
|
</navigation>
|
||||||
3
app/src/main/res/values-land/dimens.xml
Normal file
3
app/src/main/res/values-land/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">200dp</dimen>
|
||||||
|
</resources>
|
||||||
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
8
app/src/main/res/values/dimens.xml
Normal file
8
app/src/main/res/values/dimens.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
<dimen name="nav_header_vertical_spacing">8dp</dimen>
|
||||||
|
<dimen name="nav_header_height">176dp</dimen>
|
||||||
|
<dimen name="fab_margin">16dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -12,6 +12,29 @@
|
|||||||
<item>Other</item>
|
<item>Other</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="yes_no">
|
||||||
|
<item>Yes</item>
|
||||||
|
<item>No</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="category">
|
||||||
|
<item>GEN</item>
|
||||||
|
<item>OBC</item>
|
||||||
|
<item>SC</item>
|
||||||
|
<item>ST</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="blood_group">
|
||||||
|
<item>O+ve</item>
|
||||||
|
<item>O-ve</item>
|
||||||
|
<item>A+ve</item>
|
||||||
|
<item>A-ve</item>
|
||||||
|
<item>B+ve</item>
|
||||||
|
<item>B-ve</item>
|
||||||
|
<item>AB+ve</item>
|
||||||
|
<item>AB-ve</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string name="hello_blank_fragment">Hello blank fragment</string>
|
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||||
<string name="select_the_test">Select the Test</string>
|
<string name="select_the_test">Select the Test</string>
|
||||||
<string name="set_reference">Set Reference</string>
|
<string name="set_reference">Set Reference</string>
|
||||||
@@ -53,6 +76,11 @@
|
|||||||
<string name="gender_error">Gender can\'t be empty</string>
|
<string name="gender_error">Gender can\'t be empty</string>
|
||||||
<string name="age_error_out_of_bound">Age should be valid</string>
|
<string name="age_error_out_of_bound">Age should be valid</string>
|
||||||
|
|
||||||
|
<string name="yob_error">Year of birth can\'t be empty</string>
|
||||||
|
<string name="mobile_error">Mobile Number can\'t be empty</string>
|
||||||
|
<string name="this_error">This can\'t be empty</string>
|
||||||
|
<!-- <string name="this_error">This can\'t be empty</string>-->
|
||||||
|
|
||||||
<string name="test_results">Test Results</string>
|
<string name="test_results">Test Results</string>
|
||||||
<string name="name_in_textview"><b>Name</b> : %1$s</string>
|
<string name="name_in_textview"><b>Name</b> : %1$s</string>
|
||||||
<string name="gender_in_textview"><b>Gender</b> : %1$s</string>
|
<string name="gender_in_textview"><b>Gender</b> : %1$s</string>
|
||||||
@@ -99,5 +127,36 @@
|
|||||||
<string name="abha_id">ABHA ID</string>
|
<string name="abha_id">ABHA ID</string>
|
||||||
<string name="go">GO</string>
|
<string name="go">GO</string>
|
||||||
<string name="click_here">Click Here</string>
|
<string name="click_here">Click Here</string>
|
||||||
|
<string name="title_activity_dashboard">DashboardActivity</string>
|
||||||
|
<string name="navigation_drawer_open">Open navigation drawer</string>
|
||||||
|
<string name="navigation_drawer_close">Close navigation drawer</string>
|
||||||
|
<string name="nav_header_title">Android Studio</string>
|
||||||
|
<string name="nav_header_subtitle">android.studio@android.com</string>
|
||||||
|
<string name="nav_header_desc">Navigation header</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
|
||||||
|
<string name="menu_home">Home</string>
|
||||||
|
<string name="menu_gallery">Gallery</string>
|
||||||
|
<string name="menu_slideshow">Slideshow</string>
|
||||||
|
<string name="profile">Profile</string>
|
||||||
|
<string name="year_of_birth">Year of Birth</string>
|
||||||
|
<string name="father_s_name_husband_s_name">Father\'s Name / Husband\'s Name</string>
|
||||||
|
<string name="is_patient_married_yes_no">Is Patient Married? (Yes/No)</string>
|
||||||
|
<string name="category">Category</string>
|
||||||
|
<string name="blood_group">Blood Group</string>
|
||||||
|
<string name="patient_medical_records">Patient Medical Records</string>
|
||||||
|
<string name="patient_address_details">Patient Address Details</string>
|
||||||
|
<string name="district">District</string>
|
||||||
|
<string name="city_town">City / Town</string>
|
||||||
|
<string name="state">State</string>
|
||||||
|
<string name="pincode">Pincode</string>
|
||||||
|
<string name="threedots">...</string>
|
||||||
|
<string name="create_abha_id_card">Create ABHA ID Card</string>
|
||||||
|
<string name="official_abha_app">Official ABHA App</string>
|
||||||
|
<string name="scan_patient_aadhaar_card">Scan Patient Aadhaar Card</string>
|
||||||
|
<string name="enter_aadhaar_number_manualy">Enter Aadhaar number manualy</string>
|
||||||
|
<string name="aadhaar_number">Aadhaar Number</string>
|
||||||
|
<string name="please_use_official_abha_app_to_create_abha_id_and_come_back">Please use “Official ABHA App" to create ABHA ID, and come back.</string>
|
||||||
|
<string name="please_enter_aadhaar">Please Enter Aadhaar Number to continue</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.HPOS" parent="Theme.MaterialComponents.Light.NoActionBar">
|
<style name="Theme.HPOS" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||||
<!-- <style name="Theme.RefactoredApp" parent="Theme.MaterialComponents.Light.DarkActionBar">-->
|
<!-- <style name="Theme.RefactoredApp" parent="Theme.MaterialComponents.Light.DarkActionBar">-->
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/blue_app</item>
|
<item name="colorPrimary">@color/blue_app</item>
|
||||||
<!-- <item name="colorPrimaryVariant">@color/purple_700</item>-->
|
<!-- <item name="colorPrimaryVariant">@color/purple_700</item>-->
|
||||||
<item name="colorPrimaryVariant">@color/blue_app_dark</item>
|
<item name="colorPrimaryVariant">@color/blue_app_dark</item>
|
||||||
<item name="colorOnPrimary">@color/white</item>
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
@@ -31,4 +31,13 @@
|
|||||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.HPOS.NoActionBar">
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.HPOS.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
|
||||||
|
|
||||||
|
<style name="Theme.HPOS.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
|
||||||
</resources>
|
</resources>
|
||||||
@@ -3,7 +3,7 @@ package com.example.hpos
|
|||||||
import com.example.hpos.data.DataHolder
|
import com.example.hpos.data.DataHolder
|
||||||
import com.example.hpos.data.constant.Constants
|
import com.example.hpos.data.constant.Constants
|
||||||
import com.example.hpos.data.model.PatientData
|
import com.example.hpos.data.model.PatientData
|
||||||
import com.example.hpos.data.model.TestRightResultType
|
import com.example.hpos.data.model.test.TestRightResultType
|
||||||
import com.example.hpos.presentation.testRight.TestRightViewModel
|
import com.example.hpos.presentation.testRight.TestRightViewModel
|
||||||
import junit.framework.Assert.assertEquals
|
import junit.framework.Assert.assertEquals
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|||||||
Reference in New Issue
Block a user