Skip to content

Commit 3e2d807

Browse files
Merge pull request #364 from Ayush0Chaudhary/feature/navbar
Feature/navbar
2 parents 3eaf86c + abd6c84 commit 3e2d807

18 files changed

+1213
-23
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<activity android:name=".triggers.ui.CreateTriggerActivity" android:exported="false" android:label="Create Trigger" android:theme="@style/Theme.Blurr" android:windowSoftInputMode="adjustResize" />
7878
<activity android:name=".triggers.ui.ChooseTriggerTypeActivity" android:exported="false" android:label="Choose Trigger Type" android:theme="@style/Theme.Blurr" />
7979
<activity android:name=".ProPurchaseActivity" android:exported="false" android:label="Upgrade to Pro" android:theme="@style/Theme.Blurr" />
80+
<activity android:name=".MomentsActivity" android:exported="false" android:label="Moments" android:theme="@style/Theme.Blurr" />
8081

8182

8283
<!-- Your Other Services -->
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.blurr.voice
2+
3+
import android.content.Intent
4+
import android.os.Build
5+
import android.os.Bundle
6+
import android.widget.LinearLayout
7+
import androidx.appcompat.app.AppCompatActivity
8+
9+
abstract class BaseNavigationActivity : AppCompatActivity() {
10+
11+
protected abstract fun getContentLayoutId(): Int
12+
protected abstract fun getCurrentNavItem(): NavItem
13+
14+
enum class NavItem {
15+
HOME, TRIGGERS, MOMENTS, UPGRADE, SETTINGS
16+
}
17+
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
super.onCreate(savedInstanceState)
20+
// Disable any default activity transitions
21+
disableTransitions()
22+
}
23+
24+
override fun setContentView(layoutResID: Int) {
25+
super.setContentView(R.layout.activity_base_navigation)
26+
27+
// Inflate the child activity's content into the content container
28+
val contentContainer = findViewById<LinearLayout>(R.id.content_container)
29+
layoutInflater.inflate(layoutResID, contentContainer, true)
30+
31+
setupBottomNavigation()
32+
}
33+
34+
private fun setupBottomNavigation() {
35+
val currentItem = getCurrentNavItem()
36+
37+
findViewById<LinearLayout>(R.id.nav_triggers).apply {
38+
setOnClickListener {
39+
if (currentItem != NavItem.TRIGGERS) {
40+
navigateToActivity(com.blurr.voice.triggers.ui.TriggersActivity::class.java, currentItem)
41+
}
42+
}
43+
alpha = if (currentItem == NavItem.TRIGGERS) 1.0f else 0.7f
44+
}
45+
46+
findViewById<LinearLayout>(R.id.nav_moments).apply {
47+
setOnClickListener {
48+
if (currentItem != NavItem.MOMENTS) {
49+
navigateToActivity(MomentsActivity::class.java, currentItem)
50+
}
51+
}
52+
alpha = if (currentItem == NavItem.MOMENTS) 1.0f else 0.7f
53+
}
54+
55+
findViewById<LinearLayout>(R.id.nav_home).apply {
56+
setOnClickListener {
57+
if (currentItem != NavItem.HOME) {
58+
navigateToActivity(MainActivity::class.java, currentItem)
59+
}
60+
}
61+
alpha = if (currentItem == NavItem.HOME) 1.0f else 0.7f
62+
}
63+
64+
findViewById<LinearLayout>(R.id.nav_upgrade).apply {
65+
setOnClickListener {
66+
if (currentItem != NavItem.UPGRADE) {
67+
navigateToActivity(ProPurchaseActivity::class.java, currentItem)
68+
}
69+
}
70+
alpha = if (currentItem == NavItem.UPGRADE) 1.0f else 0.7f
71+
}
72+
73+
findViewById<LinearLayout>(R.id.nav_settings).apply {
74+
setOnClickListener {
75+
if (currentItem != NavItem.SETTINGS) {
76+
navigateToActivity(SettingsActivity::class.java, currentItem)
77+
}
78+
}
79+
alpha = if (currentItem == NavItem.SETTINGS) 1.0f else 0.7f
80+
}
81+
}
82+
83+
private fun navigateToActivity(activityClass: Class<*>, currentItem: NavItem) {
84+
val intent = Intent(this, activityClass)
85+
startActivity(intent)
86+
// Disable transition animations
87+
disableTransitions()
88+
if (currentItem != NavItem.HOME) {
89+
finish()
90+
// Also disable animations when finishing
91+
disableTransitions()
92+
}
93+
}
94+
95+
override fun finish() {
96+
super.finish()
97+
// Disable animations when finishing
98+
disableTransitions()
99+
}
100+
101+
@Suppress("DEPRECATION")
102+
private fun disableTransitions() {
103+
// Use the legacy method for all Android versions since the new API
104+
// requires more complex setup and this works reliably
105+
overridePendingTransition(0, 0)
106+
}
107+
}

app/src/main/java/com/blurr/voice/MainActivity.kt

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.view.View
2323
import android.view.ViewGroup
2424
import android.widget.Button
2525
import android.widget.ImageButton
26+
import android.widget.LinearLayout
2627
import android.widget.TextView
2728
import android.widget.Toast
2829
import android.widget.VideoView
@@ -60,7 +61,7 @@ import kotlinx.coroutines.withContext
6061
import kotlinx.coroutines.tasks.await
6162
import java.io.File
6263

63-
class MainActivity : AppCompatActivity() {
64+
class MainActivity : BaseNavigationActivity() {
6465

6566
private lateinit var handler: Handler
6667
private lateinit var managePermissionsButton: TextView
@@ -174,7 +175,7 @@ class MainActivity : AppCompatActivity() {
174175
}
175176

176177

177-
setContentView(R.layout.activity_main)
178+
setContentView(R.layout.activity_main_content)
178179
// existing click listener
179180
findViewById<TextView>(R.id.btn_set_default_assistant).setOnClickListener {
180181
startActivity(Intent(this, RoleRequestActivity::class.java))
@@ -215,6 +216,7 @@ class MainActivity : AppCompatActivity() {
215216
setupClickListeners()
216217
setupSettingsButton()
217218
setupGradientText()
219+
218220

219221
// Show loading and perform initial billing check
220222
showLoading(true)
@@ -319,19 +321,18 @@ class MainActivity : AppCompatActivity() {
319321
handleIntent(intent)
320322
}
321323

324+
override fun getContentLayoutId(): Int = R.layout.activity_main_content
325+
326+
override fun getCurrentNavItem(): BaseNavigationActivity.NavItem = BaseNavigationActivity.NavItem.HOME
327+
322328
private fun setupClickListeners() {
323-
findViewById<TextView>(R.id.triggersButton).setOnClickListener {
324-
startActivity(Intent(this, com.blurr.voice.triggers.ui.TriggersActivity::class.java))
325-
}
326329
findViewById<TextView>(R.id.startConversationButton).setOnClickListener {
327330
startConversationalAgent()
328331
}
329332
// findViewById<TextView>(R.id.memoriesButton).setOnClickListener {
330333
// startActivity(Intent(this, MemoriesActivity::class.java))
331334
// }
332-
findViewById<TextView>(R.id.goProButton).setOnClickListener {
333-
startActivity(Intent(this, ProPurchaseActivity::class.java))
334-
}
335+
335336
saveKeyButton.setOnClickListener {
336337
startActivity(Intent(this, SettingsActivity::class.java))
337338
}
@@ -342,11 +343,7 @@ class MainActivity : AppCompatActivity() {
342343
increaseLimitsLink.setOnClickListener {
343344
requestLimitIncrease()
344345
}
345-
findViewById<TextView>(R.id.github_link_textview).setOnClickListener {
346-
val url = "https://github.com/Ayush0Chaudhary/blurr"
347-
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
348-
startActivity(intent)
349-
}
346+
350347
wakeWordHelpLink.setOnClickListener {
351348
showWakeWordFailureDialog()
352349
}
@@ -494,12 +491,10 @@ class MainActivity : AppCompatActivity() {
494491
private fun updateTaskCounter() {
495492
lifecycleScope.launch {
496493
val tasksLeft = freemiumManager.getTasksRemaining()
497-
val goProButton = findViewById<TextView>(R.id.goProButton)
498494

499495
if (tasksLeft == Long.MAX_VALUE) {
500496
tasksRemainingTextView.visibility = View.GONE
501497
increaseLimitsLink.visibility = View.GONE
502-
goProButton.visibility = View.GONE
503498

504499
} else if (tasksLeft != null && tasksLeft >= 0) {
505500
if (tasksLeft > 0) {
@@ -508,13 +503,11 @@ class MainActivity : AppCompatActivity() {
508503
tasksRemainingTextView.text = "You have 0 free tasks left for today."
509504
}
510505
tasksRemainingTextView.visibility = View.VISIBLE
511-
goProButton.visibility = View.VISIBLE
512506
increaseLimitsLink.visibility = View.VISIBLE
513507

514508
} else {
515509
tasksRemainingTextView.visibility = View.GONE
516510
increaseLimitsLink.visibility = View.VISIBLE
517-
goProButton.visibility = View.VISIBLE
518511
}
519512
}
520513
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.blurr.voice
2+
3+
import android.os.Bundle
4+
import android.widget.TextView
5+
import androidx.appcompat.app.AppCompatActivity
6+
7+
class MomentsActivity : BaseNavigationActivity() {
8+
9+
override fun onCreate(savedInstanceState: Bundle?) {
10+
super.onCreate(savedInstanceState)
11+
setContentView(R.layout.activity_moments_content)
12+
13+
// Setup back button
14+
findViewById<TextView>(R.id.back_button).setOnClickListener {
15+
finish()
16+
}
17+
}
18+
19+
override fun getContentLayoutId(): Int = R.layout.activity_moments_content
20+
21+
override fun getCurrentNavItem(): BaseNavigationActivity.NavItem = BaseNavigationActivity.NavItem.MOMENTS
22+
}

app/src/main/java/com/blurr/voice/ProPurchaseActivity.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.first
1515
import kotlinx.coroutines.launch
1616
import kotlinx.coroutines.withTimeoutOrNull
1717

18-
class ProPurchaseActivity : AppCompatActivity(), PurchasesUpdatedListener {
18+
class ProPurchaseActivity : BaseNavigationActivity(), PurchasesUpdatedListener {
1919

2020
private lateinit var priceTextView: TextView
2121
private lateinit var purchaseButton: Button
@@ -182,4 +182,11 @@ class ProPurchaseActivity : AppCompatActivity(), PurchasesUpdatedListener {
182182
Toast.makeText(this, "Purchase failed: ${billingResult.debugMessage}", Toast.LENGTH_LONG).show()
183183
}
184184
}
185+
override fun getContentLayoutId(): Int {
186+
return R.layout.activity_pro_purchase
187+
}
188+
189+
override fun getCurrentNavItem(): NavItem {
190+
return BaseNavigationActivity.NavItem.UPGRADE
191+
}
185192
}

app/src/main/java/com/blurr/voice/SettingsActivity.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import kotlinx.coroutines.launch
3232
import java.io.File
3333
import kotlin.coroutines.cancellation.CancellationException
3434

35-
class SettingsActivity : AppCompatActivity() {
35+
class SettingsActivity : BaseNavigationActivity() {
3636

3737
private lateinit var ttsVoicePicker: NumberPicker
3838
private lateinit var backButton: Button
@@ -330,5 +330,8 @@ class SettingsActivity : AppCompatActivity() {
330330
androidx.core.content.ContextCompat.getColor(this, R.color.white)
331331
)
332332
}
333-
333+
334+
override fun getContentLayoutId(): Int = R.layout.activity_settings
335+
336+
override fun getCurrentNavItem(): BaseNavigationActivity.NavItem = BaseNavigationActivity.NavItem.SETTINGS
334337
}

app/src/main/java/com/blurr/voice/triggers/ui/TriggersActivity.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.widget.CheckBox
1010
import android.widget.TextView
1111
import androidx.appcompat.app.AlertDialog
1212
import androidx.appcompat.app.AppCompatActivity
13+
import com.blurr.voice.BaseNavigationActivity
1314
import androidx.recyclerview.widget.LinearLayoutManager
1415
import androidx.recyclerview.widget.RecyclerView
1516
import com.blurr.voice.R
@@ -18,7 +19,7 @@ import com.blurr.voice.triggers.TriggerMonitoringService
1819
import com.blurr.voice.triggers.TriggerType
1920
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
2021

21-
class TriggersActivity : AppCompatActivity() {
22+
class TriggersActivity : BaseNavigationActivity() {
2223

2324
private lateinit var triggerManager: TriggerManager
2425
private lateinit var triggerAdapter: TriggerAdapter
@@ -190,4 +191,8 @@ class TriggersActivity : AppCompatActivity() {
190191
val triggers = triggerManager.getTriggers()
191192
triggerAdapter.updateTriggers(triggers)
192193
}
194+
195+
override fun getContentLayoutId(): Int = R.layout.activity_triggers
196+
197+
override fun getCurrentNavItem(): BaseNavigationActivity.NavItem = BaseNavigationActivity.NavItem.TRIGGERS
193198
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="32dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="@android:color/transparent"
8+
android:strokeColor="#FFFFFF"
9+
android:strokeWidth="2.5"
10+
android:pathData="M12,3 L21,19 L3,19 Z"/>
11+
</vector>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="#FFFFFF"
8+
android:pathData="M12,2l3.09,6.26L22,9.27l-5,4.87 1.18,6.88L12,17.77l-6.18,3.25L7,14.14 2,9.27l6.91,-1.01L12,2z"/>
9+
</vector>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="@android:color/transparent"
8+
android:strokeColor="#FFFFFF"
9+
android:strokeWidth="2"
10+
android:pathData="M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/>
11+
<path
12+
android:fillColor="@android:color/transparent"
13+
android:strokeColor="#FFFFFF"
14+
android:strokeWidth="2"
15+
android:pathData="M19.4,15a1.65,1.65 0,0 0,0.33 1.82l0.06,0.06a2,2 0,0 1,0 2.83,2 2,0 0,1 -2.83,0l-0.06,-0.06a1.65,1.65 0,0 0,-1.82 -0.33,1.65 1.65,0 0,0 -1,1.51V21a2,2 0,0 1,-2 2,2 2,0 0,1 -2,-2v-0.09A1.65,1.65 0,0 0,9.4 19.4a1.65,1.65 0,0 0,-1.82 0.33l-0.06,0.06a2,2 0,0 1,-2.83 0,2 2,0 0,1 0,-2.83l0.06,-0.06a1.65,1.65 0,0 0,0.33 -1.82,1.65 1.65,0 0,0 -1.51,-1H3a2,2 0,0 1,-2 -2,2 2,0 0,1 2,-2h0.09A1.65,1.65 0,0 0,4.6 9.4a1.65,1.65 0,0 0,-0.33 -1.82L4.21,7.52a2,2 0,0 1,0 -2.83,2 2,0 0,1 2.83,0l0.06,0.06a1.65,1.65 0,0 0,1.82 0.33H9a1.65,1.65 0,0 0,1 -1.51V3a2,2 0,0 1,2 -2,2 2,0 0,1 2,2v0.09a1.65,1.65 0,0 0,1 1.51,1.65 1.65,0 0,0 1.82,-0.33l0.06,-0.06a2,2 0,0 1,2.83 0,2 2,0 0,1 0,2.83l-0.06,0.06a1.65,1.65 0,0 0,-0.33 1.82V9a1.65,1.65 0,0 0,1.51 1H21a2,2 0,0 1,2 2,2 2,0 0,1 -2,2h-0.09a1.65,1.65 0,0 0,-1.51 1z"/>
16+
</vector>

0 commit comments

Comments
 (0)