diff --git a/WORKSPACE b/WORKSPACE index 82d3c12b3..0639591ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -415,6 +415,7 @@ maven_install( "com.google.guava:listenablefuture:1.0", "junit:junit:4.12", "org.hamcrest:hamcrest-library:1.3", + "com.afollestad.material-dialogs:core:0.9.6.0", ], fetch_sources = True, repositories = [ diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD index c473aca26..93d0fb0bf 100644 --- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD @@ -25,7 +25,7 @@ android_binary( "applicationId": "com.google.mediapipe.examples.posetracking_lindera", }, multidex = "native", - resource_files = ["//mediapipe/examples/android/solutions:resource_files"], + resource_files = [":resource_files"], deps = [ "//mediapipe/framework/formats:detection_java_proto_lite", "//mediapipe/framework/formats:landmark_java_proto_lite", @@ -48,5 +48,12 @@ android_binary( "@maven//:androidx_exifinterface_exifinterface", "@maven//:androidx_fragment_fragment", "@maven//:com_google_guava_guava", + "@maven//:com_afollestad_material_dialogs_core", ], ) + +filegroup( + name = "resource_files", + srcs = glob(["res/**"]), + # visibility = ["//mediapipe/examples/android/solutions:__subpackages__"], +) diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java index c7ae4a98d..304c4bacc 100644 --- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java @@ -15,17 +15,24 @@ package com.google.mediapipe.examples.posetracking_lindera; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; +import android.widget.ProgressBar; import androidx.appcompat.app.AppCompatActivity; +import com.afollestad.materialdialogs.MaterialDialog; import com.google.mediapipe.solutions.lindera.CameraRotation; import com.google.mediapipe.solutions.lindera.ComputerVisionPlugin; import com.google.mediapipe.solutions.lindera.Lindera; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** @@ -47,8 +54,8 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); - disableRedundantUI(); - + findViewById(R.id.button_set_model).setVisibility(View.GONE); + findViewById(R.id.button_toggle_landmarks).setVisibility(View.GONE); setupLiveDemoUiComponents(); plugin = new ComputerVisionPluginImpl(); lindera = new Lindera(plugin); @@ -65,45 +72,125 @@ public class MainActivity extends AppCompatActivity { */ private void setupLiveDemoUiComponents() { - Button startCameraButton = findViewById(R.id.button_start_camera); + Button startDetectionButton = findViewById(R.id.button_start_detection); + Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks); + Button modelComplexity = findViewById(R.id.button_set_model); FrameLayout frameLayout = findViewById(R.id.preview_display_layout); - - startCameraButton.setOnClickListener( + startDetectionButton.setOnClickListener( v -> { // startCameraButton.setVisibility(View.GONE); if (!isLinderaInitialized) { - lindera.initialize(frameLayout, MainActivity.this); - isLinderaInitialized = true; - startCameraButton.setText("STOP CAMERA"); + 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); + updateLandmarkButtonText(); + updateModelComplexityButtonText(); + }); - } else { - - if (isDetectionStarted) { - startCameraButton.setText(R.string.start_camera); - - - lindera.stopDetection(); - } else { - lindera.startDetection(); - startCameraButton.setText("STOP CAMERA"); - - } } isDetectionStarted = !isDetectionStarted; }); - } - /** - * Disables unecesary UI buttons - */ - private void disableRedundantUI() { - findViewById(R.id.button_load_picture).setVisibility(View.GONE); - findViewById(R.id.button_load_video).setVisibility(View.GONE); + toggleLandmarks.setOnClickListener( + v ->{ + this.lindera.setLandmarksVisibility(!this.lindera.getLandmarkVisibility()); + updateLandmarkButtonText(); + } + ); + + 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/examples/android/solutions/posetracking-lindera/src/main/res b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res deleted file mode 120000 index fc8850136..000000000 --- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res +++ /dev/null @@ -1 +0,0 @@ -../../../res \ No newline at end of file diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..c7bd21dbd --- /dev/null +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..01f0af0ad --- /dev/null +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..ceca64dea --- /dev/null +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml @@ -0,0 +1,47 @@ + + + + +