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
9ef3abdd
Commit
9ef3abdd
authored
Oct 28, 2024
by
Ishankha K.C
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
use multiple devices
parent
d73d445b
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
482 additions
and
2 deletions
+482
-2
app/src/main/AndroidManifest.xml
app/src/main/AndroidManifest.xml
+3
-0
app/src/main/java/com/kaluwa/enterprises/babycare/activities/BabyCamListActivity.java
.../enterprises/babycare/activities/BabyCamListActivity.java
+243
-0
app/src/main/java/com/kaluwa/enterprises/babycare/activities/DashboardActivity.java
...wa/enterprises/babycare/activities/DashboardActivity.java
+1
-1
app/src/main/java/com/kaluwa/enterprises/babycare/activities/LiveFeedActivity.java
...uwa/enterprises/babycare/activities/LiveFeedActivity.java
+6
-1
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/BabyCamListAdapter.java
...luwa/enterprises/babycare/adapter/BabyCamListAdapter.java
+125
-0
app/src/main/res/layout/activity_baby_cam_list.xml
app/src/main/res/layout/activity_baby_cam_list.xml
+104
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
9ef3abdd
...
@@ -18,6 +18,9 @@
...
@@ -18,6 +18,9 @@
android:supportsRtl=
"true"
android:supportsRtl=
"true"
android:theme=
"@style/Theme.BabyCare"
android:theme=
"@style/Theme.BabyCare"
tools:targetApi=
"31"
>
tools:targetApi=
"31"
>
<activity
android:name=
".activities.BabyCamListActivity"
android:exported=
"false"
/>
<activity
<activity
android:name=
".activities.LiveVocalActivity"
android:name=
".activities.LiveVocalActivity"
android:exported=
"false"
/>
android:exported=
"false"
/>
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/activities/BabyCamListActivity.java
0 → 100644
View file @
9ef3abdd
package
com.kaluwa.enterprises.babycare.activities
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
config
.
TokenSaver
.
clearToken
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
config
.
TokenSaver
.
getToken
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
animationChanger
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
loader
;
import
android.content.Intent
;
import
android.os.Bundle
;
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.TextView
;
import
android.widget.Toast
;
import
androidx.activity.EdgeToEdge
;
import
androidx.annotation.NonNull
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.appcompat.widget.PopupMenu
;
import
androidx.appcompat.widget.Toolbar
;
import
androidx.core.graphics.Insets
;
import
androidx.core.view.ViewCompat
;
import
androidx.core.view.WindowInsetsCompat
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
androidx.swiperefreshlayout.widget.SwipeRefreshLayout
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.github.ybq.android.spinkit.SpinKitView
;
import
com.google.android.material.floatingactionbutton.FloatingActionButton
;
import
com.google.gson.Gson
;
import
com.kaluwa.enterprises.babycare.MainActivity
;
import
com.kaluwa.enterprises.babycare.R
;
import
com.kaluwa.enterprises.babycare.adapter.BabyCamListAdapter
;
import
com.kaluwa.enterprises.babycare.adapter.BabyDashboardAdapter
;
import
com.kaluwa.enterprises.babycare.config.ApiConfig
;
import
com.kaluwa.enterprises.babycare.dto.BabyDto
;
import
com.kaluwa.enterprises.babycare.dto.responseDto.AuthenticationDto
;
import
com.kaluwa.enterprises.babycare.error.ErrorDto
;
import
com.kaluwa.enterprises.babycare.service.BabyApiService
;
import
java.util.ArrayList
;
import
java.util.List
;
import
retrofit2.Call
;
import
retrofit2.Callback
;
import
retrofit2.Response
;
public
class
BabyCamListActivity
extends
AppCompatActivity
{
private
final
static
String
TAG
=
"BabyCamListActivity"
;
private
SwipeRefreshLayout
swipeContainer
;
private
AuthenticationDto
authDto
;
private
RecyclerView
recyclerView
;
private
TextView
tvNoContent
;
private
View
overlay
;
private
SpinKitView
progressbar
;
private
BabyApiService
babyApiService
;
private
BabyCamListAdapter
adapter
;
private
List
<
BabyDto
>
babyDtoList
=
new
ArrayList
<>();
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_baby_cam_list
);
// define actionbar
defineActionbar
();
swipeToRefresh
();
// initialize user api service
try
{
authDto
=
getToken
(
getApplicationContext
());
}
catch
(
JsonProcessingException
e
)
{
Log
.
e
(
TAG
,
"Error: "
+
e
.
getMessage
());
Toast
.
makeText
(
this
,
"Error getting token, Please refresh"
,
Toast
.
LENGTH_SHORT
).
show
();
}
babyApiService
=
ApiConfig
.
getInstance
().
getBabyApi
(
authDto
.
getTokenDto
().
getToken
());
// assign ids here
recyclerView
=
findViewById
(
R
.
id
.
bcl_baby_dash_rv
);
tvNoContent
=
findViewById
(
R
.
id
.
no_content_message
);
overlay
=
findViewById
(
R
.
id
.
overlay
);
progressbar
=
findViewById
(
R
.
id
.
progress_bar
);
// load data
loadData
();
adapter
=
new
BabyCamListAdapter
(
this
,
babyDtoList
);
recyclerView
.
setAdapter
(
adapter
);
recyclerView
.
setLayoutManager
(
new
LinearLayoutManager
(
this
));
}
private
void
loadData
()
{
Call
<
List
<
BabyDto
>>
call
=
babyApiService
.
getAllBabies
();
loader
(
overlay
,
progressbar
,
true
);
noContentCall
();
call
.
enqueue
(
new
Callback
<
List
<
BabyDto
>>()
{
@Override
public
void
onResponse
(
Call
<
List
<
BabyDto
>>
call
,
Response
<
List
<
BabyDto
>>
response
)
{
if
(
response
.
isSuccessful
())
{
List
<
BabyDto
>
newBabyDtoList
=
new
ArrayList
<>();
if
(
response
.
body
()
!=
null
)
{
newBabyDtoList
=
response
.
body
();
}
// Assuming babyDtoList is a class member
// Check for changes and update the list accordingly
if
(
babyDtoList
==
null
)
{
babyDtoList
=
newBabyDtoList
;
adapter
.
notifyItemRangeInserted
(
0
,
newBabyDtoList
.
size
());
}
else
{
// Here, you might want to implement a diffing algorithm
// For simplicity, let's assume you replace the entire list
babyDtoList
.
clear
();
babyDtoList
.
addAll
(
newBabyDtoList
);
adapter
.
notifyDataSetChanged
();
}
noContentCall
();
loader
(
overlay
,
progressbar
,
false
);
}
else
{
try
{
Gson
gson
=
new
Gson
();
assert
response
.
errorBody
()
!=
null
;
String
errorBodyString
=
response
.
errorBody
().
string
();
// Check if the error body is in JSON format
if
(
errorBodyString
.
startsWith
(
"{"
))
{
ErrorDto
errorDto
=
gson
.
fromJson
(
errorBodyString
,
ErrorDto
.
class
);
Toast
.
makeText
(
BabyCamListActivity
.
this
,
errorDto
.
getMessage
(),
Toast
.
LENGTH_LONG
).
show
();
}
else
{
// If the error body is not in JSON format, display a generic error message
Log
.
e
(
TAG
,
errorBodyString
);
Toast
.
makeText
(
BabyCamListActivity
.
this
,
"An unexpected error occurred"
,
Toast
.
LENGTH_LONG
).
show
();
}
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
"else-error: "
+
e
.
getMessage
());
Toast
.
makeText
(
BabyCamListActivity
.
this
,
e
.
getMessage
(),
Toast
.
LENGTH_LONG
).
show
();
}
noContentCall
();
loader
(
overlay
,
progressbar
,
false
);
}
}
@Override
public
void
onFailure
(
Call
<
List
<
BabyDto
>>
call
,
Throwable
throwable
)
{
noContentCall
();
Log
.
e
(
TAG
,
throwable
.
getMessage
());
Toast
.
makeText
(
BabyCamListActivity
.
this
,
"Error to Failure"
,
Toast
.
LENGTH_LONG
).
show
();
loader
(
overlay
,
progressbar
,
false
);
}
});
}
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_dashboard
)
{
Intent
intent
=
new
Intent
(
this
,
DashboardActivity
.
class
);
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_CLEAR_TASK
|
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
startActivity
(
intent
);
animationChanger
(
this
);
finish
();
}
else
if
(
id
==
R
.
id
.
mm_app_setting
)
{
Intent
intent
=
new
Intent
(
this
,
SettingsActivity
.
class
);
startActivity
(
intent
);
animationChanger
(
this
);
}
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
();
});
}
private
void
swipeToRefresh
()
{
// Look up for the swipe container
swipeContainer
=
findViewById
(
R
.
id
.
swipeContainer
);
// Setup Refresh Listener which triggers new data loading
swipeContainer
.
setOnRefreshListener
(()
->
{
// Code to refresh goes here. Make sure to call swipeContainer.setRefresh(false) once the refreshed.
startActivity
(
getIntent
());
finish
();
overridePendingTransition
(
0
,
0
);
swipeContainer
.
setRefreshing
(
false
);
});
// Configure refresh colors
swipeContainer
.
setColorSchemeResources
(
android
.
R
.
color
.
holo_blue_bright
,
android
.
R
.
color
.
holo_green_light
,
android
.
R
.
color
.
holo_orange_light
,
android
.
R
.
color
.
holo_red_light
);
}
@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
);
}
void
noContentCall
()
{
if
(
babyDtoList
.
isEmpty
())
{
tvNoContent
.
setVisibility
(
View
.
VISIBLE
);
}
else
{
tvNoContent
.
setVisibility
(
View
.
GONE
);
}
}
}
\ No newline at end of file
app/src/main/java/com/kaluwa/enterprises/babycare/activities/DashboardActivity.java
View file @
9ef3abdd
...
@@ -40,7 +40,7 @@ public class DashboardActivity extends AppCompatActivity {
...
@@ -40,7 +40,7 @@ public class DashboardActivity extends AppCompatActivity {
btn6
=
findViewById
(
R
.
id
.
btn_settings
);
btn6
=
findViewById
(
R
.
id
.
btn_settings
);
btn1
.
setOnClickListener
(
v
->
{
btn1
.
setOnClickListener
(
v
->
{
Intent
intent
=
new
Intent
(
this
,
LiveFeed
Activity
.
class
);
Intent
intent
=
new
Intent
(
this
,
BabyCamList
Activity
.
class
);
startActivity
(
intent
);
startActivity
(
intent
);
animationChanger
(
this
);
animationChanger
(
this
);
});
});
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/activities/LiveFeedActivity.java
View file @
9ef3abdd
...
@@ -56,7 +56,7 @@ public class LiveFeedActivity extends AppCompatActivity {
...
@@ -56,7 +56,7 @@ public class LiveFeedActivity extends AppCompatActivity {
private
Handler
handler
=
new
Handler
();
private
Handler
handler
=
new
Handler
();
private
Runnable
updateRunnable
;
private
Runnable
updateRunnable
;
private
WebSocket
webSocket
;
private
WebSocket
webSocket
;
private
String
deviceUid
=
"
8563efa6
"
;
private
String
deviceUid
=
""
;
private
AuthenticationDto
authDto
;
private
AuthenticationDto
authDto
;
...
@@ -74,6 +74,11 @@ public class LiveFeedActivity extends AppCompatActivity {
...
@@ -74,6 +74,11 @@ public class LiveFeedActivity extends AppCompatActivity {
Toast
.
makeText
(
this
,
"Error getting token, Please refresh"
,
Toast
.
LENGTH_SHORT
).
show
();
Toast
.
makeText
(
this
,
"Error getting token, Please refresh"
,
Toast
.
LENGTH_SHORT
).
show
();
}
}
// get extra
if
(
getIntent
().
hasExtra
(
"deviceUid"
))
{
deviceUid
=
getIntent
().
getStringExtra
(
"deviceUid"
);
}
// Replace the device UID in the URLs
// Replace the device UID in the URLs
LIVE_FEED_URL
=
LIVE_FEED_URL
.
replace
(
"{device_uid}"
,
deviceUid
);
LIVE_FEED_URL
=
LIVE_FEED_URL
.
replace
(
"{device_uid}"
,
deviceUid
);
...
...
app/src/main/java/com/kaluwa/enterprises/babycare/adapter/BabyCamListAdapter.java
0 → 100644
View file @
9ef3abdd
package
com.kaluwa.enterprises.babycare.adapter
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
animationChanger
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
babyAgeCalculate
;
import
static
com
.
kaluwa
.
enterprises
.
babycare
.
utils
.
Utils
.
convertByteArrayToBitmap
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.graphics.Bitmap
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
androidx.annotation.NonNull
;
import
androidx.constraintlayout.widget.ConstraintLayout
;
import
androidx.fragment.app.FragmentActivity
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.google.android.material.imageview.ShapeableImageView
;
import
com.kaluwa.enterprises.babycare.R
;
import
com.kaluwa.enterprises.babycare.activities.BabyCamListActivity
;
import
com.kaluwa.enterprises.babycare.activities.LiveFeedActivity
;
import
com.kaluwa.enterprises.babycare.dialogs.EditBabyDialog
;
import
com.kaluwa.enterprises.babycare.dto.BabyDto
;
import
java.time.LocalDate
;
import
java.util.List
;
public
class
BabyCamListAdapter
extends
RecyclerView
.
Adapter
<
BabyCamListAdapter
.
BabyCamListItemHolder
>
{
private
final
static
String
TAG
=
"BabyCamListAdapter"
;
private
Context
context
;
private
List
<
BabyDto
>
babyList
;
public
BabyCamListAdapter
(
BabyCamListActivity
context
,
List
<
BabyDto
>
babyList
)
{
this
.
context
=
context
;
this
.
babyList
=
babyList
;
}
@NonNull
@Override
public
BabyCamListAdapter
.
BabyCamListItemHolder
onCreateViewHolder
(
@NonNull
ViewGroup
parent
,
int
viewType
)
{
View
view
=
LayoutInflater
.
from
(
context
).
inflate
(
R
.
layout
.
baby_rv_item
,
parent
,
false
);
return
new
BabyCamListItemHolder
(
view
);
}
@Override
public
void
onBindViewHolder
(
@NonNull
BabyCamListAdapter
.
BabyCamListItemHolder
holder
,
int
position
)
{
BabyDto
babyDto
=
babyList
.
get
(
position
);
String
firstname
=
babyDto
.
getFirstName
();
String
lastname
=
babyDto
.
getLastName
();
LocalDate
dob
=
babyDto
.
getDob
();
String
sex
=
babyDto
.
getSex
();
String
notes
=
babyDto
.
getNotes
();
Boolean
isActive
=
babyDto
.
getIsActive
();
byte
[]
imageData
=
babyDto
.
getImageData
();
if
(
lastname
!=
null
)
{
holder
.
tvBabyName
.
setText
(
firstname
+
" "
+
lastname
);
}
else
{
holder
.
tvBabyName
.
setText
(
firstname
);
}
String
age
=
babyAgeCalculate
(
dob
);
holder
.
tvBabyAge
.
setText
(
age
!=
null
?
age
:
"Not Available"
);
holder
.
tvBabySex
.
setText
(
sex
);
if
(!
TextUtils
.
isEmpty
(
notes
))
{
holder
.
tvBabyDDespContent
.
setText
(
notes
);
}
else
{
holder
.
tvBabyDDespTitle
.
setText
(
"Status >"
);
holder
.
tvBabyDDespContent
.
setTextColor
(
isActive
?
context
.
getResources
().
getColor
(
R
.
color
.
success_green
)
:
context
.
getResources
().
getColor
(
R
.
color
.
cancel_red
));
holder
.
tvBabyDDespContent
.
setText
(
isActive
?
"Active"
:
"Inactive"
);
}
if
(
imageData
!=
null
)
{
try
{
Bitmap
bitmap
=
convertByteArrayToBitmap
(
imageData
);
holder
.
ivBabyImage
.
setImageBitmap
(
bitmap
);
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
"Error occurred: "
+
e
.
getMessage
());
Toast
.
makeText
(
context
,
e
.
getMessage
(),
Toast
.
LENGTH_SHORT
).
show
();
}
}
// Handle item click
holder
.
clBabyItem
.
setOnClickListener
(
v
->
{
// Open live feed activity
if
(
babyDto
.
getDeviceUid
()
==
null
||
babyDto
.
getDeviceUid
().
isEmpty
())
{
Toast
.
makeText
(
context
,
"No device is associated with this baby."
,
Toast
.
LENGTH_SHORT
).
show
();
}
else
{
Toast
.
makeText
(
context
,
"Opening live feed for "
+
babyDto
.
getFirstName
(),
Toast
.
LENGTH_SHORT
).
show
();
Intent
intent
=
new
Intent
(
context
,
LiveFeedActivity
.
class
);
intent
.
putExtra
(
"deviceUid"
,
babyDto
.
getDeviceUid
());
context
.
startActivity
(
intent
);
animationChanger
((
Activity
)
context
);
}
});
}
@Override
public
int
getItemCount
()
{
return
babyList
.
size
();
}
public
static
class
BabyCamListItemHolder
extends
RecyclerView
.
ViewHolder
{
public
ConstraintLayout
clBabyItem
;
public
TextView
tvBabyName
,
tvBabyAge
,
tvBabySex
,
tvBabyDDespTitle
,
tvBabyDDespContent
;
public
ShapeableImageView
ivBabyImage
;
public
BabyCamListItemHolder
(
@NonNull
View
view
)
{
super
(
view
);
clBabyItem
=
view
.
findViewById
(
R
.
id
.
baby_item
);
tvBabyName
=
view
.
findViewById
(
R
.
id
.
baby_item_name
);
tvBabyAge
=
view
.
findViewById
(
R
.
id
.
baby_item_tv_age_content
);
tvBabySex
=
view
.
findViewById
(
R
.
id
.
baby_item_tv_sex_content
);
tvBabyDDespTitle
=
view
.
findViewById
(
R
.
id
.
baby_item_tv_desp_title
);
tvBabyDDespContent
=
view
.
findViewById
(
R
.
id
.
baby_item_tv_desp_content
);
ivBabyImage
=
view
.
findViewById
(
R
.
id
.
baby_item_iv_image
);
}
}
}
app/src/main/res/layout/activity_baby_cam_list.xml
0 → 100644
View file @
9ef3abdd
<?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.BabyCamListActivity"
>
<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=
"Baby Cam List"
android:textAlignment=
"center"
android:textColor=
"@color/white"
android:textAllCaps=
"true"
android:fontFamily=
"@font/inknut_antiqua_regular"
android:textSize=
"20sp"
android:gravity=
"center"
/>
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/bcl_baby_dash_rv"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintTop_toBottomOf=
"@id/rl_header"
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
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