1 /**
<lambda>null2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * ```
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * ```
10  *
11  * Unless required by applicable law or agreed to in writing, software distributed under the License
12  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13  * or implied. See the License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 package com.android.healthconnect.controller.permissiontypes.prioritylist
17 
18 import android.app.Dialog
19 import android.os.Bundle
20 import android.view.LayoutInflater
21 import android.view.View
22 import android.widget.TextView
23 import androidx.fragment.app.DialogFragment
24 import androidx.fragment.app.activityViewModels
25 import androidx.fragment.app.setFragmentResult
26 import androidx.recyclerview.widget.ItemTouchHelper
27 import androidx.recyclerview.widget.RecyclerView
28 import com.android.healthconnect.controller.R
29 import com.android.healthconnect.controller.permissiontypes.HealthPermissionTypesViewModel
30 import com.android.healthconnect.controller.shared.app.AppMetadata
31 import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
32 import com.android.healthconnect.controller.utils.logging.PermissionTypesElement
33 import dagger.hilt.android.AndroidEntryPoint
34 
35 /** A {@link DialogFragment} that displays the apps in priority order. */
36 @AndroidEntryPoint(DialogFragment::class)
37 class PriorityListDialogFragment() : Hilt_PriorityListDialogFragment() {
38 
39     private val viewModel: HealthPermissionTypesViewModel by activityViewModels()
40 
41     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
42         val priorityList: List<AppMetadata> = viewModel.editedPriorityList.value ?: emptyList()
43         val dataCategoryName: String? = viewModel.categoryLabel.value
44         val parentView: View =
45             LayoutInflater.from(context).inflate(R.layout.dialog_layout_priority, null)
46         val priorityListView: RecyclerView =
47             parentView.findViewById(R.id.priority_list_recycle_view)
48         val adapter = PriorityListAdapter(priorityList, viewModel)
49 
50         priorityListView.layoutManager = PriorityListLinearLayoutManager(context, adapter)
51         priorityListView.adapter = adapter
52         val messageView = parentView.findViewById<TextView>(R.id.priority_list_message)
53         dataCategoryName?.let { messageView.text = getString(R.string.priority_dialog_message, it) }
54 
55         val callback = PriorityListItemMoveCallback(adapter)
56         val priorityListMover = ItemTouchHelper(callback)
57         adapter.setOnItemDragStartedListener(priorityListMover)
58         priorityListMover.attachToRecyclerView(priorityListView)
59 
60         return AlertDialogBuilder(this, PermissionTypesElement.SET_APP_PRIORITY_DIALOG_CONTAINER)
61             .setView(parentView)
62             .setNeutralButton(
63                 android.R.string.cancel,
64                 PermissionTypesElement.SET_APP_PRIORITY_DIALOG_CANCEL_BUTTON)
65             .setPositiveButton(
66                 R.string.priority_dialog_positive_button,
67                 PermissionTypesElement.SET_APP_PRIORITY_DIALOG_SAVE_BUTTON) { _, _ ->
68                     setFragmentResult(PRIORITY_UPDATED_EVENT, bundle(adapter.getPackageNameList()))
69                 }
70             .create()
71     }
72 
73     fun bundle(list: List<String>): Bundle {
74         val resultBundle = Bundle()
75         resultBundle.putStringArrayList(
76             PRIORITY_UPDATED_EVENT, list.toMutableList() as ArrayList<String>)
77         return resultBundle
78     }
79 
80     companion object {
81         const val TAG = "PriorityDialogFragment"
82         const val PRIORITY_UPDATED_EVENT = "PRIORITY_UPDATED_EVENT"
83     }
84 }
85