/** DR Radio 2 is developed by Jacob Nordfalk, Hanafi Mughrabi and Frederik Aagaard. Some parts of the code are loosely based on Sveriges Radio Play for Android. DR Radio 2 for Android is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. DR Radio 2 for Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DR Radio 2 for Android. If not, see <http://www.gnu.org/licenses/>. */ package dk.dr.radio.akt; import android.app.ListActivity; import android.content.Context; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import dk.dr.radio.R; import dk.dr.radio.data.DRData; import dk.dr.radio.data.stamdata.Kanal; import dk.dr.radio.diverse.ImageViewTilBlinde; import dk.dr.radio.diverse.Log; public class Kanalvalg_akt extends ListActivity { private KanalAdapter kanaladapter; private View[] listeElementer; private Typeface skrift_DRiBold; private List<String> overordnedeKanalkoder; private int p4indeks; /** * Om P4-underlisten er åbnet. static da det er en nem måde at få listen til at huske om den er åben 'næsten altid' */ private static boolean p4erÅbnet; private List<String> p4koder; private List<String> alleKanalkoder; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); overordnedeKanalkoder = DRData.instans.stamdata.kanalkoder; p4koder = DRData.instans.stamdata.p4koder; if (p4koder.get(0).equals("P4")) p4koder.remove(0); // Selve P4 skal ikke vises som en del af underlisten p4indeks = overordnedeKanalkoder.indexOf("P4"); alleKanalkoder = new ArrayList<String>(overordnedeKanalkoder); alleKanalkoder.addAll(p4indeks + 1, p4koder); // P4's underkanaler ligger lige under P4-indgangen for (String k : alleKanalkoder) if (DRData.instans.stamdata.kanalkodeTilKanal.get(k) == null) { new IllegalStateException("Kanalkode mangler! Det her må ikke ske!").printStackTrace(); DRData.instans.stamdata.kanalkodeTilKanal.put(k, new Kanal()); // reparér problemet :-( } try { // DRs skrifttyper er ikke offentliggjort i SVN, derfor kan følgende fejle: skrift_DRiBold = Typeface.createFromAsset(getAssets(), "DRiBold.otf"); } catch (Exception e) { Log.e("DRs skrifttyper er ikke tilgængelige", e); } // Da der er tale om et fast lille antal kanaler er der ikke grund til det store bogholderi // Så vi husker bare viewsne i er array listeElementer = new View[alleKanalkoder.size()]; kanaladapter = new KanalAdapter(); // Opbyg arrayet på forhånd for jævnere visning for (int pos = 0; pos < listeElementer.length; pos++) kanaladapter.bygListeelement(pos); setListAdapter(kanaladapter); // Sæt baggrunden. Normalt ville man gøre det fra XML eller med //getListView().setBackgroundResource(R.drawable.main_app_bg); ListView lv = getListView(); /* // Vi ønsker en mørkere udgave af baggrunden, så vi indlæser den // her og sætter et farvefilter. Drawable baggrund = getResources().getDrawable(R.drawable.main_app_bg); baggrund = baggrund.mutate(); baggrund.setColorFilter(0xffa0a0a0, Mode.MULTIPLY); */ lv.setBackgroundColor(0xffa0a0a0); lv.setDivider(new ColorDrawable(0x80ffffff)); lv.setDividerHeight(2); // Sørg for at baggrunden bliver tegnet, også når listen scroller. // Se http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html lv.setCacheColorHint(0x00000000); // Man kunne have en ensfarvet baggrund, det gør scroll mere flydende //getListView().setCacheColorHint(0xffe4e4e4); } private class KanalAdapter extends BaseAdapter { LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); Resources res = getResources(); private View bygListeelement(int position) { String kanalkode = alleKanalkoder.get(position); Kanal kanal = DRData.instans.stamdata.kanalkodeTilKanal.get(kanalkode); // tjek om der er et billede i 'drawable' med det navn filnavn int id = res.getIdentifier("kanal_" + kanalkode.toLowerCase(), "drawable", getPackageName()); //System.out.println("getView " + position + " kanal_" + kanalkode.toLowerCase() + " type = " + id); View view = mInflater.inflate(R.layout.kanalvalg_element, null); ImageViewTilBlinde billede = (ImageViewTilBlinde) view.findViewById(R.id.billede); ImageViewTilBlinde ikon = (ImageViewTilBlinde) view.findViewById(R.id.ikon); TextView textView = (TextView) view.findViewById(R.id.tekst); //Log.d("billedebilledebilledebillede"+billede+ikon+textView); String visningsNavn = kanal.longName; // Sæt åbne/luk-ikon for P4 og højttalerikon for kanal if (position == p4indeks) { sætP4ikon(ikon); } else if (DRData.instans.aktuelKanalkode.equals(kanalkode)) { ikon.setImageResource(R.drawable.kanalvalg_spiller); ikon.blindetekst = "Spiller nu"; } else ikon.setVisibility(View.INVISIBLE); if (id != 0) { // Element med billede billede.setVisibility(View.VISIBLE); billede.setImageResource(id); billede.blindetekst = visningsNavn; textView.setVisibility(View.GONE); } else { // Element uden billede billede.setVisibility(View.GONE); textView.setVisibility(View.VISIBLE); textView.setText(visningsNavn); if (skrift_DRiBold != null) textView.setTypeface(skrift_DRiBold); } return view; } public View getView(int position, View convertView, ViewGroup parent) { // Hop over p4's positioner i tilfælde af at P4 ikke er åbnet if (!p4erÅbnet && position > p4indeks) position += p4koder.size(); View view = listeElementer[position]; if (view != null) return view; // Elementet er allede konstrueret view = bygListeelement(position); listeElementer[position] = view; // husk til næste gang return view; } public int getCount() { return p4erÅbnet ? alleKanalkoder.size() : overordnedeKanalkoder.size(); } public Object getItem(int position) { return null; } public long getItemId(int position) { return position; } } private void sætP4ikon(ImageViewTilBlinde ikon) { ikon.setImageResource(p4erÅbnet ? R.drawable.kanalvalg_minus : R.drawable.kanalvalg_plus); ikon.blindetekst = (p4erÅbnet ? "Luk" : "Åben"); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { if (position == p4indeks) { p4erÅbnet = !p4erÅbnet; // Opdatér plus/minus på P4-kanal ImageViewTilBlinde åbneLukIkon = (ImageViewTilBlinde) listeElementer[p4indeks].findViewById(R.id.ikon); sætP4ikon(åbneLukIkon); // Fortæl at antal elementer i listen er ændret kanaladapter.notifyDataSetChanged(); return; } // Hop over p4's positioner i tilfælde af at P4 ikke er åbnet if (!p4erÅbnet && position > p4indeks) position += p4koder.size(); String kanalkode = alleKanalkoder.get(position); //Kanal kanal = drData.stamdata.kanalkodeTilKanal.get(kanalkode); //Toast.makeText(this, "Klik på "+position+" "+kanal.longName, Toast.LENGTH_LONG).show(); if (kanalkode.equals(DRData.instans.aktuelKanalkode)) setResult(RESULT_CANCELED); else setResult(RESULT_OK); // Signalér til kalderen at der er skiftet kanal!! // Ny kanal valgt - send valg til afspiller (ændrer også drData.aktuelKanalkode) DRData.instans.skiftKanal(kanalkode); // Hop tilbage til kalderen (hovedskærmen) finish(); } }