Skip to content

Üniversite öğrencilerine yönelik sosyal medya uygulaması.

Notifications You must be signed in to change notification settings

hozanBaydu/CampuseTime

Repository files navigation

CampuseTime

Hozan BAYDU

Merhaba,ben Hozan.Bu uygulamayı Firebase ve kotlin kullanarak yazdım. Bu README dosyasında kısaca,yaptığım uygulamanın özelliklerini anlatıp bu özellikleri nasıl kodladığımı anlatacağım.

  1. Uygulama tanıtımı 2.Kodlar

Özellikler

  • Her kullanıcı istediği bir okul için paylaşım yapabilecek.
  • Kullanıcılar mail ile kayıt yapabilecek.
  • Kullanıcı isteğine göre birden fazla okul için paylaşım yapılabilecektir.

Note: Bu uygulama kullanıcılar için bir sosyal medya olmanın ötesinde hem öğrencilerin kendi okul çevrelerinde sosyalleşmesi hem de sınav soruları gibi ders araçlarının paylaşıldığı bir
platform olması amacıyla yazılmıştır.

Giriş sayfası

Bu sayfada kullanıcılar uygulamaya kayıt yaptırabilir veya uygulamadan çıkış yapılmış ise bu sayfadan giriş yapılır.

giriş sayfası

Öncelikle onCreate altında action barı kapatarak aktiviteyi yazmaya başladım.Uygulamanın tamamında kapatmak istemediğimden dolayı aktivitenin içinde kapattım.Bir sonraki aktivitede ihtiyacımız olacaktır.

val currentUsers=auth.currentUser  //initialize ettik.

        if (currentUsers!=null){
            val intent=Intent(this@MainActivity, FeedActivity::class.java)   
            startActivity(intent)
            finish()
        }

Kullanıcı uygulamaya her giriş yapmak istendiğinde bu sayfanın çıkası ve kullanıcı bilgilerini sorması kullanışlı olmayacağından dolayı eğer mevcut bir kullanıcı girişi daha önce yapılmış ve çıkış işlemi gerçekleşmemiş ise doğrudan uygulamanın içine geçiş yapılması için yukarıdaki kodu yazdım.Kullanıcı giriş yaptıktan sonra çıkış yapmak için sonraki aktivitede çıkış yap butonuna tıklayarak çıkış yapabilmektedir.Geri tuşuna basarak çıkış yapmaması için aktiviteyi bitirmek için finish() kodu ekledim.

Ana sayfa

Kullanıcının paylaşımları görebileceği sayfadır.

giriş sayfası

Bu sayfada tüm gönderilerin aynı anda okunmaması için recyclerview kullandım. Bunun için viewbindingten yararlanarak adapter kodladım.Bu adapterde bir postList:ArrayList isteniyor ve bu değeri firebaseden çekerek recyclerviewde gösteriyor.

giriş sayfası

Her okul için farklı bir recyclerview olacağından bir menu oluşturdum.Recyclerview tıklanan okula göre güncellenecektir.

 private fun getData(uni:String){


        db.collection(uni).orderBy("date",Query.Direction.DESCENDING).addSnapshotListener { value, error ->
            if (error!=null){
                Toast.makeText(this,error.localizedMessage,Toast.LENGTH_LONG).show()

            }else{
                if (value!=null){
                    if(!value.isEmpty){

                        val documents=value.documents
                        
                        postArrayList.clear()
                        
                        for (document in documents){
                            
                            val comment=document.get("comment") as String
                            val userEmail=document.get("userEmail") as String
                            val dowloadUrl=document.get("dowlandUrl") as String
                            val post=Post(userEmail,comment,dowloadUrl)
                            postArrayList.add(post)
                        }
                        feedAdapter.notifyDataSetChanged()
                    }
                }
            }
        }
    }

Her okul için farklı bir bilgi çekme fonksiyonu yazmanın verimsiz olacağını düşünüp tek bir veri çekme fonksiyonu yazdım.Her okul için yazılan fonksiyonda sadece getData fonksiyonunu çağırıp istenen uni:String değerinin verilmesi yeterli olacaktır.Çünkü bir sonraki fotoğraf yükleme sayfasında açıklayacağım üzere firebaseye fötoğrafları gönedrirken hangi okul için olduğu bilgisi verilmektedir.

if (item.itemId==R.id.odtu){
            getData("odtu")
            binding.recyclerView.layoutManager=LinearLayoutManager(this)
            feedAdapter= FeedRecyclerAdapter(postArrayList)
            binding.recyclerView.adapter=feedAdapter

Yukarıda örnek olarak odtu için çağırma fonksiyonu gösterilmiştir.Getdata fonksiyonunda istenen uni değeri odtu olacağından db.collection(uni).orderBy("date",Query.Direction.DESCENDING).addSnapshotListener-- kodu odtu koleksiyonundaki fotoğrafları çekecektir.

if (item.itemId==R.id.odtu){
            getSupportActionBar()?.setTitle("Orta Doğu Teknik Üniversitesi")
            getSupportActionBar()?.setBackgroundDrawable( ColorDrawable(Color.parseColor("#1c6071")))

Action Barın seçilen okula göre renk ve isim değiştirilmesi için yukarıdaki kodları yazdım.

Yükleme sayfası

Kullanıcılar bu sayfadan gönderi ekleyebilecektir.

giriş sayfası

Kullanıcı gerekli izinleri verip fotoğraf ve yorum girdikten sonra gönderiyi paylaşacağı okulu seçmek için ilgili okulun butonuna tıklayacaktır.

    fun upload (uni: String) {
        val uuid=UUID.randomUUID()
        val imageName="$uuid.jpg"
        val refererence=storage.reference
        val imageReference=refererence.child("images").child(imageName)
        if (selectedPicture!=null){
            imageReference.putFile(selectedPicture!!).addOnSuccessListener{
             val uploadPictureReference=storage.reference.child("images").child(imageName)
                uploadPictureReference.downloadUrl.addOnSuccessListener {
                    val dowlandUrl=it.toString()
                    if (auth.currentUser !=null){
                        val postMap= hashMapOf<String,Any>()
                        postMap.put("dowlandUrl",dowlandUrl)
                        postMap.put("userEmail",auth.currentUser!!.email!!)
                        postMap.put("comment",binding.commentText.text.toString())
                        postMap.put("uni",uni)
                        postMap.put("date",Timestamp.now())
                        firestore.collection(uni).add(postMap).addOnSuccessListener {
                            finish()
                        }.addOnFailureListener{
                        Toast.makeText(this,it.localizedMessage,Toast.LENGTH_LONG).show()
                        }
                    }
                }
            }.addOnFailureListener{
                Toast.makeText(this,it.localizedMessage,Toast.LENGTH_LONG).show()
            }
        }
    }

Seçilen görsel ve yorumun fairbaseye gönderilmesi için yukarıdaki kodu yazdım ama seçilen okulun belirtilmesi burada yapılmadığından fonksiyon string olan bir uni değeri istemektedir.

Örnek olarak Ytü altında bir gönderi paylaşılmak istendiğinde yukarıdaki fonksiyon şöyle çağrılmaktadı.

fun ytuButton (view: View){
        binding.ytuButton.visibility=View.GONE
        Toast.makeText(applicationContext,"YTÜ yükleniyor",Toast.LENGTH_SHORT).show()
        upload("ytu")
    }

Başta ytu butonu visibledir ve gönderinin tekrar tekrar yüklenmemesi için yükledikten hemen sonra butonu yok etmem gerekti.

Firebase

giriş sayfası

Fotoğrafta görüldüğü üzere firebasede itu,odtu ve ytu diye 3 koleksiyon oluşturulur ve kullanıcının seçimine göre bu gönderiler recyclerviewde gösterilir.

Uygulamayı yazan:Hozan BAYDU

Tarih:20.05.2022

iletişim:hozan.baydu3447@gmail.com

Tasarım:Sketchbook

Canva