package dk.dr.radio.akt;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.media.AudioManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import dk.dr.radio.afspilning.Status;
import dk.dr.radio.data.DRData;
import dk.dr.radio.data.DRJson;
import dk.dr.radio.data.Lydkilde;
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 Hovedaktivitet extends Basisaktivitet implements Runnable {
public static final String VIS_FRAGMENT_KLASSE = "klasse";
public static final String SPØRG_OM_STOP = "SPØRG_OM_STOP";
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private Venstremenu_frag venstremenuFrag;
private Afspiller_frag afspillerFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
com.ensighten.Ensighten.bootstrap(this, "drdk-ensighten", "dr_radio_android", true);
super.onCreate(savedInstanceState);
if (App.prefs.getBoolean("tving_lodret_visning", true)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Basisfragment.sætBilledeDimensioner(getResources().getDisplayMetrics());
setContentView(R.layout.hoved_akt);
venstremenuFrag = (Venstremenu_frag) getSupportFragmentManager().findFragmentById(R.id.venstremenu_frag);
// Set up the drawer.
venstremenuFrag.setUp(R.id.venstremenu_frag, (DrawerLayout) findViewById(R.id.drawer_layout));
afspillerFrag = (Afspiller_frag) getSupportFragmentManager().findFragmentById(R.id.afspiller_frag);
afspillerFrag.setIndholdOverskygge(findViewById(R.id.indhold_overskygge));
if (savedInstanceState == null) try {
String visFragment = getIntent().getStringExtra(VIS_FRAGMENT_KLASSE);
if (visFragment != null) {
Fragment f = (Fragment) Class.forName(visFragment).newInstance();
Bundle b = getIntent().getExtras();
f.setArguments(b);
// Vis fragmentet i FrameLayoutet
Log.d("Viser fragment " + f + " med arg " + b);
getSupportFragmentManager().beginTransaction()
.replace(R.id.indhold_frag, f)
.commit();
// Ingen App.sidevisning(..) her, det skal kalderen klare (der er måske en slug der også skal gemmes)
} else {
// Startet op fra hjemmeskærm eller notifikation
getSupportFragmentManager().beginTransaction()
.replace(R.id.indhold_frag, new Kanaler_frag())
.commit();
// Hvis det ikke er en direkte udsendelse, så hop ind i den pågældende udsendelsesside
if (DRData.instans.afspiller.getAfspillerstatus() != Status.STOPPET) {
Lydkilde lydkilde = DRData.instans.afspiller.getLydkilde();
if (lydkilde instanceof Udsendelse) {
Udsendelse udsendelse = lydkilde.getUdsendelse();
Fragment f = Fragmentfabrikering.udsendelse(udsendelse);
f.getArguments().putString(Basisfragment.P_kode, lydkilde.getKanal().kode);
getSupportFragmentManager().beginTransaction()
.replace(R.id.indhold_frag, f)
.addToBackStack("Udsendelse")
.commit();
Sidevisning.vist(Udsendelse_frag.class, udsendelse.slug);
return;
}
}
//venstremenuFrag.sætListemarkering(Venstremenu_frag.FORSIDE_INDEX); // "Forside
}
//Log.d("getIntent()="+getIntent().getFlags());
if (App.prefs.getBoolean("startAfspilningMedDetSammme", false) && DRData.instans.afspiller.getAfspillerstatus() == Status.STOPPET) {
App.forgrundstråd.post(new Runnable() {
@Override
public void run() {
try {
DRData.instans.afspiller.startAfspilning();
} catch (Exception e) {
Log.rapporterFejl(e);
}
}
});
}
} catch (Exception e) {
Log.rapporterFejl(e);
}
App.fjernbetjening.registrér();
}
@Override
public void onBackPressed() {
if (venstremenuFrag.isDrawerOpen()) {
venstremenuFrag.skjulMenu();
} else if (afspillerFrag.viserUdvidetOmråde()) {
afspillerFrag.udvidSkjulOmråde();
} else try {
super.onBackPressed();
} catch (Exception e) { Log.rapporterFejl(e); } // Workaround for https://mint.splunk.com/dashboard/project/cd78aa05/errors/4016698276 - se http://stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa
}
@Override
protected void onResume() {
super.onResume();
DRData.instans.grunddata.observatører.add(this);
run();
App.netværk.observatører.add(visSkjulSkilt_ingen_forbindelse);
visSkjulSkilt_ingen_forbindelse.run();
}
@Override
protected void onPause() {
DRData.instans.grunddata.observatører.remove(this);
App.netværk.observatører.remove(visSkjulSkilt_ingen_forbindelse);
super.onPause();
}
Runnable visSkjulSkilt_ingen_forbindelse = new Runnable() {
public TextView ingen_forbindelse;
@Override
public void run() {
if (ingen_forbindelse==null) {
ingen_forbindelse = (TextView) findViewById(R.id.ingen_forbindelse);
ingen_forbindelse.setTypeface(App.skrift_gibson);
}
ingen_forbindelse.setVisibility(App.netværk.erOnline() ? View.GONE : View.VISIBLE);
}
};
private static final String drift_statusmeddelelse_NØGLE = "drift_statusmeddelelse";
private static String vis_drift_statusmeddelelse;
private boolean viser_drift_statusmeddelelse;
@Override
public void run() {
if (viser_drift_statusmeddelelse) return;
if (vis_drift_statusmeddelelse == null) {
String drift_statusmeddelelse = DRData.instans.grunddata.android_json.optString(drift_statusmeddelelse_NØGLE).trim();
// Tjek i prefs om denne drifmeddelelse allerede er vist.
// Der er 1 ud af en millards chance for at hashkoden ikke er ændret, den risiko tør vi godt løbe
int drift_statusmeddelelse_hash = drift_statusmeddelelse.hashCode();
final int gammelHashkode = App.prefs.getInt(drift_statusmeddelelse_NØGLE, 0);
if (gammelHashkode != drift_statusmeddelelse_hash && !"".equals(drift_statusmeddelelse)) { // Driftmeddelelsen er ændret. Vis den...
Log.d("vis_drift_statusmeddelelse='" + drift_statusmeddelelse + "' nyHashkode=" + drift_statusmeddelelse_hash + " gammelHashkode=" + gammelHashkode);
vis_drift_statusmeddelelse = drift_statusmeddelelse;
}
}
if (vis_drift_statusmeddelelse != null) {
AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setMessage(Html.fromHtml(vis_drift_statusmeddelelse));
ab.setPositiveButton("OK", new AlertDialog.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
if (vis_drift_statusmeddelelse == null) return;
App.prefs.edit().putInt(drift_statusmeddelelse_NØGLE, vis_drift_statusmeddelelse.hashCode()).commit(); // ...og gem ny hashkode i prefs
vis_drift_statusmeddelelse = null;
viser_drift_statusmeddelelse = false;
run(); // Se om der er flere meddelelser
}
});
AlertDialog d = ab.create();
d.show();
viser_drift_statusmeddelelse = true;
((TextView) (d.findViewById(android.R.id.message))).setMovementMethod(LinkMovementMethod.getInstance());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.soeg, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
try {
if (item.getItemId() == android.R.id.home) {
getSupportFragmentManager().popBackStack();
}
if (item.getItemId() == R.id.søg) {
FragmentManager fm = getSupportFragmentManager();
// Fjern backstak - så vi starter forfra i 'roden'
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.indhold_frag, new Soeg_efter_program_frag());
// Tilbageknappen skal gå til forsiden - undtagen hvis vi ER på forsiden
ft.addToBackStack("Venstremenu");
ft.commit();
Sidevisning.vist(Soeg_efter_program_frag.class);
return true;
}
} catch (Exception e) { Log.rapporterFejl(e); } // fix for https://mint.splunk.com/dashboard/project/cd78aa05/errors/4020628139
return super.onOptionsItemSelected(item);
}
@Override
public void finish() {
int volumen = App.audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
// Hvis der er skruet helt ned så stop afspilningen
if (volumen == 0 && DRData.instans.afspiller.getAfspillerstatus() != Status.STOPPET) {
DRData.instans.afspiller.stopAfspilning();
}
if (DRData.instans.afspiller.getAfspillerstatus() != Status.STOPPET && getIntent().getBooleanExtra(SPØRG_OM_STOP, true)) {
// Spørg brugeren om afspilningen skal stoppes
showDialog(0);
return;
}
super.finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode==KeyEvent.KEYCODE_VOLUME_UP || keyCode==KeyEvent.KEYCODE_VOLUME_UP) && afspillerFrag.viserUdvidetOmråde()) {
// Opdatér 10 gange i sekundet mens knapperne bruges
App.forgrundstråd.postDelayed(afspillerFrag.lydstyrke, 100);
afspillerFrag.lydstyrke.opdateringshastighed = 100;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if ((keyCode==KeyEvent.KEYCODE_VOLUME_UP || keyCode==KeyEvent.KEYCODE_VOLUME_UP) && afspillerFrag.viserUdvidetOmråde()) {
// Opdatér en enkelt gange om 1/10-del sekund
App.forgrundstråd.postDelayed(afspillerFrag.lydstyrke, 100);
afspillerFrag.lydstyrke.opdateringshastighed = 1000;
}
return super.onKeyUp(keyCode, event);
}
@Override
protected Dialog onCreateDialog(final int id) {
AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setMessage(R.string.Stop_afspilningen_);
ab.setPositiveButton(R.string.Stop_afspilning, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
DRData.instans.afspiller.stopAfspilning();
Hovedaktivitet.super.finish();
}
});
ab.setNeutralButton(R.string.Fortsæt_i_baggrunden, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
Hovedaktivitet.super.finish();
}
});
//ab.setNegativeButton("Annullér", null);
return ab.create();
}
/*
@Override
public void onPrepareDialog(int id, Dialog d) {
if (id == 0) try {
((AlertDialog) d).setMessage(Html.fromHtml(vis_drift_statusmeddelelse));
((TextView) (d.findViewById(android.R.id.message))).setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) { Log.rapporterFejl(e); }
}
*/
/**
* Om tilbageknappen skal afslutte programmet eller vise venstremenuen
static boolean tilbageViserVenstremenu = true; // hack - static, ellers skulle den gemmes i savedInstanceState
@Override public void onBackPressed() {
if (tilbageViserVenstremenu) {
venstremenuFrag.visMenu();
tilbageViserVenstremenu = false;
} else {
super.onBackPressed();
tilbageViserVenstremenu = true;
}
}
@Override public boolean dispatchTouchEvent(MotionEvent ev) {
tilbageViserVenstremenu = true;
return super.dispatchTouchEvent(ev);
}
@Override public boolean dispatchTrackballEvent(MotionEvent ev) {
tilbageViserVenstremenu = true;
return super.dispatchTrackballEvent(ev);
}
*/
}