package com.iwedia.gui.components.dialogs;
import android.content.Context;
import android.content.SharedPreferences.Editor;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import com.iwedia.comm.system.about.ISoftwareUpdate;
import com.iwedia.gui.MainActivity;
import com.iwedia.gui.R;
import com.iwedia.gui.components.A4TVAlertDialog;
import com.iwedia.gui.components.A4TVButton;
import com.iwedia.gui.components.A4TVButtonSwitch;
import com.iwedia.gui.components.A4TVDialog;
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 com.iwedia.gui.pvr.A4TVUSBStorage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
/**
* Software update dialog
*
* @author Branimir Pavlovic
*/
public class SoftwareUpgradeDialog extends A4TVDialog implements
A4TVDialogInterface, android.view.View.OnClickListener {
public static final String TAG = "SoftwareUpgradeDialog";
/** IDs for buttons */
public static final int TV_MENU_SOFTWARE_UPGRADE_SETTINGS_AUTO_UPGRADE = 30,
TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE = 31,
TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_CURR_VERSION = 32,
TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_UPGRADE = 33,
TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_USB = 34;
// 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 A4TVButton buttonManuallyUpgrade,
buttonManuallyUpgradeCurrentVersion,
buttonManuallyUpgradeUpgradeBtn, buttonManuallyUpgradeUSB;
private A4TVButtonSwitch buttonAutoUpgrade;
private A4TVAlertDialog alertDialog;
private Handler handlerForCallBacks;
private Context ctx;
private A4TVStorageManager storage = new A4TVStorageManager();
public static final int SHOW_ALERT_DIALOG = 0, TOAST_MESSAGE = 1,
USB_UPGRADE_MSG = 2, USB_CHECK_UPDATE = 3;
// fields for animation
private Thread thread;
private Runnable run;
private int checkType;
private final int CHECKING = 11, DOWNLOADING = 12;
public SoftwareUpgradeDialog(Context context) {
super(context, checkTheme(context), 0);
ctx = context;
// fill lists
returnArrayListsWithDialogContents(contentList, contentListIDs,
titleIDs);
// set content to dialog
fillDialog();
// set attributes
setDialogAttributes();
fillInitialViews();
}
@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;
}
/**
* 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;
}
/** Get references from views */
private void fillInitialViews() {
/** Get references from views */
buttonManuallyUpgrade = (A4TVButton) findViewById(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE);
buttonAutoUpgrade = (A4TVButtonSwitch) findViewById(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_AUTO_UPGRADE);
buttonManuallyUpgradeCurrentVersion = (A4TVButton) findViewById(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_CURR_VERSION);
buttonManuallyUpgradeUpgradeBtn = (A4TVButton) findViewById(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_UPGRADE);
buttonManuallyUpgradeUSB = (A4TVButton) findViewById(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_USB);
// hide some views and change paddings
buttonManuallyUpgrade.setBackgroundColor(Color.TRANSPARENT);
buttonManuallyUpgrade.setFocusable(false);
buttonManuallyUpgrade.setGravity(Gravity.LEFT);
buttonManuallyUpgradeCurrentVersion
.setBackgroundColor(Color.TRANSPARENT);
buttonManuallyUpgradeUpgradeBtn
.setText(R.string.tv_menu_software_upgrade_settings_manually_uprade_btn);
buttonManuallyUpgradeUSB
.setText(R.string.tv_menu_software_upgrade_settings_manually_uprade_btn);
LinearLayout view = (LinearLayout) findViewById(R.string.tv_menu_software_upgrade_settings_manually_uprade);
if (view != null) {
view.setPadding(4, 4, 15, 4);
}
/** Init handler for executing commands from call backs */
handlerForCallBacks = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_ALERT_DIALOG: {
stopThread();
showAlertDialogWithMessage((String) msg.obj, -1, false);
break;
}
case TOAST_MESSAGE: {
stopThread();
final A4TVAlertDialog alert = new A4TVAlertDialog(ctx);
alert.setCancelable(true);
alert.setTitleOfAlertDialog((String) msg.obj);
alert.setPositiveButton(R.string.parental_control_ok,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alert.cancel();
}
});
alert.show();
break;
}
case USB_UPGRADE_MSG: {
stopThread();
String message = (String) msg.obj;
Log.d(TAG, "RECEIVED USB UPGRADE" + message);
if (message.contains("Error:")) {
final A4TVAlertDialog alert = new A4TVAlertDialog(
ctx);
alert.setCancelable(true);
alert.setTitleOfAlertDialog(R.string.no_usb);
alert.setPositiveButton(
R.string.parental_control_ok,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alert.cancel();
}
});
alert.show();
}
if (message.contains("Finish:")) {
// FTI should run after update
clearSavedData();
A4TVToast toast = new A4TVToast(ctx);
toast.showToast(R.string.upgrade_finished_over_usb);
}
break;
}
case USB_CHECK_UPDATE: {
stopThread();
int swType = msg.arg1;
String swVersion = (String) msg.obj;
showAlertDialogWithMessage(swVersion, swType, true);
break;
}
case DOWNLOADING: {
if (buttonManuallyUpgrade.getText().toString()
.contains("...")) {
buttonManuallyUpgrade.setText(R.string.downloading);
} else {
buttonManuallyUpgrade.setText(buttonManuallyUpgrade
.getText().toString() + ".");
}
break;
}
case CHECKING: {
if (buttonManuallyUpgrade.getText().toString()
.contains("...")) {
buttonManuallyUpgrade.setText(R.string.checking);
} else {
buttonManuallyUpgrade.setText(buttonManuallyUpgrade
.getText().toString() + ".");
}
break;
}
default:
break;
}
super.handleMessage(msg);
}
};
run = new Runnable() {
@Override
public void run() {
while (true) {
Thread currentThread = Thread.currentThread();
if (currentThread.equals(thread)) {
handlerForCallBacks.sendEmptyMessage(checkType);
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
};
}
/** Hide progress dialog and toast error message */
public void toastMessage(String message) {
handlerForCallBacks.sendMessage(Message.obtain(handlerForCallBacks,
TOAST_MESSAGE, message));
}
/** This function need to be called from call back to show alert dialog */
public void showAlertDialog(String version) {
handlerForCallBacks.sendMessage(Message.obtain(handlerForCallBacks,
SHOW_ALERT_DIALOG, version));
}
public void usbMessageReceived(String msg) {
handlerForCallBacks.sendMessage(Message.obtain(handlerForCallBacks,
USB_UPGRADE_MSG, msg));
}
public void usbCheckUpdateEvent(int msgType, String msg) {
handlerForCallBacks.sendMessage(Message.obtain(handlerForCallBacks,
USB_CHECK_UPDATE, msgType, 0, msg));
}
/**
* Shows alert dialog with messages
*
* @param version
* version of new software
* @param SWUpgradeMsgs
* upgrade or down grade
*/
private void showAlertDialogWithMessage(String version, int swUpgradeMsgs,
boolean overUSB) {
/** Initialize alert dialog */
alertDialog = new A4TVAlertDialog(ctx);
if (swUpgradeMsgs == -1
|| swUpgradeMsgs == com.iwedia.comm.enums.SWUpgradeMsgs.UPGRADE) {
alertDialog.setTitleOfAlertDialog(ctx.getResources().getString(
R.string.software_upgrade_text_part_one)
+ " "
+ version
+ " "
+ ctx.getResources().getString(
R.string.software_upgrade_text_part_two_upgrade));
}
if (swUpgradeMsgs == com.iwedia.comm.enums.SWUpgradeMsgs.DOWNGRADE) {
alertDialog.setTitleOfAlertDialog(ctx.getResources().getString(
R.string.software_upgrade_text_part_one)
+ " "
+ version
+ " "
+ ctx.getResources().getString(
R.string.software_upgrade_text_part_two_downgrade));
}
if (swUpgradeMsgs == com.iwedia.comm.enums.SWUpgradeMsgs.NO_AVAILABLE_VERSION) {
final A4TVAlertDialog alert = new A4TVAlertDialog(ctx);
alert.setCancelable(true);
alert.setTitleOfAlertDialog(R.string.upgrade_no_new_version);
alert.setPositiveButton(R.string.parental_control_ok,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alert.cancel();
}
});
alert.show();
return;
}
if (swUpgradeMsgs == com.iwedia.comm.enums.SWUpgradeMsgs.NO_ZIP_FILE) {
final A4TVAlertDialog alert = new A4TVAlertDialog(ctx);
alert.setCancelable(true);
alert.setTitleOfAlertDialog(R.string.no_usb);
alert.setPositiveButton(R.string.parental_control_ok,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alert.cancel();
}
});
alert.show();
return;
}
if (swUpgradeMsgs == com.iwedia.comm.enums.SWUpgradeMsgs.INVALID_ZIP) {
final A4TVAlertDialog alert = new A4TVAlertDialog(ctx);
alert.setCancelable(true);
alert.setTitleOfAlertDialog(ctx.getResources().getString(
R.string.upgrade_invalid_zip));
alert.setPositiveButton(R.string.parental_control_ok,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alert.cancel();
}
});
alert.show();
return;
}
alertDialog.setCancelable(false);
// ////////////////////////////////////////////
// OVER NETWORK
// ////////////////////////////////////////////
if (!overUSB) {
alertDialog.setPositiveButton(R.string.button_text_yes,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
/** Upgrade software to new version */
try {
clearSavedData();
MainActivity.service.getSystemControl()
.getAbout().getSoftwareUpdate()
.upgrade();
} catch (Exception e) {
e.printStackTrace();
}
alertDialog.cancel();
}
});
}
// ////////////////////////////////////////////
// USB
// ////////////////////////////////////////////
else {
alertDialog.setPositiveButton(R.string.button_text_yes,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
/** Upgrade software to new version */
try {
clearSavedData();
MainActivity.service.getSystemControl()
.getAbout().getSoftwareUpdate()
.finishUSBUpgrade();
} catch (Exception e) {
e.printStackTrace();
}
alertDialog.cancel();
}
});
}
alertDialog.setNegativeButton(R.string.button_text_no,
new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
alertDialog.cancel();
}
});
alertDialog.show();
}
private void fillViews() {
ISoftwareUpdate softwareUpdate = null;
try {
softwareUpdate = MainActivity.service.getSystemControl().getAbout()
.getSoftwareUpdate();
} catch (Exception e) {
e.printStackTrace();
}
if (softwareUpdate != null) {
String runningVersion = null;
try {
runningVersion = softwareUpdate.getRunnungVersion();
} catch (Exception e) {
e.printStackTrace();
}
if (runningVersion != null) {
buttonManuallyUpgradeCurrentVersion.setText(runningVersion);
}
}
/********* AUTO UPGRADE SWITCH BUTTON **********/
buttonAutoUpgrade.setSelectedStateAndText(false,
R.string.button_text_no);
}
@Override
public void show() {
fillViews();
super.show();
}
/** Check internet connection */
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_UPGRADE: {
if (isOnline()) {
try {
MainActivity.service.getSystemControl().getAbout()
.getSoftwareUpdate().upgradeCheck();
startThread(DOWNLOADING);
} catch (Exception e) {
e.printStackTrace();
}
} else {
A4TVToast toast = new A4TVToast(ctx);
toast.showToast(R.string.no_internet_connection);
}
break;
}
case TV_MENU_SOFTWARE_UPGRADE_SETTINGS_AUTO_UPGRADE: {
/********* AUTO UPGRADE SWITCH BUTTON **********/
buttonAutoUpgrade.setSelectedStateAndText(!v.isSelected(), !v
.isSelected() ? R.string.button_text_yes
: R.string.button_text_no);
break;
}
case TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_USB: {
String usbMountPath = "../..";
File usbRootDir;
String[] filesOnUsbRoot;
boolean upgradeZipFound = false;
if (storage != null) {
if (storage.getUSBStorage(0) == null) {
A4TVToast toast = new A4TVToast(ctx);
toast.showToast(R.string.no_usb);
break;
}
/* TODO: what if there is more than one partition on USB? */
A4TVUSBStorage usbStorage = storage.getUSBStorage(0);
if (usbStorage != null)
usbMountPath = usbMountPath.concat(usbStorage
.getPartitionMountPath(0));
usbRootDir = new File(usbMountPath);
filesOnUsbRoot = usbRootDir.list();
if (filesOnUsbRoot != null)
for (int i = 0; i < filesOnUsbRoot.length; i++) {
/*
* TODO: what is going to be the name of the zip
* file with upgrades? upgrade.zip?
*/
if (filesOnUsbRoot[i].matches("upgrade.zip")) {
upgradeZipFound = true;
break;
}
}
if (upgradeZipFound == false) {
A4TVToast toast = new A4TVToast(ctx);
toast.showToast(R.string.no_usb_zip_file);
break;
}
}
try {
MainActivity.service.getSystemControl().getAbout()
.getSoftwareUpdate().copyUpgradeFWFromUSB();
startThread(CHECKING);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
default:
break;
}
}
@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.tv_menu_software_upgrade_settings);
// auto upgrade******************************************
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_software_upgrade_settings_auto_upgrade);
list.add(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_AUTO_UPGRADE);
contentListIDs.add(list);
// manually upgrade******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_software_upgrade_settings_manually_uprade);
list.add(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE);
contentListIDs.add(list);
// manually upgrade current
// version******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_software_upgrade_settings_manually_uprade_current_version);
list.add(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_CURR_VERSION);
contentListIDs.add(list);
// manually upgrade upgrade******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_software_upgrade_settings_manually_uprade_upgrade);
list.add(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_UPGRADE);
contentListIDs.add(list);
// manually upgrade over USB******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_software_upgrade_settings_manually_uprade_usb);
list.add(TV_MENU_SOFTWARE_UPGRADE_SETTINGS_MANUALLY_UPGRADE_USB);
contentListIDs.add(list);
}
private void clearSavedData() {
Editor editor = MainActivity.getSharedPrefs().edit();
editor.clear();
editor.commit();
MainActivity.getSharedPrefs().edit()
.putBoolean(MainActivity.FIRST_TIME_INSTALL, true).commit();
// Remove widgets
if (MainActivity.activity.getWidgetsHandler() != null) {
MainActivity.activity.getWidgetsHandler().removeAllWidgets();
try {
MainActivity.activity.getWidgetsHandler().saveImportantData();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Start background thread
*/
public void startThread(int checkType) {
Log.d(TAG, "start thread entered");
if (thread == null) {
if (DOWNLOADING == checkType) {
buttonManuallyUpgrade.setText(R.string.downloading);
} else {
buttonManuallyUpgrade.setText(R.string.checking);
}
this.checkType = checkType;
thread = new Thread(run);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
}
/**
* Stops background thread
*/
public void stopThread() {
Log.d(TAG, "stop thread entered");
if (thread != null) {
Thread moribund = thread;
thread = null;
moribund.interrupt();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
buttonManuallyUpgrade.setText("");
}
}, 400);
}
}
public void stopThreadFromCallback() {
Log.d(TAG, "stop thread from callback entered");
if (thread != null
&& buttonManuallyUpgrade.getText().toString()
.contains(ctx.getText(R.string.checking))) {
Thread moribund = thread;
thread = null;
moribund.interrupt();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
buttonManuallyUpgrade.setText("");
}
}, 100);
}
}
}