diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a9a7031..0000000 --- a/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -*.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 -.idea -.kotlintest -run.sh -*.idea -*.lock -*.apk -*.aab -output-metadata.json -/build.properties -*.hprof \ No newline at end of file diff --git a/README.md b/README.md index 81c0cc8..9fee95c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,10 @@ Задание содержит 3 страницы: 1. `Contacts` - страница контакта записной книжки 2. `Cart` - страница корзины -3. `Login` - [MaterialAlertDialog](https://m2.material.io/components/dialogs/android) формы логина +3. `Login` - [MaterialAlertDialog](https://m2.material.io/components/dialogs/android) формы логина. создай + Simple dialog + Simple dialogs display a list of items that take immediate effect when selected. При логине вводим имейл и попадаем в личную кабинет +, который выглядит как картинка с названием файла Contacts Day.png. Для первого и второго задания в проекте сделаны две пустых `Activity`: 1. `ContactsActivity` diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/viewandresources/CartActivity.kt b/app/src/main/java/otus/gpb/homework/viewandresources/CartActivity.kt index b6cbf73..b364632 100644 --- a/app/src/main/java/otus/gpb/homework/viewandresources/CartActivity.kt +++ b/app/src/main/java/otus/gpb/homework/viewandresources/CartActivity.kt @@ -1,11 +1,102 @@ package otus.gpb.homework.viewandresources -import androidx.appcompat.app.AppCompatActivity +import android.content.Context import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import com.google.android.material.button.MaterialButton +import kotlin.random.Random class CartActivity : AppCompatActivity() { + + private lateinit var recyclerView: RecyclerView + private lateinit var adapter: CartAdapter + private lateinit var totalAmountTextView: TextView + + private val cartItems = mutableListOf() + private companion object { + const val PREFS_NAME = "ThemePrefs" + const val KEY_DARK_THEME = "dark_theme" + } + override fun onCreate(savedInstanceState: Bundle?) { + applyTheme() super.onCreate(savedInstanceState) setContentView(R.layout.activity_cart) + + recyclerView = findViewById(R.id.cart_recycler_view) + totalAmountTextView = findViewById(R.id.total_amount) + + for (i in 1..5) { + cartItems.add(CartItem("Item $i", 10.0 + i, Random.nextInt(1, 5))) + } + + adapter = CartAdapter(cartItems) { item -> + cartItems.remove(item) + adapter.notifyItemRemoved(cartItems.indexOf(item)) + updateTotal() + } + recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(this) + + updateTotal() + } + + private fun updateTotal() { + val total = cartItems.sumOf { it.price * it.quantity } + totalAmountTextView.text = getString(R.string.item_price_template, total) + } + + data class CartItem(val name: String, val price: Double, val quantity: Int) + + inner class CartAdapter( + private val items: MutableList, + private val onDeleteClick: (CartItem) -> Unit + ) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_cart_product, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = items[position] + holder.bind(item) + } + + override fun getItemCount() = items.size + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val nameTextView: TextView = itemView.findViewById(R.id.product_name) + private val priceTextView: TextView = itemView.findViewById(R.id.product_price) + private val quantityTextView: TextView = itemView.findViewById(R.id.product_quantity) + private val deleteButton: MaterialButton = itemView.findViewById(R.id.delete_button) + + fun bind(item: CartItem) { + nameTextView.text = item.name + priceTextView.text = itemView.context.getString(R.string.item_price_template, item.price) + quantityTextView.text = itemView.context.getString(R.string.item_quantity_template, item.quantity) + + deleteButton.setOnClickListener { + val position = adapterPosition + if (position != RecyclerView.NO_POSITION) { + onDeleteClick(items[position]) + } + } + } + } + } + private fun applyTheme() { + val sharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + val isDarkTheme = sharedPreferences.getBoolean(KEY_DARK_THEME, false) + val mode = if (isDarkTheme) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO + AppCompatDelegate.setDefaultNightMode(mode) } } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/viewandresources/ContactsActivity.kt b/app/src/main/java/otus/gpb/homework/viewandresources/ContactsActivity.kt index 25f1ffb..32f5603 100644 --- a/app/src/main/java/otus/gpb/homework/viewandresources/ContactsActivity.kt +++ b/app/src/main/java/otus/gpb/homework/viewandresources/ContactsActivity.kt @@ -1,11 +1,107 @@ package otus.gpb.homework.viewandresources -import androidx.appcompat.app.AppCompatActivity +import android.content.Context import android.os.Bundle +import android.view.View +import android.widget.ArrayAdapter +import android.widget.AutoCompleteTextView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import com.google.android.material.textfield.TextInputEditText +import java.text.SimpleDateFormat +import java.util.* class ContactsActivity : AppCompatActivity() { + + private lateinit var dateInputEditText: TextInputEditText + private lateinit var phoneTypeAutoComplete: AutoCompleteTextView + private lateinit var themeToggleButton: View + private companion object { + const val PREFS_NAME = "ThemePrefs" + const val KEY_DARK_THEME = "dark_theme" + } + override fun onCreate(savedInstanceState: Bundle?) { + applyTheme() super.onCreate(savedInstanceState) setContentView(R.layout.activity_contacts) + + dateInputEditText = findViewById(R.id.date_input_edit_text) + phoneTypeAutoComplete = findViewById(R.id.phone_type_autocomplete) + themeToggleButton = findViewById(R.id.theme_toggle_button) + + dateInputEditText.setOnClickListener { + showDatePicker() + } + + setupPhoneTypeSpinner() + + themeToggleButton.setOnClickListener { + toggleTheme() + } + } + + private fun showDatePicker() { + val calendar = Calendar.getInstance() + val year = calendar.get(Calendar.YEAR) + val month = calendar.get(Calendar.MONTH) + val dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH) + + val datePickerDialog = android.app.DatePickerDialog( + this, + { _, selectedYear, selectedMonth, selectedDayOfMonth -> + val selectedDate = Calendar.getInstance().apply { + set(selectedYear, selectedMonth, selectedDayOfMonth) + } + val dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()) + val formattedDate = dateFormat.format(selectedDate.time) + + dateInputEditText.setText(formattedDate) + }, + year, + month, + dayOfMonth + ) + + datePickerDialog.show() + } + + private fun setupPhoneTypeSpinner() { + val phoneTypes = arrayOf("Mobile", "Home", "Work", "Fax", "Other") + + val adapter = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, phoneTypes) + + phoneTypeAutoComplete.setAdapter(adapter) + } + + private fun toggleTheme() { + val sharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + val isDarkTheme = sharedPreferences.getBoolean(KEY_DARK_THEME, false) + + val newNightMode = if (isDarkTheme) { + AppCompatDelegate.MODE_NIGHT_NO + } else { + AppCompatDelegate.MODE_NIGHT_YES + } + + with(sharedPreferences.edit()) { + putBoolean(KEY_DARK_THEME, newNightMode == AppCompatDelegate.MODE_NIGHT_YES) + apply() + } + + AppCompatDelegate.setDefaultNightMode(newNightMode) + + recreate() + } + + fun onBackPressed(view: View) { + finish() + } + private fun applyTheme() { + val sharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + val isDarkTheme = sharedPreferences.getBoolean(KEY_DARK_THEME, false) + + val mode = if (isDarkTheme) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO + AppCompatDelegate.setDefaultNightMode(mode) } } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/viewandresources/MainActivity.kt b/app/src/main/java/otus/gpb/homework/viewandresources/MainActivity.kt index 22b779c..6f843e9 100644 --- a/app/src/main/java/otus/gpb/homework/viewandresources/MainActivity.kt +++ b/app/src/main/java/otus/gpb/homework/viewandresources/MainActivity.kt @@ -1,15 +1,25 @@ package otus.gpb.homework.viewandresources +import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Button +import android.widget.EditText import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate import com.google.android.material.dialog.MaterialAlertDialogBuilder class MainActivity : AppCompatActivity() { + private companion object { + const val PREFS_NAME = "ThemePrefs" + const val KEY_DARK_THEME = "dark_theme" + } + override fun onCreate(savedInstanceState: Bundle?) { + applyTheme() super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + findViewById