Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,6 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

implementation "androidx.paging:paging-runtime-ktx:$paging_version"
implementation 'com.pavelsikun:material-seekbar-preference:2.3.0'

}
43 changes: 29 additions & 14 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,52 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ai.kun.socialdistancealarm">

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- If your app targets Android 9 or lower, you can declare
ACCESS_COARSE_LOCATION instead. -->
<!--
If your app targets Android 9 or lower, you can declare
ACCESS_COARSE_LOCATION instead.
-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

<application
android:name=".SocialDistanceAlarm"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name="ai.kun.socialdistancealarm.SocialDistanceAlarm">
android:theme="@style/AppTheme">
<activity
android:name=".ui.settings.SettingsActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>

<receiver
android:name=".alarm.BLEClient"
android:enabled="true"
android:exported="false"
android:name="ai.kun.socialdistancealarm.alarm.BLEClient" />
android:exported="false" />
<receiver
android:name=".alarm.BLEServer"
android:enabled="true"
android:exported="false"
android:name="ai.kun.socialdistancealarm.alarm.BLEServer" />
<receiver android:name="ai.kun.socialdistancealarm.alarm.AutoStart">
android:exported="false" />
<receiver android:name=".alarm.AutoStart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

<activity
android:name="ai.kun.socialdistancealarm.MainActivity"
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package ai.kun.socialdistancealarm

import ai.kun.socialdistancealarm.alarm.BLETrace
import ai.kun.socialdistancealarm.ui.home.HomeFragment
import ai.kun.socialdistancealarm.ui.settings.SettingsActivity
import ai.kun.socialdistancealarm.ui.timer.TimerFragment
import ai.kun.socialdistancealarm.ui.timer.TimerState
import ai.kun.socialdistancealarm.util.PrefUtil
import android.content.Intent
import android.os.Build
import android.os.Bundle
Expand All @@ -10,6 +15,7 @@ import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
Expand All @@ -18,7 +24,7 @@ import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView


class MainActivity : AppCompatActivity() {
class MainActivity : AppCompatActivity() {
private val TAG = "MainActivity"

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -39,7 +45,7 @@ class MainActivity : AppCompatActivity() {
R.id.onBoardFragment_2,
R.id.onBoardFragment_3,
R.id.onBoardFragment_4,
R.id.launchFragment-> {
R.id.launchFragment -> {
navView.visibility = View.GONE
toolbar.visibility = View.GONE
}
Expand All @@ -52,7 +58,8 @@ class MainActivity : AppCompatActivity() {

// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(setOf(R.id.navigation_history, R.id.navigation_home))
val appBarConfiguration =
AppBarConfiguration(setOf(R.id.navigation_history, R.id.navigation_home))
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
Expand All @@ -65,15 +72,15 @@ class MainActivity : AppCompatActivity() {
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
menu?.let {
// Change the state of the toolbar depending on the state of BLETrace
BLETrace.isStarted.observeForever(Observer { isStarted ->
setPausePlayOption(it, isStarted)
})

// Initialize to the current state
setPausePlayOption(it, BLETrace.isStarted.value)
}
menu?.let {
// Change the state of the toolbar depending on the state of BLETrace
BLETrace.isStarted.observeForever(Observer { isStarted ->
setPausePlayOption(it, isStarted)
})

// Initialize to the current state
setPausePlayOption(it, BLETrace.isStarted.value)
}
return true
}

Expand Down Expand Up @@ -111,9 +118,15 @@ class MainActivity : AppCompatActivity() {
}
R.id.app_bar_pause -> {
BLETrace.isPaused = true
PrefUtil.setTimerState(TimerState.Paused, this)
}
R.id.app_bar_play -> {
BLETrace.isPaused = false
PrefUtil.setTimerState(TimerState.Running, this)
}
R.id.action_settings -> {
val intent = Intent(this, SettingsActivity::class.java)
startActivity(intent)
}
}
return super.onOptionsItemSelected(item)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ai.kun.socialdistancealarm.ui.base

import androidx.annotation.IdRes
import androidx.fragment.app.Fragment

abstract class BaseFragment: Fragment() {

protected fun addFragment(@IdRes containerViewId: Int, fragment: Fragment, fragmentTag: String) {
childFragmentManager
.beginTransaction()
.add(containerViewId, fragment, fragmentTag)
.commit()
}

protected fun replaceFragment(@IdRes containerViewId: Int, fragment: Fragment, fragmentTag: String, backStackStateName: String?) {
childFragmentManager
.beginTransaction()
.replace(containerViewId, fragment, fragmentTag)
.addToBackStack(backStackStateName)
.commit()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package ai.kun.socialdistancealarm.ui.home

import ai.kun.socialdistancealarm.R
import ai.kun.socialdistancealarm.alarm.BLETrace
import ai.kun.socialdistancealarm.ui.base.BaseFragment
import ai.kun.socialdistancealarm.ui.timer.TimerFragment
import android.Manifest
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
Expand All @@ -16,14 +18,13 @@ import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class HomeFragment : Fragment() {
class HomeFragment : BaseFragment() {
private val TAG = "HomeFragment"

private val REQUEST_FINE_LOCATION = 2
Expand All @@ -43,6 +44,9 @@ class HomeFragment : Fragment() {
): View? {
val homeViewModel: HomeViewModel by viewModels()
val root = inflater.inflate(R.layout.fragment_home, container, false)

addFragment(R.id.child_fragment_container, TimerFragment.newInstance(), "TIMER_FRAGMENT_TAG")

val recyclerView = root.findViewById<RecyclerView>(R.id.recyclerView_devices)
context?.let { fragmentContext ->
val deviceListAdapter = DeviceListAdapter(fragmentContext)
Expand All @@ -60,7 +64,7 @@ class HomeFragment : Fragment() {

homeViewModel.isStarted.observe(viewLifecycleOwner, Observer { isStarted ->
isStarted?.let {
setVisibility(root, it)
// setVisibility(root, it)
}
})
}
Expand Down Expand Up @@ -94,7 +98,7 @@ class HomeFragment : Fragment() {

// Initialize the visibility
BLETrace.isStarted.value?.let {
setVisibility(view, it)
// setVisibility(view, it)
}

// Initialize the resume when tapping on the blue text...
Expand Down Expand Up @@ -241,5 +245,4 @@ class HomeFragment : Fragment() {
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ai.kun.socialdistancealarm.ui.settings

import ai.kun.socialdistancealarm.R
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class SettingsActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = "Settings"
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ai.kun.socialdistancealarm.ui.settings

import ai.kun.socialdistancealarm.R
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

class SettingsActivityFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preferences)
}
}
Loading