package com.jensdriller.contentproviderhelper.ui.dialog; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.jensdriller.contentproviderhelper.R; public class DeleteProviderDialog extends ContractDialogFragment<DeleteProviderDialog.Contract> { private static final String ARG_USER_PROVIDERS = "userProviders"; public interface Contract { void onDeleteProviderClicked(List<String> providers); } private List<String> mProviderUris; private int mProviderCount; private boolean[] mCheckStates; public static DeleteProviderDialog newInstance(ArrayList<String> contentProviders) { DeleteProviderDialog fragment = new DeleteProviderDialog(); Bundle bundle = new Bundle(); bundle.putStringArrayList(ARG_USER_PROVIDERS, contentProviders); fragment.setArguments(bundle); return fragment; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mProviderUris = getArguments().getStringArrayList(ARG_USER_PROVIDERS); mProviderCount = mProviderUris.size(); mCheckStates = new boolean[mProviderCount]; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())// .setTitle(R.string.delete_content_providers)// .setNegativeButton(R.string.cancel, null)// .setPositiveButton(R.string.delete, null);// Click listener is set in onStart() if (!mProviderUris.isEmpty()) { String[] providers = mProviderUris.toArray(new String[mProviderCount]); builder.setMultiChoiceItems(providers, null, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { mCheckStates[which] = isChecked; Button button = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE); button.setEnabled(false); for (boolean checked : mCheckStates) { if (checked) { button.setEnabled(true); break; } } } }); } else { builder.setMessage(R.string.no_custom_content_providers); } return builder.create(); } @Override public void onStart() { // super.onStart() is where dialog.show() is actually called on the underlying dialog, // so we have to do the validation and handling of the positive button after this point super.onStart(); Button positiveButton = ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_POSITIVE); positiveButton.setEnabled(false); positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<String> toDelete = new ArrayList<String>(); for (int i = 0; i < mProviderCount; i++) { if (mCheckStates[i]) { toDelete.add(mProviderUris.get(i)); } } getContract().onDeleteProviderClicked(toDelete); dismiss(); } }); } }