Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
[Jetchat] Moves to Scaffold and Compose drawer content
Change-Id: I18d6c90b947fc2cc98c7d2c2683f1954ace200ed
  • Loading branch information
JoseAlcerreca committed Oct 30, 2020
commit 1c5d29477eab8a75f8226eca2a169bf3581c38fb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.example.compose.jetchat

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.compose.jetchat.util.Event

class MainViewModel : ViewModel() {
private val _openDrawerEvent = MutableLiveData<Event<Unit>>()
val openDrawerEvent: LiveData<Event<Unit>> = _openDrawerEvent

fun openDrawer() {
_openDrawerEvent.value = Event(Unit)
}
}
143 changes: 100 additions & 43 deletions Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,72 +17,129 @@
package com.example.compose.jetchat

import android.os.Bundle
import android.view.Menu
import android.util.Log
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.compose.foundation.Text
import androidx.compose.material.Scaffold
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onCommit
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ContextAmbient
import androidx.compose.ui.platform.setContent
import androidx.compose.ui.viewinterop.AndroidView
import androidx.fragment.app.viewModels
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.navigation.NavigationView
import com.example.compose.jetchat.components.JetchatDrawer
import com.example.compose.jetchat.profile.ProfileViewModel

/**
* Main activity for the app. Shows a drawer and a toolbar rendered with traditional Views, for now.
* Main activity for the app.
*/
class NavActivity : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var drawerLayout: DrawerLayout
private val viewModel: MainViewModel by viewModels()

private var drawerShouldBeOpen by mutableStateOf(false)
private var drawerShouldBeClosed by mutableStateOf(false)

private var isDrawerOpen by mutableStateOf(false)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setContent {

drawerLayout = findViewById(R.id.drawer_layout)
val navView: NavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home,
R.id.nav_profile
),
drawerLayout
)
navView.setupWithNavController(navController)
}
val state = rememberScaffoldState()

onCommit(drawerShouldBeOpen, drawerShouldBeClosed) {
if (drawerShouldBeOpen) {
state.drawerState.open {
drawerShouldBeOpen = false
}
}
if (drawerShouldBeClosed) {
state.drawerState.close {
drawerShouldBeClosed = false
}
}
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu)
return true
onCommit(state.drawerState.isOpen) {
Log.d("jalc", state.drawerState.isOpen.toString())
isDrawerOpen = state.drawerState.isOpen
}

Scaffold(
drawerContent = {
JetchatDrawer()
},
scaffoldState = state
) {

val context = ContextAmbient.current

AndroidView( { LayoutInflater.from(context)
.inflate(R.layout.content_main, FrameLayout(context), false) }
)

}
}

viewModel.openDrawerEvent.observe(this) {
drawerShouldBeOpen = true
}
}



//
// private lateinit var appBarConfiguration: AppBarConfiguration
// private lateinit var drawerLayout: DrawerLayout
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_main)
//
// drawerLayout = findViewById(R.id.drawer_layout)
// val navView: NavigationView = findViewById(R.id.nav_view)
// val navController = findNavController(R.id.nav_host_fragment)
// // Passing each menu ID as a set of Ids because each
// // menu should be considered as top level destinations.
// appBarConfiguration = AppBarConfiguration(
// setOf(
// R.id.nav_home,
// R.id.nav_profile
// ),
// drawerLayout
// )
// navView.setupWithNavController(navController)
// }
//
// override fun onCreateOptionsMenu(menu: Menu): Boolean {
// // Inflate the menu; this adds items to the action bar if it is present.
// menuInflater.inflate(R.menu.main, menu)
// return true
// }
//
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment)
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
return navController.navigateUp() || super.onSupportNavigateUp()
}

//
/**
* Back closes drawer if open.
*/
override fun onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
Log.d("jalc", "jalc")
if (isDrawerOpen) {
drawerShouldBeClosed = true
} else {
super.onBackPressed()
}
}

/**
* Opens the drawer if present.
*
* ]TODO: Replace with compose Scaffold.
*/
fun openDrawer() {
val drawer = findViewById<DrawerLayout>(R.id.drawer_layout)
drawer?.openDrawer(GravityCompat.START)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.compose.jetchat.components

import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.runtime.Composable

@Composable
fun ColumnScope.JetchatDrawer() {

Text("Hey!")
Text("Hoy!")
Text("Hey!")

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,17 @@ import androidx.compose.runtime.Providers
import androidx.compose.ui.platform.ComposeView
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController
import com.example.compose.jetchat.NavActivity
import com.example.compose.jetchat.MainViewModel
import com.example.compose.jetchat.R
import com.example.compose.jetchat.data.exampleUiState
import com.example.compose.jetchat.theme.JetchatTheme

class ConversationFragment : Fragment() {

private val activityViewModel: MainViewModel by activityViewModels()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -52,8 +55,7 @@ class ConversationFragment : Fragment() {
)
},
onNavIconPressed = {
// TODO: Replace with Scaffold
(activity as? NavActivity)?.openDrawer()
activityViewModel.openDrawer()
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@ import android.view.ViewGroup
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import com.example.compose.jetchat.MainViewModel
import com.example.compose.jetchat.NavActivity
import com.example.compose.jetchat.theme.JetchatTheme

class ProfileFragment : Fragment() {

private val viewModel: ProfileViewModel by viewModels()
private val activityViewModel: MainViewModel by activityViewModels()

override fun onAttach(context: Context) {
super.onAttach(context)
Expand All @@ -55,8 +58,7 @@ class ProfileFragment : Fragment() {
ProfileScreen(
userData = userData,
onNavIconPressed = {
// TODO: Replace with Scaffold
(activity as? NavActivity)?.openDrawer()
activityViewModel.openDrawer()
}
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.compose.jetchat.util

/**
* Used as a wrapper for data that is exposed via a LiveData that represents an event.
*/
open class Event<out T>(private val content: T) {

var hasBeenHandled = false
private set // Allow external read but not write

/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}

/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}