first commit
@@ -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'
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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" />
|
||||
@@ -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>
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
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>
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
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>
|
||||