package what.whatandroid.request; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import api.cli.Utils; import api.requests.Request; import api.requests.Response; import api.soup.MySoup; import what.whatandroid.R; import what.whatandroid.WhatApplication; import what.whatandroid.callbacks.LoadingListener; import what.whatandroid.callbacks.ViewTorrentCallbacks; import what.whatandroid.callbacks.ViewUserCallbacks; import what.whatandroid.settings.SettingsActivity; import what.whatandroid.views.ImageDialog; import java.util.Date; /** * Display the details of a request, bounty, artists etc. */ public class RequestDetailFragment extends Fragment implements View.OnClickListener, LoadingListener<Request> { /** * The request being viewed */ private Request request; private ViewUserCallbacks viewUser; private ViewTorrentCallbacks viewTorrent; /** * Various views displaying the information about the request along with associated headers/text * so that we can hide any unused views */ private ImageView image; private ProgressBar spinner; private TextView title, created, recordLabel, catalogueNumber, releaseType, filled, filledBy, acceptBitrates, acceptFormats, acceptMedia, votes, bounty, tags; private View recordLabelText, catalogueNumberText, releaseTypeText, filledText, filledByText, bitratesContainer, formatsContainer, mediaContainer, addVote, artContainer; /** * The list shows the artists & top contributors */ private ExpandableListView list; /** * Use this factory method to create a request fragment displaying the request * * @param id request to load * @return fragment displaying the request */ public static RequestDetailFragment newInstance(int id){ RequestDetailFragment fragment = new RequestDetailFragment(); Bundle args = new Bundle(); args.putInt(RequestActivity.REQUEST_ID, id); fragment.setArguments(args); return fragment; } public RequestDetailFragment(){ //Required empty ctor } @Override public void onAttach(Activity activity){ super.onAttach(activity); try { viewTorrent = (ViewTorrentCallbacks)activity; viewUser = (ViewUserCallbacks)activity; } catch (ClassCastException e){ throw new ClassCastException(activity.toString() + " must implement ViewUser and ViewTorrent callbacks"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.expandable_list_view, container, false); list = (ExpandableListView)view.findViewById(R.id.exp_list); View header = inflater.inflate(R.layout.header_request_info, null); list.addHeaderView(header, null, false); image = (ImageView)header.findViewById(R.id.image); spinner = (ProgressBar)header.findViewById(R.id.loading_indicator); artContainer = header.findViewById(R.id.art_container); title = (TextView)header.findViewById(R.id.title); created = (TextView)header.findViewById(R.id.created); recordLabelText = header.findViewById(R.id.record_label_text); recordLabel = (TextView)header.findViewById(R.id.record_label); catalogueNumberText = header.findViewById(R.id.catalogue_number_text); catalogueNumber = (TextView)header.findViewById(R.id.catalogue_number); releaseType = (TextView)header.findViewById(R.id.release_type); releaseTypeText = header.findViewById(R.id.release_type_text); filled = (TextView)header.findViewById(R.id.filled_torrent); filledText = header.findViewById(R.id.filled_torrent_text); filledBy = (TextView)header.findViewById(R.id.filled_user); filledByText = header.findViewById(R.id.filled_user_text); acceptBitrates = (TextView)header.findViewById(R.id.accept_bitrates); bitratesContainer = header.findViewById(R.id.accept_bitrates_container); acceptFormats = (TextView)header.findViewById(R.id.accept_formats); formatsContainer = header.findViewById(R.id.accept_formats_container); acceptMedia = (TextView)header.findViewById(R.id.accept_media); mediaContainer = header.findViewById(R.id.accept_media_container); votes = (TextView)header.findViewById(R.id.votes); bounty = (TextView)header.findViewById(R.id.bounty); tags = (TextView)header.findViewById(R.id.tags); addVote = header.findViewById(R.id.add_vote); addVote.setOnClickListener(this); image.setOnClickListener(this); if (request != null){ populateViews(); } return view; } @Override public void onClick(View v){ if (v.getId() == R.id.add_vote){ VoteDialog dialog = VoteDialog.newInstance(request); dialog.show(getChildFragmentManager(), "vote_dialog"); } else if (v.getId() == R.id.image){ ImageDialog dialog = ImageDialog.newInstance(request.getResponse().getImage()); dialog.show(getChildFragmentManager(), "image_dialog"); } } @Override public void onLoadingComplete(Request data){ request = data; if (isAdded()){ populateViews(); } } /** * Update the request information being shown */ private void populateViews(){ Response response = request.getResponse(); title.setText(response.getTitle()); votes.setText(response.getVoteCount().toString()); bounty.setText(Utils.toHumanReadableSize(response.getTotalBounty().longValue())); Date createDate = MySoup.parseDate(response.getTimeAdded()); created.setText(DateUtils.getRelativeTimeSpanString(createDate.getTime(), new Date().getTime(), DateUtils.WEEK_IN_MILLIS)); RequestAdapter adapter = new RequestAdapter(getActivity(), response.getMusicInfo(), response.getTopContributors()); list.setAdapter(adapter); list.setOnChildClickListener(adapter); //Requests may be missing any of these fields String imgUrl = response.getImage(); if (!SettingsActivity.imagesEnabled(getActivity())) { artContainer.setVisibility(View.GONE); } else { artContainer.setVisibility(View.VISIBLE); WhatApplication.loadImage(getActivity(), imgUrl, image, spinner, null, null); } if (response.isFilled()){ addVote.setVisibility(View.GONE); filled.setText("Yes"); filled.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ viewTorrent.viewTorrent(-1, request.getResponse().getTorrentId().intValue()); } }); filledBy.setText(response.getFillerName()); filledBy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ viewUser.viewUser(request.getResponse().getFillerId().intValue()); } }); } else { filledText.setVisibility(View.GONE); filled.setVisibility(View.GONE); filledByText.setVisibility(View.GONE); filledBy.setVisibility(View.GONE); } if (response.getRecordLabel() != null && !response.getRecordLabel().isEmpty()){ recordLabel.setText(response.getRecordLabel()); } else { recordLabelText.setVisibility(View.GONE); recordLabel.setVisibility(View.GONE); } if (response.getCatalogueNumber() != null && !response.getCatalogueNumber().isEmpty()){ catalogueNumber.setText(response.getCatalogueNumber()); } else { catalogueNumberText.setVisibility(View.GONE); catalogueNumber.setVisibility(View.GONE); } if (response.getReleaseName() != null && !response.getReleaseName().isEmpty()){ releaseType.setText(response.getReleaseName()); } else { releaseTypeText.setVisibility(View.GONE); releaseType.setVisibility(View.GONE); } if (!response.getBitrateList().isEmpty()){ String bitrates = response.getBitrateList().toString(); bitrates = bitrates.substring(bitrates.indexOf('[') + 1, bitrates.lastIndexOf(']')); acceptBitrates.setText(bitrates); } else { bitratesContainer.setVisibility(View.GONE); } if (!response.getFormatList().isEmpty()){ String formats = response.getFormatList().toString(); formats = formats.substring(formats.indexOf('[') + 1, formats.lastIndexOf(']')); acceptFormats.setText(formats); } else { formatsContainer.setVisibility(View.GONE); } if (!response.getMediaList().isEmpty()){ String media = response.getMediaList().toString(); media = media.substring(media.indexOf('[') + 1, media.lastIndexOf(']')); acceptMedia.setText(media); } else { mediaContainer.setVisibility(View.GONE); } String tagString = response.getTags().toString(); tagString = tagString.substring(tagString.indexOf('[') + 1, tagString.lastIndexOf(']')); tags.setText(tagString); } }