Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
baby-monitoring-android-app
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
R24-145
baby-monitoring-android-app
Commits
396b16a2
Commit
396b16a2
authored
Oct 20, 2024
by
Ishankha K.C
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/chamod_dev' into 'master'
Feature/chamod dev See merge request
!4
parents
e6f88f4f
3954a365
Changes
24
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
962 additions
and
13 deletions
+962
-13
app/build.gradle.kts
app/build.gradle.kts
+1
-0
app/src/main/AndroidManifest.xml
app/src/main/AndroidManifest.xml
+6
-0
app/src/main/java/com/kaluwa/enterprises/babycare/activities/ActivityLogsActivity.java
...enterprises/babycare/activities/ActivityLogsActivity.java
+240
-0
app/src/main/java/com/kaluwa/enterprises/babycare/activities/BabyDashboardActivity.java
...nterprises/babycare/activities/BabyDashboardActivity.java
+1
-0
app/src/main/java/com/kaluwa/enterprises/babycare/activities/DashboardActivity.java
...wa/enterprises/babycare/activities/DashboardActivity.java
+4
-3
app/src/main/java/com/kaluwa/enterprises/babycare/activities/LiveFeedActivity.java
...uwa/enterprises/babycare/activities/LiveFeedActivity.java
+233
-0
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/ActivityLogsAdapter.java
...uwa/enterprises/babycare/adapter/ActivityLogsAdapter.java
+62
-0
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/BabyDashboardAdapter.java
...wa/enterprises/babycare/adapter/BabyDashboardAdapter.java
+1
-1
app/src/main/java/com/kaluwa/enterprises/babycare/config/ApiConfig.java
...ava/com/kaluwa/enterprises/babycare/config/ApiConfig.java
+7
-1
app/src/main/java/com/kaluwa/enterprises/babycare/config/BabyEmotionWebSocketListener.java
...rprises/babycare/config/BabyEmotionWebSocketListener.java
+71
-0
app/src/main/java/com/kaluwa/enterprises/babycare/constants/Configs.java
...va/com/kaluwa/enterprises/babycare/constants/Configs.java
+12
-0
app/src/main/java/com/kaluwa/enterprises/babycare/dto/ActivityLogDto.java
...a/com/kaluwa/enterprises/babycare/dto/ActivityLogDto.java
+14
-0
app/src/main/java/com/kaluwa/enterprises/babycare/dto/BabyDto.java
...ain/java/com/kaluwa/enterprises/babycare/dto/BabyDto.java
+1
-3
app/src/main/java/com/kaluwa/enterprises/babycare/service/ActivityLogsApiService.java
.../enterprises/babycare/service/ActivityLogsApiService.java
+15
-0
app/src/main/java/com/kaluwa/enterprises/babycare/utils/Utils.java
...ain/java/com/kaluwa/enterprises/babycare/utils/Utils.java
+10
-0
app/src/main/res/drawable/live_offline.png
app/src/main/res/drawable/live_offline.png
+0
-0
app/src/main/res/layout/activity_live_feed.xml
app/src/main/res/layout/activity_live_feed.xml
+92
-0
app/src/main/res/layout/activity_login.xml
app/src/main/res/layout/activity_login.xml
+5
-5
app/src/main/res/layout/activity_logs.xml
app/src/main/res/layout/activity_logs.xml
+148
-0
app/src/main/res/layout/item_activity_log.xml
app/src/main/res/layout/item_activity_log.xml
+33
-0
app/src/main/res/values-night/colors.xml
app/src/main/res/values-night/colors.xml
+1
-0
app/src/main/res/values/colors.xml
app/src/main/res/values/colors.xml
+1
-0
app/src/main/res/xml/network_security_config.xml
app/src/main/res/xml/network_security_config.xml
+2
-0
gradle/libs.versions.toml
gradle/libs.versions.toml
+2
-0
No files found.
app/build.gradle.kts
View file @
396b16a2
...
...
@@ -47,6 +47,7 @@ dependencies {
implementation
(
libs
.
swiperefreshlayout
)
implementation
(
libs
.
converter
.
jackson
)
implementation
(
libs
.
jackson
.
datatype
.
jsr310
)
implementation
(
libs
.
okhttp
)
testImplementation
(
libs
.
junit
)
androidTestImplementation
(
libs
.
ext
.
junit
)
androidTestImplementation
(
libs
.
espresso
.
core
)
...
...
app/src/main/AndroidManifest.xml
View file @
396b16a2
...
...
@@ -17,6 +17,12 @@
android:supportsRtl=
"true"
android:theme=
"@style/Theme.BabyCare"
tools:targetApi=
"31"
>
<activity
android:name=
".activities.ActivityLogsActivity"
android:exported=
"false"
/>
<activity
android:name=
".activities.LiveFeedActivity"
android:exported=
"false"
/>
<activity
android:name=
".activities.BabyDashboardActivity"
android:exported=
"false"
/>
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/activities/ActivityLogsActivity.java
0 → 100644
View file @
396b16a2
This diff is collapsed.
Click to expand it.
app/src/main/java/com/kaluwa/enterprises/babycare/activities/BabyDashboardActivity.java
View file @
396b16a2
...
...
@@ -65,6 +65,7 @@ public class BabyDashboardActivity extends AppCompatActivity implements AddBabyD
private
BabyApiService
babyApiService
;
private
BabyDashboardAdapter
adapter
;
private
List
<
BabyDto
>
babyDtoList
=
new
ArrayList
<>();
@SuppressLint
(
"NewApi"
)
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/activities/DashboardActivity.java
View file @
396b16a2
...
...
@@ -19,7 +19,6 @@ import androidx.appcompat.widget.Toolbar;
import
com.kaluwa.enterprises.babycare.MainActivity
;
import
com.kaluwa.enterprises.babycare.R
;
import
com.kaluwa.enterprises.babycare.activities.auth.LoginActivity
;
public
class
DashboardActivity
extends
AppCompatActivity
{
...
...
@@ -41,13 +40,15 @@ public class DashboardActivity extends AppCompatActivity {
btn6
=
findViewById
(
R
.
id
.
btn_settings
);
btn1
.
setOnClickListener
(
v
->
{
Intent
intent
=
new
Intent
(
this
,
LiveFeedActivity
.
class
);
startActivity
(
intent
);
});
btn2
.
setOnClickListener
(
v
->
{
});
btn3
.
setOnClickListener
(
v
->
{
Intent
intent
=
new
Intent
(
this
,
ActivityLogsActivity
.
class
);
startActivity
(
intent
);
});
btn4
.
setOnClickListener
(
v
->
{
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/activities/LiveFeedActivity.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.activities
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
config
.
BabyEmotionWebSocketListener
.
NORMAL_CLOSURE_STATUS
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
config
.
TokenSaver
.
clearToken
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
constants
.
Configs
.
EMOTIONAL_VIDEO_PROCESS_WS_URL
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
constants
.
Configs
.
LIVE_FEED_URL
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
constants
.
Configs
.
REFRESH_INTERVAL
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
animationChanger
;
import
android.content.Intent
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.os.Bundle
;
import
android.os.Handler
;
import
android.util.Log
;
import
android.view.Gravity
;
import
android.view.Menu
;
import
android.view.MenuInflater
;
import
android.view.MenuItem
;
import
android.view.View
;
import
android.widget.Button
;
import
android.widget.ImageView
;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
androidx.annotation.NonNull
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.appcompat.widget.PopupMenu
;
import
androidx.appcompat.widget.Toolbar
;
import
com.kaluwa.enterprises.babycare.MainActivity
;
import
com.kaluwa.enterprises.babycare.R
;
import
com.kaluwa.enterprises.babycare.config.BabyEmotionWebSocketListener
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.WebSocket
;
public
class
LiveFeedActivity
extends
AppCompatActivity
{
private
static
final
String
TAG
=
"LiveFeedActivity"
;
private
ImageView
ivLiveFeed
;
private
Button
lfFlashBtn
;
private
TextView
tvLlStatusValue
;
private
Handler
handler
=
new
Handler
();
private
Runnable
updateRunnable
;
private
WebSocket
webSocket
;
private
OkHttpClient
client
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_live_feed
);
// define actionbar
defineActionbar
();
ivLiveFeed
=
findViewById
(
R
.
id
.
ivLiveFeed
);
lfFlashBtn
=
findViewById
(
R
.
id
.
lfFlashBtn
);
tvLlStatusValue
=
findViewById
(
R
.
id
.
tvLlStatusValue
);
updateRunnable
=
new
Runnable
()
{
@Override
public
void
run
()
{
fetchAndDisplayImage
();
handler
.
postDelayed
(
this
,
REFRESH_INTERVAL
);
}
};
// Start updating
handler
.
post
(
updateRunnable
);
// Toggle flashlight
lfFlashBtn
.
setOnClickListener
(
v
->
toggleFlashlight
());
// Initialize the WebSocket connection
// client = new OkHttpClient();
// Request request = new Request.Builder()
// .url(EMOTIONAL_VIDEO_PROCESS_WS_URL)
// .build();
// BabyEmotionWebSocketListener listener = new BabyEmotionWebSocketListener(this, tvLlStatusValue);
// webSocket = client.newWebSocket(request, listener);
//
// // Clean up the WebSocket connection when done
// client.dispatcher().executorService().shutdown();
}
private
void
toggleFlashlight
()
{
String
currentText
=
lfFlashBtn
.
getText
().
toString
();
String
url
=
currentText
.
equals
(
"FLASH ON"
)
?
LIVE_FEED_URL
+
"/flashlight/on"
:
LIVE_FEED_URL
+
"/flashlight/off"
;
String
newText
=
currentText
.
equals
(
"FLASH ON"
)
?
"FLASH OFF"
:
"FLASH ON"
;
// Call the API in a background thread
new
Thread
(()
->
{
try
{
URL
apiUrl
=
new
URL
(
url
);
HttpURLConnection
connection
=
(
HttpURLConnection
)
apiUrl
.
openConnection
();
connection
.
setRequestMethod
(
"GET"
);
connection
.
connect
();
int
responseCode
=
connection
.
getResponseCode
();
if
(
responseCode
==
200
)
{
// Update the button text on the main thread
runOnUiThread
(()
->
lfFlashBtn
.
setText
(
newText
));
}
else
{
Log
.
e
(
TAG
,
"Failed to call API: "
+
responseCode
);
}
connection
.
disconnect
();
}
catch
(
IOException
e
)
{
Log
.
e
(
TAG
,
"Error calling flashlight API"
,
e
);
}
}).
start
();
}
@Override
protected
void
onStart
()
{
super
.
onStart
();
connectWebSocket
();
}
@Override
protected
void
onStop
()
{
super
.
onStop
();
closeWebSocket
();
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
handler
.
removeCallbacks
(
updateRunnable
);
// Stop updating when the activity is destroyed
// Close the WebSocket connection
if
(
webSocket
!=
null
)
{
webSocket
.
close
(
1000
,
"Activity destroyed"
);
}
}
private
void
fetchAndDisplayImage
()
{
new
Thread
(()
->
{
try
{
URL
url
=
new
URL
(
LIVE_FEED_URL
+
"/cam-hi.jpg"
);
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
();
connection
.
setDoInput
(
true
);
connection
.
connect
();
InputStream
input
=
connection
.
getInputStream
();
Bitmap
bitmap
=
BitmapFactory
.
decodeStream
(
input
);
runOnUiThread
(()
->
ivLiveFeed
.
setImageBitmap
(
bitmap
));
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
"Error fetching image"
,
e
);
// If there's an error, set the default image
runOnUiThread
(()
->
ivLiveFeed
.
setImageResource
(
R
.
drawable
.
live_offline
));
}
}).
start
();
}
private
void
defineActionbar
()
{
Toolbar
toolbar
=
findViewById
(
R
.
id
.
b_care_action_bar
);
setSupportActionBar
(
toolbar
);
if
(
getSupportActionBar
()
!=
null
)
{
getSupportActionBar
().
setDisplayShowTitleEnabled
(
false
);
}
toolbar
.
setNavigationIcon
(
R
.
drawable
.
ico_menu_32
);
toolbar
.
setNavigationOnClickListener
(
v
->
{
// Initializing the popup menu and giving the reference as current context
PopupMenu
popupMenu
=
new
PopupMenu
(
this
,
toolbar
);
popupMenu
.
setGravity
(
Gravity
.
BOTTOM
);
popupMenu
.
getMenuInflater
().
inflate
(
R
.
menu
.
menu_main
,
popupMenu
.
getMenu
());
popupMenu
.
setOnMenuItemClickListener
(
item
->
{
int
id
=
item
.
getItemId
();
if
(
id
==
R
.
id
.
mm_device_setting
)
{
Toast
.
makeText
(
this
,
"You Clicked "
+
item
.
getTitle
(),
Toast
.
LENGTH_SHORT
).
show
();
}
else
if
(
id
==
R
.
id
.
mm_app_setting
)
{
Toast
.
makeText
(
this
,
"You Clicked "
+
item
.
getTitle
(),
Toast
.
LENGTH_SHORT
).
show
();
}
else
if
(
id
==
R
.
id
.
mm_logout
)
{
clearToken
(
getApplicationContext
());
Toast
.
makeText
(
this
,
"Logout successful."
,
Toast
.
LENGTH_SHORT
).
show
();
Intent
intent
=
new
Intent
(
this
,
MainActivity
.
class
);
intent
.
setFlags
(
Intent
.
FLAG_ACTIVITY_CLEAR_TOP
|
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
startActivity
(
intent
);
finish
();
animationChanger
(
this
);
}
return
true
;
});
popupMenu
.
show
();
});
}
@Override
public
boolean
onCreateOptionsMenu
(
Menu
menu
)
{
MenuInflater
inflater
=
getMenuInflater
();
inflater
.
inflate
(
R
.
menu
.
user_action_menu
,
menu
);
return
true
;
}
@Override
public
boolean
onOptionsItemSelected
(
@NonNull
MenuItem
item
)
{
int
id
=
item
.
getItemId
();
if
(
id
==
R
.
id
.
user
)
{
Intent
intent
=
new
Intent
(
this
,
UserProfileActivity
.
class
);
startActivity
(
intent
);
animationChanger
(
this
);
}
else
{
Toast
.
makeText
(
this
,
"No item."
,
Toast
.
LENGTH_SHORT
).
show
();
}
return
super
.
onOptionsItemSelected
(
item
);
}
@Override
public
void
onBackPressed
()
{
super
.
onBackPressed
();
animationChanger
(
this
);
}
private
void
connectWebSocket
()
{
OkHttpClient
client
=
new
OkHttpClient
();
Request
request
=
new
Request
.
Builder
().
url
(
EMOTIONAL_VIDEO_PROCESS_WS_URL
).
build
();
webSocket
=
client
.
newWebSocket
(
request
,
new
BabyEmotionWebSocketListener
(
this
,
tvLlStatusValue
));
}
private
void
closeWebSocket
()
{
if
(
webSocket
!=
null
)
{
webSocket
.
close
(
NORMAL_CLOSURE_STATUS
,
"Closing WebSocket"
);
webSocket
=
null
;
// Set to null after closing
}
}
}
\ No newline at end of file
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/ActivityLogsAdapter.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.adapter
;
import
android.annotation.SuppressLint
;
import
android.content.Context
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.TextView
;
import
androidx.annotation.NonNull
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.kaluwa.enterprises.babycare.R
;
import
com.kaluwa.enterprises.babycare.dto.ActivityLogDto
;
import
java.util.List
;
public
class
ActivityLogsAdapter
extends
RecyclerView
.
Adapter
<
ActivityLogsAdapter
.
ActivityLogItemHolder
>
{
private
final
static
String
TAG
=
"ActivityLogAdapter"
;
private
Context
context
;
private
List
<
ActivityLogDto
>
activityLogList
;
public
ActivityLogsAdapter
(
Context
context
,
List
<
ActivityLogDto
>
activityLogList
)
{
this
.
context
=
context
;
this
.
activityLogList
=
activityLogList
;
}
@NonNull
@Override
public
ActivityLogsAdapter
.
ActivityLogItemHolder
onCreateViewHolder
(
@NonNull
ViewGroup
parent
,
int
viewType
)
{
View
view
=
LayoutInflater
.
from
(
context
).
inflate
(
R
.
layout
.
item_activity_log
,
parent
,
false
);
return
new
ActivityLogsAdapter
.
ActivityLogItemHolder
(
view
);
}
@SuppressLint
(
"SetTextI18n"
)
@Override
public
void
onBindViewHolder
(
@NonNull
ActivityLogsAdapter
.
ActivityLogItemHolder
holder
,
int
position
)
{
ActivityLogDto
activityLogDto
=
activityLogList
.
get
(
position
);
holder
.
tvActivityLogId
.
setText
(
activityLogDto
.
getActivityLogId
().
toString
());
holder
.
tvActivityType
.
setText
(
activityLogDto
.
getActivityLogType
());
holder
.
tvDescription
.
setText
(
activityLogDto
.
getActivityLogDescription
());
}
@Override
public
int
getItemCount
()
{
return
activityLogList
.
size
();
}
public
static
class
ActivityLogItemHolder
extends
RecyclerView
.
ViewHolder
{
public
TextView
tvActivityLogId
,
tvActivityType
,
tvDescription
;
public
ActivityLogItemHolder
(
@NonNull
View
view
)
{
super
(
view
);
tvActivityLogId
=
view
.
findViewById
(
R
.
id
.
tvActivityLogId
);
tvActivityType
=
view
.
findViewById
(
R
.
id
.
tvActivityType
);
tvDescription
=
view
.
findViewById
(
R
.
id
.
tvDescription
);
}
}
}
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/BabyDashboardAdapter.java
View file @
396b16a2
...
...
@@ -59,7 +59,7 @@ public class BabyDashboardAdapter extends RecyclerView.Adapter<BabyDashboardAdap
String
sex
=
babyDto
.
getSex
();
String
notes
=
babyDto
.
getNotes
();
Boolean
isActive
=
babyDto
.
getIsActive
();
InputStream
imageData
=
babyDto
.
getImageData
();
byte
[]
imageData
=
babyDto
.
getImageData
();
if
(
lastname
!=
null
)
{
holder
.
tvBabyName
.
setText
(
firstname
+
" "
+
lastname
);
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/config/ApiConfig.java
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.config
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
config
.
TokenSaver
.
getToken
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
constants
.
Configs
.
BASE_URL
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.SerializationFeature
;
import
com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
;
import
com.kaluwa.enterprises.babycare.service.ActivityLogsApiService
;
import
com.kaluwa.enterprises.babycare.service.AuthApiService
;
import
com.kaluwa.enterprises.babycare.service.BabyApiService
;
import
com.kaluwa.enterprises.babycare.service.DocumentApiService
;
...
...
@@ -17,7 +19,6 @@ import retrofit2.converter.gson.GsonConverterFactory;
import
retrofit2.converter.jackson.JacksonConverterFactory
;
public
class
ApiConfig
{
private
static
final
String
BASE_URL
=
"http://192.168.1.2:8080/api/v1/baby-care/"
;
private
static
ApiConfig
instance
;
private
static
Retrofit
retrofitAuth
=
null
;
private
static
Retrofit
retrofitOther
=
null
;
...
...
@@ -77,4 +78,9 @@ public class ApiConfig {
AUTH_TOKEN
=
JWTToken
;
return
retrofitOther
.
create
(
DocumentApiService
.
class
);
}
public
ActivityLogsApiService
getActivityLogsApi
(
String
JWTToken
)
{
AUTH_TOKEN
=
JWTToken
;
return
retrofitOther
.
create
(
ActivityLogsApiService
.
class
);
}
}
app/src/main/java/com/kaluwa/enterprises/babycare/config/BabyEmotionWebSocketListener.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.config
;
import
android.app.Activity
;
import
android.util.Log
;
import
android.widget.TextView
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.nio.charset.StandardCharsets
;
import
okhttp3.Response
;
import
okhttp3.WebSocket
;
import
okhttp3.WebSocketListener
;
import
okio.ByteString
;
public
class
BabyEmotionWebSocketListener
extends
WebSocketListener
{
public
static
final
int
NORMAL_CLOSURE_STATUS
=
1000
;
private
final
TextView
statusValueTextView
;
private
final
Activity
activity
;
// Reference to the Activity
public
BabyEmotionWebSocketListener
(
Activity
activity
,
TextView
statusValueTextView
)
{
this
.
activity
=
activity
;
this
.
statusValueTextView
=
statusValueTextView
;
}
@Override
public
void
onOpen
(
WebSocket
webSocket
,
Response
response
)
{
// Connection opened
byte
[]
data
=
"Hello, WebSocket!"
.
getBytes
(
StandardCharsets
.
UTF_8
);
webSocket
.
send
(
ByteString
.
of
(
data
));
}
@Override
public
void
onMessage
(
WebSocket
webSocket
,
String
text
)
{
// Parse the received message and update the UI
activity
.
runOnUiThread
(()
->
{
try
{
JSONObject
jsonObject
=
new
JSONObject
(
text
);
String
emotion
=
jsonObject
.
getString
(
"emotion"
);
// Capitalize the first letter
String
capitalizedEmotion
=
emotion
.
substring
(
0
,
1
).
toUpperCase
()
+
emotion
.
substring
(
1
);
if
(
capitalizedEmotion
.
equals
(
"Null"
))
{
statusValueTextView
.
setText
(
"No emotion detected!"
);
}
else
{
statusValueTextView
.
setText
(
capitalizedEmotion
);
}
}
catch
(
JSONException
e
)
{
e
.
printStackTrace
();
}
});
}
@Override
public
void
onMessage
(
WebSocket
webSocket
,
ByteString
bytes
)
{
onMessage
(
webSocket
,
bytes
.
utf8
());
}
@Override
public
void
onClosing
(
WebSocket
webSocket
,
int
code
,
String
reason
)
{
Log
.
e
(
"WebSocket"
,
"Connection closing: "
+
reason
);
webSocket
.
close
(
NORMAL_CLOSURE_STATUS
,
null
);
activity
.
runOnUiThread
(()
->
statusValueTextView
.
setText
(
"Connection closed"
));
}
@Override
public
void
onFailure
(
WebSocket
webSocket
,
Throwable
t
,
Response
response
)
{
Log
.
e
(
"WebSocket"
,
"Error: "
+
t
.
getMessage
());
activity
.
runOnUiThread
(()
->
statusValueTextView
.
setText
(
"Connection error: "
+
t
.
getMessage
()));
}
}
app/src/main/java/com/kaluwa/enterprises/babycare/constants/Configs.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.constants
;
public
class
Configs
{
public
static
final
String
URL
=
"192.168.1.2:8080/api/v1/baby-care/"
;
public
static
final
String
BASE_URL
=
"http://"
+
URL
;
public
static
final
String
LIVE_FEED_URL
=
"http://192.168.1.7"
;
public
static
final
String
EMOTIONAL_VIDEO_PROCESS_WS_URL
=
"ws://"
+
URL
+
"emotional/video-process"
;
public
static
final
int
REFRESH_INTERVAL
=
100
;
// Refresh every 100 ms
}
app/src/main/java/com/kaluwa/enterprises/babycare/dto/ActivityLogDto.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ActivityLogDto
{
private
Long
activityLogId
;
private
String
activityLogType
;
private
String
activityLogDescription
;
}
app/src/main/java/com/kaluwa/enterprises/babycare/dto/BabyDto.java
View file @
396b16a2
...
...
@@ -49,9 +49,7 @@ public class BabyDto {
private
UserDto
user
;
private
Long
userId
;
private
Long
documentId
;
@JsonIgnore
private
InputStream
imageData
;
private
byte
[]
imageData
;
@JsonIgnore
private
boolean
sys_validated
;
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/service/ActivityLogsApiService.java
0 → 100644
View file @
396b16a2
package
com.kaluwa.enterprises.babycare.service
;
import
com.kaluwa.enterprises.babycare.dto.ActivityLogDto
;
import
java.util.List
;
import
retrofit2.Call
;
import
retrofit2.http.GET
;
public
interface
ActivityLogsApiService
{
@GET
(
"activity-logs"
)
Call
<
List
<
ActivityLogDto
>>
getAllActivityLogs
();
}
app/src/main/java/com/kaluwa/enterprises/babycare/utils/Utils.java
View file @
396b16a2
...
...
@@ -223,6 +223,16 @@ public class Utils {
}
}
public
static
Bitmap
convertByteArrayToBitmap
(
byte
[]
byteArray
)
{
try
{
return
BitmapFactory
.
decodeByteArray
(
byteArray
,
0
,
byteArray
.
length
);
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
"Error decoding image byte array: "
+
e
.
getMessage
());
throw
new
RuntimeException
(
"Error decoding image byte array"
);
}
}
public
static
int
dpToPx
(
Context
context
,
int
dp
)
{
float
density
=
context
.
getResources
().
getDisplayMetrics
().
density
;
return
Math
.
round
(
dp
*
density
);
...
...
app/src/main/res/drawable/live_offline.png
0 → 100644
View file @
396b16a2
8.32 KB
app/src/main/res/layout/activity_live_feed.xml
0 → 100644
View file @
396b16a2
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".activities.LiveFeedActivity"
>
<include
layout=
"@layout/appbar"
/>
<ImageView
android:id=
"@+id/background"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/b_care_action_bar"
app:layout_constraintBottom_toBottomOf=
"parent"
android:src=
"@drawable/background"
android:contentDescription=
"background-image"
android:scaleType=
"centerCrop"
android:alpha=
"0.4"
/>
<LinearLayout
android:id=
"@+id/llLiveFeedBox"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toTopOf=
"@+id/background"
app:layout_constraintStart_toStartOf=
"@id/background"
app:layout_constraintEnd_toEndOf=
"@id/background"
android:orientation=
"vertical"
android:gravity=
"center"
android:padding=
"16dp"
>
<ImageView
android:id=
"@+id/ivLiveFeed"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:maxHeight=
"450dp"
android:scaleType=
"centerInside"
android:src=
"@drawable/live_offline"
android:background=
"@drawable/borders"
/>
<Button
android:id=
"@+id/lfFlashBtn"
android:layout_width=
"150dp"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"40dp"
android:layout_marginTop=
"28dp"
android:layout_marginRight=
"40dp"
android:background=
"@drawable/positive_btn_background"
android:fontFamily=
"@font/abril_fatface_regular"
android:padding=
"6dp"
android:text=
"FLASH ON"
android:textColor=
"@color/white"
android:textSize=
"18sp"
/>
</LinearLayout>
<!-- New LinearLayout for displaying the status -->
<LinearLayout
android:id=
"@+id/llStatusBox"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toBottomOf=
"@+id/llLiveFeedBox"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
android:orientation=
"horizontal"
android:gravity=
"center"
android:padding=
"16dp"
>
<TextView
android:id=
"@+id/tvLlStatusLabel"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Last Baby's Status:"
android:textColor=
"@color/black"
android:textSize=
"18sp"
android:layout_marginEnd=
"8dp"
/>
<TextView
android:id=
"@+id/tvLlStatusValue"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"No emotion detected!"
android:textColor=
"@color/black"
android:textStyle=
"bold"
android:textSize=
"18sp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_login.xml
View file @
396b16a2
...
...
@@ -152,15 +152,15 @@
android:id=
"@+id/l_btn_login"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"LOGIN"
android:textSize=
"20sp"
android:fontFamily=
"@font/abril_fatface_regular"
android:layout_marginLeft=
"40dp"
android:layout_marginRight=
"40dp"
android:layout_marginTop=
"28dp"
android:layout_marginRight=
"40dp"
android:background=
"@drawable/positive_btn_background"
android:fontFamily=
"@font/abril_fatface_regular"
android:padding=
"6dp"
android:textColor=
"@color/white"
/>
android:text=
"LOGIN"
android:textColor=
"@color/white"
android:textSize=
"20sp"
/>
<TextView
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/activity_logs.xml
0 → 100644
View file @
396b16a2
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/swipeContainer"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".activities.ActivityLogsActivity"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<include
layout=
"@layout/appbar"
/>
<ImageView
android:id=
"@+id/background"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/b_care_action_bar"
app:layout_constraintBottom_toBottomOf=
"parent"
android:src=
"@drawable/background"
android:contentDescription=
"background-image"
android:scaleType=
"centerCrop"
android:alpha=
"0.4"
/>
<RelativeLayout
android:id=
"@+id/rl_header"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/rl_background"
android:backgroundTint=
"#62178F"
app:layout_constraintTop_toTopOf=
"@+id/background"
app:layout_constraintStart_toStartOf=
"@id/background"
app:layout_constraintEnd_toEndOf=
"@id/background"
android:padding=
"8dp"
>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"Activity Notifications"
android:textAlignment=
"center"
android:textColor=
"@color/white"
android:textAllCaps=
"true"
android:fontFamily=
"@font/inknut_antiqua_regular"
android:textSize=
"20sp"
android:gravity=
"center"
/>
</RelativeLayout>
<!-- Header Row for the Table -->
<LinearLayout
android:id=
"@+id/headerRow"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
android:background=
"@color/gray"
android:paddingTop=
"6dp"
android:paddingStart=
"15dp"
android:paddingEnd=
"15dp"
android:paddingBottom=
"6dp"
app:layout_constraintTop_toBottomOf=
"@id/rl_header"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"0.8"
android:text=
"Id"
android:textSize=
"16sp"
android:textStyle=
"bold"
android:textColor=
"@color/black"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"2"
android:text=
"Activity Type"
android:textSize=
"16sp"
android:textStyle=
"bold"
android:textColor=
"@color/black"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"3"
android:text=
"Description"
android:textSize=
"16sp"
android:textStyle=
"bold"
android:textColor=
"@color/black"
/>
</LinearLayout>
<!-- RecyclerView for the Table Content -->
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv_activity_notifications"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintTop_toBottomOf=
"@id/headerRow"
app:layout_constraintBottom_toBottomOf=
"@id/background"
app:layout_constraintEnd_toEndOf=
"@id/background"
app:layout_constraintStart_toStartOf=
"@id/background"
android:scrollbars=
"none"
android:paddingTop=
"6dp"
android:paddingStart=
"15dp"
android:paddingEnd=
"15dp"
android:paddingBottom=
"6dp"
/>
<TextView
android:id=
"@+id/no_content_message"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"No content available"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:textStyle=
"bold"
android:visibility=
"gone"
/>
<View
android:id=
"@+id/overlay"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#99D5C5DF"
android:visibility=
"gone"
android:clickable=
"true"
android:focusable=
"true"
/>
<com.github.ybq.android.spinkit.SpinKitView
android:id=
"@+id/progress_bar"
style=
"@style/SpinKitView.Large.DoubleBounce"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
app:SpinKit_Color=
"@color/purple"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:visibility=
"gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
\ No newline at end of file
app/src/main/res/layout/item_activity_log.xml
0 → 100644
View file @
396b16a2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
android:padding=
"8dp"
>
<TextView
android:id=
"@+id/tvActivityLogId"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"0.8"
android:text=
"Id"
android:textSize=
"16sp"
android:textStyle=
"bold"
/>
<TextView
android:id=
"@+id/tvActivityType"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"2"
android:text=
"Activity Type"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tvDescription"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"3"
android:text=
"Description"
android:textSize=
"16sp"
/>
</LinearLayout>
\ No newline at end of file
app/src/main/res/values-night/colors.xml
View file @
396b16a2
...
...
@@ -9,4 +9,5 @@
<color
name=
"cancel_dark_red"
>
#CC0000
</color>
<color
name=
"success_green"
>
#28A745
</color>
<color
name=
"success_dark_green"
>
#218838
</color>
<color
name=
"gray"
>
#D3D3D3
</color>
<!-- Light gray color -->
</resources>
\ No newline at end of file
app/src/main/res/values/colors.xml
View file @
396b16a2
...
...
@@ -12,4 +12,5 @@
<color
name=
"cancel_dark_red"
>
#CC0000
</color>
<color
name=
"success_green"
>
#28A745
</color>
<color
name=
"success_dark_green"
>
#218838
</color>
<color
name=
"gray"
>
#D3D3D3
</color>
<!-- Light gray color -->
</resources>
\ No newline at end of file
app/src/main/res/xml/network_security_config.xml
View file @
396b16a2
...
...
@@ -4,5 +4,7 @@
<domain
includeSubdomains=
"true"
>
192.168.1.2
</domain>
<domain
includeSubdomains=
"true"
>
192.168.1.6
</domain>
<domain
includeSubdomains=
"true"
>
192.168.63.103
</domain>
<domain
includeSubdomains=
"true"
>
192.168.1.3
</domain>
<domain
includeSubdomains=
"true"
>
192.168.1.7
</domain>
</domain-config>
</network-security-config>
gradle/libs.versions.toml
View file @
396b16a2
...
...
@@ -16,6 +16,7 @@ materialVersion = "1.13.0-alpha02"
swiperefreshlayout
=
"1.2.0-alpha01"
converterJackson
=
"2.11.0"
jacksonDatatypeJsr310
=
"2.17.1"
okhttp
=
"5.0.0-alpha.14"
[libraries]
junit
=
{
group
=
"junit"
,
name
=
"junit"
,
version.ref
=
"junit"
}
...
...
@@ -36,6 +37,7 @@ ucrop = { group = "com.github.yalantis", name = "ucrop", version = "2.2.9" }
swiperefreshlayout
=
{
group
=
"androidx.swiperefreshlayout"
,
name
=
"swiperefreshlayout"
,
version.ref
=
"swiperefreshlayout"
}
converter-jackson
=
{
group
=
"com.squareup.retrofit2"
,
name
=
"converter-jackson"
,
version.ref
=
"converterJackson"
}
jackson-datatype-jsr310
=
{
group
=
"com.fasterxml.jackson.datatype"
,
name
=
"jackson-datatype-jsr310"
,
version.ref
=
"jacksonDatatypeJsr310"
}
okhttp
=
{
group
=
"com.squareup.okhttp3"
,
name
=
"okhttp"
,
version.ref
=
"okhttp"
}
[plugins]
androidApplication
=
{
id
=
"com.android.application"
,
version.ref
=
"agp"
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment