Skip to content

Commit 765070c

Browse files
committed
Added basic settings screen, still WIP
1 parent 7bf3b84 commit 765070c

File tree

11 files changed

+299
-36
lines changed

11 files changed

+299
-36
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies {
3535
implementation 'com.google.android.material:material:1.3.0'
3636
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
3737
implementation 'com.google.android.exoplayer:exoplayer:2.13.3'
38+
implementation 'androidx.preference:preference:1.1.1'
3839

3940
testImplementation 'junit:junit:4.+'
4041
androidTestImplementation 'androidx.test.ext:junit:1.1.2'

app/src/main/AndroidManifest.xml

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package="com.fpvout.digiview">
44

55
<uses-feature android:name="android.hardware.usb.host" />
6+
67
<uses-permission android:name="android.permission.WAKE_LOCK" />
78

89
<application
@@ -11,29 +12,30 @@
1112
android:label="@string/app_name"
1213
android:roundIcon="@mipmap/ic_launcher_round"
1314
android:supportsRtl="true"
14-
android:theme="@style/Theme.Digiview"
15-
>
16-
15+
android:theme="@style/Theme.Digiview">
16+
<activity
17+
android:name=".SettingsActivity"
18+
android:label="@string/title_activity_settings"></activity>
1719
<activity
20+
android:name=".MainActivity"
21+
android:configChanges="orientation|keyboardHidden"
1822
android:launchMode="singleTask"
19-
android:name="com.fpvout.digiview.MainActivity"
20-
android:screenOrientation="sensorLandscape"
21-
android:configChanges="orientation|keyboardHidden">
23+
android:screenOrientation="sensorLandscape">
2224
<intent-filter>
2325
<action android:name="android.intent.action.MAIN" />
2426

2527
<category android:name="android.intent.category.LAUNCHER" />
2628
</intent-filter>
27-
2829
<intent-filter>
2930
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
3031
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
3132
</intent-filter>
3233

33-
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
34+
<meta-data
35+
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
3436
android:resource="@xml/device_filter" />
35-
36-
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
37+
<meta-data
38+
android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
3739
android:resource="@xml/device_filter" />
3840
</activity>
3941
</application>

app/src/main/java/com/fpvout/digiview/MainActivity.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,28 @@
77
import android.content.Context;
88
import android.content.Intent;
99
import android.content.IntentFilter;
10+
import android.content.SharedPreferences;
1011
import android.hardware.usb.UsbDevice;
1112
import android.hardware.usb.UsbManager;
1213
import android.os.Bundle;
14+
import android.provider.Settings;
1315
import android.util.Log;
1416
import android.view.GestureDetector;
17+
import android.view.MenuItem;
1518
import android.view.MotionEvent;
1619
import android.view.ScaleGestureDetector;
1720
import android.view.SurfaceView;
1821
import android.view.View;
1922
import android.view.ViewGroup;
2023
import android.view.WindowManager;
24+
import android.widget.Toast;
2125

26+
import androidx.annotation.NonNull;
2227
import androidx.appcompat.app.ActionBar;
2328
import androidx.appcompat.app.AppCompatActivity;
29+
import androidx.preference.PreferenceManager;
30+
31+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
2432

2533
import java.util.HashMap;
2634

@@ -43,6 +51,8 @@ public class MainActivity extends AppCompatActivity implements UsbDeviceListener
4351
SurfaceView fpvView;
4452
private GestureDetector gestureDetector;
4553
private ScaleGestureDetector scaleGestureDetector;
54+
private SharedPreferences sharedPreferences;
55+
private static final String ShowWatermark = "ShowWatermark";
4656

4757
@Override
4858
protected void onCreate(Bundle savedInstanceState) {
@@ -80,15 +90,24 @@ protected void onCreate(Bundle savedInstanceState) {
8090
overlayView = findViewById(R.id.overlayView);
8191
fpvView = findViewById(R.id.fpvView);
8292

93+
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
94+
95+
FloatingActionButton settingsButton = findViewById(R.id.floatingActionButton);
96+
settingsButton.setOnClickListener(new View.OnClickListener() {
97+
@Override
98+
public void onClick(View v) {
99+
Intent intent = new Intent(v.getContext(), SettingsActivity.class);
100+
v.getContext().startActivity(intent);
101+
}
102+
});
103+
83104
// Enable resizing animations
84105
((ViewGroup)findViewById(R.id.mainLayout)).getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
85106

86107
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
87108
@Override
88109
public boolean onSingleTapConfirmed(MotionEvent e) {
89-
if (watermarkView.getVisibility() == View.VISIBLE) {
90-
toggleWatermark();
91-
}
110+
toggleSettingsButton();
92111
return super.onSingleTapConfirmed(e);
93112
}
94113

@@ -110,8 +129,6 @@ public void onScaleEnd(ScaleGestureDetector detector) {
110129
}
111130
});
112131

113-
watermarkView.setVisibility(View.GONE);
114-
115132
mUsbMaskConnection = new UsbMaskConnection();
116133
mVideoReader = new VideoReaderExoplayer(fpvView, overlayView, this);
117134

@@ -132,26 +149,13 @@ public boolean onTouchEvent(MotionEvent event) {
132149
return super.onTouchEvent(event);
133150
}
134151

135-
private void toggleWatermark() {
136-
if (watermarkAnimationInProgress) {
137-
return;
138-
}
139-
watermarkAnimationInProgress = true;
140-
141-
float targetAlpha = 0;
142-
if (watermarkView.getAlpha() == 0) {
143-
targetAlpha = 0.3F;
144-
}
152+
private void toggleSettingsButton() {
153+
// TODO: animate show/hide, start hide timer if shown
154+
}
145155

146-
watermarkView.animate()
147-
.alpha(targetAlpha)
148-
.setDuration(shortAnimationDuration)
149-
.setListener(new AnimatorListenerAdapter() {
150-
@Override
151-
public void onAnimationEnd(Animator animation) {
152-
watermarkAnimationInProgress = false;
153-
}
154-
});
156+
private void updateWatermark() {
157+
boolean showWatermark = sharedPreferences.getBoolean(ShowWatermark, true);
158+
watermarkView.setAlpha(showWatermark ? 0.3F : 0F);
155159
}
156160

157161
@Override
@@ -196,7 +200,6 @@ private void connect(){
196200
usbConnected = true;
197201
mUsbMaskConnection.setUsbDevice(usbManager.openDevice(usbDevice), usbDevice);
198202
mVideoReader.setUsbMaskConnection(mUsbMaskConnection);
199-
watermarkView.setVisibility(View.VISIBLE);
200203
overlayView.hide();
201204
mVideoReader.start();
202205
}
@@ -214,6 +217,8 @@ public void onResume() {
214217
overlayView.showOpaque(R.string.waiting_for_usb_device, OverlayStatus.Disconnected);
215218
}
216219
}
220+
221+
updateWatermark();
217222
}
218223

219224
@Override
@@ -225,6 +230,7 @@ protected void onStop() {
225230
mVideoReader.stop();
226231
usbConnected = false;
227232
}
233+
228234
@Override
229235
protected void onPause() {
230236
super.onPause();
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.fpvout.digiview;
2+
3+
import android.os.Bundle;
4+
import android.view.MenuItem;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.appcompat.app.ActionBar;
8+
import androidx.appcompat.app.AppCompatActivity;
9+
import androidx.preference.PreferenceFragmentCompat;
10+
11+
public class SettingsActivity extends AppCompatActivity {
12+
13+
@Override
14+
protected void onCreate(Bundle savedInstanceState) {
15+
super.onCreate(savedInstanceState);
16+
setContentView(R.layout.settings_activity);
17+
if (savedInstanceState == null) {
18+
getSupportFragmentManager()
19+
.beginTransaction()
20+
.replace(R.id.settings, new SettingsFragment())
21+
.commit();
22+
}
23+
ActionBar actionBar = getSupportActionBar();
24+
if (actionBar != null) {
25+
actionBar.setDisplayHomeAsUpEnabled(true);
26+
}
27+
}
28+
29+
@Override
30+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
31+
32+
if (item.getItemId() == android.R.id.home) {
33+
this.finish();
34+
return true;
35+
}
36+
37+
return super.onOptionsItemSelected(item);
38+
}
39+
40+
public static class SettingsFragment extends PreferenceFragmentCompat {
41+
@Override
42+
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
43+
setPreferencesFromResource(R.xml.root_preferences, rootKey);
44+
}
45+
}
46+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fpvout.digiview;
2+
3+
import android.content.Context;
4+
import android.content.pm.PackageInfo;
5+
import android.content.pm.PackageManager;
6+
import android.util.AttributeSet;
7+
8+
import androidx.preference.Preference;
9+
10+
// From https://stackoverflow.com/a/20157577/877465
11+
public class VersionPreference extends Preference {
12+
public VersionPreference(Context context, AttributeSet attrs) {
13+
super(context, attrs);
14+
String versionName;
15+
final PackageManager packageManager = context.getPackageManager();
16+
if (packageManager != null) {
17+
try {
18+
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
19+
versionName = packageInfo.versionName;
20+
} catch (PackageManager.NameNotFoundException e) {
21+
versionName = null;
22+
}
23+
setSummary(versionName);
24+
}
25+
26+
setSelectable(false);
27+
}
28+
}

app/src/main/java/com/fpvout/digiview/VideoReaderExoplayer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.view.SurfaceView;
1010

1111
import androidx.constraintlayout.widget.ConstraintLayout;
12+
import androidx.preference.PreferenceManager;
1213

1314
import com.google.android.exoplayer2.C;
1415
import com.google.android.exoplayer2.DefaultLoadControl;
@@ -42,7 +43,7 @@ public class VideoReaderExoplayer {
4243
surfaceView = videoSurface;
4344
this.overlayView = overlayView;
4445
context = c;
45-
sharedPreferences = context.getSharedPreferences("DigiView", Context.MODE_PRIVATE);
46+
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c); //context.getSharedPreferences("DigiView", Context.MODE_PRIVATE);
4647
}
4748

4849
public void setUsbMaskConnection(UsbMaskConnection connection) {
@@ -52,6 +53,9 @@ public void setUsbMaskConnection(UsbMaskConnection connection) {
5253

5354
public void start() {
5455
zoomedIn = sharedPreferences.getBoolean(VideoZoomedIn, true);
56+
if (!zoomedIn) {
57+
zoomOut();
58+
}
5559

5660
inputStream.startReadThread();
5761
DefaultLoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(32 * 1024, 64 * 1024, 0, 0).build();

app/src/main/res/layout/activity_main.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,17 @@
4242
app:layout_constraintStart_toStartOf="parent"
4343
app:layout_constraintTop_toTopOf="parent" />
4444

45+
<com.google.android.material.floatingactionbutton.FloatingActionButton
46+
android:id="@+id/floatingActionButton"
47+
android:layout_width="wrap_content"
48+
android:layout_height="wrap_content"
49+
android:layout_marginEnd="20dp"
50+
android:layout_marginBottom="20dp"
51+
android:backgroundTint="@color/digiview_blue"
52+
android:clickable="true"
53+
android:tint="@color/digiview_purple"
54+
app:layout_constraintBottom_toBottomOf="parent"
55+
app:layout_constraintEnd_toEndOf="parent"
56+
app:srcCompat="@drawable/exo_ic_settings" />
57+
4558
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:layout_width="match_parent"
3+
android:layout_height="match_parent">
4+
5+
<FrameLayout
6+
android:id="@+id/settings"
7+
android:layout_width="match_parent"
8+
android:layout_height="match_parent" />
9+
</LinearLayout>

app/src/main/res/values/arrays.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<resources>
2+
<!-- Reply Preference -->
3+
<string-array name="video_preset_titles">
4+
<item>@string/video_preset_default</item>
5+
<item>@string/video_preset_conservative</item>
6+
<item>@string/video_preset_aggressive</item>
7+
<item>@string/video_preset_legacy</item>
8+
</string-array>
9+
10+
<string-array name="video_preset_values">
11+
<item>default</item>
12+
<item>conservative</item>
13+
<item>aggressive</item>
14+
<item>legacy</item>
15+
</string-array>
16+
</resources>

app/src/main/res/values/strings.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,11 @@
66
<string name="usb_device_detached_waiting">USB device detached\n\nWaiting for USB device…</string>
77
<string name="usb_device_found">USB device found.</string>
88
<string name="waiting_for_video">Waiting for video…</string>
9+
<string name="title_activity_settings">SettingsActivity</string>
10+
11+
<!-- Video Preset Titles -->
12+
<string name="video_preset_default">Default</string>
13+
<string name="video_preset_conservative">Conservative</string>
14+
<string name="video_preset_aggressive">Aggressive</string>
15+
<string name="video_preset_legacy">Legacy</string>
916
</resources>

0 commit comments

Comments
 (0)