package com.iwedia.gui.components.dialogs;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import com.iwedia.comm.IDlnaControl;
import com.iwedia.gui.MainActivity;
import com.iwedia.gui.R;
import com.iwedia.gui.components.A4TVButtonSwitch;
import com.iwedia.gui.components.A4TVDialog;
import com.iwedia.gui.components.A4TVEditText;
import com.iwedia.gui.components.A4TVProgressDialog;
import com.iwedia.gui.components.A4TVToast;
import com.iwedia.gui.mainmenu.DialogManager;
import com.iwedia.gui.mainmenu.MainMenuContent;
import com.iwedia.gui.pvr.A4TVStorageManager;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
/**
* DLNA settings dialog class
*
* @author Branimir Pavlovic
*/
public class DLNASettingsDialog extends A4TVDialog implements
A4TVDialogInterface, android.view.View.OnClickListener {
/** ID's of switch buttons */
public static final int TV_MENU_DLNA_SETTINGS_ENABLE_SERVER = 12344,
TV_MENU_DLNA_SETTINGS_ENABLE_RENDERER = 12345,
TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_SERVER = 12346,
TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_RENDERER = 12347;
public static final int RENAME_SERVER_NAME = 1, RENAME_RENDERER_NAME = 2;
public static final int TIME_OUT = 2000;
private Context ctx;
@SuppressWarnings("unused")
private static boolean isServer = false, isRenderer = false;
@SuppressWarnings("unused")
private static boolean isUSBMounted = false;
// fields for creating dialogs
private ArrayList<ArrayList<Integer>> contentList = new ArrayList<ArrayList<Integer>>(),
contentListIDs = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> titleIDs = new ArrayList<Integer>();
private A4TVButtonSwitch enableServer, enableRendereer;
private A4TVEditText changeNameServer, changeNameRenderer;
private final int STOP_SERVER = 1, START_SERVER = 2, STOP_RENDERER = 3,
START_RENDERER = 4;
private static final String CHANGE_NAME_SERVER = "Change name server";
private static final String CHANGE_NAME_RENDERER = "Change name renderer";
private A4TVProgressDialog progress;
private Enumeration<NetworkInterface> en;
private Enumeration<InetAddress> enumIpAddr;
private NetworkInterface intf;
private InetAddress inetAddress;
// private Thread mThreadServer = null, mThreadRenderer = null;
private String serverName, rendererName;
private static A4TVStorageManager storage = new A4TVStorageManager();
public String getLocalIpAddress() {
try {
en = NetworkInterface.getNetworkInterfaces();
while (en.hasMoreElements()) {
intf = en.nextElement();
enumIpAddr = intf.getInetAddresses();
while (enumIpAddr.hasMoreElements()) {
inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLinkLocalAddress()) {
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress();
}
}
}
}
} catch (SocketException ex) {
Log.e("Error", ex.toString());
}
return null;
}
@Override
public void onBackPressed() {
if (!MainActivity.sharedPrefs.getString(CHANGE_NAME_SERVER, "DlnaDMS")
.equals(serverName)) {
MainActivity.sharedPrefs.edit()
.putString(CHANGE_NAME_SERVER, serverName).commit();
Thread mThreadServer = new Thread(new Runnable() {
@Override
public void run() {
renameServerName(serverName);
}
});
mThreadServer.start();
}
if (!MainActivity.sharedPrefs
.getString(CHANGE_NAME_RENDERER, "DlnaDMR")
.equals(rendererName)) {
MainActivity.sharedPrefs.edit()
.putString(CHANGE_NAME_RENDERER, rendererName).commit();
Thread mThreadRenderer = new Thread(new Runnable() {
@Override
public void run() {
renameRendererName(rendererName);
}
});
mThreadRenderer.start();
}
super.onBackPressed();
}
public DLNASettingsDialog(Context context) {
super(context, checkTheme(context), 0);
ctx = context;
// fill lists
returnArrayListsWithDialogContents(contentList, contentListIDs,
titleIDs);
// set content to dialog
fillDialog();
// set attributes
setDialogAttributes();
getReferencesFromViews();
}
/**
* Initially get references from views
*/
private void getReferencesFromViews() {
enableServer = (A4TVButtonSwitch) findViewById(TV_MENU_DLNA_SETTINGS_ENABLE_SERVER);
enableRendereer = (A4TVButtonSwitch) findViewById(TV_MENU_DLNA_SETTINGS_ENABLE_RENDERER);
changeNameServer = (A4TVEditText) findViewById(TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_SERVER);
changeNameRenderer = (A4TVEditText) findViewById(TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_RENDERER);
progress = new A4TVProgressDialog(ctx);
progress.setMessage("Performing action!");
progress.setTitleOfAlertDialog(R.string.loading_message);
progress.setCancelable(false);
}
/**
* Get USB status
*/
private static boolean getUsbStatus() {
boolean usbStatus = false;
if (storage != null) {
if (storage.getUSBStorage(0) != null) {
usbStatus = true;
}
}
// try {
// Process proc = Runtime.getRuntime().exec("ls /mnt/media");
// BufferedReader in = new BufferedReader(new InputStreamReader(
// proc.getInputStream()));
// String line = null;
// while ((line = in.readLine()) != null) {
// System.out.println(line);
// usbStatus = true;
// }
// in.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
return usbStatus;
}
@Override
public void show() {
fillInitialViews();
super.show();
}
/** Populate views in dialog */
private void fillInitialViews() {
// ZORANA - remove hardcoded states - they should be retrieved in
// runtime
try {
isServer = MainActivity.service.getDlnaControl().getServerStatus();
isRenderer = MainActivity.service.getDlnaControl()
.getRendererStatus();
} catch (Exception e1) {
e1.printStackTrace();
}
// TODO ask service
if ((getUsbStatus() == false) && (isServer == true)) {
new MyAsyncTask(STOP_SERVER).execute();
}
if (isServer) {
enableServer.setSelectedStateAndText(isServer,
R.string.button_text_yes);
} else {
enableServer.setSelectedStateAndText(isServer,
R.string.button_text_no);
}
if (isRenderer) {
enableRendereer.setSelectedStateAndText(isRenderer,
R.string.button_text_yes);
} else {
enableRendereer.setSelectedStateAndText(isRenderer,
R.string.button_text_no);
}
String prefChangeNameServer = MainActivity.sharedPrefs.getString(
CHANGE_NAME_SERVER, "DlnaDMS");
String prefChangeNameRenderer = MainActivity.sharedPrefs.getString(
CHANGE_NAME_RENDERER, "DlnaDMR");
changeNameServer.setText(prefChangeNameServer);
changeNameRenderer.setText(prefChangeNameRenderer);
changeNameServer.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (changeNameServer.getText().toString().length() > 0) {
serverName = s.toString();
} else {
serverName = "DlnaDMS";
}
}
});
changeNameRenderer.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (changeNameRenderer.getText().toString().length() > 0) {
rendererName = s.toString();
} else {
rendererName = "DlnaDMR";
}
}
});
}
private void renameServerName(String prefChangeNameServer) {
if (isServer) {
try {
MainActivity.service.getDlnaControl().changeDMSName(
prefChangeNameServer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void renameRendererName(String prefChangeNameRenderer) {
if (isRenderer) {
try {
MainActivity.service.getDlnaControl().changeDMRName(
prefChangeNameRenderer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case TV_MENU_DLNA_SETTINGS_ENABLE_SERVER: {
if (getUsbStatus() && (getLocalIpAddress() != null)) {
if (((A4TVButtonSwitch) v).getText().equals(
ctx.getResources().getString(
R.string.button_text_no))) {
// // Disable Renderer
// if (enableRendereer.isSelected()) {
// new MyAsyncTask(STOP_RENDERER).execute();
// enableRendereer.setSelectedStateAndText(false,
// R.string.button_text_no);
// }
new MyAsyncTask(START_SERVER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(true,
R.string.button_text_yes);
} else {
new MyAsyncTask(STOP_SERVER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
}
} else { // getUsbStatus = false
if (((A4TVButtonSwitch) v).getText().equals(
ctx.getResources().getString(
R.string.button_text_yes))) {
new MyAsyncTask(STOP_SERVER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
}
if (getUsbStatus()) {
A4TVToast toast = new A4TVToast(ctx);
toast.showToast("No IP connection");
} else {
A4TVToast toast = new A4TVToast(ctx);
toast.showToast(R.string.pvr_no_usb);
}
}
break;
}
case TV_MENU_DLNA_SETTINGS_ENABLE_RENDERER: {
if (getLocalIpAddress() != null) {
if (((A4TVButtonSwitch) v).getText().equals(
ctx.getResources().getString(
R.string.button_text_no))) {
// Disable Server
// if (enableServer.isSelected()) {
// new MyAsyncTask(STOP_SERVER).execute();
// enableServer.setSelectedStateAndText(false,
// R.string.button_text_no);
// }
new MyAsyncTask(START_RENDERER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(true,
R.string.button_text_yes);
} else {
new MyAsyncTask(STOP_RENDERER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
}
} else {
if (((A4TVButtonSwitch) v).getText().equals(
ctx.getResources().getString(
R.string.button_text_yes))) {
new MyAsyncTask(STOP_RENDERER).execute();
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
}
A4TVToast toast = new A4TVToast(ctx);
toast.showToast("No IP connection");
}
break;
}
default:
break;
}
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
int typeOfWork;
public MyAsyncTask(int typeOfWork) {
this.typeOfWork = typeOfWork;
}
@Override
protected void onPreExecute() {
progress.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
IDlnaControl dlnaControl = null;
try {
dlnaControl = MainActivity.service.getDlnaControl();
} catch (Exception e1) {
e1.printStackTrace();
}
if (dlnaControl != null) {
switch (typeOfWork) {
case STOP_SERVER: {
isServer = false;
try {
dlnaControl.stopDlnaServer();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
case START_SERVER: {
isServer = true;
String prefChangeNameServer = MainActivity.sharedPrefs
.getString(CHANGE_NAME_SERVER, "DlnaDMS");
try {
dlnaControl.startDlnaServer(prefChangeNameServer);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
case START_RENDERER: {
isRenderer = true;
String prefChangeNameRenderer = MainActivity.sharedPrefs
.getString(CHANGE_NAME_RENDERER, "DlnaDMR");
try {
dlnaControl
.startDlnaRenderer(prefChangeNameRenderer);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
case STOP_RENDERER: {
isRenderer = false;
try {
dlnaControl.stopDlnaRenderer();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
default:
break;
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
progress.dismiss();
super.onPostExecute(result);
}
}
/**
* Function that load theme
*
* @param ctx
* @return
*/
private static int checkTheme(Context ctx) {
TypedArray atts = ctx.getTheme().obtainStyledAttributes(
new int[] { R.attr.A4TVDialog });
int i = atts.getResourceId(0, 0);
atts.recycle();
return i;
}
@Override
public void fillDialog() {
View view = DialogManager.dialogCreator.fillDialogWithContents(
contentList, contentListIDs, titleIDs, null, this, null);// ,
// pictureBackgroundID);
setContentView(view);
}
@Override
public void setDialogAttributes() {
getWindow().getAttributes().width = MainActivity.dialogWidth;
getWindow().getAttributes().height = MainActivity.dialogHeight;
}
@Override
public void returnArrayListsWithDialogContents(
ArrayList<ArrayList<Integer>> contentList,
ArrayList<ArrayList<Integer>> contentListIDs,
ArrayList<Integer> titleIDs) {
// clear old data in lists
contentList.clear();
contentListIDs.clear();
titleIDs.clear();
// title
titleIDs.add(R.drawable.settings_icon);
titleIDs.add(R.string.settings_menu_item_dlna);
// server on off******************************************
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButtonSwitch);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_dlna_settings_server_on_off);
list.add(TV_MENU_DLNA_SETTINGS_ENABLE_SERVER);
contentListIDs.add(list);
// Change the name of dlna
// server******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVEditText);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_dlna_settings_change_the_name_of_dlna_server);
list.add(TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_SERVER);
contentListIDs.add(list);
// renderer on off******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButtonSwitch);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_dlna_settings_renderer_on_off);
list.add(TV_MENU_DLNA_SETTINGS_ENABLE_RENDERER);
contentListIDs.add(list);
// Change the name of dlna
// renderer******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVEditText);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_dlna_settings_change_the_name_of_dlna_renderer);
list.add(TV_MENU_DLNA_SETTINGS_CHANGE_THE_NAME_OF_DLNA_RENDERER);
contentListIDs.add(list);
}
}