Skip to content

ozlemaybek/StudyGalaxy

Repository files navigation

StudyGalaxy

Study Galaxy; bitirme projem olan bir android uygulamasıdır.

Projedeki Teknolojiler: MVVM Mimarisi, Data Binding

Geliştirirken Yapılanlar

GRADLE DOSYALARI DÜZENLEMELERİ

Önce projenin gradle dosyalarında gerekebilecek değişiklikleri yaptım.

Android Studio güncellemesinden sonra artık proje bağımlılıklarını settings.gradle dosyasındaki dependencyResolutionManagament bloğunda belirtmeliyiz. bu yüzden jcenter() satırını settings.gradle dosyasına ekledim.

settings.gradle dosyası :

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        jcenter()
        google()
        mavenCentral()
    }
}
rootProject.name = "StudyGalaxy"
include ':app'

build.gradle (project) dosyası :

/* Sonradan yaptığım eklemeler: */
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.7.21"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        def nav_version = "2.3.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
/* Sonradan yaptığım eklemeler buraya kadardı. */


// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.4.0' apply false
    id 'com.android.library' version '7.4.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.21' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle (app-module) dosyası :

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    // Eklemelerim :
    id 'kotlin-android-extensions'
    id 'androidx.navigation.safeargs.kotlin'
    id 'kotlin-kapt'
}

android {
    namespace 'com.example.studygalaxy'
    compileSdk 33

    defaultConfig {
        applicationId "com.example.studygalaxy"
        minSdk 23
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

    // DataBinding'i aktif hale getirelim:
    dataBinding{
        enabled = true
    }

}

dependencies {

    // Güncellemeleri yapmadan önce gerekli tanımlamaları yapalım:
    def retrofitVersion = '2.8.1'
    def glideVersion = '4.11.0'
    def rxJavaVersion = '2.2.8'
    def rxAndroidVersion = '2.1.1'
    def roomVersion = '2.5.0'
    def navVersion = '2.5.3'
    def preference_version= '1.2.0'

    implementation 'androidx.core:core-ktx:1.9.0'
    implementation 'androidx.appcompat:appcompat:1.6.0'
    implementation 'com.google.android.material:material:1.8.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

    // Sonradan eklediğim implementation'lar:
    implementation "androidx.room:room-runtime:$roomVersion"
    kapt "androidx.room:room-compiler:$roomVersion"
    implementation "androidx.room:room-ktx:$roomVersion"
    implementation "androidx.navigation:navigation-fragment-ktx:$navVersion"
    implementation "androidx.navigation:navigation-ui-ktx:$navVersion"
    implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
    implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"
    implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
    implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
    implementation "com.github.bumptech.glide:glide:$glideVersion"
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
    implementation "androidx.preference:preference-ktx:$preference_version"

}

build.gradle dosyalarının düzenlemelerini ilerde kullanabileceğim şeyleride düşünerek şimdilik böyle yaptım. Fakat sonradan değişebilir.

LOGO

Uygulama logosunu figmada oluşturup svg ve png formatlarında indirdim. svg formatında olanı bikgisayarda manuel olarak proje dosyasına ekledim. png olanı ise android studio'dan drawable kalsörüne ekledim. Sonrasında drawable klasörü içinde bir vector asset oluşturarak svg formatındaki logonun xml dosyasını elde ettim:

image

COLORS

Seçtiğim renkleri colors dosyasına ekledim:

image

image

Çalışmaya başlamadan önce Fragment dosyalarını aşağıdaki hale getirdim:

image

BUTTONS

drawable -> new -> drawable resources file :

image

Bir xml dosyası açmış olduk burada button'lar için bir arkaplan style'ı belirledim:

image

Themes.xml

Themes.xml dosyasında butonlar için bir style belirledim:

image

Strings.xml

App genelinde kullanacağım stringleri bu şekilde tanımlıyorum:

image

Fragment Düzenlemeleri Devam

Şimdi sign in için kullanacağım fragment'ı düzenlemeye başlıyorum:

Frame Layout'a bir ID ekledim.

Fragmentları activity'ye bağlamadan emülatörde göremeyiz!

NOT: Fragment'ı kullanabilmek için FragmentManager denen yapıyı çağırmalıyız. ve yapacağımız işlemleri başlatmak için fragmentTransaction denen bir yapı oluşturuyoruz.

Sign in ve sign up işlemleri için iki farklı fragment tasarımı yaptım:

image

Fragment'ları Activity İçinde Gösterelim

Sign In ve Sign Up ekranları arasındaki geçişi textView'lara onClick metodu vererek yapacağım. Aşağıdaki resimde kırmızı işaretli yerlere koyduğum textView'lara tıklandığında iki ekran arası geçiş sağlanacak:

image

activity_main.xml dosyasında constraint layout'un içine fragment'ları göstermek için bir frame layout ekleyelim:

image

Ekledikten sonra frameLayout'a bir id verelim:

image

NAVIGATION

Şimdi oluşturduğum fragment'lar için navigation framework'ünü kullanacağım.

Önce navigation için gerekli gradle eklemelerini kontrol ettim. Bir eksik olmadığı için devam ettim.

Şimdi fragment'lar arası geçiş ve veri aktarımını ayarlayacağım. RES klasörü altında bir navigation grafiği oluşturalım. Bunun için RES -> new -> android resource file (aşağıda işaretli 3 alanı belirledik):

image

Bir projenin içinde birden fazla navigation grafiği oluşturulabileceği için isimlendirmeye dikkat ettim.

MainActivity.kt'de onClickSignInText ve onClickSignUpText metodlarını implemente edelim:

package com.example.studygalaxy.view

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.example.studygalaxy.R

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

    }

    fun onClickSignInText(view : View){

        // Fragment'ı kullanabilmek için FragmentManager denen yapıyı çağırmalıyız:
        val fragmentManager = supportFragmentManager

        // Yapacağımız işlemleri başlatmak için fragmentTransaction denen bir yapı oluşturuyoruz.
        // Bu fragment ile ilgili değişiklik yapacağız demiş oluyoruz:
        val fragmentTransaction = fragmentManager.beginTransaction()
        // Artık işlemlerimizi fragmentTransaction kullanarak yapabiliriz.

        // Fragment oluşturalım:
        // Eşitliğin sağ tarafı Fragment'ın ismi:
        val signInFragment = SignInFragment()

        // replace: Öncesinde bir fragment varsa onu kaldırır ve istediğimiz fragment'ı ekler.
        // ilk parametre: Bu fragment'ı kim kullanacak
        // ikinci fragment: hangi fragment'ı gösterecek
        // .commit() diyerek transaction'ı commit ediyorum yani burada yaptığım işlemi artık sonlandırıyorum:
        fragmentTransaction.replace(R.id.frameLayoutID, signInFragment).commit()
    }

    fun onClickSignUpText(view : View){

        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()

        // Fragment oluşturalım:
        // Eşitliğin sağ tarafı Fragment'ın ismi:
        val signUpFragment = SignUpFragment()

        // replace: Öncesinde bir fragment varsa onu kaldırır ve istediğimiz fragment'ı ekler.
        // ilk parametre: Bu fragment'ı kim kullanacak
        // ikinci fragment: hangi fragment'ı gösterecek
        // .commit() diyerek transaction'ı commit ediyorum yani burada yaptığım işlemi artık sonlandırıyorum:
        fragmentTransaction.replace(R.id.frameLayoutID, signUpFragment).commit()

    }
}

Oluşturduğumuz frameLayout içine bir NavHostFragment ekledik ve hazırladığımız navigation graph'ı seçtik:

image

Oluşturduğumuz Mainactivity'den action bar'ı kaldırmak istiyoruz bu yüzden Android.Manifest.xml dosyasına aşağıda işaretlediğimiz satırı ekledik:

image

BOTTOM NAVIGATION BAR

MainActivity2 içinde bir bottom navigation bar oluşturacağım. Araştırdığımda bottom navigation bar içinde 3 ila 5 tane item olabileceğini gördüm. Ben 5 tane kullanacağım. Bir activity içinde 5 fragment ile fraklı işlevleri göstereceğim.

Bir yandan da bu activity'yi oluşturduğum andan itibaren view binding kullanmaya başlayacağım.

VIEW BINDING

View Binding'i kullanmak için öncelikle build.gradle (app-module) dosyasında view binding’i aktive etmemiz gerekiyor bunun için android bloğunun içine aşağıdaki kodu eklememiz gerekiyor:

// ViewBinding'i aktif hale getirelim:
    viewBinding{
        enabled = true
    }

Sonrasında MainActivity2'de view binding kullanmak istediğim için aşağıdaki işlemleri yapıyorum:

package com.ozlem.studygalaxy

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.ozlem.studygalaxy.databinding.ActivityMain2Binding

class MainActivity2 : AppCompatActivity() {

    // view binding için :
    private lateinit var binding2 : ActivityMain2Binding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // view binding için :
        binding2 = ActivityMain2Binding.inflate(layoutInflater)
        setContentView(binding2.root)
    }

BOTTOM NAVIGATION BAR DEVAM

activity_main2.xml dosyasına gidiyoruz ve arama çubuğundan aratıp bularak ekrana bir bottom navigation view ekliyoruz. Sonra constraint layout içine bir frame layout ekliyoruz sonuç olarak component tree şu hali alıyor:

image

Elde etmek istediğimiz görünüm bu:

image

Bu yüzden activity_main2.xml dosyasının kod bölümünü aşağıdaki hale getiriyoruz:

<?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"
    tools:context=".MainActivity2">

    <FrameLayout
        android:id="@+id/frameLayout2ID"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationViewId"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </FrameLayout>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationViewId"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

    </com.google.android.material.bottomnavigation.BottomNavigationView>

</androidx.constraintlayout.widget.ConstraintLayout>

Şimdi fragment'lar için bottom navigation view'da görüncek icon'lara ihtiyacımız var. Bu yüzden her icon için bir vector asset oluşturmalıyız. Bunu şu şekilde yapıyorum:

image

Açılan ekranda clip_art'ı işaretledikten sonra işaretli yere tıklayarak icon seçiyoruz:

image

İstediğimiz icon'u bu şekilde aratarak bulabiliriz:

image

Rengi için sonradan xml dosyasından değişiklik yapabileceğim için değiştirmiyorum:

image

Toplam 5 icon için 5 adet vector asset oluşturdum :

image

Şimdi bottom navigation view için bir menu'ye ihtiyacımız var bu yüzden yeni bir android resource directory oluşturuyoruz:

image

image

Şimdi menu > new > menu resource file:

image

Sonrasında bottom navigation bar'da kaç bölüm olmasını istiyorsak o kadar menu item’ı şekilde göründüğü gibi component tree’nin içine sürüklemeliyiz:

image

Şuanda elimizde bu var:

image

Sonrasında title (başlık) bölümlerini değiştirdik:

image

Icon'ları ve id'leri ekleyelim:

image

activity_main2.xml dosyasına gidip bunu ekliyoruz:

image

Şuanda elimizde olan görüntü bu:

image

Şimdi bottom navigation bar’daki bölüm sayısı kadar fragment oluşturmalıyız.

image

Bu fragment'ları belirlediğim özelliklere göre yapılandıracağım.

MainActivity2 için gerekli şeyleri ekleyelim:

package com.ozlem.studygalaxy.view

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.ozlem.studygalaxy.*
import com.ozlem.studygalaxy.databinding.ActivityMain2Binding

class MainActivity2 : AppCompatActivity() {

    // view binding için :
    private lateinit var binding2 : ActivityMain2Binding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // view binding için :
        binding2 = ActivityMain2Binding.inflate(layoutInflater)
        setContentView(binding2.root)

        // İlk açıldığında home page'i göstermek için:
        replaceFragment(HomeFragment())

        // bottom navigation bar'ın listener'ını yazalım:
        binding2.bottomNavigationViewId.setOnItemSelectedListener {

            when(it.itemId){

                // Burada sol tarafta bottom_navigation_menu.xml'deki id'leri kullanıyoruz,
                // Sağ tarafta ise Fragment'ların dosya isimlerini kullanıyoruz:
                R.id.statistics_icon_id -> replaceFragment(StatisticsFragment())
                R.id.goals_icon_id -> replaceFragment(GoalsFragment())
                R.id.home_icon_id -> replaceFragment(HomeFragment())
                R.id.calender_icon_id -> replaceFragment(CalenderFragment())
                R.id.profile_icon_id -> replaceFragment(ProfileFragment())

                else ->{ }

            }
            true
        }

    }

    private fun replaceFragment(fragment : Fragment){

        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()
        // activity_main2.xml'deki frame layout'un id'si: frameLayout2ID :
        fragmentTransaction.replace(R.id.frameLayout2ID,fragment)
        fragmentTransaction.commit()

    }

}

Manifest dosyasında MainActivity2 için action bar'ı kapattım:

image

Şimdi önce fragment'lar için UI kısmını düzenleyeceğim sonrasında navigation_graph'lerini çıkaracağım.

fragment_home.xml Tasarımı

Ekranın başındaki tasarımlar kodlara bakılarak anlaşılabilir ancak nestedScrollView içine constraint Layout atınca constraint layout'un içindeki tasarımı yapmak biraz zorlayabiliyor çünkü eklediğim view'ların constraint'lerini xml'de yazarak belirlemem gerekti.

RecylerView'lu bölüme geçiyorum. Önce layout klasöründe bir layout resource file oluşturdum burada recycler view'un tek satırının tasarımını yapacağım. Dosyanın adını "goals_recycler_row.xml" olarak belirledim.

goals_recyler_row.xml

<?xml version="1.0" encoding="utf-8"?>

<!--Bu dosyada recyclerView'umuzun bir satırını tasarlayacağız.-->
<!--Bu xml her bir recyclerView sırasında kullanılacak.-->

<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:id="@+id/constraint_layout_id_0"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:layout_marginTop="20dp"
    android:background="@drawable/info_space_style">

    <LinearLayout
        android:id="@+id/linear_layout_id_0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textview_0_id"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:fontFamily="@font/roboto_bold"
            android:gravity="center"
            android:text="Final Project"
            android:textAlignment="center"
            android:textColor="@color/white"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/textview_1_id"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:fontFamily="@font/roboto_bold"
            android:gravity="center"
            android:text="Everyday"
            android:textAlignment="center"
            android:textColor="@color/white"
            android:textSize="18dp" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_id_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/imageView"
        app:layout_constraintStart_toEndOf="@+id/linear_layout_id_0"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textview_2_id"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:fontFamily="@font/roboto_bold"
            android:gravity="center"
            android:text="%99"
            android:textAlignment="center"
            android:textColor="@color/white"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/textview_3_id"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:fontFamily="@font/roboto_bold"
            android:gravity="center"
            android:text="04.00.00"
            android:textAlignment="center"
            android:textColor="@color/white"
            android:textSize="18dp" />

    </LinearLayout>

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/menu_icon"
        android:layout_margin="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Tasarımı şu şekilde oldu:

image

Şimdi menu klasöründe bir menu resource file açalım ve ismini goals_menu.xml koyalım:

goals_menu.xml dosyasını aşağıdaki şekilde yapılandırdım:

image

recylerView işlemleri devam

Önce build.gradle(app-module) dosyasına ilgili eklemeyi yaptım:

image

Şimdi recylerView'u görüntülemek istediğimiz yere yani "fragment_home.xml" dosyasına recyclerView ekleyelim:

constraint layout içine bir tane frame layout attım onun içinede recycler view ekledim:

image

FIREBASE AKTİVASYON İŞLEMLERİ

Diğer aşamalara devam etmeden önce projenin firebase aktivasyonunu yapmak istiyorum çünkü artık yavaş yavaş kullanıcı işlemleri ile iligli sonuçları görebilmem gerekiyor.

image

image

image

image

Firebase’e android uygulamamız ile firebase’i birleştireceğimizi belirtelim:

image

Uygulamanın paket ismini girdim ve "Register App" butonuna tıkladım:

image

İkinci adımda bizim için bir dosya oluşturuluyor. Bu dosya bizim android projemiz ile firebase sunucusunu birbirine bağlayan dosya ve bu dosya olmadan hiçbir işlem yapamıyoruz. Bu yüzden bu dosyayı indiriyorum:

image

Sonrasında google-services.json dosyasını projemin içine alıyorum bunun için Android Studio'da android görünümünden project görünümüne geçiyorum ve dosyayı app bölümüne yapıştırıyorum:

image

Aslında google-services.json dosyasının içindekilerin herhangi birine gösterilmemesi gerekiyor fakat bu projeyi Google Play Store'a yüklemeyeceğim.

Şimdi 3. adıma geçiyorum. Bu adımda projeme Firebase SDK'sını ekliyorum. Bu adım 2 aşamalı.

  1. ADIM: Bunun için build.gradle (project) dosyasına; aşağıda işaretlediğim kısmı dependencies bloğuna ekliyorum. Çünkü güncellemelerden sonra artık allProjects bloğu settings.gradle dosyasında bulunuyor ve buildScript kısmıda zaten build.gradle (project) dosyamda mevcut.

image

sync now işlemini yaptıktan sonra ikinci adıma geçiyorum.

  1. ADIM: Sonra 2. adımda ilgili kodları build.gradle (module-app) dosyasına ekliyorum:

image

Artık işlem tamamlandı "Continue to Console" butonu ile console'a geri dönüyoruz:

image

Firebase'in projeye entegre olup olmadığını kontrol etmek amacıyla MainActivity.kt içindeki onCreate metodunun içine Firebase yazıp ilgili özellikler geldi mi diye bakıyoruz:

image

FIREBASE AUTHENTICATION (Kullanıcı İşlemleri)MODÜLÜ ENTEGRASYONU

Firebase Authentication modülü; kullanıcıların kayıt olabilmesi, giriş yapabilmesi, giriş yapılıp yapılmadığının algılanması gibi özellikleri barındırır.

Firebase Console’da soldaki bölümden Authentication’a tıklayalım:

image

image

Buradaki “Get started” butonu ile authentication yani kullanıcı işlemlerini başlatalım. Get started butonuna basınca şöyle bir ekranla karşılaşıyoruz:

image

Sign-in method’lardan birini, birden fazlasını ya da hepsini uygulamamızda kullanmak isteyebiliriz. Ben email ve parola kullanacağım. Yaptığımız etkinleştirmeleri android tarafında da uygulamam gerekiyor.

Email/password seçeneğine tıkladıktan sonra karşımıza gelen ekranda enable yaparak aktif hale getiriyoruz. Resimdeki 2. enable direkt email’e giriş linki atarak password kullanmadan giriş yapmayı sağlıyor ama bunu kullanmayacağım. “Save” butonuna basalım:

image

Etkinleştirildi:

image

Bütün modüllerin ayrı SDK’sı var. Firebase’in bir sürü modülü var ve hepsini kullanmıyoruz. Yük olmaması içinde modüllere ait SDK’lar tek tek kuruluyor.

Documentation kısmından Build > Aythentication bölümüne gittik. Sonra aşağıdaki bölüme geçelim:

image

Ve Android kodları tarafında gerekli authentication işlemlerini yapmaya başlayalım:

Aşağıda işaretli satırı build.gradle (app-module) içine ekleyelim:

image

Şimdi dokümanda bir FirebaseAuth objesi oluşturmamız isteniyor. Sırayla aşağıdaki işlemleri MainActivity.kt içinde yapıyoruz:

image

Şİmdi güncel kullanıcı yani current user'ı alabilirsin diyor fakat henüz hiçbir kullanıcı oluşturmadım.

Bu yüzden SignInFragment ve SignUpFragment'ta kod düzenlemelerini ayarlayalım:

Önce iki fragment'a ait kt dosyalarında FirebaseAuth objeleri oluşturma işlemini yaptım:

image

Fragment'ta view binding işlemi activity'ye göre farklı işliyor bunun için onCreate yerine onCreateView metodunu kullanıyoruz. Aynı zamanda onDestroy metodundada binding'i null yapıyoruz:

class SignInFragment : Fragment() {

    // Bir FirebaseAuth objesi oluşturalım:
    private lateinit var auth: FirebaseAuth
    // view binding için:
    private var _binding: FragmentSignInBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Oluşturduğumuz FirebaseAuth objesini initialize edelim:
        auth = Firebase.auth
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // view binding için:
        _binding = FragmentSignInBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

}

Firebase Firestore Database Entegrasyonu

image

Başlatmak için “Create Database” butonuna basmalıyız. Bunu yaptığımızda güvenlik ayarlarını nasıl seçmek istediğimizi soruyor. Burada güvenlikten kastedilen şey veritabanımıza kimin erişebileceği ve kimin erişemeyeceği. Bunun için iki farklı seçeneğimiz var.

image

  1. Production Mode: Hiçbir şeye izin vermez.
  1. Test Mode: Herkesin erişimine izin verir ve bunun için 30 günlük bir süre tanımlar. Bunu github’daki token’lara benziyor.

Şimdilik kodlama aşamasında olduğum için test modunda başlatıyorum.

“Test Mode” u seçtikten sonra Next butonuna basalım.

İkinci adımda lokasyon seçmemizi istiyor. Bunu uygulamayı yapacağımız yere yakın seçmemiz gerekiyor.

image

eur3 seçeneğini seçip Enable butonuna bastım. Bu işlemi sadece bir kez yapıyoruz bir daha karşımıza gelmeyecek. Şu anda bizim için firestore veritabanı oluşturuluyor.

Şimdi oluşturulan alanda kendi database'imi kuracağım.

Kod tarafında build.gradle (app-module) kısmına ekleme yaptım:

image

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages