add navigation bar

master
Julien THEME 2 years ago
parent ce46396e37
commit 4d34f8db47

@ -0,0 +1,29 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
</profile>
</component>

@ -30,6 +30,12 @@ android {
kotlinOptions { kotlinOptions {
jvmTarget = '1.8' jvmTarget = '1.8'
} }
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.0-alpha01"
}
} }
dependencies { dependencies {
@ -44,4 +50,18 @@ dependencies {
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.0'
implementation 'androidx.navigation:navigation-compose:2.4.0-alpha10'
implementation 'androidx.compose.ui:ui:1.1.1'
implementation 'androidx.compose.material:material-icons-core:1.1.1'
implementation 'androidx.compose.material:material-icons-extended:1.1.1'
implementation "androidx.compose.ui:ui:1.1.1"
implementation "androidx.compose.ui:ui-tooling:1.1.1"
implementation "androidx.compose.material:material:1.1.1"
implementation "androidx.compose.material:material-ripple:1.1.1"
} }

@ -3,16 +3,23 @@ package com.example.cinapp
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.widget.TextView import android.widget.TextView
import androidx.activity.compose.setContent
import androidx.compose.material.MaterialTheme
import com.android.volley.VolleyError import com.android.volley.VolleyError
import com.android.volley.toolbox.StringRequest import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley import com.android.volley.toolbox.Volley
import com.example.cinapp.model.Movie import com.example.cinapp.model.Movie
import com.example.cinapp.navigation.MainScreen
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) //setContentView(R.layout.activity_main)
setContent {
MaterialTheme { MainScreen() }
}
/*
// TextView // TextView
val textView = findViewById<TextView>(R.id.text) val textView = findViewById<TextView>(R.id.text)
@ -34,24 +41,13 @@ class MainActivity : AppCompatActivity() {
// Add the request to the RequestQueue. // Add the request to the RequestQueue.
queue.add(stringRequest) queue.add(stringRequest)
/*companion object {
fun fromJson(json: JSONObject): Movie { //bottom navigation with jetpack compose
return Movie(
json.getInt("id"), */
json.getString("name"),
json.getString("backdrop_path"),
json.getString("release_date"),
json.getJSONArray("origin_country").toList(),
json.getString("original_language"),
json.getString("original_name"),
json.getString("overview"),
json.getDouble("popularity"),
json.getString("poster_path"),
json.getDouble("vote_average"),
json.getInt("vote_count"),
json.getJSONArray("genre_ids").toList()
)
}
}*/
} }
} }

@ -1,7 +1,20 @@
package com.example.cinapp.Room.DAO package com.example.cinapp.Room.DAO
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Query
import com.example.cinapp.Room.Entity.SeasonEntity
@Dao @Dao
interface SeasonDAO { interface SeasonDAO {
@Query("SELECT * FROM season")
fun getAll(): List<SeasonEntity>
@Query("SELECT * FROM season WHERE id = :id ")
fun getSeasonById(id: Int): SeasonEntity
@Delete
fun deleteSeason(season: SeasonEntity)
//@Query("DELETE FROM season WHERE ")
} }

@ -26,12 +26,4 @@ interface SerieDAO {
@Query("SELECT * FROM serie WHERE :seasonId IN (seasonsIds)") @Query("SELECT * FROM serie WHERE :seasonId IN (seasonsIds)")
fun findBySeason(seasonId: Int): SerieEntity fun findBySeason(seasonId: Int): SerieEntity
@Query("SELECT * FROM serie " +
"WHERE :episodeId IN (" +
"SELECT episodesIds FROM season WHERE id IN (" +
"SELECT seasonsIds FROM serie WHERE :episodeId IN (" +
"SELECT episodesIds FROM season)))")
fun findByEpisode(episodeId: Int): SerieEntity
} }

@ -11,7 +11,8 @@ data class EpisodeEntity (
var stillPath: String, var stillPath: String,
var episodeNumber: Int, var episodeNumber: Int,
var seasonNumber: Int, var seasonNumber: Int,
var airDate: String, val releaseDate: String,
var voteAverage: Double, var voteAverage: Double,
var voteCount: Int var voteCount: Int,
var runtime: Int
) )

@ -10,5 +10,6 @@ data class SeasonEntity (
var overview: String, var overview: String,
var posterPath: String, var posterPath: String,
var seasonNumber: Int, var seasonNumber: Int,
var episodesIds: List<Int> var episodesIds: List<Int>,
val releaseDate: String
) )

@ -0,0 +1,24 @@
package com.example.cinapp.navigation
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
@Composable
fun BottomNavGraph(navController: NavHostController){
NavHost(
navController = navController,
startDestination = BottomNavigation.Movie.route
) {
composable(BottomNavigation.Movie.route) {
MovieScreen()
}
composable(BottomNavigation.Search.route) {
SearchScreen()
}
composable(BottomNavigation.Serie.route) {
SerieScreen()
}
}
}

@ -0,0 +1,30 @@
package com.example.cinapp.navigation
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.LiveTv
import androidx.compose.material.icons.filled.Movie
import androidx.compose.material.icons.filled.Search
import androidx.compose.ui.graphics.vector.ImageVector
sealed class BottomNavigation(
val route: String,
val icon: ImageVector,
val title: String
) {
object Movie : BottomNavigation(
route = "movie",
//icon = R.drawable.ic_baseline_movie_24,
icon = Icons.Filled.Movie,
title = "Movie")
object Search : BottomNavigation(
route = "search",
//icon = R.drawable.ic_baseline_search_24,
icon = Icons.Filled.Search,
title = "Search")
object Serie : BottomNavigation(
route = "serie",
//icon = R.drawable.ic_baseline_live_tv_24,
icon = Icons.Filled.LiveTv,
title = "Serie")
}

@ -0,0 +1,78 @@
package com.example.cinapp.navigation
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.padding
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.navigation.compose.rememberNavController
import androidx.compose.ui.Modifier
import androidx.navigation.NavDestination
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.ui.setupWithNavController
@Composable
fun MainScreen() {
val navController = rememberNavController()
Scaffold(
bottomBar = { BottomBar(navController = navController) }
) {
BottomNavGraph(navController = navController)
}
}
@Composable
fun BottomBar(navController: NavHostController) {
val screens = listOf(
BottomNavigation.Movie,
BottomNavigation.Serie,
BottomNavigation.Search,
)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
BottomNavigation {
screens.forEach { screen ->
AddItem(
screen = screen,
currentDestination = currentDestination,
navController = navController
)
}
}
}
@Composable
fun RowScope.AddItem(
screen: BottomNavigation,
currentDestination: NavDestination?,
navController: NavHostController
) {
BottomNavigationItem(
label = {
Text(text = screen.title)
},
icon = {
Icon(
imageVector = screen.icon,
contentDescription = "Navigation Icon"
)
},
selected = currentDestination?.hierarchy?.any {
it.route == screen.route
} == true,
unselectedContentColor = LocalContentColor.current.copy(alpha = ContentAlpha.disabled),
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id)
launchSingleTop = true
}
}
)
}

@ -0,0 +1,8 @@
package com.example.cinapp.navigation
import androidx.compose.runtime.Composable
@Composable
fun MovieScreen() {
}

@ -0,0 +1,8 @@
package com.example.cinapp.navigation
import androidx.compose.runtime.Composable
@Composable
fun SerieScreen() {
}

@ -0,0 +1,8 @@
package com.example.cinapp.navigation
import androidx.compose.runtime.Composable
@Composable
fun SearchScreen() {
}

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12zM9,10v8l7,-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18,4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4h-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

@ -0,0 +1,37 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="409dp"
android:layout_height="43dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.428"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.997">
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save