diff --git a/app/src/main/assets/remote b/app/src/main/assets/remote index 028f5655c..947bcd449 160000 --- a/app/src/main/assets/remote +++ b/app/src/main/assets/remote @@ -1 +1 @@ -Subproject commit 028f5655ce698fa41eece4c8f09354fd179293c0 +Subproject commit 947bcd449aa0eeaebcec50e58fa220f3fdfe07bf diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Analysis.java b/app/src/main/java/de/rwth_aachen/phyphox/Analysis.java index dee9bc200..678f559d2 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Analysis.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Analysis.java @@ -9,7 +9,7 @@ import java.util.Iterator; import java.util.Vector; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; // The analysis class is used to to do math operations on dataBuffers diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothExperimentLoader.java b/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothExperimentLoader.java index 39e4382e3..268c4a6d3 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothExperimentLoader.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothExperimentLoader.java @@ -20,7 +20,7 @@ import java.io.FileOutputStream; import java.util.zip.CRC32; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; import de.rwth_aachen.phyphox.R; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothScanDialog.java b/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothScanDialog.java index c0cc12b2e..20603b7a9 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothScanDialog.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Bluetooth/BluetoothScanDialog.java @@ -30,7 +30,7 @@ import java.util.Set; import java.util.UUID; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; import de.rwth_aachen.phyphox.R; /** diff --git a/app/src/main/java/de/rwth_aachen/phyphox/DataExport.java b/app/src/main/java/de/rwth_aachen/phyphox/DataExport.java index e5afc6a3d..ab2d6bad0 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/DataExport.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/DataExport.java @@ -1,8 +1,8 @@ package de.rwth_aachen.phyphox; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.MIME_TYPE_CSV_MINI; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.MIME_TYPE_CSV_ZIP; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.MIME_TYPE_XLS; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.MIME_TYPE_CSV_MINI; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.MIME_TYPE_CSV_ZIP; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.MIME_TYPE_XLS; import android.app.Activity; import android.app.AlertDialog; @@ -41,7 +41,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import de.rwth_aachen.phyphox.Helper.DataExportUtility; +import de.rwth_aachen.phyphox.helper.DataExportUtility; //The DataExport class provides export functionality for a phyphoxExperiment. //it provides multiple export formats and the dialogs to control them diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExpView.java b/app/src/main/java/de/rwth_aachen/phyphox/ExpView.java index 8afa6c326..3dfc9bf2c 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExpView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExpView.java @@ -23,6 +23,7 @@ import android.text.TextPaint; import android.text.method.DigitsKeyListener; import android.text.style.MetricAffectingSpan; +import android.transition.Visibility; import android.util.Log; import android.util.TypedValue; import android.view.ContextThemeWrapper; @@ -66,13 +67,13 @@ import java.util.Locale; import java.util.Vector; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; import de.rwth_aachen.phyphox.camera.CameraPreviewFragment; import de.rwth_aachen.phyphox.camera.Scrollable; import de.rwth_aachen.phyphox.camera.depth.DepthInput; import de.rwth_aachen.phyphox.camera.depth.DepthPreview; -import de.rwth_aachen.phyphox.Helper.DecimalTextWatcher; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.DecimalTextWatcher; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.NetworkConnection.NetworkConnection; import de.rwth_aachen.phyphox.NetworkConnection.NetworkService; import de.rwth_aachen.phyphox.camera.model.CameraSettingLevel; @@ -343,17 +344,23 @@ protected void onViewSelected(boolean parentViewIsVisible) { } private void updateViewElementVisibility(){ - if(visibilityBuffer != null){ - if(visibilityBuffer.value <= 0 || visibilityBuffer.size == 0){ - if (state == State.maximized) { - //This prevents from leaving the user with an entirely empty UI, when an element might be maximized while it becomes hidden. - restore(); - } else { - rootView.setVisibility(GONE); - } + if(rootView == null){ + return; + } + if(visibilityBuffer == null){ + return; + } + + boolean shouldBeVisible = visibilityBuffer.value > 0 && visibilityBuffer.size > 0 && !Double.isNaN(visibilityBuffer.value); + if(shouldBeVisible){ + rootView.setVisibility(VISIBLE); + } else { + if (state == State.maximized) { + //This prevents from leaving the user with an entirely empty UI, when an element might be maximized while it becomes hidden. + restore(); } else { - rootView.setVisibility(VISIBLE); + rootView.setVisibility(GONE); } } } @@ -574,10 +581,10 @@ protected String createViewHTML(){ @Override //We just have to send calculated value and the unit to the textView protected void onMayReadFromBuffers(PhyphoxExperiment experiment) { + super.onMayReadFromBuffers(experiment); if (!needsUpdate) return; needsUpdate = false; - super.onMayReadFromBuffers(experiment); double x = experiment.getBuffer(inputs.get(0)).value; if (tv != null) { String vStr = ""; @@ -1398,10 +1405,10 @@ else if (!inputs.get(i).isEmpty) @Override protected void onMayReadFromBuffers(PhyphoxExperiment experiment) { + super.onMayReadFromBuffers(experiment); if (!needsUpdate) return; needsUpdate = false; - super.onMayReadFromBuffers(experiment); if(dynamicBuffer == null){ return; @@ -1912,10 +1919,10 @@ protected String createViewHTML(){ @Override protected void onMayReadFromBuffers(PhyphoxExperiment experiment) { + super.onMayReadFromBuffers(experiment); if (!needsUpdate) return; needsUpdate = false; - super.onMayReadFromBuffers(experiment); for (int i = 0; i < inputs.size(); i+=2) { if (inputs.size() > i+1) { DataBuffer x = experiment.getBuffer(inputs.get(i+1)); @@ -3347,10 +3354,10 @@ protected double getValue() { @Override protected void onMayReadFromBuffers(PhyphoxExperiment experiment) { + super.onMayReadFromBuffers(experiment); if (!needsUpdate || triggered || autoCompleteTextView == null) return; needsUpdate = false; - super.onMayReadFromBuffers(experiment); double x = experiment.getBuffer(inputs.get(0)).value; int index= -1; @@ -3694,10 +3701,10 @@ protected boolean onMayWriteToBuffers(PhyphoxExperiment experiment) { @Override protected void onMayReadFromBuffers(PhyphoxExperiment experiment) { + super.onMayReadFromBuffers(experiment); if (!needsUpdate || triggered) return; needsUpdate = false; - super.onMayReadFromBuffers(experiment); if (inputs.size() == 0) return; double value = experiment.getBuffer(inputs.get(0)).value; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExpViewFragment.java b/app/src/main/java/de/rwth_aachen/phyphox/ExpViewFragment.java index 4db32f5ee..105ec83f1 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExpViewFragment.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExpViewFragment.java @@ -3,6 +3,8 @@ import android.animation.LayoutTransition; import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; @@ -12,6 +14,7 @@ import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; public class ExpViewFragment extends Fragment { @@ -112,6 +115,11 @@ public void onCreate(Bundle savedInstanceState) { } } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + } + public void recreateView() { if (root == null) return; @@ -169,11 +177,17 @@ public void onFocusChange(View v, boolean hasFocus) { @Override public void onResume() { super.onResume(); + if(getActivity() == null){ + return; + } recreateView(); } public void onPause() { super.onPause(); + if(getActivity() == null){ + return; + } if (((Experiment)getActivity()).experiment != null && ((Experiment)getActivity()).experiment.experimentViews.size() > index) { for (ExpView.expViewElement element : ((Experiment) getActivity()).experiment.experimentViews.elementAt(index).elements) { element.destroyView(); diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Experiment.java b/app/src/main/java/de/rwth_aachen/phyphox/Experiment.java index ad7117afc..febabe461 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Experiment.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Experiment.java @@ -2,9 +2,9 @@ import static de.rwth_aachen.phyphox.ExperimentList.model.Const.EXPERIMENT_PRESELECTED_BLUETOOTH_ADDRESS; import static de.rwth_aachen.phyphox.ExperimentList.model.Const.PREFS_NAME; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.MIME_TYPE_CSV_ZIP; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.MIME_TYPE_PHYPHOX; -import static de.rwth_aachen.phyphox.Helper.DataExportUtility.REQUEST_WRITE_EXTERNAL_STORAGE; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.MIME_TYPE_CSV_ZIP; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.MIME_TYPE_PHYPHOX; +import static de.rwth_aachen.phyphox.helper.DataExportUtility.REQUEST_WRITE_EXTERNAL_STORAGE; import android.annotation.SuppressLint; import android.app.Activity; @@ -105,11 +105,11 @@ import de.rwth_aachen.phyphox.Bluetooth.ConnectedBluetoothDeviceInfoAdapter; import de.rwth_aachen.phyphox.Bluetooth.ConnectedDeviceInfo; import de.rwth_aachen.phyphox.Bluetooth.UpdateConnectedDeviceDelegate; -import de.rwth_aachen.phyphox.Helper.DataExportUtility; -import de.rwth_aachen.phyphox.Helper.WindowInsetHelper; +import de.rwth_aachen.phyphox.helper.DataExportUtility; +import de.rwth_aachen.phyphox.helper.WindowInsetHelper; import de.rwth_aachen.phyphox.camera.depth.DepthInput; -import de.rwth_aachen.phyphox.Helper.DecimalTextWatcher; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.DecimalTextWatcher; +import de.rwth_aachen.phyphox.helper.Helper; import de.rwth_aachen.phyphox.NetworkConnection.NetworkConnection; // Experiments are performed in this activity, which reacts to various intents. diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ExperimentListActivity.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ExperimentListActivity.java index 76073da3a..7892b3a13 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ExperimentListActivity.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ExperimentListActivity.java @@ -97,9 +97,9 @@ import de.rwth_aachen.phyphox.ExperimentList.datasource.ExperimentRepository; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentShortInfo; import de.rwth_aachen.phyphox.ExperimentList.handler.SimpleExperimentCreator; -import de.rwth_aachen.phyphox.Helper.Helper; -import de.rwth_aachen.phyphox.Helper.ReportingScrollView; -import de.rwth_aachen.phyphox.Helper.WindowInsetHelper; +import de.rwth_aachen.phyphox.helper.Helper; +import de.rwth_aachen.phyphox.helper.ReportingScrollView; +import de.rwth_aachen.phyphox.helper.WindowInsetHelper; import de.rwth_aachen.phyphox.PhyphoxFile; import de.rwth_aachen.phyphox.R; import de.rwth_aachen.phyphox.SensorInput; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/AssetExperimentLoader.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/AssetExperimentLoader.java index aed76a6c8..b0dec1366 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/AssetExperimentLoader.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/AssetExperimentLoader.java @@ -33,17 +33,17 @@ import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentListEnvironment; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentLoadInfoData; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentShortInfo; -import de.rwth_aachen.phyphox.Helper.baseColorDrawable.BaseColorDrawable; -import de.rwth_aachen.phyphox.Helper.baseColorDrawable.BitmapIcon; +import de.rwth_aachen.phyphox.helper.baseColorDrawable.BaseColorDrawable; +import de.rwth_aachen.phyphox.helper.baseColorDrawable.BitmapIcon; import de.rwth_aachen.phyphox.Bluetooth.Bluetooth; import de.rwth_aachen.phyphox.ExperimentList.ui.ExperimentsInCategory; import de.rwth_aachen.phyphox.GpsInput; -import de.rwth_aachen.phyphox.Helper.Helper; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.Helper; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.R; import de.rwth_aachen.phyphox.SensorInput; -import de.rwth_aachen.phyphox.Helper.baseColorDrawable.TextIcon; -import de.rwth_aachen.phyphox.Helper.baseColorDrawable.VectorIcon; +import de.rwth_aachen.phyphox.helper.baseColorDrawable.TextIcon; +import de.rwth_aachen.phyphox.helper.baseColorDrawable.VectorIcon; import de.rwth_aachen.phyphox.camera.depth.DepthInput; import de.rwth_aachen.phyphox.camera.helper.CameraHelper; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/ExperimentRepository.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/ExperimentRepository.java index 0731b994f..5ac4dbf50 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/ExperimentRepository.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/datasource/ExperimentRepository.java @@ -19,7 +19,7 @@ import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentListEnvironment; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentShortInfo; import de.rwth_aachen.phyphox.ExperimentList.ui.ExperimentsInCategory; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; import de.rwth_aachen.phyphox.R; public class ExperimentRepository{ diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/model/ExperimentShortInfo.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/model/ExperimentShortInfo.java index daa021595..9791b6d67 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/model/ExperimentShortInfo.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/model/ExperimentShortInfo.java @@ -9,7 +9,7 @@ import java.util.UUID; import java.util.Vector; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; public class ExperimentShortInfo { public RGB color; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentItemAdapter.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentItemAdapter.java index a8537ce0f..947ba3d0d 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentItemAdapter.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentItemAdapter.java @@ -40,12 +40,12 @@ import java.util.Vector; import de.rwth_aachen.phyphox.BuildConfig; -import de.rwth_aachen.phyphox.Helper.DataExportUtility; +import de.rwth_aachen.phyphox.helper.DataExportUtility; import de.rwth_aachen.phyphox.Experiment; import de.rwth_aachen.phyphox.ExperimentList.datasource.ExperimentRepository; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentShortInfo; -import de.rwth_aachen.phyphox.Helper.Helper; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.Helper; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.R; //This adapter is used to fill the gridView of the categories in the experiment list. diff --git a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentsInCategory.java b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentsInCategory.java index 97f9a24a0..576645074 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentsInCategory.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/ExperimentList/ui/ExperimentsInCategory.java @@ -22,7 +22,7 @@ import de.rwth_aachen.phyphox.ExperimentList.datasource.ExperimentRepository; import de.rwth_aachen.phyphox.ExperimentList.model.ExperimentShortInfo; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.R; import de.rwth_aachen.phyphox.camera.helper.CameraHelper; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/GraphView.java b/app/src/main/java/de/rwth_aachen/phyphox/GraphView.java index 44a69821b..799f44da9 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/GraphView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/GraphView.java @@ -25,7 +25,7 @@ import java.util.TimeZone; import java.util.Vector; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; //The graphView class implements an Android view which displays a data graph diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/DataExportUtility.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/DataExportUtility.java index 923848b72..0f30383f7 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/DataExportUtility.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/DataExportUtility.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import android.app.Activity; import android.content.ComponentName; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/DecimalTextWatcher.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/DecimalTextWatcher.java index b7d166ce5..9f94e0202 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/DecimalTextWatcher.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/DecimalTextWatcher.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import android.text.Editable; import android.text.TextWatcher; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/Helper.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/Helper.java index 004f49c72..8a1aa6746 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/Helper.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/Helper.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import static android.content.Context.BATTERY_SERVICE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; @@ -30,6 +30,7 @@ import android.util.Base64; import android.util.DisplayMetrics; import android.util.Log; +import android.view.OrientationEventListener; import android.view.PixelCopy; import android.view.Surface; import android.view.View; @@ -72,6 +73,7 @@ import de.rwth_aachen.phyphox.PlotAreaView; import de.rwth_aachen.phyphox.R; import de.rwth_aachen.phyphox.SettingsActivity.SettingsFragment; +import de.rwth_aachen.phyphox.camera.DeviceOrientation; public abstract class Helper { @@ -631,5 +633,20 @@ else if (context instanceof ContextWrapper) return null; } + public static DeviceOrientation getOrientationFromAngle(int angle) { + if (angle == OrientationEventListener.ORIENTATION_UNKNOWN) { + return DeviceOrientation.PORTRAIT; + } + + if (angle >= 315 || angle < 45) { + return DeviceOrientation.PORTRAIT; + } else if (angle >= 45 && angle < 135) { + return DeviceOrientation.LANDSCAPE_REVERSE; + } else if (angle >= 135 && angle < 225) { + return DeviceOrientation.PORTRAIT_REVERSE; + } else { // angle >= 225 && angle < 315 + return DeviceOrientation.LANDSCAPE; + } + } } diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/RGB.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/RGB.java index d5561c473..287b0d6b5 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/RGB.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/RGB.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import android.content.res.Resources; import android.util.Log; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/ReportingScrollView.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/ReportingScrollView.java index c2f844735..5e93db19d 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/ReportingScrollView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/ReportingScrollView.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import android.content.Context; import android.util.AttributeSet; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/WindowInsetHelper.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/WindowInsetHelper.java index 6e0011a6b..1a563ef28 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/WindowInsetHelper.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/WindowInsetHelper.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper; +package de.rwth_aachen.phyphox.helper; import android.app.Activity; import android.util.Log; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BaseColorDrawable.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BaseColorDrawable.java index 5fe5c96b2..a01e248f5 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BaseColorDrawable.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BaseColorDrawable.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper.baseColorDrawable; +package de.rwth_aachen.phyphox.helper.baseColorDrawable; import android.content.Context; import android.graphics.ColorFilter; @@ -8,7 +8,7 @@ import androidx.core.content.ContextCompat; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.R; //This is the base class of our experiment icons. It is basically just stuff drawn on a colored background. diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BitmapIcon.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BitmapIcon.java index 006a503e1..3c9cff000 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BitmapIcon.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/BitmapIcon.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper.baseColorDrawable; +package de.rwth_aachen.phyphox.helper.baseColorDrawable; import android.content.Context; import android.graphics.Bitmap; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/TextIcon.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/TextIcon.java index 83651d5af..f71e68b12 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/TextIcon.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/TextIcon.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper.baseColorDrawable; +package de.rwth_aachen.phyphox.helper.baseColorDrawable; import android.content.Context; import android.graphics.Canvas; @@ -7,12 +7,12 @@ import androidx.core.content.ContextCompat; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.R; //The class TextIcon is a drawable that displays up to three characters in a rectangle as a //substitution icon, used if an experiment does not have its own icon -public class TextIcon extends BaseColorDrawable { +public class TextIcon extends de.rwth_aachen.phyphox.helper.baseColorDrawable.BaseColorDrawable { private final String text; //The characters too be displayed private final Paint paint; //The paint for the characters diff --git a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/VectorIcon.java b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/VectorIcon.java index fa3e116cd..e9c212d0c 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/VectorIcon.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/Helper/baseColorDrawable/VectorIcon.java @@ -1,4 +1,4 @@ -package de.rwth_aachen.phyphox.Helper.baseColorDrawable; +package de.rwth_aachen.phyphox.helper.baseColorDrawable; import android.content.Context; import android.graphics.Canvas; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/InteractiveGraphView.java b/app/src/main/java/de/rwth_aachen/phyphox/InteractiveGraphView.java index d1b976f80..884b5657f 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/InteractiveGraphView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/InteractiveGraphView.java @@ -41,7 +41,7 @@ import java.util.ArrayList; import java.util.List; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; public class InteractiveGraphView extends RelativeLayout implements GraphView.PointInfo, SpectroscopyCalibrationManager.SpectroscopyCalibrationDelegate { @@ -100,7 +100,6 @@ public void set(float viewX, float viewY, float dataX, float dataY, float dataZ) TextView popupWindowText = null; MarkerOverlayView markerOverlayView; private SpectroscopyCalibrationManager spectroscopyCalibrationManager; - private TextView spectroscopyStatusLabel; private List calibrationMarkerViews = new ArrayList<>(); private boolean needsCalibrationMarkerUpdate = false; @@ -156,14 +155,6 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { return true; case R.id.graph_tools_calibrate: removePopUpAndMarkerOverlayView(); - Log.d("Interactive", "calibrationMode"+calibrationMode); - Log.d("Interactive", "calibrationMarkerViews"+calibrationMarkerViews.size()); - if(calibrationMarkerViews.size() > 0){ - Log.d("Interactive", "calibrationMarkerViews"+calibrationMarkerViews.get(0).getVisibility()); - } - - Log.d("Interactive", "enableCalibrationMode"+enableCalibrationMode); - Log.d("Interactive", "marker"+marker.length); graphView.setTouchMode(GraphView.TouchMode.calibrate); if(!graphView.isSpectroscopyCalibrated) spectroscopyCalibrationManager.resetCalibration(); return true; @@ -750,6 +741,9 @@ else if (marker[0].active && marker[1].active) { } else if (marker[0].active || marker[1].active) { + if(graphView.isSpectroscopyCalibrated){ + return; + } int pos[] = new int[2]; graphView.getLocationInWindow(pos); @@ -826,13 +820,10 @@ public void setCalibrationMode(SpectroscopyCalibrationManager.CalibrationMode ca this.calibrationMode = calibrationMode; this.enableCalibrationMode = true; } else { + this.enableCalibrationMode = false; return; } - spectroscopyStatusLabel = createStatusLabel(context); - spectroscopyStatusLabel.setText(getResources().getString(R.string.calibration_invalid)); - graphFrame.addView(spectroscopyStatusLabel); - if(spectroscopyCalibrationManager == null){ spectroscopyCalibrationManager = new SpectroscopyCalibrationManager(context, parent); spectroscopyCalibrationManager.setDelegate(this); @@ -858,16 +849,12 @@ public void setInterceptBuffer(DataBuffer interceptBuffer){ @Override public void spectroscopyUnCalibrated(SpectroscopyCalibrationManager manager) { - spectroscopyStatusLabel.setText(""); - spectroscopyStatusLabel.setVisibility(GONE); clearCalibrationMarkers(); markerOverlayView.update(null, null); } @Override public void spectroscopyCalibrationDidStart(SpectroscopyCalibrationManager manager) { - spectroscopyStatusLabel.setText(getResources().getString(R.string.spectroscopy_tap_first_point)); - spectroscopyStatusLabel.setVisibility(VISIBLE); clearCalibrationMarkers(); markerOverlayView.update(null, null); graphView.resetPicks(); @@ -881,11 +868,9 @@ public void spectroscopyCalibrationDidUpdatePoints(SpectroscopyCalibrationManage switch (state) { case FIRST_POINT_SELECTED: - spectroscopyStatusLabel.setText(getResources().getString(R.string.spectroscopy_tap_second_point)); showCalibrationPointMarkers(points); break; case SECOND_POINT_SELECTED: - spectroscopyStatusLabel.setText(getResources().getString(R.string.spectroscopy_calculating)); showCalibrationPointMarkers(points); break; default: @@ -896,11 +881,6 @@ public void spectroscopyCalibrationDidUpdatePoints(SpectroscopyCalibrationManage @Override public void spectroscopyCalibrationDidComplete(SpectroscopyCalibrationManager manager, double slope, double intercept) { - String calibrationInfo = manager.getCalibrationInfo(); - if (calibrationInfo != null) { - spectroscopyStatusLabel.setText(calibrationInfo); - } - markerOverlayView.update(null, null); updateCalibrationParametersBuffer(slope,intercept); @@ -912,7 +892,6 @@ public void spectroscopyCalibrationDidComplete(SpectroscopyCalibrationManager ma @Override public void spectroscopyCalibrationDidReset(SpectroscopyCalibrationManager manager) { - spectroscopyStatusLabel.setText(getResources().getString(R.string.spectroscopy_tap_first_point)); clearCalibrationMarkers(); markerOverlayView.update(null, null); graphView.resetPicks(); @@ -934,8 +913,6 @@ public void spectroscopyCalibrationShouldPresentDialog(SpectroscopyCalibrationMa @Override public void spectroscopyDidFailWithError(SpectroscopyCalibrationManager manager, String error) { - spectroscopyStatusLabel.setText(getResources().getString(R.string.spectroscopy_calibration_failed)); - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(getResources().getString(R.string.error)) .setMessage(error) diff --git a/app/src/main/java/de/rwth_aachen/phyphox/MarkerOverlayView.java b/app/src/main/java/de/rwth_aachen/phyphox/MarkerOverlayView.java index f8701856d..4a7218731 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/MarkerOverlayView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/MarkerOverlayView.java @@ -8,7 +8,7 @@ import android.util.AttributeSet; import android.view.View; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; public class MarkerOverlayView extends View { diff --git a/app/src/main/java/de/rwth_aachen/phyphox/PhyphoxFile.java b/app/src/main/java/de/rwth_aachen/phyphox/PhyphoxFile.java index 7bb4f4e2d..0cd5acd60 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/PhyphoxFile.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/PhyphoxFile.java @@ -61,8 +61,8 @@ import de.rwth_aachen.phyphox.camera.helper.CameraHelper; import de.rwth_aachen.phyphox.camera.CameraInput; import de.rwth_aachen.phyphox.camera.depth.DepthInput; -import de.rwth_aachen.phyphox.Helper.Helper; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.Helper; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.NetworkConnection.Mqtt.MqttCsv; import de.rwth_aachen.phyphox.NetworkConnection.Mqtt.MqttJson; import de.rwth_aachen.phyphox.NetworkConnection.Mqtt.MqttTlsCsv; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/PlotAreaView.java b/app/src/main/java/de/rwth_aachen/phyphox/PlotAreaView.java index 7122fd444..d08cebfba 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/PlotAreaView.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/PlotAreaView.java @@ -24,7 +24,7 @@ import javax.microedition.khronos.egl.EGLDisplay; import javax.microedition.khronos.egl.EGLSurface; -import de.rwth_aachen.phyphox.Helper.Helper; +import de.rwth_aachen.phyphox.helper.Helper; public class PlotAreaView extends TextureView { diff --git a/app/src/main/java/de/rwth_aachen/phyphox/SettingsActivity/SettingsActivity.java b/app/src/main/java/de/rwth_aachen/phyphox/SettingsActivity/SettingsActivity.java index 4e74c56a0..b5f356492 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/SettingsActivity/SettingsActivity.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/SettingsActivity/SettingsActivity.java @@ -12,8 +12,8 @@ import android.view.ViewGroup; -import de.rwth_aachen.phyphox.Helper.Helper; -import de.rwth_aachen.phyphox.Helper.WindowInsetHelper; +import de.rwth_aachen.phyphox.helper.Helper; +import de.rwth_aachen.phyphox.helper.WindowInsetHelper; import de.rwth_aachen.phyphox.R; diff --git a/app/src/main/java/de/rwth_aachen/phyphox/SpectroscopyCalibrationManager.java b/app/src/main/java/de/rwth_aachen/phyphox/SpectroscopyCalibrationManager.java index 7a6acc44c..3712b4cbe 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/SpectroscopyCalibrationManager.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/SpectroscopyCalibrationManager.java @@ -6,15 +6,20 @@ import android.content.Context; import android.content.DialogInterface; import android.text.InputType; +import android.view.OrientationEventListener; +import android.view.WindowManager; import android.widget.EditText; import androidx.appcompat.app.AlertDialog; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; +import de.rwth_aachen.phyphox.camera.analyzer.SpectrumOrientation; + public class SpectroscopyCalibrationManager { public enum CalibrationState { @@ -254,20 +259,6 @@ public void resetCalibration() { } } - public String getCalibrationInfo() { - if (calibrationParameters == null) { - return null; - } - - DecimalFormat formatter = new DecimalFormat("#.####"); - formatter.setMinimumFractionDigits(2); - - String slopeStr = formatter.format(calibrationParameters.slope); - String interceptStr = formatter.format(calibrationParameters.intercept); - - return "Calibrated: a- " + slopeStr + ", b- " + interceptStr; - } - // Helper method for getting localized strings private String getString(String key) { int resId = context.getResources().getIdentifier(key, "string", context.getPackageName()); @@ -323,3 +314,7 @@ public static void manageCalibrationPoints(List array, int currentCount, } } } + + + + diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/CameraPreviewFragment.kt b/app/src/main/java/de/rwth_aachen/phyphox/camera/CameraPreviewFragment.kt index 903d1f743..e5a3f6819 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/CameraPreviewFragment.kt +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/CameraPreviewFragment.kt @@ -3,13 +3,15 @@ package de.rwth_aachen.phyphox.camera import android.os.Build import android.os.Bundle import android.view.LayoutInflater +import android.view.OrientationEventListener import android.view.View import android.view.ViewGroup import androidx.annotation.RequiresApi import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import de.rwth_aachen.phyphox.Helper.RGB +import de.rwth_aachen.phyphox.helper.RGB +import de.rwth_aachen.phyphox.helper.Helper import de.rwth_aachen.phyphox.PhyphoxExperiment import de.rwth_aachen.phyphox.R import de.rwth_aachen.phyphox.camera.model.CameraSettingLevel @@ -44,6 +46,9 @@ class CameraPreviewFragment ( /* handles all the UI elements for camera preview */ private lateinit var cameraPreviewScreen: CameraPreviewScreen + private var orientationEventListener: OrientationEventListener? = null + private var currentOrientation = DeviceOrientation.PORTRAIT + /* tracks the current view state */ private val cameraScreenViewState = MutableStateFlow(CameraScreenViewState()) @@ -118,6 +123,25 @@ class CameraPreviewFragment ( } } } + + orientationEventListener = object : OrientationEventListener(context) { + override fun onOrientationChanged(angle: Int) { + val newOrientation: DeviceOrientation = Helper.getOrientationFromAngle(angle) + if(newOrientation == DeviceOrientation.PORTRAIT_REVERSE) return + + if (newOrientation !== currentOrientation) { + currentOrientation = newOrientation + cameraPreviewScreen.updateSpectrumOrientation(newOrientation) + } + } + } + } + + override fun onResume() { + super.onResume() + if (orientationEventListener!!.canDetectOrientation()) { + orientationEventListener?.enable(); + } } override fun onPause() { @@ -126,6 +150,11 @@ class CameraPreviewFragment ( cameraPreviewScreen.previewTextureView.visibility = View.GONE } + override fun onStop() { + super.onStop() + orientationEventListener?.disable(); + } + fun onPageVisibleToUser(visible: Boolean) { cameraPreviewScreen.visibleToUser = visible } @@ -138,3 +167,10 @@ interface Scrollable: Serializable { fun disableScrollable() } + +enum class DeviceOrientation { + PORTRAIT, + LANDSCAPE, + PORTRAIT_REVERSE, + LANDSCAPE_REVERSE +} diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/AnalyzingOpenGLRendererPreviewOutput.java b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/AnalyzingOpenGLRendererPreviewOutput.java index da37ac7b3..0f37d1e26 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/AnalyzingOpenGLRendererPreviewOutput.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/AnalyzingOpenGLRendererPreviewOutput.java @@ -33,7 +33,7 @@ import javax.microedition.khronos.egl.EGL10; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.camera.ui.CameraPreviewScreen; @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/HSVAnalyzer.java b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/HSVAnalyzer.java index 1e82c7772..b68135417 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/HSVAnalyzer.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/HSVAnalyzer.java @@ -20,7 +20,7 @@ import java.nio.ByteOrder; import de.rwth_aachen.phyphox.DataBuffer; -import de.rwth_aachen.phyphox.Helper.RGB; +import de.rwth_aachen.phyphox.helper.RGB; import de.rwth_aachen.phyphox.camera.model.CameraSettingState; @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/SpectrumOrientation.java b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/SpectrumOrientation.java index cb3c7bbb2..bcd08549e 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/SpectrumOrientation.java +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/analyzer/SpectrumOrientation.java @@ -1,9 +1,57 @@ package de.rwth_aachen.phyphox.camera.analyzer; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public enum SpectrumOrientation { VERTICAL_BLUE_UP, VERTICAL_RED_UP, HORIZONTAL_BLUE_RIGHT, HORIZONTAL_RED_RIGHT, - INVALID + INVALID; + + private static final List ROTATION_CYCLE = Arrays.asList( + SpectrumOrientation.HORIZONTAL_RED_RIGHT, + SpectrumOrientation.VERTICAL_RED_UP, + SpectrumOrientation.HORIZONTAL_BLUE_RIGHT, + SpectrumOrientation.VERTICAL_BLUE_UP + ); + + private static final Map INDEX_MAP; + + static { + Map map = new HashMap<>(); + for (int i = 0; i < ROTATION_CYCLE.size(); i++) { + map.put(ROTATION_CYCLE.get(i), i); + } + INDEX_MAP = Collections.unmodifiableMap(map); + } + + public SpectrumOrientation rotateCounterClockwise() { + Integer currentIndex = INDEX_MAP.get(this); + if (currentIndex == null) { + return this; + } + + int nextIndex = (currentIndex + 1) % ROTATION_CYCLE.size(); + + return ROTATION_CYCLE.get(nextIndex); + } + + public SpectrumOrientation rotateClockwise() { + + Integer currentIndex = INDEX_MAP.get(this); + if (currentIndex == null) { + return this; + } + + int previousIndex = (currentIndex - 1 + ROTATION_CYCLE.size()) % ROTATION_CYCLE.size(); + + return ROTATION_CYCLE.get(previousIndex); + } + } diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/helper/SpectrumDispersionManager.kt b/app/src/main/java/de/rwth_aachen/phyphox/camera/helper/SpectrumDispersionManager.kt new file mode 100644 index 000000000..b08b87c99 --- /dev/null +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/helper/SpectrumDispersionManager.kt @@ -0,0 +1,79 @@ +package de.rwth_aachen.phyphox.camera.helper + +import de.rwth_aachen.phyphox.camera.DeviceOrientation +import de.rwth_aachen.phyphox.camera.analyzer.SpectrumOrientation +import java.util.concurrent.ConcurrentHashMap +import kotlin.collections.set + +class SpectrumDispersionManager { + + var currentDeviceOrientation: DeviceOrientation = DeviceOrientation.PORTRAIT + private set + + var currentDispersionOrientation: SpectrumOrientation = SpectrumOrientation.HORIZONTAL_RED_RIGHT + private set + + private val userSelectedDispersionMap = ConcurrentHashMap() + + init { + userSelectedDispersionMap[DeviceOrientation.PORTRAIT] = SpectrumOrientation.HORIZONTAL_RED_RIGHT + } + + fun onUserDispersionSelected(chosenDispersion: SpectrumOrientation) { + userSelectedDispersionMap[currentDeviceOrientation] = chosenDispersion + currentDispersionOrientation = chosenDispersion + } + + fun onDeviceRotated(newDeviceOrientation: DeviceOrientation) { + if (newDeviceOrientation == currentDeviceOrientation) return + + val previousDeviceOrientation = currentDeviceOrientation + currentDeviceOrientation = newDeviceOrientation + + val baseDispersion = currentDispersionOrientation + + currentDispersionOrientation = when { + // PORTRAIT -> LANDSCAPE + previousDeviceOrientation == DeviceOrientation.PORTRAIT && newDeviceOrientation == DeviceOrientation.LANDSCAPE -> + baseDispersion.rotateClockwise() + + // LANDSCAPE -> PORTRAIT + previousDeviceOrientation == DeviceOrientation.LANDSCAPE && newDeviceOrientation == DeviceOrientation.PORTRAIT -> + baseDispersion.rotateCounterClockwise() + + // PORTRAIT -> REVERSE_LANDSCAPE + previousDeviceOrientation == DeviceOrientation.PORTRAIT && newDeviceOrientation == DeviceOrientation.LANDSCAPE_REVERSE -> + baseDispersion.rotateCounterClockwise() + + // REVERSE_LANDSCAPE -> PORTRAIT + previousDeviceOrientation == DeviceOrientation.LANDSCAPE_REVERSE && newDeviceOrientation == DeviceOrientation.PORTRAIT -> + baseDispersion.rotateClockwise() + + // LANDSCAPE -> REVERSE_LANDSCAPE (a 180-degree turn) + previousDeviceOrientation == DeviceOrientation.LANDSCAPE && newDeviceOrientation == DeviceOrientation.LANDSCAPE_REVERSE -> + baseDispersion.rotateClockwise().rotateClockwise() + + // REVERSE_LANDSCAPE -> LANDSCAPE (a 180-degree turn) + previousDeviceOrientation == DeviceOrientation.LANDSCAPE_REVERSE && newDeviceOrientation == DeviceOrientation.LANDSCAPE -> + baseDispersion.rotateClockwise().rotateClockwise() + + // Fallback for any other unhandled case + else -> getHardcodedDefaultFor(newDeviceOrientation) + } + + // IMPORTANT: Because we just calculated a *new* default, we save it as the preference for this orientation. + // This makes the behavior consistent if the user rotates away and back again. + userSelectedDispersionMap[newDeviceOrientation] = currentDispersionOrientation + } + + + private fun getHardcodedDefaultFor(orientation: DeviceOrientation): SpectrumOrientation { + return when (orientation) { + DeviceOrientation.PORTRAIT -> SpectrumOrientation.HORIZONTAL_RED_RIGHT + DeviceOrientation.LANDSCAPE -> SpectrumOrientation.VERTICAL_BLUE_UP + DeviceOrientation.LANDSCAPE_REVERSE -> SpectrumOrientation.VERTICAL_RED_UP + DeviceOrientation.PORTRAIT_REVERSE -> SpectrumOrientation.HORIZONTAL_BLUE_RIGHT + } + } + +} diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/CameraPreviewScreen.kt b/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/CameraPreviewScreen.kt index 1a2c17d3a..00413ac48 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/CameraPreviewScreen.kt +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/CameraPreviewScreen.kt @@ -11,6 +11,7 @@ import android.graphics.PorterDuff import android.graphics.RectF import android.os.Build import android.util.Log +import android.view.LayoutInflater import android.view.MotionEvent import android.view.Surface import android.view.TextureView @@ -18,32 +19,29 @@ import android.view.View import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.view.WindowManager import android.view.animation.AlphaAnimation -import android.widget.AdapterView -import android.widget.ArrayAdapter +import android.widget.Button import android.widget.FrameLayout import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.Spinner import android.widget.TextView import androidx.annotation.RequiresApi +import androidx.appcompat.app.AlertDialog import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.LinearLayoutCompat import androidx.camera.core.CameraSelector.LENS_FACING_BACK import androidx.camera.core.CameraSelector.LENS_FACING_FRONT import androidx.core.content.ContextCompat -import androidx.core.view.get import androidx.core.view.isVisible import androidx.lifecycle.findViewTreeLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.transition.Visibility import com.google.android.material.button.MaterialButton +import com.google.android.material.button.MaterialButtonToggleGroup import com.google.android.material.slider.Slider import com.google.common.util.concurrent.ListenableFuture -import de.rwth_aachen.phyphox.Helper.Helper -import de.rwth_aachen.phyphox.Helper.RGB +import de.rwth_aachen.phyphox.helper.Helper +import de.rwth_aachen.phyphox.helper.RGB import de.rwth_aachen.phyphox.MarkerOverlayView import de.rwth_aachen.phyphox.R import de.rwth_aachen.phyphox.camera.CameraInput @@ -68,6 +66,8 @@ import java.math.RoundingMode import java.text.DecimalFormat import kotlin.math.ln import kotlin.math.pow +import de.rwth_aachen.phyphox.camera.DeviceOrientation +import de.rwth_aachen.phyphox.camera.helper.SpectrumDispersionManager @RequiresApi(Build.VERSION_CODES.LOLLIPOP) @@ -78,8 +78,7 @@ class CameraPreviewScreen( private val toggleExclusive: () -> Boolean, val grayscale: Boolean, val markOverexposure: RGB?, - val markUnderexposure: RGB? -): AdapterView.OnItemSelectedListener { + val markUnderexposure: RGB?) { private val context: Context = root.context @@ -94,7 +93,7 @@ class CameraPreviewScreen( private val buttonMaximize: ImageView = root.findViewById(R.id.imageMaximize) private val buttonMinimize: ImageView = root.findViewById(R.id.imageMinimize) - private val spinnerSpectrumOrientation: Spinner = root.findViewById(R.id.btnSelectSpectroscopyOrientation) + private val btnAnalysisSetting: MaterialButton = root.findViewById(R.id.imgAnalysisSetting) private val lnrSpectrumOrientation: LinearLayoutCompat = root.findViewById(R.id.lnrSpectroscopyAnalysisControl) private val zoomSlider: Slider = root.findViewById(R.id.zoomSlider) @@ -159,6 +158,11 @@ class CameraPreviewScreen( var resizableState = ResizableViewModuleState.Normal + var isHorizontal = true + var isRedToBlue = false + + var orientationManager: SpectrumDispersionManager? = null + init { initializeAndSetupCameraDimension() @@ -229,9 +233,9 @@ class CameraPreviewScreen( } if(cameraInput.isFeatureSpectroscopy()){ - Log.d("CameraPreviewScreen","isFeatSpec") - createSpinnerForSpectrumOrientation() - spinnerSpectrumOrientation.onItemSelectedListener = this + lnrSpectrumOrientation.visibility = View.VISIBLE + orientationManager = SpectrumDispersionManager() + btnAnalysisSetting.setOnClickListener { openSpectrumAnalysisConfigurationDialog() } } } @@ -849,37 +853,133 @@ class CameraPreviewScreen( } } - fun createSpinnerForSpectrumOrientation(){ - lnrSpectrumOrientation.visibility = View.VISIBLE - ArrayAdapter.createFromResource( - context, - R.array.spectroscopy_orientation_array, - android.R.layout.simple_spinner_item - ).also { adapter -> - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - spinnerSpectrumOrientation.adapter = adapter + private fun openSpectrumAnalysisConfigurationDialog() { + + val dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_analysis_settings, null) + // Proper image resource needs to be created to add in this imageview. + val imageOrientation : ImageView = dialogView.findViewById(R.id.imgAnalysisOrientation) + val btnBR: Button = dialogView.findViewById(R.id.btnBR) + val btnRB: Button = dialogView.findViewById(R.id.btnRB) + val axisToggle: MaterialButtonToggleGroup = dialogView.findViewById(R.id.axisToggle) + val directionToggle: MaterialButtonToggleGroup = dialogView.findViewById(R.id.directionToggle) + + fun updateLabels() { + if (isHorizontal) { + btnBR.text = context.resources.getString(R.string.spectrum_left_to_right) + btnRB.text = context.resources.getString(R.string.spectrum_right_to_left) + } else { + btnBR.text = context.resources.getString(R.string.spectrum_bottom_to_top) + btnRB.text = context.resources.getString(R.string.spectrum_top_to_bottom) + } + } + + updateLabels() + + axisToggle.check(if (isHorizontal) R.id.btnHorizontal else R.id.btnVertical) + directionToggle.check(if (isRedToBlue) R.id.btnRB else R.id.btnBR) + + axisToggle.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (isChecked) { + isHorizontal = (checkedId == R.id.btnHorizontal) + updateLabels() + applySpectrumOrientationChanges() + imageOrientation.apply { + setImageResource(getSpectrumOrientationIcon(getSelectedSpectrumOrientation())) + } + } + } + + directionToggle.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (isChecked) { + isRedToBlue = (checkedId == R.id.btnRB) + applySpectrumOrientationChanges() + imageOrientation.apply { + setImageResource(getSpectrumOrientationIcon(getSelectedSpectrumOrientation())) + } + } + } + + AlertDialog.Builder(context) + .setView(dialogView) + .setPositiveButton(context.resources.getString(R.string.ok)) { dialog, _ -> dialog.dismiss() } + .create() + .show() + } + + fun getSelectedSpectrumOrientation() : SpectrumOrientation { + val orientation: SpectrumOrientation = if(isHorizontal){ + if(isRedToBlue){ + SpectrumOrientation.HORIZONTAL_BLUE_RIGHT + } else{ + SpectrumOrientation.HORIZONTAL_RED_RIGHT + } + + } else { + if(isRedToBlue){ + SpectrumOrientation.VERTICAL_RED_UP + } else{ + SpectrumOrientation.VERTICAL_BLUE_UP + } } + return orientation; } - override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) { - // An item is selected. You can retrieve the selected item using - // parent.getItemAtPosition(pos). - Log.d("Spinner", "item: "+ parent.getItemAtPosition(pos)) - var orientation: SpectrumOrientation = SpectrumOrientation.INVALID - when(parent.getItemAtPosition(pos)){ - "Horizontal Red Right" -> orientation = SpectrumOrientation.HORIZONTAL_RED_RIGHT - "Horizontal Blue Right" -> orientation = SpectrumOrientation.HORIZONTAL_BLUE_RIGHT - "Vertical Red Top" -> orientation = SpectrumOrientation.VERTICAL_RED_UP - "Vertical Blue Top" -> orientation = SpectrumOrientation.VERTICAL_BLUE_UP + fun setSpectrumOrientation(spectrumOrientation: SpectrumOrientation){ + when(spectrumOrientation){ + SpectrumOrientation.VERTICAL_BLUE_UP -> { + isHorizontal = false + isRedToBlue = false + } + SpectrumOrientation.VERTICAL_RED_UP -> { + isHorizontal = false + isRedToBlue = true + } + SpectrumOrientation.HORIZONTAL_BLUE_RIGHT -> { + isHorizontal = true + isRedToBlue = true + } + SpectrumOrientation.HORIZONTAL_RED_RIGHT -> { + isHorizontal = true + isRedToBlue = false + } + SpectrumOrientation.INVALID -> { + isHorizontal = true + isRedToBlue = false + } } - cameraInput.changeSpectrumAnalysisOrientation(orientation) } - override fun onNothingSelected(parent: AdapterView<*>) { - // Another interface callback. + fun applySpectrumOrientationChanges() { + val orientation = getSelectedSpectrumOrientation() + orientationManager?.onUserDispersionSelected(orientation) + cameraInput.changeSpectrumAnalysisOrientation(orientation) + + btnAnalysisSetting.apply { + setIconResource(getSpectrumOrientationIcon(orientation)) + iconTint = null + } } + fun getSpectrumOrientationIcon(orientation: SpectrumOrientation) : Int { + val iconRes = when (orientation) { + SpectrumOrientation.HORIZONTAL_RED_RIGHT -> R.drawable.arrow_gradient_right + SpectrumOrientation.VERTICAL_RED_UP -> R.drawable.arrow_gradient_bottom + SpectrumOrientation.HORIZONTAL_BLUE_RIGHT -> R.drawable.arrow_gradient_left + SpectrumOrientation.VERTICAL_BLUE_UP -> R.drawable.arrow_gradient_top + else -> R.drawable.arrow_gradient_right + } + return iconRes + } + fun updateSpectrumOrientation(deviceOrientation: DeviceOrientation){ + orientationManager?.onDeviceRotated(deviceOrientation) + setSpectrumOrientation(orientationManager?.currentDispersionOrientation!!) + btnAnalysisSetting.apply { + setIconResource(getSpectrumOrientationIcon(getSelectedSpectrumOrientation())) + iconTint = null + } + } } + diff --git a/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/ChooseCameraSettingValueAdapter.kt b/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/ChooseCameraSettingValueAdapter.kt index 5a628a971..7e817940c 100644 --- a/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/ChooseCameraSettingValueAdapter.kt +++ b/app/src/main/java/de/rwth_aachen/phyphox/camera/ui/ChooseCameraSettingValueAdapter.kt @@ -8,7 +8,7 @@ import android.view.animation.AlphaAnimation import android.widget.TextView import androidx.cardview.widget.CardView import androidx.recyclerview.widget.RecyclerView -import de.rwth_aachen.phyphox.Helper.Helper +import de.rwth_aachen.phyphox.helper.Helper import de.rwth_aachen.phyphox.R import de.rwth_aachen.phyphox.camera.helper.SettingChooseListener diff --git a/app/src/main/res/color/toggle_selector_background.xml b/app/src/main/res/color/toggle_selector_background.xml new file mode 100644 index 000000000..6da491c36 --- /dev/null +++ b/app/src/main/res/color/toggle_selector_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/arrow_gradient_bottom.xml b/app/src/main/res/drawable/arrow_gradient_bottom.xml new file mode 100644 index 000000000..b912ca70b --- /dev/null +++ b/app/src/main/res/drawable/arrow_gradient_bottom.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/arrow_gradient_left.xml b/app/src/main/res/drawable/arrow_gradient_left.xml new file mode 100644 index 000000000..36aeedf84 --- /dev/null +++ b/app/src/main/res/drawable/arrow_gradient_left.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/arrow_gradient_right.xml b/app/src/main/res/drawable/arrow_gradient_right.xml new file mode 100644 index 000000000..b9cc956d1 --- /dev/null +++ b/app/src/main/res/drawable/arrow_gradient_right.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/arrow_gradient_top.xml b/app/src/main/res/drawable/arrow_gradient_top.xml new file mode 100644 index 000000000..99fbeceba --- /dev/null +++ b/app/src/main/res/drawable/arrow_gradient_top.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_experiment_list.xml b/app/src/main/res/layout/activity_experiment_list.xml index 37ef97e28..741b3d18c 100644 --- a/app/src/main/res/layout/activity_experiment_list.xml +++ b/app/src/main/res/layout/activity_experiment_list.xml @@ -49,7 +49,7 @@ - - + + + + + + + + + + + + +