package dk.dr.radio.akt;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.VolleyError;
import com.androidquery.AQuery;
import org.json.JSONObject;
import java.util.ArrayList;
import dk.dr.radio.data.DRData;
import dk.dr.radio.data.DRJson;
import dk.dr.radio.data.Kanal;
import dk.dr.radio.data.Programserie;
import dk.dr.radio.data.Udsendelse;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
import dk.dr.radio.diverse.Sidevisning;
import dk.dr.radio.net.volley.DrVolleyResonseListener;
import dk.dr.radio.net.volley.DrVolleyStringRequest;
import dk.dr.radio.v3.R;
public class Programserie_frag extends Basisfragment implements AdapterView.OnItemClickListener, View.OnClickListener {
private ListView listView;
private ArrayList<Object> liste = new ArrayList<Object>();
private String programserieSlug;
private Programserie programserie;
private Kanal kanal;
private View rod;
private int antalHentedeSendeplaner;
private AQuery aq;
@Override
public String toString() {
return super.toString() + "/" + kanal + "/" + programserie;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
programserieSlug = getArguments().getString(DRJson.SeriesSlug.name());
Log.d("onCreateView " + this + " viser " + programserieSlug);
kanal = DRData.instans.grunddata.kanalFraKode.get(getArguments().getString(Kanal_frag.P_kode));
rod = inflater.inflate(R.layout.udsendelse_frag, container, false);
aq = new AQuery(rod);
programserie = DRData.instans.programserieFraSlug.get(programserieSlug);
if (programserie == null || programserie.getUdsendelser()==null) {
hentUdsendelser(0); // hent kun en frisk udgave hvis vi ikke allerede har en
} else if (programserie.getUdsendelser().size()==0 && programserie.antalUdsendelser>0) {
Log.d("Har ingen udsendelser for "+programserieSlug+ ", så den hentes igen. Der burde være "+programserie.antalUdsendelser );
if (!App.PRODUKTION) App.kortToast("Har ingen udsendelser for "+programserieSlug+ ", så den hentes igen. Der burde være "+programserie.antalUdsendelser);
hentUdsendelser(0);
}
bygListe();
listView = aq.id(R.id.listView).adapter(adapter).getListView();
listView.setEmptyView(aq.id(R.id.tom).typeface(App.skrift_gibson).getView());
listView.setOnItemClickListener(this);
Log.registrérTestet("Visning af programserie", "ja");
udvikling_checkDrSkrifter(rod, this + " rod");
return rod;
}
@Override
public void onDestroyView() {
App.volleyRequestQueue.cancelAll(this);
super.onDestroyView();
}
private void hentUdsendelser(final int offset) {
String url = DRData.getProgramserieUrl(programserie, programserieSlug) + "&offset=" + offset;
//Log.d("XXX url=" + url);
Request<?> req = new DrVolleyStringRequest(url, new DrVolleyResonseListener() {
@Override
public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception {
if (uændret) return;
JSONObject data = new JSONObject(json);
if (offset == 0) {
programserie = DRJson.parsProgramserie(data, programserie);
DRData.instans.programserieFraSlug.put(programserieSlug, programserie);
}
ArrayList<Udsendelse> uds = DRJson.parseUdsendelserForProgramserie(data.getJSONArray(DRJson.Programs.name()), kanal, DRData.instans);
programserie.tilføjUdsendelser(offset, uds);
bygListe();
}
@Override
protected void fikFejl(VolleyError error) {
super.fikFejl(error);
if (offset == 0) {
aq.id(R.id.tom).text(R.string.Netværksfejl_prøv_igen_senere);
} else {
bygListe(); // for at fjerne evt progressBar
}
}
}).setTag(this);
App.volleyRequestQueue.add(req);
}
@Override
public void onClick(View v) {
if (v.getId()==R.id.favorit) {
CheckBox favorit = (CheckBox) v;
DRData.instans.favoritter.sætFavorit(programserieSlug, favorit.isChecked());
if (favorit.isChecked()) App.kortToast(getString(R.string.Programserien_er_føjet_til_favoritter));
Log.registrérTestet("Valg af favoritprogram", programserieSlug);
} else {
Udsendelse udsendelse = ((Viewholder) v.getTag()).udsendelse;
DRData.instans.afspiller.setLydkilde(udsendelse);
DRData.instans.afspiller.startAfspilning();
}
}
/**
* Viewholder designmønster - hold direkte referencer til de views og objekter der bruges hele tiden
*/
private static class Viewholder {
public Udsendelse udsendelse;
public AQuery aq;
public View stiplet_linje;
public TextView titel;
public TextView varighed;
public int itemViewType;
public View hør;
public TextView dato;
}
void bygListe() {
liste.clear();
if (programserie != null) {
liste.add(TOP);
ArrayList<Udsendelse> l = programserie.getUdsendelser();
if (l != null) {
førsteUdsendelseDerKanHøresIndex = 0;
for (Udsendelse u : l) {
if (u.kanHøres) break;
førsteUdsendelseDerKanHøresIndex++;
}
// Udsendelsesserie hvor ingen udsendelser kan høres - her viser vi alle udsendelserne
if (førsteUdsendelseDerKanHøresIndex==l.size()) {
førsteUdsendelseDerKanHøresIndex=0;
liste.addAll(l);
}
for (int n=førsteUdsendelseDerKanHøresIndex; n<l.size(); n++) {
liste.add(l.get(n));
}
førsteUdsendelseDerKanHøresIndex = 1;
if (programserie.getUdsendelser().size() < programserie.antalUdsendelser) {
Log.d("bygListe() viser TIDLIGERE: " + programserie.getUdsendelser().size() + " < " + programserie.antalUdsendelser);
liste.add(TIDLIGERE); // Vis 'tidligere'-listeelement
}
}
}
adapter.notifyDataSetChanged();
}
static final int TOP = 0;
static final int UDSENDELSE_TOP = 1;
static final int UDSENDELSE = 2;
static final int TIDLIGERE = 3;
private int førsteUdsendelseDerKanHøresIndex;
static final int[] layoutFraType = {
R.layout.programserie_elem0_top,
R.layout.programserie_elem1_nyeste_udsendelse,
R.layout.programserie_elem2_udsendelse,
R.layout.kanal_elem2_tidligere_senere,
};
private BaseAdapter adapter = new Basisadapter() {
@Override
public int getCount() {
return liste.size();
}
@Override
public int getViewTypeCount() {
return layoutFraType.length;
}
@Override
public int getItemViewType(int position) {
Object o = liste.get(position);
if (o instanceof Integer) return (Integer) o;
if (position== førsteUdsendelseDerKanHøresIndex) return UDSENDELSE_TOP;
return UDSENDELSE;
}
@Override
public boolean isEnabled(int position) {
return getItemViewType(position) > 0;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
Viewholder vh;
int type = getItemViewType(position);
if (v == null) {
if (getActivity()==null) { // Crash set i abetest 19. nov 2014
String fejl = "getActivity() var null for "+Programserie_frag.this.toString();
Log.rapporterFejl(new IllegalStateException(fejl));
return new TextView(App.instans); // skal aldrig vises
}
v = getLayoutInflater(null).inflate(layoutFraType[type], parent, false);
vh = new Viewholder();
vh.itemViewType = type;
AQuery aq = vh.aq = new AQuery(v);
v.setTag(vh);
if (type == TOP) {
/*
int br = bestemBilledebredde(listView, (View) aq.id(R.id.billede).getView().getParent(), 50);
int hø = br * højde9 / bredde16;
String burl = Basisfragment.skalérBillede(programserie, br, hø);
aq.width(br, false).height(hø, false).image(burl, true, true, br, AQuery.INVISIBLE, null, AQuery.FADE_IN, (float) højde9 / bredde16);
*/
String burl = Basisfragment.skalérBillede(programserie);
aq.id(R.id.billede).width(3*billedeBr/4, false).height(3*billedeHø/4, false).image(burl, true, true, 0, AQuery.INVISIBLE, null, AQuery.FADE_IN, (float) højde9 / bredde16);
if (kanal == null) aq.id(R.id.kanallogo).gone();
else aq.id(R.id.kanallogo).image(kanal.kanallogo_resid).getView().setContentDescription(kanal.navn);
aq.id(R.id.titel).typeface(App.skrift_gibson_fed).text(programserie.titel);
aq.id(R.id.alle_udsendelser).typeface(App.skrift_gibson);
aq.id(R.id.beskrivelse).text(programserie.beskrivelse).typeface(App.skrift_georgia);
Linkify.addLinks(aq.getTextView(), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
aq.id(R.id.favorit).clicked(Programserie_frag.this).typeface(App.skrift_gibson).checked(DRData.instans.favoritter.erFavorit(programserieSlug));
} else { // if (type == UDSENDELSE eller TIDLIGERE) {
vh.titel = aq.id(R.id.titel).typeface(App.skrift_gibson_fed).getTextView();
vh.dato = aq.id(R.id.dato).typeface(App.skrift_gibson).getTextView();
vh.varighed = aq.id(R.id.varighed).typeface(App.skrift_gibson).getTextView();
vh.stiplet_linje = aq.id(R.id.stiplet_linje).getView();
vh.hør = aq.id(R.id.hør).tag(vh).clicked(Programserie_frag.this).typeface(App.skrift_gibson).getView();
}
} else {
vh = (Viewholder) v.getTag();
if (!App.PRODUKTION && vh.itemViewType != type)
throw new IllegalStateException("Liste ej konsistent, der er nok sket ændringer i den fra f.eks. getView()");
}
// Opdatér viewholderens data
if (type == TOP) {
vh.aq.id(R.id.alle_udsendelser)
.text(getString(R.string.ALLE_UDSENDELSER) + " (" + programserie.antalUdsendelser + ")")
// .text(lavFedSkriftTil(tekst + " (" + programserie.antalUdsendelser + ")", tekst.length()))
.getView().setContentDescription(programserie.antalUdsendelser + " udsendelser");
} else if (type==UDSENDELSE || type==UDSENDELSE_TOP) {
Udsendelse u = (Udsendelse) liste.get(position);
vh.udsendelse = u;
//vh.stiplet_linje.setVisibility(position > 1 ? View.VISIBLE : View.INVISIBLE); // Første stiplede linje på udsendelse væk
// vh.stiplet_linje.setBackgroundResource(position > 1 ? R.drawable.stiplet_linje : R.drawable.linje); // Første stiplede linje er fuld
//vh.titel.setText(Html.fromHtml("<b>" + u.titel + "</b> - " + DRJson.datoformat.format(u.startTid)));
//vh.titel.setText(lavFedSkriftTil(u.titel + " - " + DRJson.datoformat.format(u.startTid), u.titel.length()));
vh.titel.setText(u.titel);
if (type==UDSENDELSE) {
// Vis hvilke udsendelser der kan hentes
vh.titel.setTextColor(u.kanHentes ? Color.BLACK : App.color.grå60);
}
vh.dato.setText(DRJson.datoformat.format(u.startTid));
//Log.d("DRJson.datoformat.format(u.startTid)=" + DRJson.datoformat.format(u.startTid));
//String txt = u.getKanal().navn + ", " + ((u.slutTid.getTime() - u.startTid.getTime())/1000/60 + " MIN");
String txt = ""; //u.getKanal().navn;
int varighed = (int) ((u.slutTid.getTime() - u.startTid.getTime()) / 1000 / 60);
if (varighed > 0) {
//txt += ", ";
int timer = varighed / 60;
if (timer > 1) txt += timer + getString(R.string._TIMER);
else if (timer == 1) txt += timer + getString(R.string._TIME);
int min = varighed % 60;
if (min > 0 && timer > 0) txt += getString(R.string._OG_);
if (min > 1) txt += min + getString(R.string._MINUTTER);
else if (min == 1) txt += timer + getString(R.string._MINUT);
}
//Log.d("txt=" + txt);
vh.varighed.setText(txt);
vh.varighed.setContentDescription(txt.toLowerCase());
vh.varighed.setVisibility(txt.length() > 0 ? View.VISIBLE : View.GONE);
vh.hør.setVisibility( varighed > 0 ? View.VISIBLE : View.GONE);
} else if (type == TIDLIGERE) {
if (antalHentedeSendeplaner++ < 7) {
vh.aq.id(R.id.progressBar).visible(); // De første 7 henter vi bare for brugeren
vh.titel.setVisibility(View.VISIBLE);
// skal ske lidt senere, når viewet er færdigt opdateret
App.forgrundstråd.post(new Runnable() {
@Override
public void run() {
hentUdsendelser(programserie.getUdsendelser().size());
}
});
} else {
vh.aq.id(R.id.progressBar).invisible(); // Derefter må brugeren gøre det manuelt
vh.titel.setVisibility(View.VISIBLE);
}
}
udvikling_checkDrSkrifter(v, this + " position " + position);
return v;
}
};
@Override
public void onItemClick(AdapterView<?> listView, View v, int position, long id) {
Object o = liste.get(position);
if (o instanceof Udsendelse) {
Udsendelse udsendelse = (Udsendelse) o;
// Vis normalt et Udsendelser_vandret_skift_frag med flere udsendelser
// Hvis tilgængelighed er slået til (eller bladring slået fra) vises blot ét Udsendelse_frag
Fragment f =
App.accessibilityManager.isEnabled() || !App.prefs.getBoolean("udsendelser_bladr", true) ? Fragmentfabrikering.udsendelse(udsendelse) :
new Udsendelser_vandret_skift_frag(); // standard
f.setArguments(new Intent()
.putExtra(Udsendelse_frag.BLOKER_VIDERE_NAVIGERING, true)
.putExtra(P_kode, kanal == null ? null : kanal.kode)
.putExtra(DRJson.Slug.name(), udsendelse.slug)
.getExtras());
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.indhold_frag, f)
.addToBackStack(null)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commitAllowingStateLoss(); // Fix for https://mint.splunk.com/dashboard/project/cd78aa05/errors/4061148411
Sidevisning.vist(Udsendelse_frag.class, udsendelse.slug);
return;
}
hentUdsendelser(programserie.getUdsendelser().size());
v.findViewById(R.id.titel).setVisibility(View.GONE);
v.findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
}
}