Skip to content

Commit 0b50d8b

Browse files
committed
initial work in new monitor display UI
1 parent 501125f commit 0b50d8b

File tree

5 files changed

+174
-116
lines changed

5 files changed

+174
-116
lines changed

src/main/java/org/havenapp/main/MonitorActivity.java

Lines changed: 113 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,34 @@
1717
package org.havenapp.main;
1818

1919
import android.Manifest;
20+
import android.animation.ValueAnimator;
2021
import android.app.PictureInPictureParams;
22+
import android.content.BroadcastReceiver;
23+
import android.content.Context;
2124
import android.content.Intent;
25+
import android.content.IntentFilter;
2226
import android.content.pm.PackageManager;
2327
import android.content.res.Configuration;
28+
import android.graphics.Color;
2429
import android.os.Build;
2530
import android.os.Bundle;
2631
import android.os.CountDownTimer;
2732
import android.os.Environment;
33+
import android.os.Handler;
34+
import android.os.Message;
35+
import android.text.TextUtils;
2836
import android.util.Log;
2937
import android.view.View;
3038
import android.view.WindowManager;
39+
import android.view.animation.Animation;
40+
import android.view.animation.AnimationUtils;
3141
import android.widget.Button;
3242
import android.widget.TextView;
43+
import android.widget.Toast;
3344

3445
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
3546

47+
import org.havenapp.main.model.EventTrigger;
3648
import org.havenapp.main.service.MonitorService;
3749
import org.havenapp.main.ui.AccelConfigureActivity;
3850
import org.havenapp.main.ui.CameraConfigureActivity;
@@ -46,6 +58,7 @@
4658
import androidx.appcompat.app.AppCompatActivity;
4759
import androidx.core.app.ActivityCompat;
4860
import androidx.core.content.ContextCompat;
61+
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
4962

5063
import static org.havenapp.main.Utils.getTimerText;
5164

@@ -66,6 +79,67 @@ public class MonitorActivity extends AppCompatActivity implements TimePickerDial
6679

6780
private CameraFragment mFragmentCamera;
6881

82+
private View mBtnCamera, mBtnMic, mBtnAccel;
83+
private Animation mAnimShake;
84+
private TextView txtStatus;
85+
86+
private int lastEventType = -1;
87+
88+
/**
89+
* Handler used to update back the UI after motion detection
90+
*/
91+
private final Handler handler = new Handler()
92+
{
93+
@Override
94+
public void handleMessage(Message msg) {
95+
super.handleMessage(msg);
96+
97+
if (mIsMonitoring) {
98+
99+
String message = null;
100+
101+
if (msg.what == EventTrigger.CAMERA) {
102+
mBtnCamera.startAnimation(mAnimShake);
103+
message = getString(R.string.motion_detected);
104+
105+
} else if (msg.what == EventTrigger.POWER) {
106+
message = getString(R.string.power_detected);
107+
108+
} else if (msg.what == EventTrigger.MICROPHONE) {
109+
mBtnMic.startAnimation(mAnimShake);
110+
message = getString(R.string.sound_detected);
111+
112+
113+
} else if (msg.what == EventTrigger.ACCELEROMETER || msg.what == EventTrigger.BUMP) {
114+
mBtnAccel.startAnimation(mAnimShake);
115+
message = getString(R.string.device_move_detected);
116+
117+
} else if (msg.what == EventTrigger.LIGHT) {
118+
message = getString(R.string.status_light);
119+
120+
}
121+
122+
if (lastEventType != msg.what) {
123+
if (!TextUtils.isEmpty(message))
124+
txtStatus.setText(message);
125+
}
126+
127+
lastEventType = msg.what;
128+
}
129+
}
130+
};
131+
132+
BroadcastReceiver receiver = new BroadcastReceiver() {
133+
@Override
134+
public void onReceive(Context context, Intent intent) {
135+
136+
int eventType = intent.getIntExtra("type",-1);
137+
boolean detected = intent.getBooleanExtra("detected",true);
138+
if (detected)
139+
handler.sendEmptyMessage(eventType);
140+
}
141+
};
142+
69143
@Override
70144
protected void onCreate(Bundle savedInstanceState) {
71145
super.onCreate(savedInstanceState);
@@ -107,70 +181,52 @@ private void initSetupLayout() {
107181
int timeM = preferences.getTimerDelay() * 1000;
108182

109183
txtTimer.setText(getTimerText(timeM));
110-
txtTimer.setOnClickListener(new View.OnClickListener() {
111-
@Override
112-
public void onClick(View v) {
113-
if (cTimer == null)
114-
showTimeDelayDialog();
184+
txtTimer.setOnClickListener(v -> {
185+
if (cTimer == null)
186+
showTimeDelayDialog();
115187

116-
}
117188
});
118-
findViewById(R.id.timer_text_title).setOnClickListener(new View.OnClickListener() {
119-
@Override
120-
public void onClick(View v) {
121-
if (cTimer == null)
122-
showTimeDelayDialog();
189+
findViewById(R.id.timer_text_title).setOnClickListener(v -> {
190+
if (cTimer == null)
191+
showTimeDelayDialog();
123192

124-
}
125193
});
126194

127-
findViewById(R.id.btnStartLater).setOnClickListener(new View.OnClickListener() {
128-
@Override
129-
public void onClick(View v) {
130-
doCancel();
131-
}
132-
});
195+
findViewById(R.id.btnStartLater).setOnClickListener(v -> doCancel());
133196

134-
findViewById(R.id.btnStartNow).setOnClickListener(new View.OnClickListener() {
135-
@Override
136-
public void onClick(View v) {
137-
((Button) findViewById(R.id.btnStartLater)).setText(R.string.action_cancel);
138-
findViewById(R.id.btnStartNow).setVisibility(View.INVISIBLE);
139-
findViewById(R.id.timer_text_title).setVisibility(View.INVISIBLE);
140-
initTimer();
141-
}
197+
findViewById(R.id.btnStartNow).setOnClickListener(v -> {
198+
((Button) findViewById(R.id.btnStartLater)).setText(R.string.action_cancel);
199+
findViewById(R.id.btnStartNow).setVisibility(View.INVISIBLE);
200+
findViewById(R.id.timer_text_title).setVisibility(View.INVISIBLE);
201+
initTimer();
142202
});
143203

144-
findViewById(R.id.btnAccelSettings).setOnClickListener(new View.OnClickListener() {
145-
@Override
146-
public void onClick(View v) {
204+
mBtnAccel = findViewById(R.id.btnAccelSettings);
205+
mBtnAccel.setOnClickListener(v -> {
206+
if (!mIsMonitoring)
147207
startActivity(new Intent(MonitorActivity.this, AccelConfigureActivity.class));
148-
}
149208
});
150209

151-
findViewById(R.id.btnMicSettings).setOnClickListener(new View.OnClickListener() {
152-
@Override
153-
public void onClick(View v) {
210+
mBtnMic = findViewById(R.id.btnMicSettings);
211+
mBtnMic.setOnClickListener(v -> {
212+
if (!mIsMonitoring)
154213
startActivity(new Intent(MonitorActivity.this, MicrophoneConfigureActivity.class));
155-
}
156214
});
157215

158-
findViewById(R.id.btnCameraSwitch).setOnClickListener(new View.OnClickListener() {
159-
@Override
160-
public void onClick(View v) {
216+
mBtnCamera = findViewById(R.id.btnCameraSwitch);
217+
mBtnCamera.setOnClickListener(v -> {
218+
if (!mIsMonitoring)
161219
configCamera();
162-
}
163220
});
164221

165-
findViewById(R.id.btnSettings).setOnClickListener(new View.OnClickListener() {
166-
@Override
167-
public void onClick(View v) {
168-
showSettings();
169-
}
170-
});
222+
findViewById(R.id.btnSettings).setOnClickListener(v -> showSettings());
171223

172224
mFragmentCamera = ((CameraFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_camera));
173225

226+
txtStatus = findViewById(R.id.txtStatus);
227+
228+
mAnimShake = AnimationUtils.loadAnimation(this, R.anim.shake);
229+
174230
mIsInitializedLayout = true;
175231
}
176232

@@ -361,6 +417,18 @@ public void onResume() {
361417
int totalMilliseconds = preferences.getTimerDelay() * 1000;
362418
txtTimer.setText(getTimerText(totalMilliseconds));
363419
}
420+
421+
IntentFilter filter = new IntentFilter();
422+
filter.addAction("event");
423+
LocalBroadcastManager.getInstance(this).registerReceiver(receiver,filter );
424+
425+
}
426+
427+
@Override
428+
protected void onPause() {
429+
super.onPause();
430+
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
431+
364432
}
365433

366434
@Override
@@ -404,4 +472,5 @@ public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int seco
404472
int delaySeconds = second + minute * 60 + hourOfDay * 60 * 60;
405473
updateTimerValue(delaySeconds);
406474
}
475+
407476
}

src/main/java/org/havenapp/main/ui/CameraConfigureActivity.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@
1717
package org.havenapp.main.ui;
1818

1919
import android.Manifest;
20+
import android.content.BroadcastReceiver;
21+
import android.content.Context;
22+
import android.content.Intent;
23+
import android.content.IntentFilter;
2024
import android.content.pm.PackageManager;
2125
import android.os.Bundle;
2226
import android.view.MenuItem;
2327
import android.view.View;
28+
import android.widget.Toast;
2429

2530
import org.havenapp.main.PreferenceManager;
2631
import org.havenapp.main.R;
@@ -29,10 +34,12 @@
2934
import androidx.appcompat.widget.Toolbar;
3035
import androidx.core.app.ActivityCompat;
3136
import androidx.core.content.ContextCompat;
37+
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
3238
import me.angrybyte.numberpicker.listener.OnValueChangeListener;
3339
import me.angrybyte.numberpicker.view.ActualNumberPicker;
3440

3541

42+
3643
public class CameraConfigureActivity extends AppCompatActivity {
3744

3845
private PreferenceManager mPrefManager = null;
@@ -125,6 +132,10 @@ public void onBackPressed() {
125132
@Override
126133
public void onResume() {
127134
super.onResume();
135+
IntentFilter filter = new IntentFilter();
136+
filter.addAction("event");
137+
LocalBroadcastManager.getInstance(this).registerReceiver(receiver,filter );
138+
128139
}
129140

130141
@Override
@@ -163,4 +174,25 @@ private boolean askForPermission(String permission, Integer requestCode) {
163174
}
164175
}
165176

177+
178+
@Override
179+
protected void onPause() {
180+
super.onPause();
181+
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
182+
183+
}
184+
185+
BroadcastReceiver receiver = new BroadcastReceiver() {
186+
@Override
187+
public void onReceive(Context context, Intent intent) {
188+
189+
int eventType = intent.getIntExtra("type",-1);
190+
boolean detected = intent.getBooleanExtra("detected",true);
191+
192+
if (detected)
193+
Toast.makeText(CameraConfigureActivity.this,R.string.motion_detected,Toast.LENGTH_SHORT).show();
194+
195+
}
196+
};
197+
166198
}

src/main/java/org/havenapp/main/ui/CameraFragment.java

Lines changed: 6 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -40,75 +40,6 @@ public final class CameraFragment extends Fragment {
4040
private PreferenceManager prefs;
4141
private TextView txtCameraStatus;
4242

43-
private boolean isAttached = false;
44-
45-
/**
46-
* Handler used to update back the UI after motion detection
47-
*/
48-
private final Handler handler = new Handler()
49-
{
50-
@Override
51-
public void handleMessage(Message msg) {
52-
super.handleMessage(msg);
53-
54-
if (isAttached) {
55-
if (txtCameraStatus != null) {
56-
57-
if (msg.what == EventTrigger.CAMERA) {
58-
if (cameraViewHolder.doingVideoProcessing()) {
59-
txtCameraStatus.setText(getString(R.string.motion_detected)
60-
+ "\n" + getString(R.string.status_recording_video));
61-
} else {
62-
txtCameraStatus.setText(getString(R.string.motion_detected));
63-
}
64-
}
65-
else if (msg.what == EventTrigger.POWER) {
66-
txtCameraStatus.setText(getString(R.string.power_detected));
67-
}
68-
else if (msg.what == EventTrigger.MICROPHONE) {
69-
txtCameraStatus.setText(getString(R.string.sound_detected));
70-
}
71-
else if (msg.what == EventTrigger.ACCELEROMETER || msg.what == EventTrigger.BUMP) {
72-
txtCameraStatus.setText(getString(R.string.device_move_detected));
73-
}
74-
else if (msg.what == EventTrigger.LIGHT) {
75-
txtCameraStatus.setText(getString(R.string.status_light));
76-
}
77-
78-
79-
}
80-
}
81-
}
82-
};
83-
84-
BroadcastReceiver receiver = new BroadcastReceiver() {
85-
@Override
86-
public void onReceive(Context context, Intent intent) {
87-
88-
int eventType = intent.getIntExtra("type",-1);
89-
90-
//String path = intent.getData().getPath();
91-
92-
handler.sendEmptyMessage(eventType);
93-
}
94-
};
95-
96-
@Override
97-
public void onDetach() {
98-
super.onDetach();
99-
isAttached = false;
100-
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(receiver);
101-
}
102-
103-
@Override
104-
public void onAttach(Context context) {
105-
super.onAttach(context);
106-
isAttached = true;
107-
IntentFilter filter = new IntentFilter();
108-
filter.addAction("event");
109-
LocalBroadcastManager.getInstance(getContext()).registerReceiver(receiver,filter );
110-
}
111-
11243
@Override
11344
public View onCreateView(LayoutInflater inflater, ViewGroup container,
11445
Bundle savedInstanceState) {
@@ -179,15 +110,18 @@ public void initCamera ()
179110

180111
cameraViewHolder.addListener((newBitmap, rawBitmap, motionDetected) -> {
181112

182-
handler.sendEmptyMessage(motionDetected?EventTrigger.CAMERA:-1);
183-
113+
if (!isDetached()) {
114+
Intent iEvent = new Intent("event");
115+
iEvent.putExtra("type", EventTrigger.CAMERA);
116+
iEvent.putExtra("detected",motionDetected);
117+
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(iEvent);
118+
}
184119

185120
});
186121
}
187122

188123
}
189124

190-
191125
cameraViewHolder.startCamera();
192126

193127
}

0 commit comments

Comments
 (0)