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