package net.reichholf.dreamdroid.fragment.helper;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentManager;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import net.reichholf.dreamdroid.DreamDroid;
import net.reichholf.dreamdroid.R;
import net.reichholf.dreamdroid.activities.MainActivity;
import net.reichholf.dreamdroid.activities.SimpleNoTitleFragmentActivity;
import net.reichholf.dreamdroid.activities.SimpleToolbarFragmentActivity;
import net.reichholf.dreamdroid.asynctask.SetPowerStateTask;
import net.reichholf.dreamdroid.asynctask.SimpleResultTask;
import net.reichholf.dreamdroid.asynctask.SleepTimerTask;
import net.reichholf.dreamdroid.fragment.CurrentServiceFragment;
import net.reichholf.dreamdroid.fragment.DeviceInfoFragment;
import net.reichholf.dreamdroid.fragment.EpgBouquetFragment;
import net.reichholf.dreamdroid.fragment.MediaPlayerFragment;
import net.reichholf.dreamdroid.fragment.MovieListFragment;
import net.reichholf.dreamdroid.fragment.MyPreferenceFragment;
import net.reichholf.dreamdroid.fragment.ProfileListFragment;
import net.reichholf.dreamdroid.fragment.ScreenShotFragment;
import net.reichholf.dreamdroid.fragment.ServiceListFragment;
import net.reichholf.dreamdroid.fragment.SignalFragment;
import net.reichholf.dreamdroid.fragment.TimerListFragment;
import net.reichholf.dreamdroid.fragment.VirtualRemotePagerFragment;
import net.reichholf.dreamdroid.fragment.ZapFragment;
import net.reichholf.dreamdroid.fragment.dialogs.AboutDialog;
import net.reichholf.dreamdroid.fragment.dialogs.SendMessageDialog;
import net.reichholf.dreamdroid.fragment.dialogs.SimpleChoiceDialog;
import net.reichholf.dreamdroid.fragment.dialogs.SleepTimerDialog;
import net.reichholf.dreamdroid.helpers.ExtendedHashMap;
import net.reichholf.dreamdroid.helpers.NameValuePair;
import net.reichholf.dreamdroid.helpers.Python;
import net.reichholf.dreamdroid.helpers.SimpleHttpClient;
import net.reichholf.dreamdroid.helpers.Statics;
import net.reichholf.dreamdroid.helpers.enigma2.Event;
import net.reichholf.dreamdroid.helpers.enigma2.Message;
import net.reichholf.dreamdroid.helpers.enigma2.PowerState;
import net.reichholf.dreamdroid.helpers.enigma2.SimpleResult;
import net.reichholf.dreamdroid.helpers.enigma2.SleepTimer;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.MessageRequestHandler;
import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.SimpleResultRequestHandler;
import java.util.ArrayList;
/**
* Created by Stephan on 25.12.2015.
*/
public class NavigationHelper implements NavigationView.OnNavigationItemSelectedListener, SetPowerStateTask.PowerStateTaskHandler, SleepTimerTask.SleepTimerTaskHandler, SimpleResultTask.SimpleResultTaskHandler {
protected static int[] sDialogItemIds = {R.id.menu_navigation_sleeptimer, R.id.menu_navigation_remote, R.id.menu_navigation_settings, R.id.menu_navigation_message, R.id.menu_navigation_power, R.id.menu_navigation_about, R.id.menu_navigation_changelog};
MainActivity mActivity;
protected SetPowerStateTask mSetPowerStateTask;
protected SleepTimerTask mSleepTimerTask;
protected SimpleResultTask mSimpleResultTask;
protected SimpleHttpClient mShc;
protected int mSelectedItemId;
public NavigationHelper(MainActivity activity) {
mActivity = activity;
mSelectedItemId = -1;
getNavigationView().setNavigationItemSelectedListener(this);
}
protected SimpleHttpClient getHttpClient() {
if (mShc == null)
mShc = SimpleHttpClient.getInstance();
return mShc;
}
protected MainActivity getMainActivity() {
return mActivity;
}
protected NavigationView getNavigationView() {
if (mActivity == null)
return null;
return (NavigationView) getMainActivity().findViewById(R.id.navigation_view);
}
protected View getHeaderView() {
return getNavigationView().getHeaderView(0);
}
protected void clearBackStack() {
// Pop the backstack completely everytime the user navigates "away"
// Avoid's "stacking" fragments due to back-button behaviour that feels
// really mysterious
FragmentManager fm = getMainActivity().getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
protected CharSequence getText(int resId) {
return mActivity.getText(resId);
}
@Override
public void onPowerStateSet(boolean success, ExtendedHashMap result, String resultText) {
if (!success) {
showToast(resultText);
return;
}
boolean isRunning = (Boolean) result.get(PowerState.KEY_IN_STANDBY);
if (isRunning) {
showToast(getString(R.string.is_running));
} else {
showToast(getString(R.string.in_standby));
}
}
@Override
public String getString(int resId) {
return mActivity.getString(resId);
}
public void onProfileChanged() {
mShc = SimpleHttpClient.getInstance();
}
protected void setSelectedItem(int itemId) {
if (isDialogItem(itemId))
return;
if(itemId == R.id.menu_navigation_profiles) {
getNavigationView().setCheckedItem(R.id.menu_none);
return;
}
getNavigationView().setCheckedItem(itemId);
mSelectedItemId = itemId;
}
public void navigateTo(int itemId) {
onNavigationItemClick(itemId);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
return onNavigationItemClick(item.getItemId());
}
protected boolean isDialogItem(int itemId) {
for (int id : sDialogItemIds)
if (id == itemId)
return true;
return false;
}
protected boolean onNavigationItemClick(int itemId) {
setSelectedItem(itemId);
Intent intent;
switch (itemId) {
case R.id.menu_navigation_timer:
clearBackStack();
getMainActivity().showDetails(TimerListFragment.class);
break;
case R.id.menu_navigation_movies:
clearBackStack();
getMainActivity().showDetails(MovieListFragment.class);
break;
case R.id.menu_navigation_services:
clearBackStack();
getMainActivity().showDetails(ServiceListFragment.class);
break;
case R.id.menu_navigation_device_info:
clearBackStack();
getMainActivity().showDetails(DeviceInfoFragment.class);
break;
case R.id.menu_navigation_current:
clearBackStack();
getMainActivity().showDetails(CurrentServiceFragment.class);
break;
case R.id.menu_navigation_remote:
if (!isTablet()) {
intent = new Intent(mActivity, SimpleNoTitleFragmentActivity.class);
intent.putExtra("fragmentClass", VirtualRemotePagerFragment.class);
mActivity.startActivity(intent);
} else {
clearBackStack();
getMainActivity().showDetails(VirtualRemotePagerFragment.class);
}
break;
case R.id.menu_navigation_settings:
if (!isTablet()) {
intent = new Intent(mActivity, SimpleToolbarFragmentActivity.class);
intent.putExtra("fragmentClass", MyPreferenceFragment.class);
intent.putExtra("titleResource", R.string.settings);
mActivity.startActivity(intent);
} else {
clearBackStack();
getMainActivity().showDetails(MyPreferenceFragment.class);
}
break;
case R.id.menu_navigation_message:
getMainActivity().showDialogFragment(SendMessageDialog.newInstance(), "sendmessage_dialog");
break;
case R.id.menu_navigation_screenshot:
clearBackStack();
getMainActivity().showDetails(ScreenShotFragment.class);
break;
case Statics.ITEM_TOGGLE_STANDBY:
setPowerState(PowerState.STATE_TOGGLE);
break;
case Statics.ITEM_RESTART_GUI:
setPowerState(PowerState.STATE_GUI_RESTART);
break;
case Statics.ITEM_REBOOT:
setPowerState(PowerState.STATE_SYSTEM_REBOOT);
break;
case Statics.ITEM_SHUTDOWN:
setPowerState(PowerState.STATE_SHUTDOWN);
break;
case R.id.menu_navigation_power:
CharSequence[] actions = {getText(R.string.standby), getText(R.string.restart_gui),
getText(R.string.reboot), getText(R.string.shutdown)};
int[] actionIds = {Statics.ITEM_TOGGLE_STANDBY, Statics.ITEM_RESTART_GUI, Statics.ITEM_REBOOT,
Statics.ITEM_SHUTDOWN};
getMainActivity().showDialogFragment(
SimpleChoiceDialog.newInstance(getString(R.string.powercontrol), actions, actionIds),
"powerstate_dialog");
break;
case R.id.menu_navigation_about:
getMainActivity().showDialogFragment(AboutDialog.newInstance(), "about_dialog");
break;
case Statics.ITEM_CHECK_CONN:
getMainActivity().onProfileChanged(DreamDroid.getCurrentProfile());
break;
case R.id.menu_navigation_changelog:
getMainActivity().showChangeLogIfNeeded(false);
break;
case R.id.menu_navigation_sleeptimer:
getSleepTimer(true);
break;
case R.id.menu_navigation_mediaplayer:
clearBackStack();
getMainActivity().showDetails(MediaPlayerFragment.class);
break;
case R.id.menu_navigation_profiles:
clearBackStack();
getMainActivity().showDetails(ProfileListFragment.class);
break;
case R.id.menu_navigation_signal:
clearBackStack();
getMainActivity().showDetails(SignalFragment.class);
break;
case R.id.menu_navigation_zap:
clearBackStack();
getMainActivity().showDetails(ZapFragment.class);
break;
case Statics.ITEM_RELOAD:
return false;
case R.id.menu_navigation_epg:
clearBackStack();
Bundle args = new Bundle();
String ref = DreamDroid.getCurrentProfile().getDefaultRef();
args.putString(Event.KEY_SERVICE_REFERENCE, ref);
String name = DreamDroid.getCurrentProfile().getDefaultRefName();
args.putString(Event.KEY_SERVICE_NAME, name);
EpgBouquetFragment f = new EpgBouquetFragment();
f.setArguments(args);
getMainActivity().showDetails(f);
break;
}
getMainActivity().showContent();
return !isDialogItem(itemId);
}
/**
* @param time
* @param action
* @param enabled
*/
public void onSetSleepTimer(String time, String action, boolean enabled) {
ArrayList<NameValuePair> params = new ArrayList<>();
params.add(new NameValuePair("cmd", SleepTimer.CMD_SET));
params.add(new NameValuePair("time", time));
params.add(new NameValuePair("action", action));
if (enabled) {
params.add(new NameValuePair("enabled", Python.TRUE));
} else {
params.add(new NameValuePair("enabled", Python.FALSE));
}
execSleepTimerTask(params, false);
}
/**
*
*/
protected void getSleepTimer(boolean showDialogOnFinish) {
ArrayList<NameValuePair> params = new ArrayList<>();
execSleepTimerTask(params, showDialogOnFinish);
}
@Override
public void onSleepTimerSet(boolean success, ExtendedHashMap result, boolean openDialog, String errorText) {
if (success) {
if (openDialog) {
getMainActivity().showDialogFragment(SleepTimerDialog.newInstance(result), "sleeptimer_dialog");
return;
}
String text = result.getString(SleepTimer.KEY_TEXT);
showToast(text);
} else {
showToast(getString(R.string.error));
}
}
public void execSimpleResultTask(SimpleResultRequestHandler handler, ArrayList<NameValuePair> params) {
if (mSimpleResultTask != null) {
mSimpleResultTask.cancel(true);
}
mSimpleResultTask = new SimpleResultTask(handler, this);
mSimpleResultTask.execute(params);
}
@Override
public void onSimpleResult(boolean success, ExtendedHashMap result) {
String toastText = getString(R.string.get_content_error);
String stateText = result.getString(SimpleResult.KEY_STATE_TEXT);
if (stateText != null && !"".equals(stateText)) {
toastText = stateText;
} else if (mShc.hasError()) {
toastText = mShc.getErrorText(getContext());
}
showToast(toastText);
}
/**
* @param params
*/
@SuppressWarnings("unchecked")
protected void execSleepTimerTask(ArrayList<NameValuePair> params, boolean showDialogOnFinish) {
if (mSleepTimerTask != null) {
mSleepTimerTask.cancel(true);
}
mSleepTimerTask = new SleepTimerTask(showDialogOnFinish, this);
mSleepTimerTask.execute(params);
}
/**
* @param state The powerstate to set. For example defined in
* <code>helpers.enigma2.PowerState.STATE_*</code>
*/
protected void setPowerState(String state) {
if (mSetPowerStateTask != null) {
mSetPowerStateTask.cancel(true);
}
mSetPowerStateTask = new SetPowerStateTask(this);
mSetPowerStateTask.execute(state);
}
/**
* Send a message to the target device which will be shown on TV
*
* @param text The message text
* @param type Type of the message as defined in
* <code>helpers.enigma2.Message.STATE_*</code>
* @param timeout Timeout for the message, 0 means no timeout will occur
*/
public void onSendMessage(String text, String type, String timeout) {
ExtendedHashMap msg = new ExtendedHashMap();
msg.put(Message.KEY_TEXT, text);
msg.put(Message.KEY_TYPE, type);
msg.put(Message.KEY_TIMEOUT, timeout);
execSimpleResultTask(new MessageRequestHandler(), Message.getParams(msg));
}
public void setAvailableFeatures() {
// TODO implement feature-handling for list-navigation
}
protected boolean isTablet() {
return getMainActivity().getResources().getBoolean(R.bool.is_tablet);
}
protected void showToast(String toastText) {
Toast toast = Toast.makeText(getMainActivity(), toastText, Toast.LENGTH_LONG);
toast.show();
}
public void onDialogAction(int action, Object details, String dialogTag) {
if (action == Statics.ACTION_SHOW_PRIVACY_STATEMENT) {
getMainActivity().showPrivacyStatement();
return;
}
onNavigationItemClick(action);
}
@Override
public Context getContext() {
return getMainActivity();
}
}