first commit

This commit is contained in:
NishantRajputRN
2026-04-16 15:23:13 +05:30
commit aa56e08ffd
523 changed files with 229267 additions and 0 deletions
+110
View File
@@ -0,0 +1,110 @@
apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
apply plugin: "com.google.gms.google-services"
apply plugin: "com.google.firebase.crashlytics"
react {
autolinkLibrariesWithApp()
}
def enableProguardInReleaseBuilds = false
def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'
android {
namespace "com.performics"
compileSdk rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.performics"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 183
versionName "7.3"
missingDimensionStrategy 'react-native-camera', 'general'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
signingConfigs {
debug {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
else{
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
else{
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds
shrinkResources false
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
configurations.configureEach {
resolutionStrategy {
force 'androidx.core:core:1.16.0'
force 'androidx.appcompat:appcompat:1.6.1'
}
}
}
dependencies {
implementation("com.facebook.react:react-android")
// Agar Hermes band kar ke JSC chahie to:
// implementation jscFlavor
implementation 'com.google.android.gms:play-services-location:21.0.1'
implementation project(':CameraAI')
implementation "androidx.activity:activity-ktx:1.8.0"
// 🔹 ML Kit dependencies (IMPORTANT)
// Barcode scanning
implementation "com.google.mlkit:barcode-scanning:17.2.0"
// Text recognition (kyunki error me TextRecognizer aa raha hai)
implementation "com.google.mlkit:text-recognition:16.0.0"
// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:34.10.0"))
implementation("com.google.firebase:firebase-analytics")
implementation 'com.google.firebase:firebase-messaging'
implementation "com.google.firebase:firebase-crashlytics"
implementation 'com.facebook.fresco:animated-gif:3.6.0'
}
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
{
"project_info": {
"project_number": "291414129665",
"project_id": "performicsone-app",
"storage_bucket": "performicsone-app.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:291414129665:android:ffd2b3fa837852cc4dd400",
"android_client_info": {
"package_name": "com.performics"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAUUWpFm1yRdtloYHHBiQWryNI6PFvckso"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1",
"analytics_enabled": false
}
+32
View File
@@ -0,0 +1,32 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# --- React Native Camera & ML Kit keep rules ---
# ML Kit barcode scanning
-keep class com.google.mlkit.vision.barcode.** { *; }
-dontwarn com.google.mlkit.vision.barcode.**
# ML Kit vision common
-keep class com.google.mlkit.vision.common.** { *; }
-dontwarn com.google.mlkit.vision.common.**
# ML Kit text recognition
-keep class com.google.mlkit.vision.text.** { *; }
-dontwarn com.google.mlkit.vision.text.**
# React Native Camera (ya jo bhi tum use kar rahe ho jisme BarcodeDetectorAsyncTask hai)
-keep class org.reactnative.camera.** { *; }
-dontwarn org.reactnative.camera.**
# Kabhi-kabhi internal detector classes bhi zaroori hote hain:
-keep class com.google.mlkit.vision.** { *; }
-dontwarn com.google.mlkit.vision.**
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning"/>
</manifest>
+84
View File
@@ -0,0 +1,84 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!-- Features -->
<!-- <uses-feature android:name="android.hardware.camera" /> -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:theme="@style/AppTheme"
android:hardwareAccelerated="true"
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true">
<!-- Main Activity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</activity>
<!-- Google Maps API Key -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyCI1EaTZk3eXA_J_UsnBC1STOAFd5unJ4A" />
<!-- Push Notification Metadata -->
<meta-data
android:name="com.dieam.reactnativepushnotification.notification_channel_name"
android:value="" />
<meta-data
android:name="com.dieam.reactnativepushnotification.notification_channel_description"
android:value="" />
</application>
<!-- Queries for Intent (PDF viewer etc.) -->
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="application/pdf" />
</intent>
</queries>
</manifest>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,172 @@
// package com.performics
// import android.app.Activity
// import android.content.Intent
// import android.util.Log
// import com.cpm.india.cameraai.camera.CameraActivity
// import com.facebook.react.bridge.*
// import java.io.File
// import androidx.activity.result.ActivityResultLauncher
// import androidx.activity.result.contract.ActivityResultContracts
// class CameraaiModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
// private var cameraPromise: Promise? = null
// private var cameraLauncher: ActivityResultLauncher<Intent>? = null
// init {
// setupCameraLauncher()
// }
// private fun setupCameraLauncher() {
// val activity = getCurrentActivity()
// if (activity is androidx.activity.ComponentActivity && cameraLauncher == null) {
// cameraLauncher = activity.registerForActivityResult(
// ActivityResultContracts.StartActivityForResult()
// ) { result ->
// if (result.resultCode == Activity.RESULT_OK && result.data != null) {
// val photoPath = result.data!!.getStringExtra("filePath")
// cameraPromise?.resolve(photoPath)
// } else {
// cameraPromise?.reject("CAMERA_CANCELLED", "Camera was cancelled")
// }
// cameraPromise = null
// }
// }
// }
// override fun getName(): String = "CameraaiModule"
// @ReactMethod
// fun initializeSDK(options: ReadableMap, promise: Promise) {
// try {
// val filePath = options.getString("filePath")
// ?: throw IllegalArgumentException("filePath is required")
// val photoFile = File(filePath)
// this.cameraPromise = promise
// val activity = getCurrentActivity()
// if (activity == null) {
// promise.reject("NO_ACTIVITY", "Activity not available")
// return
// }
// if (cameraLauncher == null) setupCameraLauncher()
// val intent = Intent(activity, CameraActivity::class.java).apply {
// putExtra("filePath", photoFile.absolutePath)
// putExtra("isGrid", false)
// putExtra("isFacingFront", true)
// putExtra("isCheckFace", true)
// }
// cameraLauncher?.launch(intent)
// ?: promise.reject("LAUNCHER_ERROR", "Launcher not ready")
// } catch (e: Exception) {
// Log.e("CameraaiModule", "Error: ${e.message}", e)
// cameraPromise?.reject("ERROR", e.message ?: "Unknown", e)
// }
// }
// override fun onCatalystInstanceDestroy() {
// cameraLauncher?.unregister()
// cameraLauncher = null
// super.onCatalystInstanceDestroy()
// }
// }
package com.performics
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.util.Log
import com.cpm.india.cameraai.camera.CameraActivity
import com.facebook.react.bridge.*
import java.io.File
class CameraaiModule(private val reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext), ActivityEventListener {
private var cameraPromise: Promise? = null
private val CAMERA_REQUEST_CODE = 1001
init {
// Register to receive Activity results
reactContext.addActivityEventListener(this)
}
override fun getName(): String = "CameraaiModule"
@ReactMethod
fun initializeSDK(options: ReadableMap, promise: Promise) {
try {
val filePath = options.getString("filePath")
?: throw IllegalArgumentException("filePath is required")
val photoFile = File(filePath)
cameraPromise = promise
// ✅ Get Activity from reactContext
val activity: Activity? = reactContext.currentActivity
if (activity == null) {
promise.reject("NO_ACTIVITY", "Activity not available")
cameraPromise = null
return
}
// Create intent to launch CameraActivity
val intent = Intent(activity as Context, CameraActivity::class.java).apply {
putExtra("filePath", photoFile.absolutePath)
putExtra("isGrid", false)
putExtra("isFacingFront", true)
putExtra("isCheckFace", true)
}
activity.startActivityForResult(intent, CAMERA_REQUEST_CODE)
} catch (e: Exception) {
Log.e("CameraaiModule", "Error in initializeSDK: ${e.message}", e)
cameraPromise?.reject("ERROR", e.message ?: "Unknown error", e)
cameraPromise = null
}
}
override fun onActivityResult(
activity: Activity,
requestCode: Int,
resultCode: Int,
data: Intent?
) {
if (requestCode != CAMERA_REQUEST_CODE || cameraPromise == null) return
if (resultCode == Activity.RESULT_OK && data != null) {
val photoPath = data.getStringExtra("filePath")
if (photoPath != null) {
cameraPromise?.resolve(photoPath)
} else {
cameraPromise?.reject("NO_FILEPATH", "No filePath returned from CameraActivity")
}
} else {
cameraPromise?.reject(
"CAMERA_CANCELLED",
"Camera was cancelled or failed (resultCode = $resultCode)"
)
}
cameraPromise = null
}
override fun onNewIntent(intent: Intent) {
// Not used, but must be implemented
}
override fun onCatalystInstanceDestroy() {
cameraPromise = null
super.onCatalystInstanceDestroy()
}
}
@@ -0,0 +1,19 @@
package com.performics;
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
import com.performics.CameraaiModule
import com.facebook.react.bridge.NativeModule
import java.util.Arrays
import java.util.Collections
class CameraaiPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf(CameraaiModule(reactContext))
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}
}
@@ -0,0 +1,243 @@
package com.performics;
import android.annotation.SuppressLint;
import android.content.Intent;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ActivityEventListener;
import java.lang.String;
import java.lang.Boolean;
import java.lang.Integer;
import androidx.annotation.NonNull;
import android.util.Log;
import com.facebook.react.bridge.Promise;
import android.app.ProgressDialog;
import android.widget.Toast;
import android.app.Activity;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.json.JSONObject;
import org.json.JSONException;
import android.content.BroadcastReceiver;
// import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
import android.graphics.Paint;
import java.io.ByteArrayOutputStream;
import android.net.Uri;
import java.lang.*;
import java.io.FileOutputStream;
import java.io.File;
import android.text.TextPaint;
import android.text.Layout;
import android.text.StaticLayout;
import java.lang.Thread;
import android.graphics.Typeface;
public class ImageMarkTextModule extends ReactContextBaseJavaModule implements ActivityEventListener{
public static final String REACT_CLASS = "ImageMarkText";
private static ReactApplicationContext reactContext;
private ProgressDialog dialog = null;
final Boolean[] isSdkInitialized = new Boolean[1];
String returntempSessionId = "";
private Promise iRCameraPromise=null;
BroadcastReceiver listenForBroadCast;
private int RESULT_OK =-1;
public ImageMarkTextModule(@NonNull ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
reactContext.addActivityEventListener(this); //Register this native module as Activity result listener
Log.d("ImageMarkTextModule", "init module");
}
@Override
public void onNewIntent(@NonNull Intent intent) {
}
@Override
public void onActivityResult(@NonNull Activity activity, int requestCode, int resultCode, Intent data) {
// Here is your Activity result :)
Log.i("ImageMarkTextModule", "onActivityResult: " + resultCode);
}
@NonNull
@Override
public String getName() {
return REACT_CLASS;
}
@SuppressLint("SimpleDateFormat")
@ReactMethod
public void NativeImageMarkText(String TextInfo,String ImgInfo,final Promise promise) {
// starting the infilect login
Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("MM/DD/yyyy 'at' h:mm:ss a");
// Log.d("markText", "Mark Text Start "+format.format(calendar.getTime()));
Log.d("markText", "markText Text:"+TextInfo);
Log.d("markText", "markText ImgURL:"+ImgInfo);
Boolean isSdkLoggedIn=false;
try{
JSONObject TextObj = new JSONObject(TextInfo);
JSONObject ImgObj = new JSONObject(ImgInfo);
class MarkTextApp {
public String getImageUri(Bitmap inImage) {
try{
Calendar calendar1 = Calendar.getInstance();
SimpleDateFormat format1 = new SimpleDateFormat("MM/DD/yyyy 'at' h:mm:ss a");
File tempFile = File.createTempFile("testtempimg", ".jpg");
ByteArrayOutputStream bytes =new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
byte bitmapData[] = bytes.toByteArray();
FileOutputStream fileOutPut = new FileOutputStream(tempFile);
fileOutPut.write(bitmapData);
fileOutPut.flush();
fileOutPut.close();
Uri uri=Uri.fromFile(tempFile);
return uri.toString();
}catch(Exception e) {
Log.d("markText", "Error while generating local file : "+e.getMessage());
return "";
}
}
public void CanvasMarkText() {
Thread thread = new Thread() {
@Override
public void run() {
try {
Calendar calendar1 = Calendar.getInstance();
SimpleDateFormat format1 = new SimpleDateFormat("MM/DD/yyyy 'at' h:mm:ss a");
int mColorBackground=Color.parseColor("#ffffffff");
int mTextColor=Color.parseColor("red");
String Text=TextObj.getString("text");
String BottomText=TextObj.getString("BottomText");
JSONObject TextStyle=TextObj.getJSONObject("textStyle");
String TopTextfontSize=TextStyle.getString("TopTextfontSize");
String TopText_x=TextStyle.getString("TopText_x");
String TopText_y=TextStyle.getString("TopText_y");
Float TopTextfontSize_F = Float.parseFloat(TopTextfontSize);
Float TopText_xF = Float.parseFloat(TopText_x);
Float TopText_yF = Float.parseFloat(TopText_y);
String BottomTextfontSize=TextStyle.getString("BottomTextfontSize");
String BottomText_x=TextStyle.getString("BottomText_x");
String BottomText_y=TextStyle.getString("BottomText_y");
int BottomTextfontSize_F = Integer.parseInt(BottomTextfontSize);
int BottomText_xF = Integer.parseInt(BottomText_x);
int BottomText_yF = Integer.parseInt(BottomText_y);
String src=ImgObj.getString("src");
String height=ImgObj.getString("height");
String ExtendedHeight=ImgObj.getString("ExtendedHeight");
String width=ImgObj.getString("width");
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inMutable = true;
Bitmap bMap = BitmapFactory.decodeFile(src,opt);
Bitmap bg_bMap=Bitmap.createBitmap(Integer.parseInt(width), Integer.parseInt(ExtendedHeight), Bitmap.Config.ARGB_8888);
// bMap= bMap.copy(Bitmap.Config.ARGB_8888, true);
Canvas mCanvas = new Canvas(bg_bMap);
mCanvas.drawColor(mColorBackground);
Paint paint = new Paint();
mCanvas.drawBitmap(bMap,0f,0f,paint);
paint.setColor(mTextColor);
//Typeface tf =Typeface.createFromAsset(reactContext.getAssets(),"fonts/Roboto-Regular.ttf");
paint.setTypeface(Typeface.DEFAULT);
paint.setTextSize(TopTextfontSize_F);
mCanvas.drawText(Text, TopText_xF, TopText_yF, paint);
// paint.setTextSize(BottomTextfontSize_F);
// mCanvas.drawText(BottomText, BottomText_xF, BottomText_yF, paint);
// Drawable d = new BitmapDrawable(bMap);
// d.setBounds(10, 10, 0, 0);
// d.draw(canvas);
// String BottomText = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setTextSize(BottomTextfontSize_F);
myTextPaint.setColor(mTextColor);
myTextPaint.setTypeface(Typeface.DEFAULT);
int txt_width = Integer.parseInt(width);
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(BottomText, myTextPaint, txt_width, alignment, spacingMultiplier, spacingAddition, includePadding);
mCanvas.save();
float txt_gheight = myStaticLayout.getHeight();
mCanvas.translate(BottomText_xF, BottomText_yF);
//draws static layout on canvas
myStaticLayout.draw(mCanvas);
mCanvas.restore();
String url=getImageUri(bg_bMap);
promise.resolve(url);
} catch (Exception e) {
e.printStackTrace();
promise.resolve(false);
}
}
};
thread.start();
}
}
MarkTextApp mImgObj= new MarkTextApp();
mImgObj.CanvasMarkText();
}
catch(JSONException je) {
Log.d("markText", "markText JSON Parse Error");
Toast.makeText(reactContext,"markText failed (JSON Parse Error): "+je.getMessage(), Toast.LENGTH_SHORT).show();
je.printStackTrace();
promise.resolve(null);
}
catch(Exception e){
Log.d("markText", "Error : "+e.getMessage());
e.printStackTrace();
promise.resolve(false);
}
}
}
@@ -0,0 +1,39 @@
package com.performics;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
import com.facebook.react.bridge.ReactApplicationContext;
// import com.facebook.react.bridge.ReadableArray;
// import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import java.lang.Runnable;
import java.lang.String;
import com.performics.ImageMarkTextModule;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;
public class ImageMarkTextPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new ImageMarkTextModule(reactContext));
return modules;
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
@@ -0,0 +1,33 @@
package com.performics
import android.os.Bundle
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import org.devio.rn.splashscreen.SplashScreen
class MainActivity : ReactActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
SplashScreen.show(this)
super.onCreate(null)
}
override fun onSaveInstanceState(outState: Bundle) {
// Prevent crash from react-native-screens
}
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
override fun getMainComponentName(): String = "Performics"
/**
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
*/
override fun createReactActivityDelegate(): ReactActivityDelegate =
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
}
@@ -0,0 +1,44 @@
package com.performics
import android.app.Application
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.performics.OpenDevOptionsPackage
//import com.performics.ObjectDetectionPackage
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost =
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
// Add your custom packages here
addAll(listOf(
ImageMarkTextPackage(),
CameraaiPackage(),
OpenDevOptionsPackage(),
// ObjectDetectionPackage(),
))
}
override fun getJSMainModuleName(): String = "index"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
override val reactHost: ReactHost
get() = getDefaultReactHost(applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
loadReactNative(this)
}
}
@@ -0,0 +1,53 @@
package com.performics;
import android.content.Intent;
import android.provider.Settings;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import android.app.Activity;
import android.util.Log;
public class OpenDevOptionsModule extends ReactContextBaseJavaModule {
private static ReactApplicationContext reactContext;
public OpenDevOptionsModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
Log.d("OpenDevOptionsModule", "init module");
}
@Override
public String getName() {
return "OpenDevOptions";
}
@ReactMethod
public void open() {
Log.d("OpenDevOptionsModule", "open");
Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
reactContext.startActivity(intent);
Log.d("OpenDevOptionsModule", "open1");
}
// Check if Developer Options Enabled
@ReactMethod
public void isDevOptionsEnabled(Promise promise) {
try {
Log.d("OpenDevOptionsModule", "isDevOptionsEnabled");
int devOptions = Settings.Global.getInt(
reactContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
0
);
promise.resolve(devOptions == 1);
} catch (Exception e) {
Log.d("OpenDevOptionsModule", e.toString());
promise.reject("ERROR", e.toString());
}
}
}
@@ -0,0 +1,24 @@
package com.performics;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.performics.OpenDevOptionsModule;
import java.util.*;
public class OpenDevOptionsPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new OpenDevOptionsModule(reactContext));
return modules;
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="-100%"
android:toXDelta="0"
android:duration="200" />
</set>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="100%"
android:duration="200" />
</set>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0"
android:duration="300" />
</set>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="-100%"
android:duration="300" />
</set>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="3000" />
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator">
<translate
android:fromYDelta="-100%p"
android:toYDelta="0"
android:duration="2000"/>
</set>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially"
android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="1.0"
android:toXScale="1.1"
android:fromYScale="1.0"
android:toYScale="1.0"
android:duration="500"
android:pivotX="70%"
android:pivotY="70%" />
<scale
android:interpolator="@android:anim/bounce_interpolator"
android:fromXScale="1.1"
android:fromYScale="1.1"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="70%"
android:pivotY="70%"
android:duration="1000"
android:startOffset="500" />
</set>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<!--Move-->
<translate
android:duration="1000"
android:fromXDelta="-150%"
android:fromYDelta="-150%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%"
android:toYDelta="0%"></translate>
<!--Fade Out-->
<alpha
android:duration="2000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0"></alpha>
</set>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<!-- Rotate -->
<rotate
android:duration="500"
android:fromDegrees="30"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="4"
android:repeatMode="reverse"
android:toDegrees="0"></rotate>
<!--Move-->
<translate
android:duration="1000"
android:fromXDelta="150%"
android:fromYDelta="150%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%"
android:toYDelta="0%"></translate>
<!--Fade In-->
<alpha
android:duration="2000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1.0"></alpha>
</set>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<!--Move-->
<translate
android:duration="1000"
android:fromXDelta="-170%"
android:fromYDelta="-25%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%"
android:toYDelta="0%"></translate>
<!--Fade Out-->
<alpha
android:duration="2000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0"></alpha>
</set>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<!-- Rotate -->
<rotate
android:duration="500"
android:fromDegrees="30"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="4"
android:repeatMode="reverse"
android:toDegrees="0"></rotate>
<!--Move-->
<translate
android:duration="1000"
android:fromXDelta="170%"
android:fromYDelta="25%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%"
android:toYDelta="0%"></translate>
<!--Fade In-->
<alpha
android:duration="2000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1.0"></alpha>
</set>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 - Riccardo Ciovati
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="-50%p" android:toYDelta="0" android:duration="200"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="200" />
</set>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%"
android:toXDelta="0%"
android:fromYDelta="200%"
android:toYDelta="0%"
android:duration="2000"
android:zAdjustment="top" />
</set>
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
-->
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/lin_lay"
android:layout_gravity="center"
android:orientation="vertical"
android:weightSum="10">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2">
<ImageView
android:layout_width="226dp"
android:layout_height="53dp"
android:layout_gravity="center"
android:gravity="center"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/custom_layout_margin"
android:src="@drawable/parinaam_tag_line"
android:visibility="visible" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:layout_centerHorizontal="true"
android:gravity="center"
>
<ImageView
android:id="@+id/logo"
android:layout_width="157dp"
android:layout_height="161dp"
android:gravity="center"
android:layout_centerHorizontal="true"
android:background="@drawable/logo"
android:visibility="visible"
android:layout_marginTop="-100dp"
/>
</RelativeLayout>
</LinearLayout>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary_dark">#000000</color>
<color name="primary_color">#6B84F6</color>
<color name="colorPrimary">#294D8C</color>
<color name="colorPrimaryDark">#383386</color>
<color name="colorAccent">#87CEFA</color>
<color name="primarycolor">#294D8C</color>
<color name="white">#FFFFFF</color>
<color name="lightpink">#fe8bd0</color>
<color name="black">#000000</color>
<color name="light_yellow">#FFF176</color>
<color name="text_yellow">#f9f93d</color>
<color name="red">#e21c22</color>
<color name="transparent">#00000000</color>
<color name="green">#4CAF50</color>
<color name="teal_dark">#294D8C</color>
<color name="teal_light">#009688</color>
<color name="green_dark">#388E3C</color>
<color name="teal_header">#00796B</color>
<color name="green_light">#66BB6A</color>
<color name="grey_background">#D3D3D3</color>
<color name="grey_light">#FAFAFA</color>
<color name="colorPSecond">#00bfff</color>
<color name="darkblue">#1E88E5</color>
<color name="lightsalmon">#FFA07A</color>
<color name="lightskyblue">#87CEFA</color>
<color name="gainsboro">#DCDCDC</color>
<color name="peachpuff">#FFDAB9</color>
<color name="ColorPrimaryLight">#1a7be0</color>
<color name="text_grey_color">#c8c3c3</color>
<color name="grey_dark_background">#888</color>
<color name="circular_progress_default_progress">#bada55</color>
<color name="circular_progress_default_background">#787878</color>
<color name="circular_progress_default_title">#bada55</color>
<color name="circular_progress_default_subtitle">#D1D1D1</color>
<color name="darkgrey">#A9A9A9</color>
<color name="transparent_white">#F7F7F7</color>
<color name="background_color">#E1E2E2</color>
<color name="very_dark_blue">@android:color/transparent</color>
<!-- <color name="very_dark_blue">#2A2B33</color>-->
<color name="light_blue">#E6F8FF</color>
<color name="gray_for_text_color">#5a5a5a</color>
<color name="per_closed">@color/colorPrimary</color>
</resources>
@@ -0,0 +1,34 @@
<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="custom_margin">5dp</dimen>
<dimen name="nav_header_height">160dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="text_size_normal">15sp</dimen>
<dimen name="text_size_small">16sp</dimen>
<dimen name="text_size_medium">18sp</dimen>
<dimen name="store_entry_text_size">15sp</dimen>
<dimen name="text_size_very_small">12sp</dimen>
<dimen name="text_size_14sp">14sp</dimen>
<dimen name="text_size_13sp">13sp</dimen>
<dimen name="appbar_padding_top">8dp</dimen>
<dimen name="padding_standard">5dp</dimen>
<dimen name="margin11dp">11dp</dimen>
<dimen name="margin1dp">1dp</dimen>
<dimen name="custom_layout_margin">30dp</dimen>
<dimen name="text_size_big">25sp</dimen>
<dimen name="button_margin">15dp</dimen>
<dimen name="txt_size">16sp</dimen>
<dimen name="txt_size2dp">2dp</dimen>
<dimen name="txt_3dp">3dp</dimen>
<dimen name="margin10dp">10dp</dimen>
<dimen name="store_p_activity_vertical_margin">8dp</dimen>
<dimen name="custom_layout_margin35">35dp</dimen>
<dimen name="hight40dp">40dp</dimen>
</resources>
@@ -0,0 +1,3 @@
<resources>
<string name="app_name">Performics</string>
</resources>
@@ -0,0 +1,22 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- React Native edit text -->
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<!-- Prevent dark mode usage -->
<item name="android:forceDarkAllowed" tools:targetApi="29">false</item>
<!-- Primary colors -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorAccent">@color/colorPrimary</item>
<!-- IMPORTANT: status bar color -->
<item name="android:statusBarColor">@color/colorPrimary</item>
<!-- Make sure status bar is NOT translucent -->
<item name="android:windowTranslucentStatus">false</item>
<!-- Custom. -->
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="android:hardwareAccelerated">true</item>
</style>
</resources>