Skip to content

Commit 8bc7e72

Browse files
committed
* Fleshing out proximity sensor
* Update MQTT options to refresh on changes * Changed fullscreen behavior for Android 4.1 devices * Updated UI for resolution 640px for arm/disarm buttons
1 parent ffc9ae0 commit 8bc7e72

File tree

5 files changed

+217
-17
lines changed

5 files changed

+217
-17
lines changed

app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/BaseActivity.kt

+13-3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.thanksmister.iot.mqtt.alarmpanel.network.ImageOptions
4141
import com.thanksmister.iot.mqtt.alarmpanel.network.MQTTOptions
4242
import com.thanksmister.iot.mqtt.alarmpanel.ui.Configuration
4343
import com.thanksmister.iot.mqtt.alarmpanel.managers.ConnectionLiveData
44+
import com.thanksmister.iot.mqtt.alarmpanel.managers.ProximityManager
4445
import com.thanksmister.iot.mqtt.alarmpanel.ui.activities.MainActivity
4546
import com.thanksmister.iot.mqtt.alarmpanel.ui.views.ScreenSaverView
4647
import com.thanksmister.iot.mqtt.alarmpanel.utils.DialogUtils
@@ -71,6 +72,7 @@ abstract class BaseActivity : DaggerAppCompatActivity() {
7172
private var decorView: View? = null
7273
private var userPresent: Boolean = false
7374
private var connectionLiveData: ConnectionLiveData? = null
75+
private var proximityManager: ProximityManager? = null
7476

7577
abstract fun getLayoutId(): Int
7678

@@ -102,6 +104,15 @@ abstract class BaseActivity : DaggerAppCompatActivity() {
102104
handleNetworkDisconnect()
103105
}
104106
})
107+
/*proximityManager = ProximityManager(applicationContext, lifecycle, object:ProximityManager.ProximityEventHandler {
108+
override fun deviceHasProximitySensor(hasSensor: Boolean) {
109+
Timber.d("device has proximity sensor: " + hasSensor)
110+
}
111+
override fun onProximitySensorValueChanged(value: String) {
112+
//Check for the value and awake device
113+
Timber.d("proximity value: " + value)
114+
}
115+
})*/
105116
}
106117

107118
override fun onWindowFocusChanged(hasFocus: Boolean) {
@@ -117,13 +128,12 @@ abstract class BaseActivity : DaggerAppCompatActivity() {
117128
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
118129
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
119130
visibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
120-
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
121131
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
122-
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
132+
or View.SYSTEM_UI_FLAG_LOW_PROFILE
123133
or View.SYSTEM_UI_FLAG_FULLSCREEN)
124134

125135
} else {
126-
visibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
136+
visibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
127137
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
128138
WindowManager.LayoutParams.FLAG_FULLSCREEN)
129139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright (c) 2018 ThanksMister LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software distributed
11+
* under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.thanksmister.iot.mqtt.alarmpanel.managers
18+
19+
import android.arch.lifecycle.Lifecycle
20+
import android.arch.lifecycle.LifecycleObserver
21+
import android.arch.lifecycle.OnLifecycleEvent
22+
import android.content.Context
23+
import android.hardware.Sensor
24+
import android.hardware.SensorEvent
25+
import android.hardware.SensorEventListener
26+
import android.hardware.SensorManager
27+
import timber.log.Timber
28+
29+
class ProximityManager(private val context: Context, private val lifecycle: Lifecycle, private val proximityEventHandler: ProximityEventHandler) : LifecycleObserver, SensorEventListener {
30+
31+
private var sensorManager: SensorManager? = null
32+
private var proximitySensor: Sensor? = null
33+
34+
init {
35+
sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
36+
proximitySensor = sensorManager?.getDefaultSensor(Sensor.TYPE_PROXIMITY);
37+
lifecycle.addObserver(this)
38+
}
39+
40+
@OnLifecycleEvent(Lifecycle.Event.ON_START)
41+
internal fun registerSensor() {
42+
Timber.d("registerSensor.");
43+
if (sensorManager?.getDefaultSensor(Sensor.TYPE_PROXIMITY) != null) {
44+
// Success! There's sensor.
45+
sensorManager?.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_GAME);
46+
proximityEventHandler.deviceHasProximitySensor(true);
47+
} else {
48+
// Failure! No sensor.
49+
Timber.d("Device does not have a proximity sensor.");
50+
proximityEventHandler.deviceHasProximitySensor(false);
51+
unRegisterSensor()
52+
}
53+
}
54+
55+
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
56+
internal fun unRegisterSensor() {
57+
if(proximitySensor != null) {
58+
sensorManager?.unregisterListener(this, proximitySensor)
59+
}
60+
sensorManager?.unregisterListener(this)
61+
}
62+
63+
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
64+
fun onDestroy() {
65+
}
66+
67+
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
68+
// na-da
69+
}
70+
71+
override fun onSensorChanged(event: SensorEvent) {
72+
Timber.d("Sensor Data of X axis " + event.values[0].toString())
73+
proximityEventHandler.onProximitySensorValueChanged(event.values[0].toString())
74+
}
75+
76+
interface ProximityEventHandler {
77+
fun onProximitySensorValueChanged(value: String)
78+
fun deviceHasProximitySensor(hasSensor: Boolean)
79+
}
80+
81+
companion object {
82+
//var hasNetwork = AtomicBoolean(true)
83+
}
84+
}

app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/MQTTOptions.kt

+12-11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ import kotlin.collections.ArrayList
1616
*/
1717
class MQTTOptions constructor(private val sharedPreferences: DPreference) {
1818

19+
val brokerUrl: String
20+
get() = if (!TextUtils.isEmpty(getBroker())) {
21+
if (getBroker().contains("http://") || getBroker().contains("https://")) {
22+
String.format(Locale.getDefault(), HTTP_BROKER_URL_FORMAT, getBroker(), getPort())
23+
} else if (getTlsConnection()) {
24+
String.format(Locale.getDefault(), SSL_BROKER_URL_FORMAT, getBroker(), getPort())
25+
} else {
26+
String.format(Locale.getDefault(), TCP_BROKER_URL_FORMAT, getBroker(), getPort())
27+
}
28+
} else ""
29+
1930
val isValid: Boolean
2031
get() = if (getTlsConnection()) {
2132
!TextUtils.isEmpty(getBroker()) &&
@@ -31,17 +42,7 @@ class MQTTOptions constructor(private val sharedPreferences: DPreference) {
3142
!TextUtils.isEmpty(getCommandTopic())
3243

3344
fun getBroker(): String {
34-
val broker = sharedPreferences.getPrefString(PREF_BROKER, "")
35-
if (!TextUtils.isEmpty(broker)) {
36-
if (broker!!.contains("http://") || broker.contains("https://")) {
37-
return String.format(Locale.getDefault(), HTTP_BROKER_URL_FORMAT, broker, getPort())
38-
} else if (getTlsConnection()) {
39-
return String.format(Locale.getDefault(), SSL_BROKER_URL_FORMAT, broker, getPort())
40-
} else {
41-
return String.format(Locale.getDefault(), TCP_BROKER_URL_FORMAT, broker, getPort())
42-
}
43-
}
44-
return ""
45+
return sharedPreferences.getPrefString(PREF_BROKER, "")
4546
}
4647

4748
fun getClientId(): String {

app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/MQTTService.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class MQTTService(private var context: Context, options: MQTTOptions,
117117
Timber.i("Password: " + mqttOptions!!.getPassword())
118118
Timber.i("TslConnect: " + mqttOptions!!.getTlsConnection())
119119
Timber.i("MQTT Configuration:")
120-
Timber.i("Broker: " + mqttOptions?.getBroker())
120+
Timber.i("Broker: " + mqttOptions?.brokerUrl)
121121
Timber.i("Subscibed to topics: " + StringUtils.convertArrayToString(mqttOptions!!.getStateTopics()))
122122
Timber.i("Publishing to topic: " + mqttOptions!!.getCommandTopic())
123123
if (mqttOptions!!.isValid) {
@@ -149,7 +149,7 @@ class MQTTService(private var context: Context, options: MQTTOptions,
149149
private fun initializeMqttClient() {
150150
Timber.d("initializeMqttClient")
151151
try {
152-
mqttClient = MqttAndroidClient(context, mqttOptions?.getBroker(), mqttOptions!!.getClientId())
152+
mqttClient = MqttAndroidClient(context, mqttOptions?.brokerUrl, mqttOptions!!.getClientId())
153153
val options = MqttConnectOptions()
154154
if (!TextUtils.isEmpty(mqttOptions!!.getUsername()) && !TextUtils.isEmpty(mqttOptions!!.getPassword())) {
155155
options.userName = mqttOptions!!.getUsername()
@@ -177,7 +177,7 @@ class MQTTService(private var context: Context, options: MQTTOptions,
177177

178178
override fun onFailure(asyncActionToken: IMqttToken, exception: Throwable) {
179179
if (listener != null && mqttOptions != null) {
180-
Timber.e("Failed to connect to: " + mqttOptions!!.getBroker() + " exception: " + exception)
180+
Timber.e("Failed to connect to: " + mqttOptions?.brokerUrl + " exception: " + exception)
181181
//listener!!.handleMqttException("Error connecting to the broker and port: " + mqttOptions!!.brokerUrl)
182182
listener!!.handleMqttException(context.getString(R.string.error_mqtt_subscription))
183183
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<!--
2+
~
3+
~ ~ Copyright (c) 2017. ThanksMister LLC
4+
~ ~
5+
~ ~ Licensed under the Apache License, Version 2.0 (the "License");
6+
~ ~ you may not use this file except in compliance with the License.
7+
~ ~ You may obtain a copy of the License at
8+
~ ~
9+
~ ~ http://www.apache.org/licenses/LICENSE-2.0
10+
~ ~
11+
~ ~ Unless required by applicable law or agreed to in writing, software distributed
12+
~ ~ under the License is distributed on an "AS IS" BASIS,
13+
~ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
~ ~ See the License for the specific language governing permissions and
15+
~ ~ limitations under the License.
16+
~
17+
-->
18+
19+
<FrameLayout
20+
xmlns:android="http://schemas.android.com/apk/res/android"
21+
xmlns:tools="http://schemas.android.com/tools"
22+
xmlns:app="http://schemas.android.com/apk/res-auto"
23+
android:layout_width="match_parent"
24+
android:layout_height="match_parent"
25+
android:background="@drawable/background_rounded_gray"
26+
android:gravity="center_vertical">
27+
28+
<LinearLayout
29+
android:id="@+id/alarmView"
30+
android:foreground="?android:attr/selectableItemBackground"
31+
android:layout_width="wrap_content"
32+
android:layout_height="wrap_content"
33+
android:layout_gravity="center"
34+
android:gravity="center"
35+
android:orientation="horizontal">
36+
37+
<FrameLayout
38+
android:id="@+id/alarmButton"
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content"
41+
android:gravity="center">
42+
43+
<LinearLayout
44+
android:id="@+id/alarmButtonBackground"
45+
android:layout_marginLeft="35dp"
46+
android:layout_marginStart="35dp"
47+
android:layout_width="190dp"
48+
android:layout_height="190dp"
49+
android:padding="34dp"
50+
android:orientation="vertical"
51+
android:gravity="center"
52+
android:background="@drawable/button_round_gray">
53+
54+
<ImageView
55+
android:layout_width="140dp"
56+
android:layout_height="wrap_content"
57+
android:src="@drawable/ic_lock_large"/>
58+
59+
</LinearLayout>
60+
61+
<FrameLayout
62+
android:id="@+id/alarmPendingLayout"
63+
android:layout_width="80dp"
64+
android:layout_height="80dp"
65+
android:visibility="gone"
66+
tools:visibility="visible">
67+
68+
<include
69+
android:layout_width="wrap_content"
70+
android:layout_height="wrap_content"
71+
android:id="@+id/pendingView"
72+
layout="@layout/dialog_alarm_countdown"/>
73+
74+
</FrameLayout>
75+
76+
</FrameLayout>
77+
78+
<LinearLayout
79+
android:layout_width="290dp"
80+
android:layout_height="wrap_content"
81+
android:orientation="vertical"
82+
android:padding="16dp">
83+
84+
<TextView
85+
style="@style/TextAppearance.Title"
86+
android:textStyle="bold"
87+
android:layout_gravity="left"
88+
android:layout_width="wrap_content"
89+
android:layout_height="wrap_content"
90+
android:text="@string/text_system"/>
91+
92+
<TextView
93+
android:id="@+id/alarmText"
94+
style="@style/TextAppearance.Title"
95+
android:textColor="@color/gray_pressed"
96+
android:textStyle="bold"
97+
android:layout_width="wrap_content"
98+
android:layout_height="wrap_content"
99+
tools:text="@string/text_alarm_pending"/>
100+
101+
</LinearLayout>
102+
103+
</LinearLayout>
104+
105+
</FrameLayout>

0 commit comments

Comments
 (0)