commit 6d8d9ef58eb8708ac957e5ec980e8609c7c0c9c6 Author: ismail.taha_janan Date: Sun Feb 12 22:51:01 2023 +0100 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..77b3457 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +My Facebook \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a2d7c21 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..bdd9278 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..dbc10f1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,52 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.example.myfacebook' + compileSdk 32 + + defaultConfig { + applicationId "com.example.myfacebook" + minSdk 21 + targetSdk 32 + 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' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.7.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + //Retrofit + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + +//Coroutine + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5' + + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/myfacebook/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/myfacebook/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..4264dbd --- /dev/null +++ b/app/src/androidTest/java/com/example/myfacebook/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.myfacebook + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.myfacebook", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a66116e --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/myfacebook/MyFeed.kt b/app/src/main/java/com/example/myfacebook/MyFeed.kt new file mode 100644 index 0000000..385b30e --- /dev/null +++ b/app/src/main/java/com/example/myfacebook/MyFeed.kt @@ -0,0 +1,81 @@ +package com.example.myfacebook + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.floatingactionbutton.FloatingActionButton +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import model.Post +import serivices.ApiClient +import kotlin.math.log + +class MyFeed:AppCompatActivity() +{ + private lateinit var tokenBtn:FloatingActionButton + private var data:List = mutableListOf() + private lateinit var recyclerViewPost:RecyclerView + + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.my_feed_layout) + + tokenBtn = findViewById(R.id.floatingActBtnToken) + tokenBtn.setOnClickListener { startActivity(Intent(this, TokenActivty::class.java)) } + executeCall() + recyclerViewPost = findViewById(R.id.rv_posts) + recyclerViewPost.layoutManager=LinearLayoutManager(this) + recyclerViewPost.adapter = PostRecycleViewAdapter(data) + + } + + + + //@OptIn(DelicateCoroutinesApi::class) + private fun executeCall() { + GlobalScope.launch(Dispatchers.Main) { + try { + val response = ApiClient.postApi.getAll() + + if (response.isSuccessful && response.body() != null) { + val content = response.body() + if (content != null) { + print(content) + data = content + Toast.makeText( + this@MyFeed, + "Data is here", + Toast.LENGTH_LONG + ).show() + } + } else { + Toast.makeText( + this@MyFeed, + "Error Occurred: ${response.message()}", + Toast.LENGTH_LONG + ).show() + } + + } catch (e: Exception) { + Toast.makeText( + this@MyFeed, + "Error Occurred: ${e.message}", + Toast.LENGTH_LONG + ).show() + } + } + } + + //override fun onPostSelected(postId: Long) { + //listener?.onDogSelected(dogId) + //listener?. + //S} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myfacebook/PostRecycleViewAdapter.kt b/app/src/main/java/com/example/myfacebook/PostRecycleViewAdapter.kt new file mode 100644 index 0000000..763c913 --- /dev/null +++ b/app/src/main/java/com/example/myfacebook/PostRecycleViewAdapter.kt @@ -0,0 +1,46 @@ +package com.example.myfacebook + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.example.myfacebook.R.layout.my_feed_layout +import model.Post + +class PostRecycleViewAdapter(private var postsList: List) + : RecyclerView.Adapter() +{ + + + override fun getItemCount(): Int =postsList.size + + + + class PostViewHolder(itemView: View) : + ViewHolder(itemView) { + + val viewName: TextView = itemView.findViewById(R.id.postTitle) + val viewContent: TextView = itemView.findViewById(R.id.postContent) + + } + + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder { + val view =LayoutInflater.from(parent.context) + .inflate(/* resource = */ my_feed_layout,/* root = */ parent,/* attachToRoot = */ false) + return PostViewHolder(view) + } + + + override fun onBindViewHolder(holder: PostViewHolder, position: Int) { + val itemsVM = postsList[position] + + holder.viewName.text=itemsVM.title + holder.viewContent.text = itemsVM.body + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myfacebook/TokenActivty.kt b/app/src/main/java/com/example/myfacebook/TokenActivty.kt new file mode 100644 index 0000000..7003c1b --- /dev/null +++ b/app/src/main/java/com/example/myfacebook/TokenActivty.kt @@ -0,0 +1,49 @@ +package com.example.myfacebook + +import android.content.Intent +import android.os.Bundle +import android.widget.Button +import androidx.appcompat.app.AppCompatActivity +import android.widget.EditText +import android.widget.Toast + + +private const val PREFS_NAME = "my_facebook_prefs" +private const val KEY_API = "my_facebook_keyApi" + +class TokenActivty:AppCompatActivity() { + private lateinit var tokenTexBox:EditText + private lateinit var clearBtn:Button + private lateinit var saveBtn:Button + private lateinit var toast: Toast + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.token_layout) + + val settings = getSharedPreferences(PREFS_NAME,0) + val apiKey = settings.getString(KEY_API,null) + + tokenTexBox=findViewById(R.id.editTextTextPersonName) + tokenTexBox.setText(apiKey) + + clearBtn=findViewById(R.id.clearBtn) + clearBtn.setOnClickListener{ + tokenTexBox.text.clear() + } + + saveBtn=findViewById(R.id.saveBtn) + saveBtn.setOnClickListener{ + val settings = getSharedPreferences(PREFS_NAME,0) + with(settings.edit()){ + putString(KEY_API,tokenTexBox.getText().toString()) + apply() + } + val toast = Toast.makeText(applicationContext,"Key edited",Toast.LENGTH_LONG) + toast.show() + startActivity(Intent(this,MyFeed::class.java)) + } + + + + } +} diff --git a/app/src/main/java/com/example/myfacebook/fragments/postListFragment.kt b/app/src/main/java/com/example/myfacebook/fragments/postListFragment.kt new file mode 100644 index 0000000..2ad8934 --- /dev/null +++ b/app/src/main/java/com/example/myfacebook/fragments/postListFragment.kt @@ -0,0 +1,6 @@ +package com.example.myfacebook.fragments + +import androidx.fragment.app.Fragment + +class postListFragment:Fragment() { +} \ No newline at end of file diff --git a/app/src/main/java/model/Post.kt b/app/src/main/java/model/Post.kt new file mode 100644 index 0000000..75e91b2 --- /dev/null +++ b/app/src/main/java/model/Post.kt @@ -0,0 +1,8 @@ +package model + +data class Post( + val body: String, + val id: Int, + val title: String, + val user_id: Int +) \ No newline at end of file diff --git a/app/src/main/java/model/User.kt b/app/src/main/java/model/User.kt new file mode 100644 index 0000000..3d00ae6 --- /dev/null +++ b/app/src/main/java/model/User.kt @@ -0,0 +1,9 @@ +package model + +data class User( + val email: String, + val gender: String, + val id: Int, + val name: String, + val status: String +) \ No newline at end of file diff --git a/app/src/main/java/serivices/ApiClient.kt b/app/src/main/java/serivices/ApiClient.kt new file mode 100644 index 0000000..24cf239 --- /dev/null +++ b/app/src/main/java/serivices/ApiClient.kt @@ -0,0 +1,27 @@ +package serivices +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object ApiClient { + private const val BASE_URL: String = "https://gorest.co.in/public/v2/" + + private val gson : Gson by lazy { + GsonBuilder().setLenient().create() + } + private val httpClient : OkHttpClient by lazy { + OkHttpClient.Builder().build() + } + private val retrofit : Retrofit by lazy { + Retrofit.Builder() + .baseUrl(BASE_URL) + .client(httpClient) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() + } + val postApi : PostApiRequest by lazy{ + retrofit.create(PostApiRequest::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/serivices/PostApiRequest.kt b/app/src/main/java/serivices/PostApiRequest.kt new file mode 100644 index 0000000..c6f8091 --- /dev/null +++ b/app/src/main/java/serivices/PostApiRequest.kt @@ -0,0 +1,11 @@ +package serivices + +import model.Post +import retrofit2.Response +import retrofit2.http.GET + +interface PostApiRequest { + + @GET("posts") + suspend fun getAll(): Response> +} \ No newline at end of file diff --git a/app/src/main/res/color/text_black.xml b/app/src/main/res/color/text_black.xml new file mode 100644 index 0000000..a8b409b --- /dev/null +++ b/app/src/main/res/color/text_black.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_post_list.xml b/app/src/main/res/layout/fragment_post_list.xml new file mode 100644 index 0000000..722290b --- /dev/null +++ b/app/src/main/res/layout/fragment_post_list.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/my_feed_layout.xml b/app/src/main/res/layout/my_feed_layout.xml new file mode 100644 index 0000000..bfa1387 --- /dev/null +++ b/app/src/main/res/layout/my_feed_layout.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/post_item.xml b/app/src/main/res/layout/post_item.xml new file mode 100644 index 0000000..21261ef --- /dev/null +++ b/app/src/main/res/layout/post_item.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/token_layout.xml b/app/src/main/res/layout/token_layout.xml new file mode 100644 index 0000000..39d63db --- /dev/null +++ b/app/src/main/res/layout/token_layout.xml @@ -0,0 +1,56 @@ + + + + + + + +