package dk.dr.radio.akt; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import com.androidquery.AQuery; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import dk.dr.radio.data.DRData; import dk.dr.radio.data.DRJson; import dk.dr.radio.diverse.App; import dk.dr.radio.diverse.Log; import dk.dr.radio.diverse.Sidevisning; import dk.dr.radio.v3.R; import dk.dr.radio.vaekning.AlarmClock_akt; import dk.dr.radio.vaekning.Alarms; /** * Venstremenu-navigering * Se <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction"> * design guidelines</a> for en nærmere beskrivelse. */ public class Venstremenu_frag extends Fragment implements Runnable { /** * Remember the position of the selected item. */ private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; /** * Per the design guidelines, you should show the drawer on launch until the user manually * expands it. This shared preference tracks this. */ private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; /** * Helper component that ties the action bar to the navigation drawer. */ private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout drawerLayout; private ListView listView; private View fragmentContainerView; private int mCurrentSelectedPosition = -1; private boolean mFromSavedInstanceState; private boolean mUserLearnedDrawer; private VenstremenuAdapter venstremenuAdapter; private HashMap<Class, Integer> fragmentklasseTilMenuposition = new HashMap<Class, Integer>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Read in the flag indicating whether or not the user has demonstrated awareness of the // drawer. See PREF_USER_LEARNED_DRAWER for details. SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Indicate that this fragment would like to influence the set of actions in the action bar. setHasOptionsMenu(true); if (savedInstanceState != null) { mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); mFromSavedInstanceState = true; // Select either the default item (0) or the last selected item. sætListemarkering(mCurrentSelectedPosition); } else { //mCurrentSelectedPosition = FORSIDE_INDEX; //9; //venstremenuAdapter.vælgMenu(getActivity(), mCurrentSelectedPosition); skjulMenu(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { listView = (ListView) inflater.inflate(R.layout.venstremenu_frag, container, false); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { venstremenuAdapter.vælgMenu(getActivity(), position); } }); venstremenuAdapter = new VenstremenuAdapter(getActivity()); listView.setAdapter(venstremenuAdapter); listView.setItemChecked(mCurrentSelectedPosition, true); DRData.instans.favoritter.observatører.add(this); DRData.instans.hentedeUdsendelser.observatører.add(this); Alarms.setNextAlert(getActivity()); return listView; } @Override public void onDestroyView() { DRData.instans.favoritter.observatører.remove(this); DRData.instans.hentedeUdsendelser.observatører.remove(this); super.onDestroyView(); } public void visOpnavigering(boolean vis) { mDrawerToggle.setDrawerIndicatorEnabled( !vis ); } /** * Kaldes når favoritter opdateres - så skal listens tekst opdateres */ @Override public void run() { venstremenuAdapter.notifyDataSetChanged(); } @Override public void onResume() { super.onResume(); // Dette sikrer at teksten for næste vækning vises korrekt if (venstremenuAdapter!=null) venstremenuAdapter.notifyDataSetChanged(); } public boolean isDrawerOpen() { return drawerLayout != null && drawerLayout.isDrawerOpen(fragmentContainerView); } /** * Users of this fragment must call this method to set up the navigation drawer interactions. * @param fragmentContainerViewId The android:id of this fragment in its activity's layout. * @param drawerLayout The DrawerLayout containing this fragment's UI. */ public void setUp(int fragmentContainerViewId, DrawerLayout drawerLayout) { fragmentContainerView = getActivity().findViewById(fragmentContainerViewId); this.drawerLayout = drawerLayout; // set a custom shadow that overlays the main content when the drawer opens this.drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); // set up the drawer's list view with items and click listener // ActionBarDrawerToggle ties together the the proper interactions // between the navigation drawer and the action bar app icon. mDrawerToggle = new ActionBarDrawerToggle(getActivity(), /* host Activity */ Venstremenu_frag.this.drawerLayout, /* DrawerLayout object */ // (android.support.v7.widget.Toolbar) getActivity().findViewById(toolbarId), // R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); if (!isAdded()) { return; } getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if (!isAdded()) { return; } if (!mUserLearnedDrawer) { // The user manually opened the drawer; store this flag to prevent auto-showing // the navigation drawer automatically in the future. mUserLearnedDrawer = true; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit(); } getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() // Løb listen af fragmenter igennem bagfra. // Valgt menupunkt svarer til det første fragment der passer med noget i menuen FragmentManager fm = getActivity().getSupportFragmentManager(); List<Fragment> fragments = new ArrayList<Fragment>(fm.getFragments()); Collections.reverse(fragments); for (Fragment fragment : fragments) { Log.d("fragment=" + fragment); if (fragment != null && fragment.isVisible()) { Integer pos = fragmentklasseTilMenuposition.get(fragment.getClass()); if (pos == null) continue; Log.d("... fundet pos=" + pos); sætListemarkering(pos); } // return fragment; } } }; // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, // per the navigation drawer design guidelines. if (!mUserLearnedDrawer && !mFromSavedInstanceState) { this.drawerLayout.openDrawer(fragmentContainerView); } // Defer code dependent on restoration of previous instance state. this.drawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); this.drawerLayout.setDrawerListener(mDrawerToggle); } public void sætListemarkering(int position) { position = -1; // NB! Markering er slået fra, da venstremenuen kun ses på forsiden mCurrentSelectedPosition = position; if (listView != null) { listView.setItemChecked(position, true); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Forward the new configuration the drawer toggle component. mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } private ActionBar getActionBar() { return ((ActionBarActivity) getActivity()).getSupportActionBar(); } public void visMenu() { drawerLayout.openDrawer(fragmentContainerView); listView.requestFocus(); } public void skjulMenu() { if (drawerLayout != null) { drawerLayout.closeDrawer(fragmentContainerView); } } //public static int FORSIDE_INDEX = 3; class VenstremenuAdapter extends Basisadapter { ArrayList<MenuElement> elem = new ArrayList<MenuElement>(); @Override public int getCount() { return elem.size(); } // Reelt skal ingen views genbruges til andre menupunkter, så vi giver dem alle en forskellig type @Override public int getViewTypeCount() { return elem.size(); } // Reelt skal ingen views genbruges til andre menupunkter, så vi giver dem alle en forskellig type @Override public int getItemViewType(int position) { return position; } @Override public boolean isEnabled(int position) { MenuElement e = elem.get(position); return e.fragKlasse != null || e.runnable != null; } @Override public boolean areAllItemsEnabled() { return false; } @Override public View getView(int position, View convertView, ViewGroup parent) { View l = elem.get(position).getView(); if (position == mCurrentSelectedPosition) { // l.setBackgroundResource(R.color.grå10); l.setBackgroundResource(R.drawable.knap_graa10_bg); } else { l.setBackgroundResource(0); } return l; //return elem.get(position).layout; } class MenuElement { final View view; private final Class<? extends Basisfragment> fragKlasse; public Runnable runnable; MenuElement(View v, Runnable r, Class<? extends Basisfragment> frag) { view = v; runnable = r; fragKlasse = frag; } public View getView() { return view; } } private View aq(int layout) { View v = layoutInflater.inflate(layout, null); aq = new AQuery(v); return v; } private final LayoutInflater layoutInflater; private AQuery aq; private void tilføj(MenuElement me) { aq = new AQuery(me.view); fragmentklasseTilMenuposition.put(me.fragKlasse, elem.size()); elem.add(me); } private void tilføj(int layout, Runnable r, Class<? extends Basisfragment> frag) { tilføj(new MenuElement(layoutInflater.inflate(layout, null), r, frag)); } private void tilføj(int layout, Class<? extends Basisfragment> frag) { tilføj(layout, null, frag); } private void tilføj(int layout, Runnable r) { tilføj(layout, r, null); } private void tilføj(int layout) { tilføj(layout, null, null); } public VenstremenuAdapter(final Context themedContext) { layoutInflater = (LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); /* tilføj(R.layout.venstremenu_elem_soeg, Soeg_efter_program_frag.class); aq.id(R.id.tekst).typeface(App.skrift_gibson_fed); //tilføj(R.layout.venstremenu_elem_adskiller_tynd); */ /* FORSIDE_INDEX = elem.size(); tilføj(R.layout.venstremenu_elem_overskrift, Kanaler_frag.class); aq.id(R.id.tekst).text("Forside"); aq.typeface(App.skrift_gibson_fed); */ tilføj(R.layout.venstremenu_elem_overskrift, Senest_lyttede_frag.class); aq.id(R.id.tekst).text(R.string.Senest_lyttede).typeface(App.skrift_gibson_fed); tilføj(new MenuElement(layoutInflater.inflate(R.layout.venstremenu_elem_favoritprogrammer, null), null, Favoritprogrammer_frag.class) { @Override public View getView() { TextView tekst2 = (TextView) view.findViewById(R.id.tekst2); int antal = DRData.instans.favoritter.getAntalNyeUdsendelser(); tekst2.setText( antal < 0 ? "" : // i gang med at indlæse getString(antal==0? R.string._ingen_nye_udsendelser_: antal==1? R.string._1_ny_udsendelse_ : R.string.___nye_udsendelser_, antal)); return view; } }); aq.id(R.id.tekst).typeface(App.skrift_gibson_fed).id(R.id.tekst2).typeface(App.skrift_gibson); if (DRData.instans.hentedeUdsendelser.virker()) { tilføj(new MenuElement(layoutInflater.inflate(R.layout.venstremenu_elem_hentede_udsendendelser, null), null, Hentede_udsendelser_frag.class) { @Override public View getView() { TextView tekst2 = (TextView) view.findViewById(R.id.tekst2); int antal = DRData.instans.hentedeUdsendelser.getUdsendelser().size(); tekst2.setText(" (" + antal + ")"); return view; } }); aq.id(R.id.tekst).typeface(App.skrift_gibson_fed).id(R.id.tekst2).typeface(App.skrift_gibson); } if (App.ÆGTE_DR) { tilføj(R.layout.venstremenu_elem_overskrift, DramaOgBog_frag.class); aq.id(R.id.tekst).text("DR Podcast").typeface(App.skrift_gibson_fed); tilføj(R.layout.venstremenu_elem_overskrift, AlleUdsendelserAtilAA_frag.class); aq.id(R.id.tekst).text("Alle udsendelser A-Å").typeface(App.skrift_gibson_fed); } tilføj(new MenuElement(layoutInflater.inflate(R.layout.venstremenu_elem_favoritprogrammer, null), new Runnable() { @Override public void run() { startActivity(new Intent(getActivity(), AlarmClock_akt.class)); } } , null) { @Override public View getView() { TextView tekst2 = (TextView) view.findViewById(R.id.tekst2); if (Alarms.næsteAktiveAlarm==0) tekst2.setVisibility(View.GONE); else { tekst2.setVisibility(View.VISIBLE); Date d = new Date(Alarms.næsteAktiveAlarm); tekst2.setText(getString(R.string._kl_, DRJson.getDagsbeskrivelse(d).toLowerCase(), DRJson.klokkenformat.format(d))); } return view; } }); aq.id(R.id.tekst).text(R.string.Vækkeur).typeface(App.skrift_gibson_fed); aq.id(R.id.tekst2).typeface(App.skrift_gibson).textColor(getResources().getColor(R.color.rød)); tilføj(R.layout.venstremenu_elem_overskrift, Kontakt_info_om_frag.class); aq.id(R.id.tekst).text(R.string.Kontakt_info_om).typeface(App.skrift_gibson_fed); tilføj(R.layout.venstremenu_elem_adskiller_tynd); tilføj(R.layout.venstremenu_elem_overskrift, new Runnable() { @Override public void run() { startActivity(new Intent(getActivity(), Indstillinger_akt.class)); Sidevisning.vist(Indstillinger_akt.class); } }); aq.id(R.id.tekst).text(R.string.Indstillinger).typeface(App.skrift_gibson_fed); if (App.ÆGTE_DR) { tilføj(R.layout.venstremenu_elem_overskrift, P4kanalvalg_frag.class); aq.id(R.id.tekst).text("Vælg P4-område").typeface(App.skrift_gibson_fed); } if (!App.PRODUKTION) { tilføj(R.layout.venstremenu_elem_adskiller_tynd); tilføj(R.layout.venstremenu_elem_overskrift, new Runnable() { @Override public void run() { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.URL_TIL_DR_RADIO_BETAVERSION)))); } }); aq.id(R.id.tekst).text("Hent nyeste udvikler-version.\nNuværende version:\n" + App.versionsnavn + "\n" + App.res.getString(R.string.akamaistatistik_device) + "/" + Build.MODEL + " " + Build.PRODUCT); aq.typeface(App.skrift_gibson).textSize(12); /* tilføj(R.layout.venstremenu_elem_overskrift, new Runnable() { @Override public void run() { startActivity(new Intent(getActivity(), PlayerActivity.class) .setData(Uri.parse(DRData.instans.afspiller.getLydkilde().findBedsteStreamUrl(false)))); } }); aq.id(R.id.tekst).text("ExoPlayer"); tilføj(R.layout.venstremenu_elem_overskrift, new Runnable() { @Override public void run() { startActivity(new Intent(getActivity(), PlayerActivity.class) .setData(Uri.parse("http://dr02-lh.akamaihd.net/i/dr02_0@147055/master.m3u8"))); } }); aq.id(R.id.tekst).text("ExoPlayer DR2"); */ } } public void vælgMenu(FragmentActivity akt, int position) { //new Exception().printStackTrace(); MenuElement e = elem.get(position); skjulMenu(); if (e.runnable != null) { e.runnable.run(); sætListemarkering(-1); // Ingen listemarkering return; } sætListemarkering(position); try { FragmentManager fm = akt.getSupportFragmentManager(); // Fjern backstak - så vi starter forfra i 'roden' fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); Log.d("Venstremenu viser " + e.fragKlasse); Basisfragment f = e.fragKlasse.newInstance(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.indhold_frag, f); ft.addToBackStack("Venstremenu"); ft.commit(); Sidevisning.vist(f.getClass()); } catch (Exception e1) { Log.rapporterFejl(e1); } } } } /* Virker desværre ikke, da der ikke er en PreferenceFragment i kompatibilitetsbiblioteket App.kortToast("okxxxx"); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) { App.kortToast("ok"); getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); FragmentActivity akt = getActivity(); ((ViewGroup) akt.findViewById(R.id.indhold_frag)).removeAllViews(); akt.getFragmentManager().beginTransaction().replace(R.id.indhold_frag, new Indstillinger_frag_skrald()).commit(); } else { startActivity(new Intent(getActivity(),Indstillinger_akt.class)); } */