Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
reserve.md
HELP.md
.gradle
build/
Expand Down Expand Up @@ -45,4 +44,4 @@ captures/
*.rar

### Gradle ###
!gradle/wrapper/gradle-wrapper.jar
!/gradle/wrapper/gradle-wrapper.jar
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

23 changes: 13 additions & 10 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,23 @@ plugins {
}

android {
namespace 'ru.netology.nmedia'
namespace "ru.netology.nmedia"
compileSdk 33

defaultConfig {
applicationId 'ru.netology.nmedia'
minSdk 26
applicationId "ru.netology.nmedia"
minSdk 23
targetSdk 33
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildFeatures {
viewBinding true
}

buildTypes {
release {
minifyEnabled false
Expand All @@ -33,12 +37,11 @@ android {
}

dependencies {

implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
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.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ class ExampleInstrumentedTest {
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("ru.netology.nmedia", appContext.packageName)
}
}
}
8 changes: 2 additions & 6 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication2"
tools:targetApi="31">
android:theme="@style/Theme.NMedia">
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
68 changes: 67 additions & 1 deletion app/src/main/java/ru/netology/nmedia/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,76 @@ package ru.netology.nmedia

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import ru.netology.nmedia.databinding.ActivityMainBinding
import ru.netology.nmedia.dto.Post
import ru.netology.nmedia.dto.PostService.formatNumber


class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val binding = ActivityMainBinding.inflate(layoutInflater) //функция, которая на базе верстки выдувает наш интерфейс. layoutInflater - занимается выдуванием компонентов
setContentView(binding.root) //у любого binding есть специальная переменная root, которая всегда указывает на корневой элемент этого биндинга(ActivityMainBinding)



val post = Post(
id = 1,
author = "Нетология. Университет интернет-профессий будущего",
content = "Привет, это новая Нетология! Когда-то Нетология начиналась с интенсивов по онлайн-маркетингу. Затем появились курсы по дизайну, разработке, аналитике и управлению. Мы растём сами и помогаем расти студентам: от новичков до уверенных профессионалов. Но самое важное остаётся с нами: мы верим, что в каждом уже есть сила, которая заставляет хотеть больше, целиться выше, бежать быстрее. Наша миссия — помочь встать на путь роста и начать цепочку перемен → http://netolo.gy/fyb",
published = "21 мая в 18:36",
likedByMe = false,
sharedByMe = false,
likes = 10,
shares = 9,
views = 1000000

)

binding.shareCount?.text = formatNumber(post.shares)
binding.likeCount?.text = formatNumber(post.likes)
binding.viewsCount?.text = formatNumber(post.views)


with(binding) {
author.text = post.author
published.text = post.published
content.text = post.content
if (post.likedByMe) {
like?.setImageResource(R.drawable.ic_liked_24)
}
likeCount?.text = post.likes.toString() //Если пост понравился пользователю, то устанавливается соответствующая иконка и обновляется значение количества лайков.


root.setOnClickListener {
Log.d("stuff", "stuff")
}

avatar.setOnClickListener {
Log.d("stuff", "avatar")
}

like?.setOnClickListener { //данный код настраивает обработчик клика для элемента like. При клике на элемент, выполняется изменение состояния лайка, обновление отображаемого изображения, обновление количества лайков и вывод сообщения в лог.
Log.d("stuff", "like")
post.likedByMe = !post.likedByMe //значение свойства likedByMe объекта post инвертируется. Если оно было true, то становится false, и наоборот.
like.setImageResource( //устанавливается ресурс изображения для элемента like. если likedByMe равно true, то устанавливается иконка с ресурсом R.drawable.ic_liked_24, иначе - иконка с ресурсом R.drawable.ic_like_24.
if (post.likedByMe) R.drawable.ic_liked_24 else R.drawable.ic_like_24
)
if (post.likedByMe) post.likes++ else post.likes-- //увеличивается или уменьшается значение свойства likes объекта post, в зависимости от значения likedByMe. Если likedByMe равно true, то значение likes увеличивается на 1, иначе - уменьшается на 1.
likeCount?.text = formatNumber(post.likes)
}

share?.setOnClickListener {
Log.d("stuff", "share")
post.sharedByMe = !post.sharedByMe
post.shares++
shareCount?.text = formatNumber(post.shares)
}

}

}
}


20 changes: 20 additions & 0 deletions app/src/main/java/ru/netology/nmedia/MainActivityPlain.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.netology.nmedia

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageButton

class MainActivityPlain : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// findViewById<ImageButton>(R.id.like).setOnClickListener {
// if (it !is ImageButton) {
// return@setOnClickListener
// }
//
// it.setImageResource(R.drawable.ic_liked_24)
// }
}
}

14 changes: 14 additions & 0 deletions app/src/main/java/ru/netology/nmedia/dto/Post.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.netology.nmedia.dto

data class Post(
val id: Long,
val author: String,
val content: String,
val published: String,
var likes: Int = 0,
var likedByMe: Boolean = false,
var shares: Int = 0,
var sharedByMe: Boolean = false,
val views: Int = 0
)

23 changes: 23 additions & 0 deletions app/src/main/java/ru/netology/nmedia/dto/PostService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.netology.nmedia.dto

object PostService {

fun formatNumber(number: Int): String { //принимает число, возвращает строку
return when {
number in 1000..9999 -> {
val hundreds = (number / 100) % 10
val formattedHundreds = if (hundreds > 0) ".$hundreds" else ""
"${(number / 1000)}$formattedHundreds" + "K"
}

number in 10000..999999 -> "${(number / 1000)}K"

number >= 1000000 -> {
val tenThousands = (number / 100000) % 10
val formattedtenThousands = if (tenThousands > 0) ".$tenThousands" else ""
"${(number / 1000000)}$formattedtenThousands" + "M"
}
else -> number.toString()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.netology.nmedia.repository

import androidx.lifecycle.LiveData
import ru.netology.nmedia.dto.Post

interface PostRepository {
fun get() : LiveData<Post>
fun like()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.netology.nmedia.repository

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import ru.netology.nmedia.dto.Post

class PostRepositoryInMemoryImpl: PostRepository {

private var post = Post(
id = 1,
author = "Нетология. Университет интернет-профессий будущего",
content = "Привет, это новая Нетология! Когда-то Нетология начиналась с интенсивов по онлайн-маркетингу. Затем появились курсы по дизайну, разработке, аналитике и управлению. Мы растём сами и помогаем расти студентам: от новичков до уверенных профессионалов. Но самое важное остаётся с нами: мы верим, что в каждом уже есть сила, которая заставляет хотеть больше, целиться выше, бежать быстрее. Наша миссия — помочь встать на путь роста и начать цепочку перемен → http://netolo.gy/fyb",
published = "21 мая в 18:36",
likedByMe = false,
sharedByMe = false,
likes = 0
)

private val data = MutableLiveData(post) // MutableLiveData - данные за которыми можно наблюдать. В конструктор ( ) ему передается начальное значение этих данных

override fun get() = data //будет возвращать переменную data

override fun like() { //будет изменять пост
post = post.copy(likedByMe = !post.likedByMe) //post является датаклассом со значениями val, поэтому, чтобы изменить какое-то значение, нам нужно создать копию
data.value = post //в переменную data записываем новое значение.
}

// оператор ! - это инвертирование Boolean переменной. Если было true, то вернет false. Если было false, то вернет true

}
30 changes: 0 additions & 30 deletions app/src/main/res/drawable-v24/ic_launcher_foreground.xml

This file was deleted.

Loading