Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
cb26b34
added technical desgin document for handle
Mar 24, 2025
5b4b2ec
Updated README.md file
Mar 25, 2025
8a0d6c6
Merge branch 'develop' of https://github.com/SachinPremkumar/android-…
Jul 8, 2025
3dba72f
multiple click continue button navigate to diff screen
Jul 18, 2025
ed96db4
RCF-1176 (#547)
jayesh12234 Jul 18, 2025
b1cf112
Merge pull request #548 from SachinPremkumar/RCF-1168
ckm007 Jul 21, 2025
3056af1
Updated UI automation testscripts (#563)
Famuda1234 Aug 17, 2025
80a4e36
removed hardcoded label (#551)
Rakshithasai123 Aug 22, 2025
7579e31
RCF-1167 Removed download json btn for machine details (#546)
MadhuMosip Aug 23, 2025
f9071d5
Rcf 1135 (#555)
Rakshithasai123 Aug 25, 2025
d19529a
fixed the overflow text (#558)
Rakshithasai123 Aug 25, 2025
cb95c19
fixed date picker (#553)
Rakshithasai123 Aug 25, 2025
f2b3202
RCF-887 While Onboarding/Updating operator details, Supervisor's Biom…
Rakshithasai123 Aug 28, 2025
bfddf89
pending approval dropdown, app upload, expand buttons, onboarding pac…
Rakshithasai123 Aug 28, 2025
f4da6a1
RCF-471 RCF-472 Android Reg Client in Landscape mode Tablet and phon…
Rakshithasai123 Aug 28, 2025
c41b7ed
RCF-784 implemented auto logout feature if the device is idle (#544)
MadhuMosip Aug 29, 2025
d77348b
RCF-40 added setting spec logic (#559)
SachinPremkumar Aug 29, 2025
9fc83ec
UI Chnages (#572)
Rakshithasai123 Aug 29, 2025
328106d
added review_status in other languages (#571)
Rakshithasai123 Aug 29, 2025
8e193bb
fixed the issue When navigating from preview to Document upload, POI …
Rakshithasai123 Sep 25, 2025
e54a443
fixed the fetch invalid application id from pre-reg,the page is not r…
Rakshithasai123 Sep 25, 2025
a2cfa5a
Fixed quality % in red color, if the threshold is not crossed instead…
Rakshithasai123 Sep 29, 2025
abc887a
fixed the issue removed the next arrow button when user is in last pa…
Rakshithasai123 Sep 29, 2025
d688d3e
The Attempt button should turn green and the captured biometrics sho…
Rakshithasai123 Sep 29, 2025
84d6a0d
RCF-916- added preg reg creation flow in Arc automation (#580)
jayesh12234 Sep 29, 2025
26bc965
RCF-92 : Global Config Settings Implementation (#582)
SachinPremkumar Oct 7, 2025
196ffda
RCF-93 Device settings (#573)
SachinPremkumar Oct 7, 2025
c13d0b8
update vulnerable libraries (#592)
Rakshithasai123 Oct 26, 2025
74a50d8
Size of uploaded document should mention in upload document screen (#…
Rakshithasai123 Oct 26, 2025
4e4212e
improper and vulnerable use of log4j (#591)
Rakshithasai123 Oct 27, 2025
81673dd
RCF-502 Created biometric correction feature (#564)
MadhuMosip Oct 27, 2025
c3b64d1
Resolved application id issue in approval page (#598)
MadhuMosip Oct 30, 2025
e47c2ad
RCF-1185 : Implemented GPS feature (#593)
SachinPremkumar Oct 30, 2025
387135f
RCF-1224: for operator role not able to login getting some error (#595)
SachinPremkumar Oct 30, 2025
e141f48
Using setAccessible(true) issue (#594)
Rakshithasai123 Oct 30, 2025
badca22
operator permission is not mandated (#596)
Rakshithasai123 Oct 31, 2025
3a7ef49
Implemented scheduled jobs in the settings page (#586)
MadhuMosip Oct 31, 2025
dd2a0ab
fixed build failure issue (#599)
SachinPremkumar Oct 31, 2025
ec12474
fixed build failure issue (#600)
SachinPremkumar Oct 31, 2025
e12a8dd
RCF-571: verify and save button twice to get onboard (#601)
SachinPremkumar Nov 7, 2025
a01fc5b
RCF-1266 resolved schoduled jobs alignment issues (#608)
MadhuMosip Nov 7, 2025
a4312f3
Fixed-In the global config settings page the Global Config settings h…
Rakshithasai123 Nov 7, 2025
8caa7ff
Instead of submit, better to have log as Authenticat at pending appro…
Rakshithasai123 Nov 7, 2025
7ed2205
RCF-1177: pdf box security bug (#610)
SachinPremkumar Nov 7, 2025
b77ee5f
RCF-1260: Authenticate button not clickable (#603)
SachinPremkumar Nov 7, 2025
b6f4a3f
RCF-1271 : DB migration logic and bug fix (#614)
SachinPremkumar Nov 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 112 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,113 @@
# android-registration-client
Reference Android Registration Client Software - WIP

# Use of Java Packages:
1. Added all the java packages in android directory of the project: <package-name>
2. Add implementation in settings.gradle file of the project:
Eg: include(:<package-name>)
3. Set the server base url in android/build.gradle file.
4. Add implementation for packages in android/app/build.gradle files inside dependency block as:
implementation project(:<package-name>)

# Creation of Services in the project's java package.
1. Added all the required functions by creating individual services for each functionality.
2. Using AppComponent interface which inherits Dagger for dependecny injection.
3. Dependency injection performed in MainActivity.java file by calling inject() method.

# Creation of MethodChannels in dart classes.
1. Create MethodChannel with a constant string name in a dart class and try to invoke a method
provided by this channel.
2. This invoke method will take the function name and arguments which will be sent to native side
for getting a response.
3. The function name in invoke method and on native side should be the same as:
methodChannel.invokeMethod("fetchDetails");
4. On native side, in MainActivity file, inside MethodChennel() use a switch case to check for method name
call.method argument which checks "fetchDetails" case. On matching, it implements "fetchDetails" method.
case "fetchDetails:
Service().fetchDetails(result);
break;

# Fetch Machine Details
1. Method channel on Credential Page invokes "getMachineDetails" method and gets a response from
native side as a string.
2. Then this string can be decoded into a Map<String, dynamic> and the details can be displayed
on a page.
3. It also contains functionality to copy the details and save a file containing details in internal storage.

# Perform Online Login
1. First create a machine with given machine details in admin portal.
2. Try to login by providing correct userId and password.
3. After pressing login button, "login" method will be invoked from method channel.
3. If user is able to login with given credentials, perform master data sync by pressing the sync data button.
4. After that based on the roles of the user which is logged in, he will be prompted to a either home page or onboarding page.

# Performing Offline Login
1. After performing online login and master data sync, a hashed value of the password will be saved in the db.
2. So if the user provides offline login, then the hashed value for password will be checked and matched with the entered password value.
3. If the value matches, then the user is able to perform offline login, else screen will display required error messages.

The Android Registration Client is a tablet application that serves as a portable version of the existing desktop Registration Client. It has been developed to support accessibility on all Android devices. The creation of the Android Registration Client was driven by the need to meet the mobility requirements of countries adopting MOSIP.

# Developer Guide

The documentation here will guide you through the pre-requisites and the other necessary details required for Android Registration Client developer setup.

The android-registration-client repository contains the Android Registration Client software for MOSIP. The feature-flutter branch focuses on integrating Flutter into the client.

## Setup

To set up the Android Registration Client with Flutter and Android Studio, follow the steps below:

#### Prerequisites

* Flutter SDK (3.10.4): Install Flutter by following the official [Flutter installation guide](https://flutter.dev/docs/get-started/install).
* Android Studio (or Any IDE of your choice): Download and install Android Studio from the official [Android Studio website](https://developer.android.com/studio).

#### Step 1: Clone the Repository

The `develop` branch of android-reg-client is currently being actively developed. If you wish to access this branch, you can clone the repository by executing the following command in your terminal. Alternatively, you can download one of the releases available in the repository's release section.

```
git clone -b feature-flutter https://github.com/mosip/android-registration-client.git
```

**Active Branches**:

* [release-0.11.x](https://github.com/mosip/android-registration-client/tree/release-0.11.x)(developer release branch)
* [develop](https://github.com/mosip/android-registration-client/tree/develop)(active development branch)

#### Step 2: Set up Flutter in Android Studio

1. To begin, launch Android Studio.
2. Next, select **Open an existing Android Studio project** and navigate to the cloned repository.
3. Open the `android-registration-client` directory as a project in Android Studio.
4. In order to integrate Flutter with Android Studio, install the Flutter plugin by accessing `File > Settings > Plugins` and searching for **Flutter**. Proceed to click on **Install** to install the plugin.
5. To ensure proper functionality, configure the Flutter SDK path by navigating to `File > Settings > Languages & Frameworks > Flutter` and specifying the Flutter SDK path as the location where you have installed Flutter.
6. Finally, save the changes by clicking on the "Apply" button.

**Customizing the Registration Client**

* Styling of the application can be configured by modifying these files `lib/utils/app_style.dart, lib/utils/app_config.dart`
* Application language bundles can be added to this path `lib/l10n` After adding the bundle run the below command to generate Localization data (Required for the first time).

```
flutter gen-l10n
```

* The label and application logo can be changed here android/app/src/main/AndroidManifest.xml

#### Step 3: Build and Run the Application

* The `pigeon.sh` file consists of the necessary commands for downloading dependencies and generating Flutter - Android native communication code. Please execute the `pigeon.sh` file or execute the commands within the file separately.
* Ensure you have connected an Android device or initiated an Android emulator.
* Open the terminal within Android Studio or use an external terminal.
* Navigate to the `android-registration-client` directory.
* Run the following command to build and execute the application:

```
flutter run
```

#### Step 4: Build, debug, and release APK

Execute the commands below to debug and release the APK

```
// Debug APK
flutter build apk --debug

// Release APK
flutter build apk --release
```

### Set up Mock MDS for Biometric Scan

The Mock MDS tool can be utilized to simulate the functionalities of biometric devices. The Mock MDS application is compliant with CTK standards and can serve as a substitute for Android SBI modules during testing and validation.

1. Install the Mock MDS application.
2. Access the **Settings** menu.
3. Under Device Configuration, choose **Registration** from the dropdown menu.
4. In P12 Configuration:
* Enter the necessary credentials for the Device Key and upload the Device P12 file.
* Enter the required credentials for the FTM Key and upload the FTM P12 file.
* Complete all fields in MOSIP IDA Configuration.
5. In Modality Configuration, specify the quality score for Face, Finger, and Iris scans(these values can also be adjusted during testing).
6. Click on the **Save** button.
7. Go back to the Home Page and select `LOAD AND VALIDATE CERTIFICATES`.

A toast message will be displayed indicating the success of the validation process.

**Note**: To view the released version of the Mock SBI APK, click [here](https://github.com/mosip/android-camera-mds/releases/tag/vDP1).

To download the Mock SBI APK, click on `camera-mds.zip`.

### Contributions

If you would like to contribute to the Android Registration Client, please follow the guidelines outlined [here](https://docs.mosip.io/1.2.0/community/code-contributions).

### License

The Android Registration Client is licensed under the [MIT License](https://github.com/mosip/android-registration-client/blob/develop/LICENSE).

### Support

If you encounter any issues or have any questions, please open an issue on the [GitHub repository](https://github.com/mosip/android-registration-client/issues).

### Sources

* [Flutter- Get started: Install](https://flutter.dev/docs/get-started/install)
* [Android Studio- Download](https://developer.android.com/studio)
17 changes: 9 additions & 8 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,17 @@ dependencies {
annotationProcessor 'com.google.dagger:dagger-compiler:2.41'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.41'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.squareup.okhttp3:mockwebserver:3.14.9'
// implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
implementation 'com.squareup.okio:okio:3.4.0'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-runtime:2.4.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation "androidx.fragment:fragment:$fragment_version"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'com.cronutils:cron-utils:9.1.5'
implementation 'com.cronutils:cron-utils:9.1.7'

androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down Expand Up @@ -181,9 +182,9 @@ dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
// https://mvnrepository.com/artifact/commons-codec/commons-codec
implementation 'commons-codec:commons-codec:1.15'
implementation group: 'commons-io', name: 'commons-io', version: '2.11.0'
implementation group: 'commons-io', name: 'commons-io', version: '2.14.0'

implementation 'org.bouncycastle:bcprov-jdk15on:1.59'
implementation 'org.bouncycastle:bcprov-jdk15on:1.66'
implementation 'com.auth0.android:jwtdecode:2.0.1'

implementation project(':clientmanager')
Expand Down Expand Up @@ -240,8 +241,8 @@ dependencies {
implementation 'androidx.navigation:navigation-ui:2.4.2'

implementation 'javax.inject:javax.inject:1'
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.2'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.2'
implementation 'com.fasterxml.jackson.core:jackson-core:2.15.0-rc1'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4.1'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.2'


Expand Down Expand Up @@ -292,7 +293,7 @@ dependencies {
implementation 'org.apache.velocity:velocity:1.7'
implementation 'org.mvel:mvel2:2.4.14.Final'

implementation('com.tom-roush:pdfbox-android:2.0.20.0') {
implementation('com.tom-roush:pdfbox-android:2.0.27.0') {
exclude group: 'org.bouncycastle'
}

Expand Down
3 changes: 3 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name=" android.permission.USE_EXACT_ALARM" />
<!-- GPS Location Permissions -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:label="Registration Client"
android:name="${applicationName}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.mosip.registration.clientmanager.dao.FileSignatureDao;
import io.mosip.registration.clientmanager.dao.GlobalParamDao;
import io.mosip.registration.clientmanager.dao.UserDetailDao;
import io.mosip.registration.clientmanager.dao.LocalConfigDAO;
import io.mosip.registration.clientmanager.repository.GlobalParamRepository;
import io.mosip.registration.clientmanager.repository.IdentitySchemaRepository;
import io.mosip.registration.clientmanager.repository.RegistrationCenterRepository;
Expand All @@ -29,7 +30,11 @@
import io.mosip.registration.clientmanager.service.LoginService;
import io.mosip.registration.clientmanager.service.TemplateService;
import io.mosip.registration.clientmanager.service.UserOnboardService;
import io.mosip.registration.clientmanager.service.LocalConfigServiceImpl;
import io.mosip.registration.clientmanager.service.LocationValidationServiceImpl;
import io.mosip.registration.clientmanager.spi.AuditManagerService;
import io.mosip.registration.clientmanager.spi.LocalConfigService;
import io.mosip.registration.clientmanager.spi.LocationValidationService;
import io.mosip.registration.clientmanager.spi.MasterDataService;
import io.mosip.registration.clientmanager.spi.PacketService;
import io.mosip.registration.clientmanager.spi.PreRegistrationDataSyncService;
Expand Down Expand Up @@ -60,6 +65,7 @@
import io.mosip.registration_client.api_services.DocumentDetailsApi;

import io.mosip.registration_client.api_services.DynamicDetailsApi;
import io.mosip.registration_client.api_services.GlobalConfigSettingsApi;
import io.mosip.registration_client.api_services.MachineDetailsApi;
import io.mosip.registration_client.api_services.PacketAuthenticationApi;
import io.mosip.registration_client.api_services.MasterDataSyncApi;
Expand Down Expand Up @@ -224,5 +230,24 @@ DocumentCategoryApi getDocumentCategoryApi(RegistrationService registrationServi
DashBoardDetailsApi getDashBoardDetailsApi(UserDetailDao userDetailDao, RegistrationRepository registrationRepository) {
return new DashBoardDetailsApi(appContext,userDetailDao, registrationRepository);
}


@Provides
@Singleton
LocalConfigService provideLocalConfigService(LocalConfigDAO localConfigDAO) {
return new LocalConfigServiceImpl(localConfigDAO);
}

@Provides
@Singleton
GlobalConfigSettingsApi getGlobalConfigSettingsApiImpl(MasterDataService masterDataService, LocalConfigService localConfigService, GlobalParamRepository globalParamRepository) {
return new GlobalConfigSettingsApi(masterDataService, localConfigService, globalParamRepository);
}

@Provides
@Singleton
LocationValidationService provideLocationValidationService() {
return new LocationValidationServiceImpl();
}
}

Loading
Loading