diff --git a/summer_coding_android/app/src/main/AndroidManifest.xml b/summer_coding_android/app/src/main/AndroidManifest.xml index 46b301c..ef3fc38 100644 --- a/summer_coding_android/app/src/main/AndroidManifest.xml +++ b/summer_coding_android/app/src/main/AndroidManifest.xml @@ -9,6 +9,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.SummerCodingAndroid"> + + diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok59592Activity.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok59592Activity.kt new file mode 100644 index 0000000..b0fa01a --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok59592Activity.kt @@ -0,0 +1,53 @@ +package kr.co.landvibe.summer_coding_android.gok5959 + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import androidx.recyclerview.widget.ItemTouchHelper +import kr.co.landvibe.summer_coding_android.R +import kr.co.landvibe.summer_coding_android.databinding.ActivityGok59592Binding +import kr.co.landvibe.summer_coding_android.gok5959.adapters.LocationAdapter +import kr.co.landvibe.summer_coding_android.gok5959.data.Location +import kr.co.landvibe.summer_coding_android.gok5959.data.locationItem +import kr.co.landvibe.summer_coding_android.gok5959.itemTouch.ItemTouchHelperCallback + +class Gok59592Activity : AppCompatActivity() { + + private lateinit var text:String + private lateinit var binding:ActivityGok59592Binding + + val location: MutableList = mutableListOf( + Location("인하대학교 후문", 1), + Location("캐리비안베이", 2), + Location("파라다이스 시티", 3), + Location("BBQ치킨 인하대후문점", 4), + Location("인천국제공항 제1여객터미널", 5), + Location("부평역", 6), + Location("성원상떼빌아파트", 7), + Location("광안대교", 8), + Location("김해국제공항", 9), + Location("CU 영주 적십자병원점", 10), + Location("미진프라자", 11), + Location("강남역 1번출구", 12) + + + ) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityGok59592Binding.inflate(layoutInflater) + setContentView(binding.root) + + val adapter = LocationAdapter(location) + binding.locationRV.adapter = adapter + + val itemTouchHelperCallback = ItemTouchHelperCallback(adapter) + + val helper = ItemTouchHelper(itemTouchHelperCallback) + helper.attachToRecyclerView(binding.locationRV) + adapter.addFooterAndSubmitList(location) + } + + + +} \ No newline at end of file diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959Activity.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959Activity.kt index e3f6511..02dbb6d 100644 --- a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959Activity.kt +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959Activity.kt @@ -1,12 +1,43 @@ package kr.co.landvibe.summer_coding_android.gok5959 +import android.content.ContentValues.TAG +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import kr.co.landvibe.summer_coding_android.R +import kr.co.landvibe.summer_coding_android.databinding.ActivityGok5959Binding class Gok5959Activity : AppCompatActivity() { + private lateinit var binding: ActivityGok5959Binding + private lateinit var activityResultLauncher: ActivityResultLauncher + private val TAG:String = "MainActivity" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_gok5959) + binding = ActivityGok5959Binding.inflate(layoutInflater) + setContentView(binding.root) + Log.d(TAG, "init") + initView() + Log.d(TAG, "init2") + } + + fun initView() { + binding.run { + activityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + when (result.resultCode) { + 1000 -> { + nameTV.text = result.data?.getStringExtra("inputText") + } + } + } + } + + binding.nameBTN.setOnClickListener { + val intent = Intent(this@Gok5959Activity, Gok59592Activity::class.java) + activityResultLauncher.launch(intent) + } } } \ No newline at end of file diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959LocationinformationActivity.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959LocationinformationActivity.kt new file mode 100644 index 0000000..e2d745e --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/Gok5959LocationinformationActivity.kt @@ -0,0 +1,23 @@ +package kr.co.landvibe.summer_coding_android.gok5959 + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import kr.co.landvibe.summer_coding_android.R +import kr.co.landvibe.summer_coding_android.databinding.ActivityGok5959LocationinformationBinding + +class Gok5959LocationinformationActivity : AppCompatActivity() { + lateinit var binding:ActivityGok5959LocationinformationBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityGok5959LocationinformationBinding.inflate(layoutInflater) + init() + setContentView(binding.root) + } + + fun init(){ + binding.locationTV.text = intent.getStringExtra("locationName") + binding.backBTN.setOnClickListener { + finish() + } + } +} \ No newline at end of file diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/adapters/LocationAdapter.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/adapters/LocationAdapter.kt new file mode 100644 index 0000000..f53812f --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/adapters/LocationAdapter.kt @@ -0,0 +1,121 @@ +package kr.co.landvibe.summer_coding_android.gok5959.adapters + +import android.content.Intent +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import kr.co.landvibe.summer_coding_android.databinding.FooterGok5959Binding +import kr.co.landvibe.summer_coding_android.databinding.ItemViewGok5959Binding +import kr.co.landvibe.summer_coding_android.gok5959.Gok5959LocationinformationActivity +import kr.co.landvibe.summer_coding_android.gok5959.data.Location +import kr.co.landvibe.summer_coding_android.gok5959.data.locationItem +import kr.co.landvibe.summer_coding_android.gok5959.itemTouch.ItemTouchHelperListener +import kr.co.landvibe.summer_coding_android.gok5959.util.DiffUtilCallback + +class LocationAdapter(private val locationList: MutableList) : + ListAdapter(DiffUtilCallback()), + ItemTouchHelperListener { + lateinit var LocationAdded: String + val HEADER = 0 + val ITEM = 1 + val FOOTER = 2 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + + return when (viewType) { + ITEM -> LocationViewHolder(ItemViewGok5959Binding.inflate(LayoutInflater.from( + parent.context), + parent, + false)) + FOOTER -> FooterViewHolder(FooterGok5959Binding.inflate(LayoutInflater.from( + parent.context), + parent, + false)) + else -> { + throw ClassCastException("error") + } + } + + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is FooterViewHolder -> { + holder.binding.addBTN.setOnClickListener { + LocationAdded = holder.binding.addET.text.toString() + if (LocationAdded.equals("")) { + Toast.makeText(it.context, "입력하세요", Toast.LENGTH_SHORT).show() + } else { + addLocation() + } + } + } + is LocationViewHolder -> { + val item = getItem(position) as locationItem.Item + holder.bind(item) + holder.binding.locationCTRL.setOnClickListener { + val tmp : String = holder.binding.locationTV.text.toString() + val intent = Intent(holder.binding.locationCTRL?.context, + Gok5959LocationinformationActivity::class.java) + intent.putExtra("locationName", tmp) + ContextCompat.startActivity(holder.binding.locationCTRL.context, intent, null) + } + } + } + } + + override fun getItemViewType(position: Int): Int { + return when (getItem(position)) { + is locationItem.Footer -> FOOTER + is locationItem.Item -> ITEM + else -> 0 + } + } + + + class FooterViewHolder(val binding: FooterGok5959Binding) : + RecyclerView.ViewHolder(binding.root) { + + } + + class LocationViewHolder(val binding: ItemViewGok5959Binding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: locationItem.Item) { // + binding.locationTV.text = item.name + } + } + + fun addLocation() { + val newLocation = Location(LocationAdded, locationList.size + 1.toLong()) + locationList.add(newLocation) + addFooterAndSubmitList(locationList) + } + + override fun onItemMove(from_position: Int, to_position: Int): Boolean { + val item = locationList[from_position] + + locationList.removeAt(from_position) + locationList.add(to_position, item) + addFooterAndSubmitList(locationList) + return true; + } + + override fun onItemSwipe(position: Int) { + TODO("Not yet implemented") + } + + fun addFooterAndSubmitList(list: MutableList?) { + val items = when (list.isNullOrEmpty()) { + true -> listOf(locationItem.Footer) + false -> list.map { locationItem.Item(it) } + listOf(locationItem.Footer) + } + submitList(items) + } +} + diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/Location.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/Location.kt new file mode 100644 index 0000000..4e92f87 --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/Location.kt @@ -0,0 +1,6 @@ +package kr.co.landvibe.summer_coding_android.gok5959.data + +data class Location( + var name: String, + var id: Long +) diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/locationItem.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/locationItem.kt new file mode 100644 index 0000000..70c6a9d --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/data/locationItem.kt @@ -0,0 +1,16 @@ +package kr.co.landvibe.summer_coding_android.gok5959.data + +sealed class locationItem{ + abstract var id: Long + abstract var name: String + data class Item(val location: Location) : locationItem() { + override var id = location.id + override var name = location.name + + } + object Footer : locationItem(){ + override var id = Long.MAX_VALUE + override var name = "" + } +} + diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperCallback.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperCallback.kt new file mode 100644 index 0000000..a4e3bb6 --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperCallback.kt @@ -0,0 +1,32 @@ +package kr.co.landvibe.summer_coding_android.gok5959.itemTouch + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + +class ItemTouchHelperCallback(val listener: ItemTouchHelperListener) + : ItemTouchHelper.Callback() +{ + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + ): Int { + val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN + val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + return makeMovementFlags(dragFlags, 0) + } + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder, + ): Boolean { + return listener.onItemMove(viewHolder.adapterPosition, target.adapterPosition) + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + listener.onItemSwipe(viewHolder.adapterPosition) + } + + +} \ No newline at end of file diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperListener.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperListener.kt new file mode 100644 index 0000000..d1eaed0 --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/itemTouch/ItemTouchHelperListener.kt @@ -0,0 +1,6 @@ +package kr.co.landvibe.summer_coding_android.gok5959.itemTouch + +interface ItemTouchHelperListener { + fun onItemMove(from_position : Int, to_position: Int): Boolean + fun onItemSwipe(position: Int) +} \ No newline at end of file diff --git a/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/util/DiffUtilCallback.kt b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/util/DiffUtilCallback.kt new file mode 100644 index 0000000..50b9140 --- /dev/null +++ b/summer_coding_android/app/src/main/java/kr/co/landvibe/summer_coding_android/gok5959/util/DiffUtilCallback.kt @@ -0,0 +1,18 @@ +package kr.co.landvibe.summer_coding_android.gok5959.util + +import androidx.recyclerview.widget.DiffUtil +import kr.co.landvibe.summer_coding_android.gok5959.data.Location +import kr.co.landvibe.summer_coding_android.gok5959.data.locationItem + +class DiffUtilCallback : DiffUtil.ItemCallback(){ + + + override fun areItemsTheSame(oldItem: locationItem, newItem: locationItem): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: locationItem, newItem: locationItem): Boolean { + return oldItem == newItem + } + +} \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/drawable/edge_gok5959.xml b/summer_coding_android/app/src/main/res/drawable/edge_gok5959.xml new file mode 100644 index 0000000..8781c13 --- /dev/null +++ b/summer_coding_android/app/src/main/res/drawable/edge_gok5959.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/drawable/mapping.png b/summer_coding_android/app/src/main/res/drawable/mapping.png new file mode 100644 index 0000000..0144b47 Binary files /dev/null and b/summer_coding_android/app/src/main/res/drawable/mapping.png differ diff --git a/summer_coding_android/app/src/main/res/drawable/xbutton.png b/summer_coding_android/app/src/main/res/drawable/xbutton.png new file mode 100644 index 0000000..e538f9d Binary files /dev/null and b/summer_coding_android/app/src/main/res/drawable/xbutton.png differ diff --git a/summer_coding_android/app/src/main/res/layout/activity_gok5959.xml b/summer_coding_android/app/src/main/res/layout/activity_gok5959.xml index 4d9ce04..b1079f8 100644 --- a/summer_coding_android/app/src/main/res/layout/activity_gok5959.xml +++ b/summer_coding_android/app/src/main/res/layout/activity_gok5959.xml @@ -13,12 +13,33 @@ android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:text="@string/gcooter" - android:textColor="@color/green" + + android:textColor="@color/green_gok" android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + android:background="@color/blue_gok"> + @@ -195,7 +218,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:backgroundTint="@color/blue" + android:backgroundTint="@color/blue_gok" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/thirdCL"> diff --git a/summer_coding_android/app/src/main/res/layout/activity_gok59592.xml b/summer_coding_android/app/src/main/res/layout/activity_gok59592.xml new file mode 100644 index 0000000..269e4f3 --- /dev/null +++ b/summer_coding_android/app/src/main/res/layout/activity_gok59592.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/layout/activity_gok5959_locationinformation.xml b/summer_coding_android/app/src/main/res/layout/activity_gok5959_locationinformation.xml new file mode 100644 index 0000000..498e9ea --- /dev/null +++ b/summer_coding_android/app/src/main/res/layout/activity_gok5959_locationinformation.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/layout/footer_gok5959.xml b/summer_coding_android/app/src/main/res/layout/footer_gok5959.xml new file mode 100644 index 0000000..38a8cef --- /dev/null +++ b/summer_coding_android/app/src/main/res/layout/footer_gok5959.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/layout/item_view_gok5959.xml b/summer_coding_android/app/src/main/res/layout/item_view_gok5959.xml new file mode 100644 index 0000000..b7fe2b3 --- /dev/null +++ b/summer_coding_android/app/src/main/res/layout/item_view_gok5959.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/summer_coding_android/app/src/main/res/values/colors.xml b/summer_coding_android/app/src/main/res/values/colors.xml index 0d9bb02..d61125e 100644 --- a/summer_coding_android/app/src/main/res/values/colors.xml +++ b/summer_coding_android/app/src/main/res/values/colors.xml @@ -15,8 +15,8 @@ #252A3F #8f949f - #FF008000 - #DFE5F4 - #EDEFF1 + #FF008000 + #DFE5F4 + #EDEFF1 \ No newline at end of file