package dk.dr.radio.akt; //import android.R; import android.content.Context; 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.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.androidquery.AQuery; import java.util.ArrayList; import java.util.HashSet; import dk.dr.radio.data.DRData; import dk.dr.radio.data.DRJson; 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.v3.R; public class Soeg_efter_program_frag extends Basisfragment implements OnClickListener, AdapterView.OnItemClickListener { private static final boolean SØG_OGSÅ_EFTER_UDSENDELSER = false; private ListView listView; private EditText søgFelt; private ArrayList<Object> liste = new ArrayList<Object>(); // Indeholder både udsendelser og -serier protected View rod; private ImageView søgKnap; private TextView tomStr; private ArrayList<Udsendelse> udsendelseListe = new ArrayList<Udsendelse>(); private ArrayList<Programserie> programserieListe = new ArrayList<Programserie>(); private int max = 50; private static class SoegElement { public Programserie programserie; public String titel; public String beskrivelse; } private ArrayList<SoegElement> søgelistecache; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rod = inflater.inflate(R.layout.soeg_efter_program_frag, container, false); 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_fed) .text("").getView()); søgFelt = aq.id(R.id.soegFelt).getEditText(); søgFelt.setImeActionLabel(getString(R.string.Søg), KeyEvent.KEYCODE_ENTER); //søgFelt.setBackgroundResource(android.R.drawable.editbox_background_normal); søgKnap = aq.id(R.id.soegKnap).clicked(this).getImageView(); //søgKnap.setBackgroundResource(R.drawable.knap_graa10_bg); søgKnap.setVisibility(View.VISIBLE); tomStr = aq.id(R.id.tom).getTextView(); søgFelt.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d("JPER text changed"); if (søgFelt.getText().toString().length() > 0) { søgKnap.setImageResource(android.R.drawable.ic_menu_close_clear_cancel); } else { liste.clear(); adapter.notifyDataSetChanged(); søgKnap.setImageResource(R.drawable.dri_soeg_blaa); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { if (søgFelt.getText().length() > 0) { søg(); } else { tomStr.setText(""); } } }); /*Lytter efter enter key */ søgFelt.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Log.d("actionId=" + actionId); søg(); return true; } }); // Skjul softkeyboard når man hopper ud af indtastningsfeltet // se http://stackoverflow.com/questions/1109022/close-hide-the-android-soft-keyboard final InputMethodManager imm = (InputMethodManager) (getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)); søgFelt.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { Log.d("onFocusChange " + hasFocus); if (!hasFocus) { imm.hideSoftInputFromWindow(søgFelt.getWindowToken(), 0); } } }); udvikling_checkDrSkrifter(rod, this + " rod"); // Indlæs A-Å-liste hvis den ikke allerede er det, så vi har en komplet programliste if (App.ÆGTE_DR && DRData.instans.programserierAtilÅ.liste == null) { DRData.instans.programserierAtilÅ.startHentData(); } return rod; } @Override public void onDestroyView() { super.onDestroyView(); // Anullér en eventuel søgning App.volleyRequestQueue.cancelAll(this); søgelistecache = null; } private BaseAdapter adapter = new Basisadapter() { @Override public int getCount() { return liste.size(); } @Override public View getView(int position, View v, ViewGroup parent) { try { if (v == null) v = getLayoutInflater(null).inflate(R.layout.listeelem_2linjer, parent, false); AQuery aq = new AQuery(v); Object obj = liste.get(position); if (obj instanceof Programserie) { Programserie ps = (Programserie) obj; aq.id(R.id.linje1).text(ps.titel).typeface(App.skrift_gibson_fed).textColor(Color.BLACK); aq.id(R.id.linje2).text(ps.beskrivelse).typeface(App.skrift_gibson); } else if (obj instanceof String) { aq.id(R.id.linje1).text("").typeface(App.skrift_gibson_fed).textColor(Color.BLACK); aq.id(R.id.linje2).text("Indsnævr din søgning").typeface(App.skrift_gibson); } else { Udsendelse udsendelse = (Udsendelse) obj; aq.id(R.id.linje1).text(DRJson.datoformat.format(udsendelse.startTid)).typeface(App.skrift_gibson); aq.id(R.id.linje2).text(udsendelse.titel).typeface(App.skrift_gibson); } v.setBackgroundResource(0); aq.id(R.id.stiplet_linje).background(position == 0 ? 0 : R.drawable.stiplet_linje); udvikling_checkDrSkrifter(v, this.getClass() + " "); } catch (Exception e) { Log.rapporterFejl(e); } return v; } }; private String søgStr; @Override public void onItemClick(AdapterView<?> listView, View v, int position, long id) { Object obj = liste.get(position); if (obj instanceof Programserie) { Programserie programserie = (Programserie) obj; Fragment f = new Programserie_frag(); f.setArguments(new Intent() .putExtra(DRJson.SeriesSlug.name(), programserie.slug) .getExtras()); getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.indhold_frag, f) .addToBackStack(null) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commit(); Sidevisning.vist(Programserie_frag.class, programserie.slug); } else if (obj instanceof String) { max = max*2; søg(); } else { Udsendelse udsendelse = (Udsendelse) obj; Fragment f = Fragmentfabrikering.udsendelse(udsendelse); getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.indhold_frag, f) .addToBackStack(null) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commit(); Sidevisning.vist(Udsendelse_frag.class, udsendelse.slug); } } @Override public void onClick(View v) { AQuery aq = new AQuery(rod); tomStr = aq.id(R.id.tom).getTextView(); tomStr.setText(""); søgFelt.setText(""); } public void søg() { søgStr = søgFelt.getText().toString().toLowerCase(); liste.clear(); if (søgStr.length() == 0) { tomStr.setText(""); adapter.notifyDataSetChanged(); return; } if (søgelistecache == null) { søgelistecache = new ArrayList<SoegElement>(DRData.instans.programserieFraSlug.size()); for (Programserie ps : DRData.instans.programserieFraSlug.values()) { SoegElement se = new SoegElement(); se.programserie = ps; se.titel = " "+ps.titel.toLowerCase() + " " + ps.undertitel.toLowerCase(); se.beskrivelse = " "+ps.beskrivelse.toLowerCase(); søgelistecache.add(se); } } HashSet<String> alleredeFundet = new HashSet<String>(max*10); // Søg først efter start på ord i titel String _søgStr = " "+søgStr; for (SoegElement se : søgelistecache) if (se.titel.contains(_søgStr)) { liste.add(se.programserie); alleredeFundet.add(se.programserie.slug); if (liste.size()>=max) break; } // Søg derefter generelt i titel if (liste.size()<max) for (SoegElement se : søgelistecache) { if (se.titel.contains(søgStr) && !alleredeFundet.contains(se.programserie.slug)) { liste.add(se.programserie); if (liste.size()>=max) break; } } // Søg derefter generelt i beskrivelser if (liste.size()<max) for (SoegElement se : søgelistecache) { if (se.beskrivelse.contains(søgStr) && !alleredeFundet.contains(se.programserie.slug)) { liste.add(se.programserie); if (liste.size()>=max) break; } } Log.d("Søgning efter '"+søgStr+"' gav "+liste.size()); if (liste.size()>=max) liste.add("Forfin din søgning for at se mere"); adapter.notifyDataSetChanged(); if (liste.size() == 0) { tomStr.setText(R.string.Søgningen_gav_intet_resultat); } } /* public void søg_gammel() { Log.d("Liste " + liste); // Anullér forrige søgning App.volleyRequestQueue.cancelAll(this); søgStr = søgFelt.getText().toString().trim(); if (søgStr.length() == 0) { tomStr.setText(""); liste.clear(); adapter.notifyDataSetChanged(); } if (SØG_OGSÅ_EFTER_UDSENDELSER) { String url = DRData.getSøgIUdsendelserUrl(søgStr); Request<?> req = new DrVolleyStringRequest(url, new DrVolleyResonseListener() { @Override public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception { Log.d("SØG: fikSvar fraCache=" + fraCache + " uændret=" + uændret + " data = " + json); if (json != null && !"null".equals(json)) { JSONArray data = new JSONArray(json); udsendelseListe = DRJson.parseUdsendelserForProgramserie(data, null, DRData.instans); liste.clear(); liste.addAll(programserieListe); liste.addAll(udsendelseListe); Log.d("liste = " + liste); adapter.notifyDataSetChanged(); if (liste.size() == 0) { tomStr.setText(R.string.Søgningen_gav_intet_resultat); } return; } Log.d("Slut søgning!"); } @Override protected void fikFejl(VolleyError error) { super.fikFejl(error); liste.clear(); adapter.notifyDataSetChanged(); //tomStr.setText("Søgningen gav intet resultat"); } }).setTag(this); App.volleyRequestQueue.add(req); } String url = DRData.getSøgISerierUrl(søgStr); Request<?> req = new DrVolleyStringRequest(url, new DrVolleyResonseListener() { @Override public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception { Log.d("SØG: fikSvar fraCache=" + fraCache + " uændret=" + uændret + " data = " + json); if (json != null) { JSONArray data = new JSONArray(json); programserieListe.clear(); for (int n = 0; n < data.length(); n++) { JSONObject elem = data.getJSONObject(n); programserieListe.add(DRJson.parsProgramserie(elem, null)); } liste.clear(); liste.addAll(programserieListe); liste.addAll(udsendelseListe); Log.d("liste = " + liste); adapter.notifyDataSetChanged(); if (liste.size() == 0) { tomStr.setText(R.string.Søgningen_gav_intet_resultat); } return; } Log.d("Slut søgning!"); } @Override protected void fikFejl(VolleyError error) { super.fikFejl(error); liste.clear(); adapter.notifyDataSetChanged(); //tomStr.setText("Søgningen gav intet resultat"); } }).setTag(this); App.volleyRequestQueue.add(req); } */ }