package dk.dr.radio.akt; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.TouchDelegate; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; 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.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.Date; import java.util.List; import dk.dr.radio.afspilning.Status; import dk.dr.radio.data.DRData; import dk.dr.radio.data.DRJson; import dk.dr.radio.data.Kanal; import dk.dr.radio.data.Lydstream; import dk.dr.radio.data.Playlisteelement; 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 Kanal_frag extends Basisfragment implements AdapterView.OnItemClickListener, View.OnClickListener, Runnable { private ListView listView; private ArrayList<Object> liste = new ArrayList<Object>(); private int aktuelUdsendelseIndex = -1; private Kanal kanal; protected View rod; private boolean brugerHarNavigeret; private int antalHentedeSendeplaner; public static Kanal_frag senesteSynligeFragment; private Button hør_live; @Override public String toString() { return super.toString() + "/" + kanal; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Log.d(this + " onCreateView startet efter " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); String kanalkode = getArguments().getString(P_kode); boolean p4 = Kanal.P4kode.equals(kanalkode); rod = null; if (p4) { kanalkode = App.prefs.getString(App.P4_FORETRUKKEN_AF_BRUGER, null); if (kanalkode == null) { kanalkode = App.prefs.getString(App.P4_FORETRUKKEN_GÆT_FRA_STEDPLACERING, "KH4"); kanal = DRData.instans.grunddata.kanalFraKode.get(kanalkode); if (kanal == null) { Log.d("P4 IKKE FUNDET kanalkode=" + kanalkode); kanalkode = DRData.instans.grunddata.p4koder.get(3); // KH4 kanal = DRData.instans.grunddata.kanalFraKode.get(kanalkode); } rod = inflater.inflate(R.layout.kanal_p4_frag, container, false); AQuery aq = new AQuery(rod); aq.id(R.id.p4_vi_gætter_på_tekst).typeface(App.skrift_gibson); aq.id(R.id.p4_kanalnavn).text(kanal.navn).typeface(App.skrift_gibson_fed); aq.id(R.id.p4_skift_distrikt).clicked(this).typeface(App.skrift_gibson); aq.id(R.id.p4_ok).clicked(this).typeface(App.skrift_gibson); } } kanal = DRData.instans.grunddata.kanalFraKode.get(kanalkode); //Log.d(this + " onCreateView 2 efter " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); if (rod == null) rod = inflater.inflate(R.layout.kanal_frag, container, false); if (kanal == null) { if (!App.PRODUKTION) Log.rapporterFejl(new IllegalStateException("afbrydManglerData()"), "for kanal " + kanalkode); afbrydManglerData(); return rod; } AQuery aq = new AQuery(rod); listView = aq.id(R.id.listView).adapter(adapter).itemClicked(this).getListView(); listView.setEmptyView(aq.id(R.id.tom).typeface(App.skrift_gibson).getView()); listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (App.fejlsøgning) Log.d(kanal + " onScrollStateChanged " + scrollState); brugerHarNavigeret = true; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); // Knappen er meget vigtig, og har derfor et udvidet område hvor det også er den man rammer // se http://developer.android.com/reference/android/view/TouchDelegate.html hør_live = aq.id(R.id.hør_live).typeface(App.skrift_gibson).clicked(this).getButton(); hør_live.post(new Runnable() { final int udvid = getResources().getDimensionPixelSize(R.dimen.hørknap_udvidet_klikområde); @Override public void run() { Rect r = new Rect(); hør_live.getHitRect(r); r.top -= udvid; r.bottom += udvid; r.right += udvid; r.left -= udvid; //Log.d("hør_udvidet_klikområde=" + r); ((View) hør_live.getParent()).setTouchDelegate(new TouchDelegate(r, hør_live)); } }); // Klikker man på den hvide baggrund rulles til aktuel udsendelse aq.id(R.id.rulTilAktuelUdsendelse).clicked(this); //Log.d(this + " onCreateView 3 efter " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); // Hent sendeplan for den pågældende dag. Døgnskifte sker kl 5, så det kan være dagen før hentSendeplanForDag(new Date(App.serverCurrentTimeMillis() - 5 * 60 * 60 * 1000)); //Log.d(this + " onCreateView 4 efter " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); udvikling_checkDrSkrifter(rod, this + " rod"); DRData.instans.afspiller.observatører.add(this); App.netværk.observatører.add(this); run(); // opdater HØR-knap // Log.d(this + " onCreateView færdig efter " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); Log.d("onCreateView " + this); return rod; } @Override public void onDestroyView() { super.onDestroyView(); DRData.instans.afspiller.observatører.remove(this); App.netværk.observatører.remove(this); if (listView!=null) listView.setAdapter(null); // Fix hukommelseslæk rod = null; listView = null; aktuelUdsendelseViewholder = null; } private void hentSendeplanForDag(final Date dato) { final String datoStr = DRJson.apiDatoFormat.format(dato); if (kanal.harUdsendelserForDag(datoStr)) { // brug værdier i RAMen opdaterListe(); } final String url = DRData.getKanalUdsendelserUrlFraKode(kanal.kode, datoStr); if (App.fejlsøgning) Log.d("hentSendeplanForDag 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 || listView==null || getActivity() == null) return; if (kanal.harUdsendelserForDag(datoStr) && fraCache) return; // så er værdierne i RAMen gode nok // Log.d(kanal + " hentSendeplanForDag fikSvar for url " + url + " fraCache=" + fraCache+":\n"+json); if (json != null && !"null".equals(json)) { int næstøversteSynligPos = listView.getFirstVisiblePosition() + 1; if (!brugerHarNavigeret || næstøversteSynligPos >= liste.size()) { kanal.setUdsendelserForDag(DRJson.parseUdsendelserForKanal(new JSONArray(json), kanal, dato, DRData.instans), datoStr); opdaterListe(); } else { // Nu ændres der i listen for at vise en dag før eller efter - sørg for at det synlige indhold ikke rykker sig Object næstøversteSynlig = liste.get(næstøversteSynligPos); //Log.d("næstøversteSynlig = " + næstøversteSynlig); View v = listView.getChildAt(1); int næstøversteSynligOffset = (v == null) ? 0 : v.getTop(); kanal.setUdsendelserForDag(DRJson.parseUdsendelserForKanal(new JSONArray(json), kanal, dato, DRData.instans), datoStr); opdaterListe(); int næstøversteSynligNytIndex = liste.indexOf(næstøversteSynlig); listView.setSelectionFromTop(næstøversteSynligNytIndex, næstøversteSynligOffset); } } else { new AQuery(rod).id(R.id.tom).text(R.string.Netværksfejl_prøv_igen_senere); } } @Override protected void fikFejl(VolleyError error) { new AQuery(rod).id(R.id.tom).text(R.string.Netværksfejl_prøv_igen_senere); } }) { public Priority getPriority() { return getUserVisibleHint() ? Priority.NORMAL : Priority.LOW; } }.setTag(this); //Log.d("hentSendeplanForDag 2 " + (System.currentTimeMillis() - App.opstartstidspunkt) + " ms"); App.volleyRequestQueue.add(req); } public void rulBlødtTilAktuelUdsendelse() { Log.d("rulBlødtTilAktuelUdsendelse() "+this); if (aktuelUdsendelseIndex < 0) return; int topmargen = getResources().getDimensionPixelOffset(R.dimen.kanalvisning_aktuelUdsendelse_topmargen); if (Build.VERSION.SDK_INT >= 11) listView.smoothScrollToPositionFromTop(aktuelUdsendelseIndex, topmargen); else listView.setSelectionFromTop(aktuelUdsendelseIndex, topmargen); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); //Log.d(kanal + " QQQ setUserVisibleHint " + isVisibleToUser + " " + this); if (isVisibleToUser && kanal != null) { // kanal==null afbryder onCreateView, men et tjek også her er nødvendigt - fixer https://www.bugsense.com/dashboard/project/cd78aa05/errors/833298030 senesteSynligeFragment = this; App.forgrundstråd.post(this); // Opdatér lidt senere, efter onCreateView helt sikkert har kørt App.forgrundstråd.post(new Runnable() { @Override public void run() { if (DRData.instans.afspiller.getAfspillerstatus() == Status.STOPPET && DRData.instans.afspiller.getLydkilde() != kanal) { DRData.instans.afspiller.setLydkilde(kanal); } } }); } else { App.forgrundstråd.removeCallbacks(this); if (senesteSynligeFragment == this) senesteSynligeFragment = null; } } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); App.forgrundstråd.removeCallbacks(this); if (senesteSynligeFragment == this) senesteSynligeFragment = null; if (App.fejlsøgning) Log.d("onPause() " + this); } @Override public void run() { if (App.fejlsøgning) Log.d("run() synlig=" + getUserVisibleHint()+" "+this); App.forgrundstråd.removeCallbacks(this); if (getActivity()==null) return; // Fragment ikke mere synligt App.forgrundstråd.postDelayed(this, DRData.instans.grunddata.opdaterPlaylisteEfterMs); if (!kanal.harStreams()) { // ikke && App.erOnline(), det kan være vi har en cachet udgave Request<?> req = new DrVolleyStringRequest(kanal.getStreamsUrl(), new DrVolleyResonseListener() { @Override public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception { if (uændret) return; // ingen grund til at parse det igen JSONObject o = new JSONObject(json); kanal.setStreams(o); Log.d("hentStreams Kanal_frag fraCache=" + fraCache + " => " + kanal); run(); // Opdatér igen } }) { public Priority getPriority() { return getUserVisibleHint() ? Priority.HIGH : Priority.NORMAL; } }; App.volleyRequestQueue.add(req); } boolean spillerDenneKanal = DRData.instans.afspiller.getAfspillerstatus() != Status.STOPPET && DRData.instans.afspiller.getLydkilde() == kanal; boolean online = App.netværk.erOnline(); hør_live.setEnabled(online && kanal.harStreams() && !spillerDenneKanal); hør_live.setText(!online ? getString(R.string.Internetforbindelse_mangler) : (" " + getString(spillerDenneKanal? R.string.SPILLER : R.string.HØR) + " " + kanal.navn.toUpperCase())); hør_live.setContentDescription(!online ? getString(R.string.Internetforbindelse_mangler) : (" " + getString(spillerDenneKanal? R.string.Spiller : R.string.Hør) + " " + kanal.navn.toUpperCase())); if (aktuelUdsendelseViewholder == null) return; Viewholder vh = aktuelUdsendelseViewholder; if (!getUserVisibleHint() || !isResumed()) return; opdaterSenestSpillet(vh.aq, vh.udsendelse); if (App.serverCurrentTimeMillis() > vh.udsendelse.slutTid.getTime()) { opdaterListe(); //if (App.fejlsøgning) App.kortToast("Kanal_frag opdaterListe()"); if (vh.startid.isShown()) rulBlødtTilAktuelUdsendelse(); } //MediaPlayer mp = DRData.instans.afspiller.getMediaPlayer(); //Log.d("mp pos="+mp.getCurrentPosition() + " af "+mp.getDuration()); } private static final Udsendelse tidligere = new Udsendelse("Tidligere"); private static final Udsendelse senere = new Udsendelse("Senere"); private void opdaterListe() { try { if (kanal.udsendelser.size()==0) return; // Fix for https://mint.splunk.com/dashboard/project/cd78aa05/errors/4210518028 oma // ArrayList<Udsendelse> nyuliste = kanal.udsendelser; if (App.fejlsøgning) Log.d(kanal + " opdaterListe " + kanal.udsendelser.size()); tidligere.startTid = new Date(kanal.udsendelser.get(0).startTid.getTime() - 12 * 60 * 60 * 1000); // Døgnet starter kl 5, så vi er på den sikre side med 12 timer senere.startTid = new Date(kanal.udsendelser.get(kanal.udsendelser.size() - 1).slutTid.getTime() + 12 * 60 * 60 * 1000); // Til tider rækker udsendelserne ikke ind i det næste døgn, så vi lægger 12 timer til ArrayList<Object> nyListe = new ArrayList<Object>(kanal.udsendelser.size() + 5); nyListe.add(tidligere); String forrigeDagsbeskrivelse = null; for (Udsendelse u : kanal.udsendelser) { // Tilføj dagsoverskrifter hvis dagen er skiftet if (!u.dagsbeskrivelse.equals(forrigeDagsbeskrivelse)) { forrigeDagsbeskrivelse = u.dagsbeskrivelse; nyListe.add(u.dagsbeskrivelse); // Overskriften I DAG skal ikke 'blive hængende' øverst, // det løses ved at tilføje en tom overskrift lige under den if (u.dagsbeskrivelse == DRJson.I_DAG) nyListe.add(""); } nyListe.add(u); } nyListe.add(senere); int nyAktuelUdsendelseIndex = nyListe.indexOf(kanal.getUdsendelse()); // Hvis listen er uændret så hop ud - forhindrer en uendelig løkke // af opdateringer i tilfælde af, at sendeplanen for dags dato ikke kan hentes if (nyListe.equals(liste) && nyAktuelUdsendelseIndex == aktuelUdsendelseIndex) { if (App.fejlsøgning) Log.d("opdaterListe: listen er uændret: " + liste); return; } else { if (App.fejlsøgning) Log.d("opdaterListe: ændring fra " + aktuelUdsendelseIndex + liste); if (App.fejlsøgning) Log.d("opdaterListe: ændring til " + nyAktuelUdsendelseIndex + nyListe); } aktuelUdsendelseIndex = nyAktuelUdsendelseIndex; liste.clear(); liste.addAll(nyListe); aktuelUdsendelseViewholder = null; if (App.fejlsøgning) Log.d("opdaterListe " + kanal.kode + " aktuelUdsendelseIndex=" + aktuelUdsendelseIndex); adapter.notifyDataSetChanged(); if (!brugerHarNavigeret) { if (App.fejlsøgning) Log.d("hopTilAktuelUdsendelse() aktuelUdsendelseIndex=" + aktuelUdsendelseIndex + " " + this); if (aktuelUdsendelseIndex < 0) return; int topmargen = getResources().getDimensionPixelOffset(R.dimen.kanalvisning_aktuelUdsendelse_topmargen); listView.setSelectionFromTop(aktuelUdsendelseIndex, topmargen); } } catch (Exception e1) { Log.rapporterFejl(e1, "kanal="+kanal+" med udsendelser "+kanal.udsendelser); } } /** * Viewholder designmønster - hold direkte referencer til de views og objekter der bruges hele tiden */ private static class Viewholder { public AQuery aq; public TextView titel; public TextView startid; public Udsendelse udsendelse; public int itemViewType; } private Viewholder aktuelUdsendelseViewholder; private BaseAdapter adapter = new Basisadapter() { @Override public int getCount() { return liste.size(); } /* public boolean hasStableIds() { return true; } @Override public Object getItem(int position) { return liste.get(position); } @Override public long getItemId(int position) { return position+getItemViewType(position)*1000; } */ @Override public int getViewTypeCount() { return 4; } @Override public int getItemViewType(int position) { if (position == 0 || position >= liste.size() - 1) return TIDLIGERE_SENERE; // Workaround for https://mint.splunk.com/dashboard/project/cd78aa05/errors/3004788237 hvor PinnedSectionListView spørger ud over adapterens størrelse if (position == aktuelUdsendelseIndex) return AKTUEL; if (liste.get(position) instanceof Udsendelse) return NORMAL; return DAGSOVERSKRIFT; } public boolean isEnabled(int position) { return liste.get(position) instanceof Udsendelse; } @Override public boolean isItemViewTypePinned(int viewType) { return viewType == DAGSOVERSKRIFT; } // public boolean isItemViewTypePinned(int viewType) { return false; } static final int NORMAL = 0; static final int AKTUEL = 1; static final int TIDLIGERE_SENERE = 2; static final int DAGSOVERSKRIFT = 3; @Override public View getView(int position, View v, ViewGroup parent) { Viewholder vh; AQuery a; int type = getItemViewType(position); if (v == null) { v = getLayoutInflater(null).inflate( type == AKTUEL ? R.layout.kanal_elem0_aktuel_udsendelse : // Visning af den aktuelle udsendelse type == NORMAL ? R.layout.kanal_elem1_udsendelse : // De andre udsendelser type == DAGSOVERSKRIFT ? R.layout.kanal_elem3_i_dag_i_morgen // Dagens overskrift : R.layout.kanal_elem2_tidligere_senere, parent, false); vh = new Viewholder(); vh.itemViewType = type; a = vh.aq = new AQuery(v); vh.startid = a.id(R.id.starttid).typeface(App.skrift_gibson).getTextView(); //a.id(R.id.højttalerikon).clicked(new UdsendelseClickListener(vh)); a.id(R.id.slutttid).typeface(App.skrift_gibson); if (type == TIDLIGERE_SENERE) { vh.titel = a.id(R.id.titel).typeface(App.skrift_gibson_fed).getTextView(); } else if (type == DAGSOVERSKRIFT) { vh.titel = a.id(R.id.titel).typeface(App.skrift_gibson).getTextView(); } else if (type == AKTUEL) { vh.titel = a.id(R.id.titel).typeface(App.skrift_gibson_fed).getTextView(); a.id(R.id.senest_spillet_overskrift).typeface(App.skrift_gibson); a.id(R.id.titel_og_kunstner).typeface(App.skrift_gibson); a.id(R.id.lige_nu).typeface(App.skrift_gibson); a.id(R.id.senest_spillet_container).invisible(); // Start uden 'senest spillet, indtil vi har info int bbr = billedeBr - getResources().getDimensionPixelSize(R.dimen.kanalmargen)*2; a.id(R.id.billede).width(bbr,false).height(bbr*højde9/bredde16,false); a.id(R.id.billedecontainer).width(bbr, false).height(bbr * højde9 / bredde16, false); } else { vh.titel = a.id(R.id.titel_og_kunstner).typeface(App.skrift_gibson_fed).getTextView(); } v.setTag(vh); } else { vh = (Viewholder) v.getTag(); a = vh.aq; if (!App.PRODUKTION && vh.itemViewType != type) throw new IllegalStateException("Liste ej konsistent, der er nok sket ændringer i den fra f.eks. getView()"); } udvikling_checkDrSkrifter(v, this.getClass() + " type=" + type); if (position>=liste.size()) { // Der er set et crash her Log.rapporterFejl(new IllegalStateException("liste.size()<=position: "+liste.size()+" <= "+position+" for "+kanal)); return v; } // Opdatér viewholderens data Object elem = liste.get(position); if (elem instanceof String) { // Overskrifter String tekst = (String) elem; vh.titel.setText(tekst); vh.titel.setVisibility(tekst.length() == 0 ? View.GONE : View.VISIBLE); return v; } Udsendelse udsendelse = (Udsendelse) elem; // Resten er 'udsendelser' vh.udsendelse = udsendelse; switch (type) { case AKTUEL: aktuelUdsendelseViewholder = vh; vh.startid.setText(udsendelse.startTidKl); a.id(R.id.slutttid).text(udsendelse.slutTidKl); vh.titel.setText(udsendelse.titel); String burl = Basisfragment.skalérBillede(udsendelse); a.id(R.id.billede).image(burl, true, true, 0, 0, null, AQuery.FADE_IN, (float) højde9 / bredde16); vh.titel.setText(udsendelse.titel.toUpperCase()); if (udsendelse.playliste == null) { opdaterSenestSpillet(vh.aq, udsendelse); } else { opdaterSenestSpilletViews(vh.aq, udsendelse); } break; case NORMAL: // Her kom NullPointerException en sjælden gang imellem - se https://www.bugsense.com/dashboard/project/cd78aa05/errors/836338028 // det skyldtes at hentSendeplanForDag(), der ændrede i listen, mens ListView var ved at kalde fra getView() vh.startid.setText(udsendelse.startTidKl); vh.titel.setText(udsendelse.titel); // Stiplet linje skal vises mellem udsendelser - men ikke over aktuel udsendelse // og heller ikke hvis det er en overskrift der er nedenunder a.id(R.id.stiplet_linje); if (position == aktuelUdsendelseIndex + 1) a.visibility(View.INVISIBLE); else if (position > 0 && liste.get(position - 1) instanceof String) a.visibility(View.INVISIBLE); else a.visibility(View.VISIBLE); vh.titel.setTextColor(udsendelse.kanHøres ? Color.BLACK : App.color.grå60); break; case TIDLIGERE_SENERE: vh.titel.setText(udsendelse.titel); if (antalHentedeSendeplaner++ < 7 && aktuelUdsendelseIndex >= 0) { a.id(R.id.progressBar).visible(); // De første 7 henter vi bare for brugeren vh.titel.setVisibility(View.VISIBLE); final Date dag = udsendelse.startTid; // da hentSendeplanForDag ændrer i listen må kaldet ikke udføres direkte i getView App.forgrundstråd.post(new Runnable() { @Override public void run() { hentSendeplanForDag(dag); } }); } else { a.id(R.id.progressBar).invisible(); // Derefter må brugeren gøre det manuelt vh.titel.setVisibility(View.VISIBLE); } } return v; } }; private void opdaterSenestSpilletViews(AQuery aq, Udsendelse u) { if (App.fejlsøgning) Log.d("DDDDD opdaterSenestSpilletViews " + u.playliste); if (u.playliste != null && u.playliste.size() > 0) { aq.id(R.id.senest_spillet_container).visible(); Playlisteelement elem = u.playliste.get(0); // aq.id(R.id.titel_og_kunstner).text(Html.fromHtml("<b>" + elem.titel + "</b>   |  " + elem.kunstner)); aq.id(R.id.titel_og_kunstner) .text(lavFedSkriftTil(elem.titel + " | " + elem.kunstner, elem.titel.length())) .getView().setContentDescription(elem.titel + " af " + elem.kunstner); ImageView b = aq.id(R.id.senest_spillet_kunstnerbillede).getImageView(); if (elem.billedeUrl==null) { aq.gone(); } else { aq.visible().image(skalérDiscoBilledeUrl(elem.billedeUrl, b.getWidth(), b.getHeight()), true, true, b.getWidth(), b.getHeight()); } } else { aq.id(R.id.senest_spillet_container).gone(); } } private void opdaterSenestSpillet(final AQuery aq2, final Udsendelse u2) { if (kanal.ingenPlaylister) { // P1s programmer har aldrig "senest spillet" info opdaterSenestSpilletViews(aq2, u2); return; } Request<?> req = new DrVolleyStringRequest(DRData.getPlaylisteUrl(u2), new DrVolleyResonseListener() { @Override public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception { if (App.fejlsøgning) Log.d("KAN fikSvar playliste(" + fraCache + uændret + " " + url); if (getActivity() == null) return; // Fix: Senest spillet blev ikke opdateret. if (u2.playliste != null && uændret) return; // så har vi allerede den nyeste liste i MEM if (json != null && !"null".equals(json)) { u2.playliste = DRJson.parsePlayliste(new JSONArray(json)); if (DRData.instans.grunddata.serverapi_ret_forkerte_offsets_i_playliste) DRJson.retForkerteOffsetsIPlayliste(u2); } if (aktuelUdsendelseViewholder == null) return; opdaterSenestSpilletViews(aq2, u2); } }) { public Priority getPriority() { return getUserVisibleHint() ? Priority.NORMAL : Priority.LOW; } }.setTag(this); App.volleyRequestQueue.add(req); } @Override public void onClick(View v) { if (v.getId() == R.id.p4_skift_distrikt) { rod.findViewById(R.id.p4_vi_gætter_på_dialog).setVisibility(View.GONE); getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.indhold_frag, new P4kanalvalg_frag()) .commit(); Sidevisning.vist(P4kanalvalg_frag.class); } else if (v.getId() == R.id.p4_ok) { rod.findViewById(R.id.p4_vi_gætter_på_dialog).setVisibility(View.GONE); App.prefs.edit().putString(App.P4_FORETRUKKEN_AF_BRUGER, kanal.kode).commit(); } else if (!kanal.harStreams()) { Log.rapporterOgvisFejl(getActivity(), new IllegalStateException("kanal.streams er null")); } else if (v.getId() == R.id.rulTilAktuelUdsendelse) { rulBlødtTilAktuelUdsendelse(); } else { // hør_udvidet_klikområde eller hør hør(kanal, getActivity()); Log.registrérTestet("Afspilning af direkte udsendelse", kanal.kode); } } public static void hør(final Kanal kanal, Activity akt) { //if (App.fejlsøgning) App.kortToast("kanal=" + kanal); if (App.prefs.getBoolean("manuelStreamvalg", false)) { kanal.nulstilForetrukkenStream(); final List<Lydstream> lydstreamList = kanal.findBedsteStreams(false); new AlertDialog.Builder(akt) .setAdapter(new ArrayAdapter(akt, R.layout.skrald_vaelg_streamtype, lydstreamList), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { lydstreamList.get(which).foretrukken = true; DRData.instans.afspiller.setLydkilde(kanal); DRData.instans.afspiller.startAfspilning(); } }).show(); } else { DRData.instans.afspiller.setLydkilde(kanal); DRData.instans.afspiller.startAfspilning(); } } @Override public void onItemClick(AdapterView<?> listView, View v, int position, long id) { Object o = liste.get(position); // PinnedSectionListView tillader klik på hængende overskrifter, selvom adapteren siger at det skal den ikke if (!(o instanceof Udsendelse)) return; Udsendelse u = (Udsendelse) o; if (position == 0 || position == liste.size() - 1) { hentSendeplanForDag(u.startTid); v.findViewById(R.id.titel).setVisibility(View.GONE); v.findViewById(R.id.progressBar).setVisibility(View.VISIBLE); } else { //startActivity(new Intent(getActivity(), VisFragment_akt.class) // .putExtra(P_kode, getKanal.kode) // .putExtra(VisFragment_akt.KLASSE, Udsendelse_frag.class.getName()).putExtra(DRJson.Slug.name(), u.slug)); // Udsenselses-ID String aktuelUdsendelseSlug = aktuelUdsendelseIndex > 0 ? ((Udsendelse) liste.get(aktuelUdsendelseIndex)).slug : ""; // 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(u) : new Udsendelser_vandret_skift_frag(); f.setArguments(new Intent() .putExtra(P_kode, kanal.kode) .putExtra(Udsendelse_frag.AKTUEL_UDSENDELSE_SLUG, aktuelUdsendelseSlug) .putExtra(DRJson.Slug.name(), u.slug) .getExtras()); getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.indhold_frag, f) .addToBackStack(null) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commitAllowingStateLoss(); // Fix for https://www.bugsense.com/dashboard/project/cd78aa05/errors/830038058 Sidevisning.vist(Udsendelse_frag.class, u.slug); } } }