diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
index 748ab157d..78854d493 100644
--- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
@@ -36,11 +36,11 @@ android_binary(
"//mediapipe/java/com/google/mediapipe/solutioncore:solution_rendering",
"//mediapipe/java/com/google/mediapipe/solutioncore:video_input",
# "//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs-lindera",
- "//mediapipe/java/com/google/mediapipe/solutions/lindera:copperlabs-lindera",
- "//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs-pose-api",
- "//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs-pose-detection",
- "//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs-pose-graph",
- "//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs-pose-landmark",
+ "//mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera",
+ "//mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api",
+ "//mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api:copperlabs-pose-detection",
+ "//mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api:copperlabs-pose-graph",
+ "//mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api:copperlabs-pose-landmark",
"//third_party:androidx_appcompat",
"//third_party:androidx_constraint_layout",
"//third_party:opencv",
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/build.gradle
new file mode 100644
index 000000000..5eff1c105
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/build.gradle
@@ -0,0 +1,54 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'com.google.mediapipe'
+ compileSdk 32
+
+ defaultConfig {
+ applicationId "com.google.mediapipe"
+ minSdk 24
+ targetSdk 32
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation project(':copperlabs-lindera')
+ implementation project(':copperlabs-pose-api')
+ implementation project(':copperlabs-pose-detection')
+ implementation project(':copperlabs-pose-landmark')
+ implementation project(':copperlabs-pose-graph')
+
+ implementation fileTree(dir: '../common_libs', include: ['*.jar', '*.aar'])
+
+ implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
+ // CameraX core library
+ def camerax_version = "1.0.0-beta10"
+ implementation "androidx.camera:camera-core:$camerax_version"
+ implementation "androidx.camera:camera-camera2:$camerax_version"
+ implementation "androidx.camera:camera-lifecycle:$camerax_version"
+
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'com.google.android.material:material:1.5.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/androidTest/java/com/google/mediapipe/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/androidTest/java/com/google/mediapipe/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..4ad84d885
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/androidTest/java/com/google/mediapipe/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.mediapipe;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.mediapipe", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..9dc41437f
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/AndroidManifest.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java
new file mode 100644
index 000000000..902f72a2d
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java
@@ -0,0 +1,140 @@
+package com.google.mediapipe.examples.posetracking_lindera;
+
+import static java.lang.Math.min;
+
+import com.google.mediapipe.solutions.lindera.BodyJoints;
+import com.google.mediapipe.solutions.lindera.ComputerVisionPlugin;
+import com.google.mediapipe.solutions.lindera.XYZPointWithConfidence;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
+
+public class ComputerVisionPluginImpl implements ComputerVisionPlugin {
+
+ LinkedList bodyJointsEventList = new LinkedList<>();
+ static class BodyJointsEvent{
+ BodyJoints bodyJoints;
+ Long timestamp;
+
+ public BodyJointsEvent(long timestamp, BodyJoints bodyJoints) {
+ this.bodyJoints = bodyJoints;
+ this.timestamp = timestamp;
+ }
+ }
+
+
+
+
+ boolean isLogging = false;
+
+ public void startLogging(){
+ isLogging = true;
+ bodyJointsEventList = new LinkedList<>();
+ }
+
+ public JSONObject stopLoggingAndDumpOutput() throws JSONException, IllegalAccessException {
+ isLogging = false;
+ // base json string
+ String json = "{\n" +
+ " \"identifier\": \"some_name_here.Capture\",\n" +
+ " \"metaData\": {\n" +
+ " \"userIdentifier\": \"unknown user\",\n" +
+ " \"originatingEquipment\": \"Apperture\",\n" +
+ " \"activityName\": \"exercise name\",\n" +
+ " \"activityDescription\": \"\",\n" +
+ " \"tags\": [\n" +
+ " \n" +
+ " ]\n" +
+ " },\n" +
+ " \"bodyObjects\": [\n" +
+ " \n" +
+ " ]}";
+
+ JSONObject eLog = new JSONObject(json);
+ JSONArray bodyJointsArr = new JSONArray();
+ for (BodyJointsEvent bodyJointsEvent:bodyJointsEventList){
+ JSONObject jBodyJointEvent = new JSONObject();
+ jBodyJointEvent.put("ts",bodyJointsEvent.timestamp);
+ BodyJoints bodyJoints = bodyJointsEvent.bodyJoints;
+ String bodyJointsString = "";
+ // iterate over fields of BodyJoints and put them in json format
+ for (Field field : BodyJoints.class.getDeclaredFields()) {
+ Class> type = field.getType();
+
+ if (type == XYZPointWithConfidence.class) {
+
+ String name = field.getName();
+ // get abbreviation of name for example leftShoulder -> LS
+ String abbrev = String.valueOf(name.charAt(0));
+ for (int i = 1;i cameras = lindera.getAvailableCameras();
+ // FRONT or BACK
+ lindera.setCamera("FRONT");
+ lindera.setCameraRotation(CameraRotation.AUTOMATIC);
+
+ lindera.fpsHelper.onFpsUpdate = new Consumer() {
+ @Override
+ public void accept(Double fps) {
+ String text = "FPS: "+String.format("%04.1f" ,fps);
+ runOnUiThread(()-> {
+ TextView view = findViewById(R.id.fps_view);
+ view.setText(text);
+ });
+ }
+ };
+
+ }
+
+
+ /**
+ * Sets up the UI components for the live demo with camera input.
+ */
+ private void setupLiveDemoUiComponents() {
+
+ Button startDetectionButton = findViewById(R.id.button_start_detection);
+ Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks);
+ Button modelComplexity = findViewById(R.id.button_set_model);
+ Button startCapture = findViewById(R.id.button_capture_logging);
+ FrameLayout frameLayout = findViewById(R.id.preview_display_layout);
+
+ startDetectionButton.setOnClickListener(
+ v -> {
+// startCameraButton.setVisibility(View.GONE);
+ if (!isLinderaInitialized) {
+ modelLoadAsyncDialogue(()->{
+ lindera.initialize(frameLayout, MainActivity.this);
+ isLinderaInitialized = true;
+ startDetectionButton.setVisibility(View.GONE);
+ findViewById(R.id.button_set_model).setVisibility(View.VISIBLE);
+ findViewById(R.id.button_toggle_landmarks).setVisibility(View.VISIBLE);
+ findViewById(R.id.button_capture_logging).setVisibility(View.VISIBLE);
+
+ updateLandmarkButtonText();
+ updateModelComplexityButtonText();
+ });
+
+
+ }
+ isDetectionStarted = !isDetectionStarted;
+
+
+ });
+
+ toggleLandmarks.setOnClickListener(
+ v ->{
+ this.lindera.setLandmarksVisibility(!this.lindera.getLandmarkVisibility());
+ updateLandmarkButtonText();
+ }
+ );
+
+ startCapture.setOnClickListener(v->{
+
+ if (isLoggingStarted){
+ startCapture.setText("Start Capture");
+ isLoggingStarted = false;
+ try {
+ JSONObject jsonObject = plugin.stopLoggingAndDumpOutput();
+ // save to downloads folder
+ final ContentValues values = new ContentValues();
+ values.put(MediaStore.MediaColumns.DISPLAY_NAME, "data.json");
+ values.put(MediaStore.MediaColumns.MIME_TYPE, "application/json");
+ values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
+
+ final ContentResolver resolver = getContentResolver();
+ Uri uri = null;
+ final Uri contentUri;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
+ contentUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
+
+ uri = resolver.insert(contentUri, values);
+ final OutputStream stream = resolver.openOutputStream(uri);
+ stream.write(jsonObject.toString().getBytes(StandardCharsets.UTF_8));
+ stream.close();
+ Toast.makeText(getApplicationContext(), "data.json saved to Downloads", Toast.LENGTH_LONG).show();
+ }else {
+ Toast.makeText(getApplicationContext(), "Error: API not supported", Toast.LENGTH_LONG).show();
+
+ }
+
+ } catch (JSONException | IllegalAccessException | IOException e) {
+ e.printStackTrace();
+ Toast.makeText(getApplicationContext(), "Failed to save data", Toast.LENGTH_LONG).show();
+
+ }
+ }
+ else {
+ ProgressBar pbar = new ProgressBar(this);
+ frameLayout.addView(pbar);
+ final Handler handler = new Handler(Looper.getMainLooper());
+ startCapture.setEnabled(false);
+
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ frameLayout.removeView(pbar);
+ startCapture.setEnabled(true);
+ startCapture.setText("Stop Capture");
+ plugin.startLogging();
+ }
+ }, 5000);
+ isLoggingStarted = true;
+ }
+ });
+
+ modelComplexity.setOnClickListener(v->{
+ int modelComplexityVal = lindera.getModelComplexity();
+
+ new MaterialDialog.Builder(this)
+ .title("Choose Model Complexity")
+ .items(Arrays.asList("Lite","Full","Heavy"))
+ .itemsCallbackSingleChoice(modelComplexityVal, new MaterialDialog.ListCallbackSingleChoice() {
+ @Override
+ public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+ /**
+ * If you use alwaysCallSingleChoiceCallback(), which is discussed below,
+ * returning false here won't allow the newly selected radio button to actually be selected.
+ **/
+ if (which != modelComplexityVal){
+ modelLoadAsyncDialogue(()-> {
+ lindera.setModelComplexity(which);
+ lindera.restartDetection();
+ updateModelComplexityButtonText();
+ });
+ }
+ return true;
+ }
+ })
+ .positiveText("choose")
+ .show();
+// listItemsSingleChoice(R.array.my_items, initialSelection = 1);
+
+
+
+ });
+
+ }
+ void updateLandmarkButtonText(){
+ Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks);
+
+ if (this.lindera.getLandmarkVisibility()) {
+ toggleLandmarks.setText("Show Landmarks (On)");
+ }else{
+ toggleLandmarks.setText("Show Landmarks (Off)");
+
+ }
+ }
+
+ void updateModelComplexityButtonText(){
+ String text = "Select Model ";
+ switch (this.lindera.getModelComplexity()){
+ case 0:
+ text += "(lite)";
+ break;
+ case 1:
+ text += "(full)";
+ break;
+ case 2:
+ text += "(heavy)";
+ break;
+
+ }
+ Button setModel = findViewById(R.id.button_set_model);
+ setModel.setText(text);
+
+ }
+
+ void modelLoadAsyncDialogue(Runnable loader){
+ ProgressBar pbar = new ProgressBar(this);
+ MaterialDialog dialog = new MaterialDialog.Builder(this)
+ .title("Loading Model")
+ .customView(pbar, false)
+ .build();
+ dialog.show();
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Handler handler = new Handler(Looper.getMainLooper());
+
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ //Background work here
+ handler.post(loader);
+ dialog.dismiss();
+ }
+ });
+ }
+
+
+
+
+
+
+
+
+
+}
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 000000000..2b068d114
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable/ic_launcher_background.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 000000000..07d5da9cb
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/layout/activity_main.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000..975690cb0
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 000000000..c209e78ec
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..b2dfe3d1b
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 000000000..4f0f1d64e
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..62b611da0
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 000000000..948a3070f
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..1b9a6956b
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..28d4b77f9
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9287f5083
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..aa7d6427e
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9126ae37c
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values-night/themes.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values-night/themes.xml
new file mode 100644
index 000000000..24a05adc6
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/colors.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000..f8c6127d3
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/strings.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000..58a13d025
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ posetracking
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/themes.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/themes.xml
new file mode 100644
index 000000000..022379317
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/backup_rules.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 000000000..fa0f996d2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/data_extraction_rules.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 000000000..9ee9997b0
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/test/java/com/google/mediapipe/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/test/java/com/google/mediapipe/ExampleUnitTest.java
new file mode 100644
index 000000000..0667a833a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/app/src/test/java/com/google/mediapipe/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.mediapipe;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/build.gradle
new file mode 100644
index 000000000..71b99f4ca
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/build.gradle
@@ -0,0 +1,5 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.3.1' apply false
+ id 'com.android.library' version '7.3.1' apply false
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/common_libs/copperlabs-mediapipe.aar b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/common_libs/copperlabs-mediapipe.aar
new file mode 100755
index 000000000..21a4410c0
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/common_libs/copperlabs-mediapipe.aar differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/BUILD b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/BUILD.bazel
similarity index 91%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/BUILD
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/BUILD.bazel
index fd0de1be5..989c84938 100644
--- a/mediapipe/java/com/google/mediapipe/solutions/lindera/BUILD
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/BUILD.bazel
@@ -1,7 +1,7 @@
android_library(
name = "copperlabs-lindera",
- srcs = glob(["*.java"]),
- manifest = "AndroidManifest.xml",
+ srcs = glob(["src/main/**/*.java"]),
+ manifest = "src/main/AndroidManifest.xml",
visibility = ["//visibility:public"],
deps = [
"//mediapipe/framework/formats:detection_java_proto_lite",
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/build.gradle
new file mode 100644
index 000000000..88fb4df2e
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/build.gradle
@@ -0,0 +1,49 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.google.mediapipe.solutions.lindera'
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 24
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ compileOnly fileTree(dir: '../common_libs', include: ['*.jar', '*.aar'])
+ implementation project(':copperlabs-pose-api')
+
+ // Mediapipe dependencies
+ implementation 'com.google.protobuf:protobuf-javalite:3.19.1'
+ implementation 'com.google.flogger:flogger:latest.release'
+ implementation 'com.google.flogger:flogger-system-backend:latest.release'
+ implementation 'com.google.code.findbugs:jsr305:latest.release'
+ implementation 'com.google.guava:guava:27.0.1-android'
+ api "com.google.auto.value:auto-value-annotations:1.10"
+ annotationProcessor "com.google.auto.value:auto-value:1.10"
+
+
+
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'com.google.android.material:material:1.5.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/consumer-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/androidTest/java/com/google/mediapipe/solutions/lindera/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/androidTest/java/com/google/mediapipe/solutions/lindera/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..7a315b27f
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/androidTest/java/com/google/mediapipe/solutions/lindera/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.mediapipe.solutions.lindera;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.mediapipe.solutions.lindera.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/BodyJoints.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/BodyJoints.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/BodyJoints.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/BodyJoints.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/CameraRotation.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/CameraRotation.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/CameraRotation.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/CameraRotation.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/ComputerVisionPlugin.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/ComputerVisionPlugin.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/ComputerVisionPlugin.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/ComputerVisionPlugin.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/FpsHelper.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/FpsHelper.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/FpsHelper.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/FpsHelper.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/Lindera.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/Lindera.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/XYZPointWithConfidence.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/XYZPointWithConfidence.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/lindera/XYZPointWithConfidence.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/main/java/com/google/mediapipe/solutions/lindera/XYZPointWithConfidence.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/test/java/com/google/mediapipe/solutions/lindera/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/test/java/com/google/mediapipe/solutions/lindera/ExampleUnitTest.java
new file mode 100644
index 000000000..251c5a509
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-lindera/src/test/java/com/google/mediapipe/solutions/lindera/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.mediapipe.solutions.lindera;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/BUILD b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/BUILD.bazel
similarity index 70%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/BUILD
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/BUILD.bazel
index 6e27296db..7078addf0 100644
--- a/mediapipe/java/com/google/mediapipe/solutions/posetracking/BUILD
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/BUILD.bazel
@@ -11,23 +11,14 @@
# 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.
-load("//mediapipe/java/com/google/mediapipe/solutions/posetracking:copperlabs_aar.bzl", "copperlabs_aar")
licenses(["notice"])
-POSE_TRACKING_SRCS = [
- "PersonKeypoint.java",
- "PoseTracking.java",
- "PoseTrackingOptions.java",
- "PoseTrackingResult.java",
- "PoseTrackingResultGlRenderer.java",
-]
-
android_library(
name = "copperlabs-pose-api",
- srcs = POSE_TRACKING_SRCS,
+ srcs = glob(["src/main/**/*.java"]),
javacopts = ["-Acom.google.auto.value.AutoBuilderIsUnstable"],
- manifest = ":AndroidManifest.xml",
+ manifest = "src/main/AndroidManifest.xml",
visibility = ["//visibility:public"],
deps = [
"//mediapipe/framework/formats:detection_java_proto_lite",
@@ -88,30 +79,3 @@ android_library(
visibility = ["//visibility:public"],
deps = [],
)
-
-#mediapipe_aar(
-# name = "copperlabs-mediapipe",
-# calculators = ["//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps"],
-#)
-#
-
-#copperlabs_aar(
-# name = "copperlabs-pose-api",
-# srcs = POSE_TRACKING_SRCS,
-# additional_deps = [
-# "//mediapipe/java/com/google/mediapipe/solutioncore:solution_base",
-# "//mediapipe/java/com/google/mediapipe/solutioncore:camera_input",
-# "@maven//:androidx_annotation_annotation",
-# ],
-# gen_libmediapipe = False,
-#)
-
-#mediapipe_aar(
-# name = "copperlabs-pose-landmark",
-# assets = [
-# "//mediapipe/modules/pose_landmark:pose_landmark_heavy.tflite",
-# "//mediapipe/modules/pose_landmark:pose_landmark_full.tflite",
-# "//mediapipe/modules/pose_landmark:pose_landmark_lite.tflite",
-# ],
-# gen_libmediapipe = False,
-#)
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/build.gradle
new file mode 100644
index 000000000..10a5c4ae5
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/build.gradle
@@ -0,0 +1,49 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.google.mediapipe.solutions.posetracking'
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 24
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ compileOnly fileTree(dir: '../common_libs', include: ['*.jar', '*.aar'])
+
+ // Mediapipe dependencies
+ implementation 'com.google.protobuf:protobuf-javalite:3.19.1'
+ implementation 'com.google.flogger:flogger:latest.release'
+ implementation 'com.google.flogger:flogger-system-backend:latest.release'
+ implementation 'com.google.code.findbugs:jsr305:latest.release'
+ implementation 'com.google.guava:guava:27.0.1-android'
+ api "com.google.auto.value:auto-value-annotations:1.10"
+ annotationProcessor "com.google.auto.value:auto-value:1.10"
+
+
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'com.google.android.material:material:1.5.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+
+
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/consumer-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/androidTest/java/com/google/mediapipe/solutions/posetracking/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/androidTest/java/com/google/mediapipe/solutions/posetracking/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..70b4ac4e0
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/androidTest/java/com/google/mediapipe/solutions/posetracking/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.mediapipe.solutions.posetracking;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.mediapipe.solutions.posetracking.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PersonKeypoint.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PersonKeypoint.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/PersonKeypoint.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PersonKeypoint.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResult.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResult.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResult.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResult.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResultGlRenderer.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResultGlRenderer.java
similarity index 100%
rename from mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResultGlRenderer.java
rename to mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/main/java/com/google/mediapipe/solutions/posetracking/PoseTrackingResultGlRenderer.java
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/test/java/com/google/mediapipe/solutions/posetracking/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/test/java/com/google/mediapipe/solutions/posetracking/ExampleUnitTest.java
new file mode 100644
index 000000000..0701e447d
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-api/src/test/java/com/google/mediapipe/solutions/posetracking/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.mediapipe.solutions.posetracking;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/build.gradle
new file mode 100644
index 000000000..3c3174dca
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/build.gradle
@@ -0,0 +1,36 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.google.copperlabs_pose_detection'
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 23
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.7.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/consumer-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/androidTest/java/com/google/copperlabs_pose_detection/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/androidTest/java/com/google/copperlabs_pose_detection/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..e968b23bc
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/androidTest/java/com/google/copperlabs_pose_detection/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.copperlabs_pose_detection;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.copperlabs_pose_detection.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/assets/pose_detection.tflite b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/assets/pose_detection.tflite
new file mode 100644
index 000000000..4f1c521d2
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/main/assets/pose_detection.tflite differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/test/java/com/google/copperlabs_pose_detection/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/test/java/com/google/copperlabs_pose_detection/ExampleUnitTest.java
new file mode 100644
index 000000000..a7fb92a70
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-detection/src/test/java/com/google/copperlabs_pose_detection/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.copperlabs_pose_detection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/build.gradle
new file mode 100644
index 000000000..e62ac8f4d
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/build.gradle
@@ -0,0 +1,36 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.google.copperlabs_pose_graph'
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 23
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.7.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/consumer-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/androidTest/java/com/google/copperlabs_pose_graph/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/androidTest/java/com/google/copperlabs_pose_graph/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..9fd9aa41f
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/androidTest/java/com/google/copperlabs_pose_graph/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.copperlabs_pose_graph;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.copperlabs_pose_graph.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/assets/pose_tracking_gpu_image.binarypb b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/assets/pose_tracking_gpu_image.binarypb
new file mode 100755
index 000000000..6192f4128
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/main/assets/pose_tracking_gpu_image.binarypb differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/test/java/com/google/copperlabs_pose_graph/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/test/java/com/google/copperlabs_pose_graph/ExampleUnitTest.java
new file mode 100644
index 000000000..b37073199
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-graph/src/test/java/com/google/copperlabs_pose_graph/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.copperlabs_pose_graph;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/.gitignore b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/build.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/build.gradle
new file mode 100644
index 000000000..460c5787f
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/build.gradle
@@ -0,0 +1,36 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.google.copperlabs_pose_landmark'
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 23
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.7.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/consumer-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/proguard-rules.pro b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/androidTest/java/com/google/copperlabs_pose_landmark/ExampleInstrumentedTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/androidTest/java/com/google/copperlabs_pose_landmark/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..20fb41da6
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/androidTest/java/com/google/copperlabs_pose_landmark/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.google.copperlabs_pose_landmark;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.google.copperlabs_pose_landmark.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a5918e68a
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_full.tflite b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_full.tflite
new file mode 100644
index 000000000..e2ee84fc4
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_full.tflite differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_heavy.tflite b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_heavy.tflite
new file mode 100644
index 000000000..9b767e7bc
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_heavy.tflite differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_lite.tflite b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_lite.tflite
new file mode 100644
index 000000000..280cc722f
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/main/assets/pose_landmark_lite.tflite differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/test/java/com/google/copperlabs_pose_landmark/ExampleUnitTest.java b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/test/java/com/google/copperlabs_pose_landmark/ExampleUnitTest.java
new file mode 100644
index 000000000..eccd8c511
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/copperlabs-pose-landmark/src/test/java/com/google/copperlabs_pose_landmark/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.google.copperlabs_pose_landmark;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle.properties b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle.properties
new file mode 100644
index 000000000..72611fe86
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle.properties
@@ -0,0 +1,23 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
+
+android.enableJetifier=true
\ No newline at end of file
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.jar b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..e708b1c02
Binary files /dev/null and b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.properties b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..ce344deab
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Nov 07 20:47:00 PKT 2022
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew
new file mode 100755
index 000000000..4f906e0c8
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# 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
+#
+# https://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.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew.bat b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew.bat
new file mode 100644
index 000000000..107acd32c
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mediapipe/java/com/google/mediapipe/solutions/copperlabs/settings.gradle b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/settings.gradle
new file mode 100644
index 000000000..94ce0bc00
--- /dev/null
+++ b/mediapipe/java/com/google/mediapipe/solutions/copperlabs/settings.gradle
@@ -0,0 +1,21 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "posetracking"
+include ':app'
+include ':copperlabs-pose-api'
+include ':copperlabs-lindera'
+include ':copperlabs-pose-landmark'
+include ':copperlabs-pose-detection'
+include ':copperlabs-pose-graph'
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/lindera/AndroidManifest.xml
deleted file mode 100644
index ad308b232..000000000
--- a/mediapipe/java/com/google/mediapipe/solutions/lindera/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/AndroidManifest.xml b/mediapipe/java/com/google/mediapipe/solutions/posetracking/AndroidManifest.xml
deleted file mode 100644
index 0004407c6..000000000
--- a/mediapipe/java/com/google/mediapipe/solutions/posetracking/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/copperlabs_aar.bzl b/mediapipe/java/com/google/mediapipe/solutions/posetracking/copperlabs_aar.bzl
deleted file mode 100644
index e5feaf032..000000000
--- a/mediapipe/java/com/google/mediapipe/solutions/posetracking/copperlabs_aar.bzl
+++ /dev/null
@@ -1,347 +0,0 @@
-# Copyright 2019-2020 The MediaPipe Authors.
-#
-# 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.
-
-"""Generates Copperlab AAR including different variants of .so in jni folder.
-
-Usage:
-
-Creates a new copperlabs_aar() target in a BUILD file. For example,
-putting the following code into mediapipe/examples/android/aar_demo/BUILD.
-
-```
-load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")
-
-mediapipe_aar(
- name = "demo",
- calculators = ["//mediapipe/calculators/core:pass_through_calculator"],
-)
-```
-
-Then, runs the following Bazel command to generate the aar.
-
-```
-$ bazel build --strip=always -s -c opt \
- --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
- --fat_apk_cpu=arm64-v8a,armeabi-v7a \
- mediapipe/examples/android/aar_demo:demo.aar
-```
-
-Finally, imports the aar into Android Studio.
-
-"""
-
-load("@build_bazel_rules_android//android:rules.bzl", "android_binary", "android_library")
-
-def copperlabs_aar(
- name,
- srcs = [],
- gen_libmediapipe = True,
- calculators = [],
- assets = [],
- assets_dir = "",
- additional_deps = []):
- """Generates MediaPipe android archive library.
-
- Args:
- name: the name of the aar.
- srcs: the additional java source code to be added into the android library.
- gen_libmediapipe: whether to generate libmediapipe_jni.so. Default to True.
- calculators: the calculator libraries to be compiled into the jni library.
- assets: additional assets to be included into the archive.
- assets_dir: path where the assets will the packaged.
- """
-
- # When "--define EXCLUDE_OPENCV_SO_LIB=1" is set in the build command,
- # the OpenCV so libraries will be excluded from the AAR package to
- # save the package size.
- native.config_setting(
- name = "exclude_opencv_so_lib",
- define_values = {
- "EXCLUDE_OPENCV_SO_LIB": "1",
- },
- visibility = ["//visibility:public"],
- )
-
- # When "--define ENABLE_STATS_LOGGING=1" is set in the build command,
- # the solution stats logging component will be added into the AAR.
- # This flag is for internal use only.
- native.config_setting(
- name = "enable_stats_logging",
- define_values = {
- "ENABLE_STATS_LOGGING": "1",
- },
- visibility = ["//visibility:public"],
- )
-
- _mediapipe_jni(
- name = name + "_jni",
- gen_libmediapipe = gen_libmediapipe,
- calculators = calculators,
- )
-
- _mediapipe_proto(
- name = name + "_proto",
- )
-
- native.genrule(
- name = name + "_aar_manifest_generator",
- outs = ["AndroidManifest.xml"],
- cmd = """
-cat > $(OUTS) <
-
-
-
-EOF
-""",
- )
-
- android_library(
- name = name + "_android_lib",
- srcs = srcs + [
- "//mediapipe/java/com/google/mediapipe/components:java_src",
- "//mediapipe/java/com/google/mediapipe/framework:java_src",
- "//mediapipe/java/com/google/mediapipe/glutil:java_src",
- "com/google/mediapipe/formats/annotation/proto/RasterizationProto.java",
- "com/google/mediapipe/formats/proto/ClassificationProto.java",
- "com/google/mediapipe/formats/proto/DetectionProto.java",
- "com/google/mediapipe/formats/proto/LandmarkProto.java",
- "com/google/mediapipe/formats/proto/LocationDataProto.java",
- "com/google/mediapipe/proto/CalculatorProto.java",
- ] +
- select({
- "//conditions:default": [],
- "enable_stats_logging": [
- "com/google/mediapipe/proto/MediaPipeLoggingProto.java",
- "com/google/mediapipe/proto/MediaPipeLoggingEnumsProto.java",
- ],
- }),
- manifest = "AndroidManifest.xml",
- proguard_specs = ["//mediapipe/java/com/google/mediapipe/framework:proguard.pgcfg"],
- deps = [
- ":" + name + "_jni_cc_lib",
- "//mediapipe/framework:calculator_java_proto_lite",
- "//mediapipe/framework:calculator_profile_java_proto_lite",
- "//mediapipe/framework:calculator_options_java_proto_lite",
- "//mediapipe/framework:mediapipe_options_java_proto_lite",
- "//mediapipe/framework:packet_factory_java_proto_lite",
- "//mediapipe/framework:packet_generator_java_proto_lite",
- "//mediapipe/framework:status_handler_java_proto_lite",
- "//mediapipe/framework:stream_handler_java_proto_lite",
- "//mediapipe/framework/tool:calculator_graph_template_java_proto_lite",
- "//mediapipe/java/com/google/mediapipe/components:android_components",
- "//mediapipe/java/com/google/mediapipe/components:android_camerax_helper",
- "//mediapipe/java/com/google/mediapipe/framework:android_framework",
- "//mediapipe/java/com/google/mediapipe/glutil",
- "//third_party:androidx_annotation",
- "//third_party:androidx_appcompat",
- "//third_party:androidx_core",
- "//third_party:androidx_legacy_support_v4",
- "//third_party:autovalue",
- "//third_party:camerax_core",
- "//third_party:camerax_camera2",
- "//third_party:camerax_lifecycle",
- "@com_google_protobuf//:protobuf_javalite",
- "@maven//:com_google_code_findbugs_jsr305",
- "@maven//:com_google_flogger_flogger",
- "@maven//:com_google_flogger_flogger_system_backend",
- "@maven//:com_google_guava_guava",
- "@maven//:androidx_lifecycle_lifecycle_common",
- ] + select({
- "//conditions:default": [":" + name + "_jni_opencv_cc_lib"],
- "//mediapipe/framework/port:disable_opencv": [],
- "exclude_opencv_so_lib": [],
- }) + select({
- "//conditions:default": [],
- "enable_stats_logging": [
- "@maven//:com_google_android_datatransport_transport_api",
- "@maven//:com_google_android_datatransport_transport_backend_cct",
- "@maven//:com_google_android_datatransport_transport_runtime",
- ],
- }) + additional_deps,
- assets = assets,
- assets_dir = assets_dir,
- )
-
- _aar_with_jni(name, name + "_android_lib")
-
-def _mediapipe_proto(name):
- """Generates MediaPipe java proto libraries.
-
- Args:
- name: the name of the target.
- """
- _proto_java_src_generator(
- name = "mediapipe_log_extension_proto",
- proto_src = "mediapipe/util/analytics/mediapipe_log_extension.proto",
- java_lite_out = "com/google/mediapipe/proto/MediaPipeLoggingProto.java",
- srcs = ["//mediapipe/util/analytics:protos_src"],
- )
-
- _proto_java_src_generator(
- name = "mediapipe_logging_enums_proto",
- proto_src = "mediapipe/util/analytics/mediapipe_logging_enums.proto",
- java_lite_out = "com/google/mediapipe/proto/MediaPipeLoggingEnumsProto.java",
- srcs = ["//mediapipe/util/analytics:protos_src"],
- )
-
- _proto_java_src_generator(
- name = "calculator_proto",
- proto_src = "mediapipe/framework/calculator.proto",
- java_lite_out = "com/google/mediapipe/proto/CalculatorProto.java",
- srcs = ["//mediapipe/framework:protos_src"],
- )
-
- _proto_java_src_generator(
- name = "landmark_proto",
- proto_src = "mediapipe/framework/formats/landmark.proto",
- java_lite_out = "com/google/mediapipe/formats/proto/LandmarkProto.java",
- srcs = ["//mediapipe/framework/formats:protos_src"],
- )
-
- _proto_java_src_generator(
- name = "rasterization_proto",
- proto_src = "mediapipe/framework/formats/annotation/rasterization.proto",
- java_lite_out = "com/google/mediapipe/formats/annotation/proto/RasterizationProto.java",
- srcs = ["//mediapipe/framework/formats/annotation:protos_src"],
- )
-
- _proto_java_src_generator(
- name = "location_data_proto",
- proto_src = "mediapipe/framework/formats/location_data.proto",
- java_lite_out = "com/google/mediapipe/formats/proto/LocationDataProto.java",
- srcs = [
- "//mediapipe/framework/formats:protos_src",
- "//mediapipe/framework/formats/annotation:protos_src",
- ],
- )
-
- _proto_java_src_generator(
- name = "detection_proto",
- proto_src = "mediapipe/framework/formats/detection.proto",
- java_lite_out = "com/google/mediapipe/formats/proto/DetectionProto.java",
- srcs = [
- "//mediapipe/framework/formats:protos_src",
- "//mediapipe/framework/formats/annotation:protos_src",
- ],
- )
-
- _proto_java_src_generator(
- name = "classification_proto",
- proto_src = "mediapipe/framework/formats/classification.proto",
- java_lite_out = "com/google/mediapipe/formats/proto/ClassificationProto.java",
- srcs = [
- "//mediapipe/framework/formats:protos_src",
- ],
- )
-
-def _proto_java_src_generator(name, proto_src, java_lite_out, srcs = []):
- native.genrule(
- name = name + "_proto_java_src_generator",
- srcs = srcs + [
- "@com_google_protobuf//:lite_well_known_protos",
- ],
- outs = [java_lite_out],
- cmd = "$(location @com_google_protobuf//:protoc) " +
- "--proto_path=. --proto_path=$(GENDIR) " +
- "--proto_path=$$(pwd)/external/com_google_protobuf/src " +
- "--java_out=lite:$(GENDIR) " + proto_src + " && " +
- "mv $(GENDIR)/" + java_lite_out + " $$(dirname $(location " + java_lite_out + "))",
- tools = [
- "@com_google_protobuf//:protoc",
- ],
- )
-
-def _mediapipe_jni(name, gen_libmediapipe, calculators = []):
- """Generates MediaPipe jni library.
-
- Args:
- name: the name of the target.
- gen_libmediapipe: whether to generate libmediapipe_jni.so. Default to True.
- calculators: the calculator libraries to be compiled into the jni library.
- """
- if gen_libmediapipe:
- native.cc_binary(
- name = "libmediapipe_jni.so",
- linkshared = 1,
- linkstatic = 1,
- deps = [
- "//mediapipe/java/com/google/mediapipe/framework/jni:mediapipe_framework_jni",
- ] + calculators,
- )
-
- native.cc_library(
- name = name + "_cc_lib",
- srcs = [":libmediapipe_jni.so"],
- alwayslink = 1,
- )
-
- native.cc_library(
- name = name + "_opencv_cc_lib",
- srcs = select({
- "//mediapipe:android_arm64": ["@android_opencv//:libopencv_java3_so_arm64-v8a"],
- "//mediapipe:android_armeabi": ["@android_opencv//:libopencv_java3_so_armeabi-v7a"],
- "//mediapipe:android_arm": ["@android_opencv//:libopencv_java3_so_armeabi-v7a"],
- "//mediapipe:android_x86": ["@android_opencv//:libopencv_java3_so_x86"],
- "//mediapipe:android_x86_64": ["@android_opencv//:libopencv_java3_so_x86_64"],
- "//conditions:default": [],
- }),
- alwayslink = 1,
- )
-
-def _aar_with_jni(name, android_library):
- # Generates dummy AndroidManifest.xml for dummy apk usage
- # (dummy apk is generated by _dummy_app target below)
- native.genrule(
- name = name + "_binary_manifest_generator",
- outs = [name + "_generated_AndroidManifest.xml"],
- cmd = """
-cat > $(OUTS) <
-
-
-EOF
-""",
- )
-
- # Generates dummy apk including .so files.
- # We extract out .so files and throw away the apk.
- android_binary(
- name = name + "_dummy_app",
- manifest = name + "_generated_AndroidManifest.xml",
- custom_package = "dummy.package.for.so",
- multidex = "native",
- deps = [android_library],
- )
-
- native.genrule(
- name = name,
- srcs = [android_library + ".aar", name + "_dummy_app_unsigned.apk"],
- outs = [name + ".aar"],
- tags = ["manual"],
- cmd = """
-cp $(location {}.aar) $(location :{}.aar)
-chmod +w $(location :{}.aar)
-origdir=$$PWD
-cd $$(mktemp -d)
-unzip $$origdir/$(location :{}_dummy_app_unsigned.apk) "lib/*"
-cp -r lib jni
-zip -r $$origdir/$(location :{}.aar) jni/*/*.so
-""".format(android_library, name, name, name, name),
- )