/** * Copyright (c) 2015 unfoldingWord * http://creativecommons.org/licenses/MIT/ * See LICENSE file for details. * Contributors: * PJ Fechner <pj@actsmedia.com> */ package fragments; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import org.unfoldingword.mobile.R; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import adapters.ResourceChoosingAdapter; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import model.daoModels.Version; import model.parsers.MediaType; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link ResourceChoosingListener} interface * to handle interaction events. * Use the {@link ResourceChoosingFragment#newInstance} factory method to * create an instance of this fragment. */ public class ResourceChoosingFragment extends DialogFragment { private static final String VERSION_PARAM = "VERSION_PARAM"; @Bind(R.id.resource_choosing_list_view) ListView listView; @Bind(R.id.resource_choosing_title_view) TextView titleView; @Bind(R.id.resource_choosing_sub_title_view) TextView subTitleView; @Bind(R.id.resource_choosing_cancel_button) Button cancelButton; @Bind(R.id.resource_choosing_continue_button) Button continueButton; private Version[] versions; private ResourceChoosingAdapter adapter; private ResourceChoosingListener listener; public static ResourceChoosingFragment newInstance(Version[] versions) { ResourceChoosingFragment fragment = new ResourceChoosingFragment(); Bundle args = new Bundle(); args.putSerializable(VERSION_PARAM, versions); fragment.setArguments(args); return fragment; } public static ResourceChoosingFragment newInstance(Version version, ResourceChoosingListener listener) { Bundle args = new Bundle(); args.putSerializable(VERSION_PARAM, version); ResourceChoosingFragment fragment = new ResourceChoosingFragment(); fragment.setArguments(args); fragment.listener = listener; return fragment; } public static ResourceChoosingFragment newInstance(Version[] versions, ResourceChoosingListener listener) { Bundle args = new Bundle(); args.putSerializable(VERSION_PARAM, versions); ResourceChoosingFragment fragment = new ResourceChoosingFragment(); fragment.setArguments(args); fragment.listener = listener; return fragment; } public ResourceChoosingFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { Object[] baseObjects = (Object[]) getArguments().getSerializable(VERSION_PARAM); if (baseObjects != null) { Version[] parsedVersions = new Version[baseObjects.length]; for(int i = 0; i < baseObjects.length; i++) { parsedVersions[i] = (Version) baseObjects[i]; } versions = parsedVersions; } else{ versions = new Version[0]; } } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_resource_choosing, container, false); ButterKnife.bind(this, view); setupView(); return view; } private void setupView(){ String text = (versions.length == 1) ? versions[0].getName() : "Versions"; titleView.setText("Sharing " + text); subTitleView.setText("Choose Optional Resources"); adapter = new ResourceChoosingAdapter(getContext(), getData()); listView.setAdapter(adapter); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); continueButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { endDialog(); } }); } @OnClick(R.id.resource_choosing_cancel_button) void cancel(){ dismiss(); } @OnClick(R.id.resource_choosing_continue_button) protected void endDialog(){ sendChoiceInformation(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if(listener == null) { try { listener = (ResourceChoosingListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); } } } @Override public void onDetach() { super.onDetach(); listener = null; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; } private List<ResourceChoosingAdapter.ResourceChoosingAdapterProtocol> getData(){ List<ResourceChoosingAdapter.ResourceChoosingAdapterProtocol> data = new ArrayList<>(); for(Version version : versions) { if (version.hasAudio()) { MediaType type = MediaType.MEDIA_TYPE_AUDIO; data.add(new SimpleResourceChoosingObject(getActivity().getApplicationContext(), version, version.getTitle() + " " + type.getTitle(), type)); } if (version.hasVideo()) { MediaType type = MediaType.MEDIA_TYPE_VIDEO; data.add(new SimpleResourceChoosingObject(getActivity().getApplicationContext(), version, version.getTitle() + " " + type.getTitle(), type)); } } return data; } private class SimpleResourceChoosingObject implements ResourceChoosingAdapter.ResourceChoosingAdapterProtocol{ private Context context; private Version version; private String name; private MediaType type; public SimpleResourceChoosingObject(Context context, Version version, String name, MediaType type) { this.version = version; this.context = context; this.name = name; this.type = type; } @Override public Drawable getImage() { return context.getResources().getDrawable(MediaType.getImageResourceForType(type)); } @Override public String getName() { return name; } @Override public Version getVersion() { return version; } @Override public MediaType getType() { return type; } } private void sendChoiceInformation() { Map<Version, List<MediaType>> types = new HashMap<>(); for(Version version: versions){ types.put(version, Arrays.asList(MediaType.MEDIA_TYPE_TEXT)); } int i = 0; for (ResourceChoosingAdapter.ResourceChoosingAdapterProtocol item : adapter.getObjects()){ if(adapter.hasSelectedIndex(i)){ ArrayList<MediaType> specifiedTypes = new ArrayList<>(); List<MediaType> currentTypes = types.get(item.getVersion()); specifiedTypes.addAll(currentTypes); specifiedTypes.add(item.getType()); types.put(item.getVersion(), specifiedTypes); } i++; } listener.resourcesChosen(this, types); } public interface ResourceChoosingListener { void resourcesChosen(DialogFragment dialogFragment, Map<Version, List<MediaType>> sharingChoices); } @Override public void onDestroy() { super.onDestroy(); ButterKnife.unbind(this); } }