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..cec0517 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +android_2026_1 \ No newline at end of file diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..639c779 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 0000000..c61ea33 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cc8ee59..fb64ff6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -40,4 +40,6 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) + implementation("com.squareup.retrofit2:retrofit:3.0.0") + implementation("com.squareup.retrofit2:converter-gson:3.0.0") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e58d838..e67c3a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + () + private lateinit var nameAdapter: NameAdapter + + @SuppressLint("NotifyDataSetChanged") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enableEdgeToEdge() setContentView(R.layout.activity_main) - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets + + etSearch = findViewById(R.id.et_search) + btnSearch = findViewById(R.id.btn_search) + rvUsers = findViewById(R.id.rv_users) + + rvUsers.layoutManager = LinearLayoutManager(this) + nameAdapter = NameAdapter(userList) { selectedName: String -> + etSearch.setText(selectedName) + etSearch.setSelection(selectedName.length) + } + rvUsers.adapter = nameAdapter + + etSearch.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + val query: String = s?.toString() ?: "" + if (query.isNotEmpty()) { + lifecycleScope.launch { + try { + val response: UserSearchResponse = RetrofitClient.api.searchUsers(query) + val items: List? = response.items + if (items != null) { + userList.clear() + for (item in items) { + userList.add(item.login) + } + nameAdapter.notifyDataSetChanged() + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } else { + userList.clear() + nameAdapter.notifyDataSetChanged() + } + } + override fun afterTextChanged(s: Editable?) {} + }) + + btnSearch.setOnClickListener { + val name: String = etSearch.text.toString() + if (name.isNotEmpty()) { + val intent = Intent( + Intent.ACTION_VIEW, + "https://github.com/$name?tab=repositories".toUri() + ) + startActivity(intent) + } } } -} \ No newline at end of file +} + +interface GithubApi { + @GET("search/users") + suspend fun searchUsers( + @Query("q") query: String, + @Query("per_page") perPage: Int = 20 + ): UserSearchResponse +} + +data class UserSearchResponse( + @SerializedName("items") val items: List? +) + +data class UserItem( + @SerializedName("login") val login: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/android_2026_1/NameAdpater.kt b/app/src/main/java/com/example/android_2026_1/NameAdpater.kt new file mode 100644 index 0000000..dd2943e --- /dev/null +++ b/app/src/main/java/com/example/android_2026_1/NameAdpater.kt @@ -0,0 +1,35 @@ +package com.example.android_2026_1 + +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView + +class NameAdapter( + private val userList: List, + private val onItemClick: (String) -> Unit +) : RecyclerView.Adapter() { + + class NameViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NameViewHolder { + val textView = TextView(parent.context).apply { + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + setPadding(50, 40, 50, 40) + textSize = 16f + } + return NameViewHolder(textView) + } + + override fun onBindViewHolder(holder: NameViewHolder, position: Int) { + val name = userList[position] + holder.textView.text = name + holder.textView.setOnClickListener { + onItemClick(name) + } + } + + override fun getItemCount(): Int = userList.size +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9affce0..c30527c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,10 +1,35 @@ - + android:orientation="vertical" + android:padding="16dp"> - \ No newline at end of file + + + + +