package com.iwedia.service.scan;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.EnumSet;
import java.util.Timer;
import java.util.TimerTask;
import android.content.SharedPreferences.Editor;
import android.os.RemoteException;
import android.util.Log;
import com.iwedia.comm.IScanCallback;
import com.iwedia.comm.IScanControl;
import com.iwedia.comm.content.Content;
import com.iwedia.comm.content.IContentFilter;
import com.iwedia.comm.content.service.ServiceContent;
import com.iwedia.comm.enums.FilterType;
import com.iwedia.comm.enums.PlaybackDestinationType;
import com.iwedia.comm.enums.ScanSignalType;
import com.iwedia.comm.enums.ServiceListIndex;
import com.iwedia.dtv.route.broadcast.RouteFrontendType;
import com.iwedia.dtv.route.broadcast.RouteInstallSettings;
import com.iwedia.dtv.scan.BandType;
import com.iwedia.dtv.scan.FecType;
import com.iwedia.dtv.scan.Modulation;
import com.iwedia.dtv.scan.Polarization;
import com.iwedia.dtv.scan.ScanInstallStatus;
import com.iwedia.dtv.scan.SignalInfo;
import com.iwedia.dtv.scan.TunerType;
import com.iwedia.dtv.service.Service;
import com.iwedia.dtv.service.ServiceDescriptor;
import com.iwedia.dtv.service.ServiceListFilter;
import com.iwedia.dtv.service.ServiceListFilterSet;
import com.iwedia.dtv.service.ServiceType;
import com.iwedia.dtv.service.SourceType;
import com.iwedia.dtv.types.AnalogEncodingMode;
import com.iwedia.dtv.types.InternalException;
import com.iwedia.service.IWEDIAService;
import com.iwedia.service.content.ContentListControl;
import com.iwedia.service.proxyservice.IDTVInterface;
import com.iwedia.service.storage.ControllerType;
public class ScanControl extends IScanControl.Stub implements IDTVInterface {
private static final String LOG_TAG = "ScanControl";
@SuppressWarnings("unused")
private static TunerType tunerType;
public static int numberOfInstalledRadioServices = 0;
public static int numberOfInstalledTVServices = 0;
public static IScanCallback scanCallback;
private static int scanSignalType;
private static boolean isAutoScan = false;
private static boolean isScanStarted = false;
private static boolean updateList = false;
private static int installRouteId = -1;
private static int tmpLiveRoute = -1;
private static boolean keepChannelList = false;
/**
* Instance of CotnentListControl class {@link ContentListControl}.
*/
private static ContentListControl contentListControl;
/**
* Applies on main display only
*/
private static final int mDisplayId = PlaybackDestinationType.MAIN_LIVE;
public static int isScanFinished = 0;
/**
* Initiate scanning for all services on a complete frequency range.
*
* @param updateList
* Flag that specifies should existing service list be updated with
* new services, or reset before the scan
* @return true if everything is ok, else false`
*/
/**
* Default constructor
*/
public ScanControl() {
isScanStarted = false;
try {
contentListControl = (ContentListControl) IWEDIAService
.getInstance().getDtvManagerProxy().getContentListControl();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public boolean scanAll(int signalType, boolean keepCurrentChannelList) {
// if (isAntennaConnected) {
scanSignalType = signalType;
isScanStarted = true;
isAutoScan = true;
keepChannelList = keepCurrentChannelList;
isScanFinished = 0;
if (IWEDIAService.DEBUG)
Log.e(LOG_TAG, "scanAll (" + signalType + ", "
+ keepCurrentChannelList + ")");
// if false - clear favourite list
try {
if (!keepCurrentChannelList) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "deleting favourite lists");
}
IWEDIAService.getInstance().getStorageManager()
.setActiveController(ControllerType.FAVOURITE_LIST);
IWEDIAService
.getInstance()
.getStorageManager()
.removeContentFromList(
IWEDIAService.getInstance()
.getFavoriteListTableName(), null);
IWEDIAService.getInstance().getStorageManager()
.setActiveController(ControllerType.RECENTLY_LIST);
IWEDIAService
.getInstance()
.getStorageManager()
.removeContentFromList(
IWEDIAService.getInstance()
.getRecentlyListTableName(), null);
}
} catch (Exception e) {
e.printStackTrace();
}
int mainDecoderID = IWEDIAService.getInstance().getDtvManagerProxy()
.getDecoderID(mDisplayId);
setScanType(scanSignalType);
switch (scanSignalType) {
case ScanSignalType.SIGNAL_TYPE_SATTELITE:
tunerType = TunerType.SATTELITE;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDSat();
tmpLiveRoute = IWEDIAService.getInstance().getDtvManagerProxy()
.getLiveRouteIDSat(mainDecoderID);
break;
case ScanSignalType.SIGNAL_TYPE_TERRESTRIAL:
tunerType = TunerType.TERRESTRIAL;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDTer();
tmpLiveRoute = IWEDIAService.getInstance().getDtvManagerProxy()
.getLiveRouteIDTer(mainDecoderID);
break;
case ScanSignalType.SIGNAL_TYPE_CABLE:
tunerType = TunerType.CABLE;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDCab();
tmpLiveRoute = IWEDIAService.getInstance().getDtvManagerProxy()
.getLiveRouteIDCab(mainDecoderID);
break;
case ScanSignalType.SIGNAL_TYPE_IP:
tunerType = TunerType.IP;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getIpInstallRouteID();
break;
}
Service service = IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.getActiveService(
IWEDIAService.getInstance().getDtvManagerProxy()
.getCurrentLiveRoute());
if (service.getServiceIndex() == -1) {
try {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.autoScan(installRouteId);
} catch (InternalException e) {
e.printStackTrace();
try {
scanCallback.errorOccurred();
} catch (RemoteException e1) {
e1.printStackTrace();
}
return false;
}
} else {
try {
IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.stopService(
IWEDIAService.getInstance()
.getDtvManagerProxy()
.getCurrentLiveRoute());
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
startTimerTask();
} catch (InternalException e) {
e.printStackTrace();
}
}
return true;
}
private void startTimerTask() {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "TIMER isScanStarted" + isScanStarted);
}
if (isScanStarted)
if (isAutoScan) {
isScanStarted = false;
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "startScan all: installRoute:"
+ installRouteId);
}
try {
IWEDIAService.getInstance().getDTVManager()
.getScanControl().autoScan(installRouteId);
} catch (InternalException e) {
try {
scanCallback.errorOccurred();
} catch (RemoteException e1) {
e1.printStackTrace();
}
}
} else {
IWEDIAService.getInstance().getDTVManager()
.getScanControl().appendList(updateList);
try {
IWEDIAService.getInstance().getDTVManager()
.getScanControl()
.manualScan(installRouteId);
} catch (InternalException e) {
try {
scanCallback.errorOccurred();
} catch (RemoteException e1) {
e1.printStackTrace();
}
}
}
}
};
Timer timer = new Timer();
timer.schedule(timerTask, 5);
}
/**
* Abort previously started scan.
*
* @return true if everything is ok, else false`
*/
@Override
public boolean abortScan() {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "abortScan");
}
try {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.abortScan(installRouteId);
return true;
} catch (InternalException e) {
return false;
}
}
/**
* Manual scan for desired input params. Depending on signal type, other
* parameters needs to be set for manual scan.
*
* @param signalType
* Type of the signal (cable, terrestrial,satellite or IP)
* @param updateList
* Flag that specifies should existing service list be updated with
* new stations, or reset before the scan
* @return true if everything is ok, else false
*/
@Override
public boolean manualScan(int signalType, boolean keepCurrentChannelList) {
isAutoScan = false;
isScanStarted = true;
updateList = keepCurrentChannelList;
keepChannelList = keepCurrentChannelList;
isScanFinished = 0;
if (IWEDIAService.DEBUG)
Log.e(LOG_TAG, "manualScan (" + signalType + ", "
+ keepCurrentChannelList + ")");
// if false - clear favourite list
if (!keepCurrentChannelList) {
IWEDIAService.getInstance().getStorageManager()
.setActiveController(ControllerType.FAVOURITE_LIST);
IWEDIAService
.getInstance()
.getStorageManager()
.removeContentFromList(
IWEDIAService.getInstance()
.getFavoriteListTableName(), null);
IWEDIAService.getInstance().getStorageManager()
.setActiveController(ControllerType.RECENTLY_LIST);
IWEDIAService
.getInstance()
.getStorageManager()
.removeContentFromList(
IWEDIAService.getInstance()
.getRecentlyListTableName(), null);
}
switch (signalType) {
case ScanSignalType.SIGNAL_TYPE_SATTELITE:
tunerType = TunerType.SATTELITE;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDSat();
break;
case ScanSignalType.SIGNAL_TYPE_TERRESTRIAL:
tunerType = TunerType.TERRESTRIAL;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDTer();
break;
case ScanSignalType.SIGNAL_TYPE_CABLE:
tunerType = TunerType.CABLE;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDCab();
break;
case ScanSignalType.SIGNAL_TYPE_IP:
tunerType = TunerType.IP;
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getIpInstallRouteID();
break;
}
Service service = IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.getActiveService(
IWEDIAService.getInstance().getDtvManagerProxy()
.getCurrentLiveRoute());
if (service.getServiceIndex() == -1) {
try {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.appendList(updateList);
IWEDIAService.getInstance().getDTVManager().getScanControl()
.manualScan(installRouteId);
} catch (InternalException e) {
e.printStackTrace();
try {
scanCallback.errorOccurred();
} catch (RemoteException e1) {
e1.printStackTrace();
}
return false;
}
} else {
try {
IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.stopService(
IWEDIAService.getInstance()
.getDtvManagerProxy()
.getCurrentLiveRoute());
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
startTimerTask();
} catch (InternalException e) {
e.printStackTrace();
}
}
return true;
}
/**
* Sets the LNB type.
*
* @param lnbType
* Index in list of LNB types
* @return true if everything is ok, else false
*/
@Override
public void setLnbType(int lnbType) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setLnbType(lnbType);
}
/**
* Gets the index of current LNB type
*
* @return Index of current LNB type
*/
@Override
public int getLnbType() {
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getLnbType();
}
/**
* Gets the count of LNB types
*
* @return Count of LNB types
*/
@Override
public int getLnbTypeCount() {
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getLnbTypeCount();
}
/**
* Gets the Name of LNB type
*
* @param index
* Index in list of LNB Types
* @return name of the LNB
*/
@Override
public String getLnbName(int index) {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getLnbName(index);
}
/**
* Sets the frequency of LNB oscillator for high band reception.
*
* @param lnbHi
* Frequency of LNB oscillator for high band reception. If LNB has
* only one oscillator this value should be zero.
* @return true if everything is ok, else false
*/
@Override
public void setLnbHigh(int lnbHi) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setLnbHigh(lnbHi);
}
/**
* Gets the frequency of LNB oscillator for high band reception.
*
* @return Frequency of LNB oscillator for high band reception. If LNB has
* only one oscillator the return value should be zero.
*/
@Override
public int getLnbHigh() {
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getLnbHigh();
}
/**
* Sets the frequency of LNB oscillator for low band reception.
*
* @param lnbLo
* Frequency of LNB oscillator for low band reception. If LNB has
* only one oscillator this value should represent frequency of LNB
* oscillator.
* @return true if everything is ok, else false
*/
@Override
public void setLnbLow(int lnbLo) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setLnbLow(lnbLo);
}
/**
* Gets the frequency of LNB oscillator for high band reception.
*
* @return Frequency of LNB oscillator for low band reception. If LNB has
* only one oscillator the return value represents frequency of LNB
* oscillator
*/
@Override
public int getLnbLow() {
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getLnbLow();
}
/**
* Sets the LNB band type.
*
* @param bandType
* LNB band type
* @return true if everything is ok, else false
*/
@Override
public void setLnbBandType(BandType bandType) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setLnbBandType(bandType);
}
/**
* Gets LNB band type
*
* @return LNB band type
*/
@Override
public BandType getLnbBandType() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getLnbBandType();
}
/**
* Sets the frequency of the service for manual scan.
*
* @param frequency
* Frequency of the service for manual scan.
* @return true if everything is ok, else false
*/
@Override
public void setFrequency(int frequency) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "setFrequency:" + frequency);
}
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setFrequency(frequency);
}
/**
* Gets the frequency of the current service.
*
* @return Frequency of the current service.
*/
@Override
public int getFrequency() {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "getFrequency()");
}
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getFrequency();
}
/**
* Sets the symbol rate of the service for manual scan.
*
* @param symbolRate
* Symbol rate of the service for manual scan.
* @return true if everything is ok, else false
*/
@Override
public void setSymbolRate(int symbolRate) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setSymbolRate(symbolRate);
}
/**
* Gets the symbol rate of the current service.
*
* @return Symbol rate of the service
*/
@Override
public int getSymbolRate() {
return (int) IWEDIAService.getInstance().getDTVManager()
.getScanControl().getSymbolRate();
}
/**
* Sets the modulation of the service for manual scan.
*
* @param modulation
* Modulation of the service for manual scan.
* @return true if everything is ok, else false
*/
@Override
public void setModulation(Modulation modulation) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setModulation(modulation);
}
/**
* Gets the modulation of the current service.
*
* @return Modulation of the service
*/
@Override
public Modulation getModulation() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getModulation();
}
/**
* Sets FecType of the service for manual scan.
*
* @param fec
* FecType of the service for manual scan.
* @return true if everything is ok, else false
*/
@Override
public void setFecType(FecType fec) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setFecType(fec);
}
/**
* Gets the FEC of the current service.
*
* @return {@link FEC}
*/
@Override
public FecType getFecType() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getFecType();
}
/**
* Sets the polarization of the service for manual scan.
*
* @param polarization
* Polarization of the service for manual scan
* @return true if everything is ok, else false
*/
@Override
public void setPolarization(Polarization polarization) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setPolarization(polarization);
}
/**
* Gets the polarization of the service.
*
* @return Polarization of the service.
*/
@Override
public Polarization getPolarization() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getPolarization();
}
/**
* Gets signal information.
*
* @return {@link SignalInfo}
*/
@Override
public SignalInfo getSignalInfo() {
SignalInfo info = IWEDIAService
.getInstance()
.getDTVManager()
.getScanControl()
.getSignalInfo(
IWEDIAService.getInstance().getDtvManagerProxy()
.getCurrentLiveRoute());
return info;
}
@Override
public void setScanType(int scanType) {
RouteInstallSettings settings = new RouteInstallSettings();
switch (scanType) {
case ScanSignalType.SIGNAL_TYPE_TERRESTRIAL:
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDTer();
settings.setFrontendType(RouteFrontendType.TER);
break;
case ScanSignalType.SIGNAL_TYPE_CABLE:
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDCab();
settings.setFrontendType(RouteFrontendType.CAB);
break;
case ScanSignalType.SIGNAL_TYPE_SATTELITE:
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDSat();
settings.setFrontendType(RouteFrontendType.SAT);
break;
case ScanSignalType.SIGNAL_TYPE_IP:
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getIpInstallRouteID();
settings.setFrontendType(RouteFrontendType.IP);
break;
case ScanSignalType.SIGNAL_TYPE_ANALOG:
installRouteId = IWEDIAService.getInstance()
.getDtvManagerProxy().getInstallRouteIDAtv();
settings.setFrontendType(RouteFrontendType.ANALOG);
break;
}
IWEDIAService.getInstance().getDTVManager().getBroadcastRouteControl()
.configureInstallRoute(installRouteId, settings);
}
@Override
public int getScanType() {
int scanType = -1;
RouteFrontendType feType;
// By default, use terrestrial install route
if (installRouteId == -1) {
installRouteId = IWEDIAService.getInstance().getDtvManagerProxy()
.getInstallRouteIDTer();
}
RouteInstallSettings settings = IWEDIAService.getInstance()
.getDTVManager().getBroadcastRouteControl()
.getInstallRouteConfiguration(installRouteId);
feType = settings.getFrontendType();
switch (feType.getValue()) {
case 1:
scanType = ScanSignalType.SIGNAL_TYPE_SATTELITE;
break;
case 2:
scanType = ScanSignalType.SIGNAL_TYPE_CABLE;
break;
case 4:
scanType = ScanSignalType.SIGNAL_TYPE_TERRESTRIAL;
break;
case 8:
scanType = ScanSignalType.SIGNAL_TYPE_IP;
break;
}
return scanType;
// return ScanSignalType.SIGNAL_TYPE_TERRESTRIAL;
}
@Override
public void registerCallback(IScanCallback mScanCallback) {
scanCallback = mScanCallback;
}
private static void createServiceLists() {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "creating favourite lists - start");
}
int numberOfServiceLists = 0;
Log.d(LOG_TAG, "createServiceLists:" + numberOfServiceLists);
try {
numberOfServiceLists = (int) IWEDIAService.getInstance()
.getDTVManager().getServiceControl()
.getNumberOfServiceLists();
} catch (Exception e) {
e.printStackTrace();
}
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "numberOfServiceLists:" + numberOfServiceLists);
}
if (numberOfServiceLists != 1) {
if (!keepChannelList) {
deleteFavoriteLists(numberOfServiceLists);
filterServiceLists();
} else {
// switch (tunerType) {
// case TERRESTRIAL:
// deleteFavoriteListByListIndex(serviceIndexTer);
// break;
// case CABLE:
// deleteFavoriteListByListIndex(serviceIndexCab);
// break;
// case SATTELITE:
// deleteFavoriteListByListIndex(serviceIndexSat);
// break;
// default:
// break;
// }
// deleteFavoriteListByListIndex(serviceIndexRadio);
// deleteFavoriteListByListIndex(serviceIndexData);
filterServiceListsByType(tunerType);
}
} else {
// number of service list is 1
filterServiceLists();
}
if (IWEDIAService.WRITE_SERVICE_LISTS_TO_FILE) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "writing service lists to files");
}
writeServiceListsToFiles();
}
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "creating favourite lists - end");
}
}
private static int serviceIndexCab = 0;
private static int serviceIndexSat = 0;
private static int serviceIndexTer = 0;
private static int serviceIndexRadio = 0;
private static int serviceIndexData = 0;
private static int serviceIndexAtv = 0;
private static void filterServiceListsByType(TunerType type) {
try {
switch (type) {
case CABLE:
// serviceIndexCab = IWEDIAService.getInstance()
// .getDTVManager().getServiceControl()
// .createServiceList("DVB_C");
EnumSet<ServiceListFilter> filterDvbC = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_C);
ServiceListFilterSet filterSetDvbC = new ServiceListFilterSet();
filterSetDvbC.setFilter(filterDvbC);
IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.filterServiceList(0, serviceIndexCab,
filterSetDvbC);
break;
case SATTELITE:
// serviceIndexSat = IWEDIAService.getInstance()
// .getDTVManager().getServiceControl()
// .createServiceList("DVB_S");
EnumSet<ServiceListFilter> filterDvbS = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_S);
ServiceListFilterSet filterSetDvbS = new ServiceListFilterSet();
filterSetDvbS.setFilter(filterDvbS);
IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.filterServiceList(0, serviceIndexSat,
filterSetDvbS);
break;
case TERRESTRIAL:
// serviceIndexTer = IWEDIAService.getInstance()
// .getDTVManager().getServiceControl()
// .createServiceList("DVB_T");
EnumSet<ServiceListFilter> filterDvbT = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_T);
ServiceListFilterSet filterSetDvbT = new ServiceListFilterSet();
filterSetDvbT.setFilter(filterDvbT);
IWEDIAService
.getInstance()
.getDTVManager()
.getServiceControl()
.filterServiceList(0, serviceIndexTer,
filterSetDvbT);
break;
default:
break;
}
// serviceIndexRadio = IWEDIAService.getInstance().getDTVManager()
// .getServiceControl().createServiceList("RADIO");
// serviceIndexData = IWEDIAService.getInstance().getDTVManager()
// .getServiceControl().createServiceList("DATA");
/*
* int serviceIndexIp = IWEDIAService.getInstance().getDTVManager()
* .getServiceControl().createServiceList("IP");
*/
Log.e(LOG_TAG, "createFavoriteLists: serviceIndexSat:"
+ serviceIndexSat + ", serviceIndexTer:" + serviceIndexTer
+ ", serviceIndexCab:" + serviceIndexCab
+ ", serviceIndexRadio:" + serviceIndexRadio
+ ", serviceIndexData:" + serviceIndexData);
EnumSet<ServiceListFilter> filterDvbR = EnumSet
.of(ServiceListFilter.RADIO);
EnumSet<ServiceListFilter> filterDvbD = EnumSet
.of(ServiceListFilter.DATA);
/*
* EnumSet<ServiceListFilter> filterDvbI = EnumSet
* .of(ServiceListFilter.IP);
*/
ServiceListFilterSet filterSetDvbR = new ServiceListFilterSet();
ServiceListFilterSet filterSetDvbD = new ServiceListFilterSet();
// ServiceListFilterSet filterSetDvbI = new ServiceListFilterSet();
filterSetDvbR.setFilter(filterDvbR);
filterSetDvbD.setFilter(filterDvbD);
// filterSetDvbI.setFilter(filterDvbI);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexRadio, filterSetDvbR);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexData, filterSetDvbD);
/*
* IWEDIAService.getInstance().getDTVManager().getServiceControl()
* .filterServiceList(0, serviceIndexIp, filterSetDvbI);
*/
} catch (Exception e) {
e.printStackTrace();
}
}
private static void filterServiceLists() {
try {
serviceIndexSat = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("DVB_S");
serviceIndexTer = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("DVB_T");
serviceIndexCab = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("DVB_C");
if (IWEDIAService.isTvPlatform) {
serviceIndexAtv = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("ATV");
}
serviceIndexRadio = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("RADIO");
serviceIndexData = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().createServiceList("DATA");
/*
* int serviceIndexIp = IWEDIAService.getInstance().getDTVManager()
* .getServiceControl().createServiceList("IP");
*/
Log.e(LOG_TAG, "createFavoriteLists: serviceIndexSat:"
+ serviceIndexSat + ", serviceIndexTer:" + serviceIndexTer
+ ", serviceIndexCab:" + serviceIndexCab
+ ", serviceIndexAtv:" + serviceIndexAtv
+ ", serviceIndexRadio:" + serviceIndexRadio
+ ", serviceIndexData:" + serviceIndexData);
EnumSet<ServiceListFilter> filterDvbT = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_T);
EnumSet<ServiceListFilter> filterDvbS = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_S);
EnumSet<ServiceListFilter> filterDvbC = EnumSet.of(
ServiceListFilter.TV, ServiceListFilter.DVB_C);
EnumSet<ServiceListFilter> filterDvbR = EnumSet
.of(ServiceListFilter.RADIO);
EnumSet<ServiceListFilter> filterDvbD = EnumSet
.of(ServiceListFilter.DATA);
/*
* EnumSet<ServiceListFilter> filterDvbI = EnumSet
* .of(ServiceListFilter.IP);
*/
ServiceListFilterSet filterSetDvbT = new ServiceListFilterSet();
ServiceListFilterSet filterSetDvbC = new ServiceListFilterSet();
ServiceListFilterSet filterSetDvbS = new ServiceListFilterSet();
ServiceListFilterSet filterSetDvbR = new ServiceListFilterSet();
ServiceListFilterSet filterSetDvbD = new ServiceListFilterSet();
ServiceListFilterSet filterSetAtv = new ServiceListFilterSet();
// ServiceListFilterSet filterSetDvbI = new ServiceListFilterSet();
filterSetDvbT.setFilter(filterDvbT);
filterSetDvbC.setFilter(filterDvbC);
filterSetDvbS.setFilter(filterDvbS);
filterSetDvbR.setFilter(filterDvbR);
filterSetDvbD.setFilter(filterDvbD);
// filterSetDvbI.setFilter(filterDvbI);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexTer, filterSetDvbT);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexCab, filterSetDvbC);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexSat, filterSetDvbS);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexRadio, filterSetDvbR);
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexData, filterSetDvbD);
if (IWEDIAService.isTvPlatform) {
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.filterServiceList(0, serviceIndexAtv, filterSetAtv);
}
/*
* IWEDIAService.getInstance().getDTVManager().getServiceControl()
* .filterServiceList(0, serviceIndexIp, filterSetDvbI);
*/
} catch (Exception e) {
e.printStackTrace();
}
}
private static void deleteFavoriteLists(int numberOfServiceLists) {
for (int i = numberOfServiceLists - 1; i > 0; i--) {
try {
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.deleteServiceList(i);
} catch (InternalException e) {
e.printStackTrace();
}
}
}
private static void deleteFavoriteListByListIndex(int serviceListIndex) {
try {
IWEDIAService.getInstance().getDTVManager().getServiceControl()
.deleteServiceList(serviceListIndex);
} catch (InternalException e) {
e.printStackTrace();
}
}
private static void writeServiceListsToFiles() {
int numberOfLists = 0;
Log.d(LOG_TAG, "numberOfLists init:" + numberOfLists);
try {
numberOfLists = (int) IWEDIAService.getInstance().getDTVManager()
.getServiceControl().getNumberOfServiceLists();
} catch (Exception e) {
e.printStackTrace();
}
path = IWEDIAService.getInstance().getFilesDir() + "/service_Lists/";
File folder = new File(path);
if (!folder.exists()) {
folder.mkdir();
}
for (int i = 0; i < numberOfLists; i++) {
openFile("serviceList" + i);
int numberOfElementsInServiceList = 0;
Log.d(LOG_TAG, "numberOfLists init:"
+ numberOfElementsInServiceList);
try {
numberOfElementsInServiceList = IWEDIAService.getInstance()
.getDTVManager().getServiceControl()
.getServiceListCount(i);
} catch (Exception e) {
e.printStackTrace();
}
for (int j = 0; j < numberOfElementsInServiceList; j++)
writeToFile(IWEDIAService.getInstance().getDTVManager()
.getServiceControl().getServiceDescriptor(i, j)
.getName());
closeFile();
}
}
private static FileWriter f;
private static String path;
private static void openFile(String fileName) {
try {
f = new FileWriter(path + "/" + fileName + ".txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void writeToFile(String text) {
try {
f.write("\n" + text);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void closeFile() {
try {
f.flush();
f.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void unregisterCallback(IScanCallback arg0) {
scanCallback = null;
IWEDIAService.getInstance().getDTVManager().getScanControl()
.unregisterCallback(ScanControl.getScanCallback());
}
/**
* Get index of the current satellite from satellite list.
*
* @return Returns index of satellite
*/
@Override
public int getCurrentSatelliteIndex() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getSatellite(0);
}
/**
* Get number of satellites.
*
* @return Returns number of satellites
*/
@Override
public int getNumberOfSatellites() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getNumberOfSatellites();
}
/**
* Get name of the satellite with 'satelliteIndex'.
*
* @param satelliteIndex
* Index of the satellite
* @return Returns satellite name
*/
@Override
public String getSatelliteName(int index) {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getSatelliteName(index);
}
/**
* Set the sattelite
*
* @param index
* - index of the sattelite
* @return true if everything is ok, else false
*/
@Override
public void setSatelite(int index) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setSatellite(0, index);
}
@Override
public void channelZapping(boolean status) {
// TODO Auto-generated method stub
}
private static Content getFirstCorrectContent() {
if (IWEDIAService.DEBUG)
Log.e(LOG_TAG, "getFirstCorrectContent");
Content content = null;
try {
int numberOfServices = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().getServiceListCount(0);
if (numberOfServices != 0) {
ServiceDescriptor service = null;
for (int i = 0; i < numberOfServices; i++) {
service = IWEDIAService.getInstance().getDTVManager()
.getServiceControl().getServiceDescriptor(0, i);
if (!(service.getName().contains("Dummy"))) {
content = new ServiceContent(service,
service.getMasterIndex(), 0);
}
if (content != null) {
break;
}
}
} else {
IContentFilter ipStreamContentFilter = IWEDIAService
.getInstance().getDtvManagerProxy()
.getContentListControl()
.getContentFilter(FilterType.IP_STREAM);
if (ipStreamContentFilter.getContentListSize() != 0) {
return ipStreamContentFilter.getContent(0);
}
}
} catch (RemoteException e) {
e.printStackTrace();
}
return content;
}
/**
* Sets the atv system of the service for manual scan.
*
* @param system
* System of the service for manual scan
* @return true if everything is ok, else false
*/
@Override
public void setAnalogEncodingMode(AnalogEncodingMode mode) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setAnalogEncodingMode(0, mode);
}
/**
* Gets the atv system of the service.
*
* @return Atv system of the service.
*/
@Override
public AnalogEncodingMode getAnalogEncodingMode() {
return IWEDIAService.getInstance().getDTVManager().getScanControl()
.getAnalogEncodingMode(0);
}
@Override
public void atvFineTune(int frequency, boolean save) {
try {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.atvFineTune(0, frequency, save);
} catch (InternalException e) {
e.printStackTrace();
}
}
@Override
public void setNetNumber(int netNumber) {
IWEDIAService.getInstance().getDTVManager().getScanControl()
.setNetworkNumber(netNumber);
}
@Override
public void storeNetworkDefaultValues(int NID, int frequency,
int symbolRate, Modulation modulation) {
IWEDIAService
.getInstance()
.getDTVManager()
.getScanControl()
.storeNetworkDefaultValues(NID, frequency, symbolRate,
modulation);
}
private static com.iwedia.dtv.scan.IScanCallback tunerCallback = new com.iwedia.dtv.scan.IScanCallback() {
@Override
public void antennaConnected(int deviceID, boolean success) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "antenna connected callback triggered");
}
if (contentListControl.getChannelsCallbackManager() != null)
try {
contentListControl.getChannelsCallbackManager()
.antennaConnected(deviceID, success);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void installServiceDATANumber(int routeID, int arg0) {
// TODO Auto-generated method stub
}
@Override
public void installServiceRADIOName(int routeID, String name) {
try {
scanCallback.installService(new ServiceContent(name,
ServiceType.DIG_RAD));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void installServiceRADIONumber(int routeID, int number) {
numberOfInstalledRadioServices = number;
}
@Override
public void installServiceTVName(int routeID, String name) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "install service tv:" + name);
}
try {
scanCallback.installService(new ServiceContent(name,
ServiceType.DIG_TV));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void installServiceTVNumber(int routeID, int number) {
numberOfInstalledTVServices = number;
}
@Override
public void scanFinished(int routeID) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "scanFinished-start");
}
if (isScanFinished != 0) {
return;
}
isScanFinished = 1;
Thread thr = new Thread(new Runnable() {
int mainDecoderID = IWEDIAService.getInstance()
.getDtvManagerProxy().getDecoderID(mDisplayId);
@Override
public void run() {
if (IWEDIAService.FAVORITE) {
createServiceLists();
}
// Call 2 times setActiveContent with parameter null, so
// both active and previous
// content are set to null.
contentListControl.setActiveContent(null, mDisplayId);
contentListControl.setActiveContent(null, mDisplayId);
int numberOfServices;
try {
contentListControl.setActiveFilter(FilterType.ALL);
contentListControl.reinitialize();
numberOfServices = IWEDIAService
.getInstance()
.getDtvManagerProxy()
.getServiceControl()
.getServiceListCount(
ServiceListIndex.MASTER_LIST);
if (numberOfServices == 0) {
if (IWEDIAService.DEBUG)
Log.e(LOG_TAG, "numberOfServices: "
+ numberOfServices);
scanCallback.noChannelsFound();
}
if (numberOfServices > 0) {
/**
* Take first service from MW master service list
* and check service type of returned DTV service.
* Service type will be used to manage index of MW
* service list used to initially play service when
* scan finished.
*/
Content content = getFirstCorrectContent();
contentListControl.setActiveFilter(FilterType.ALL);
if (content != null) {
if (IWEDIAService.DEBUG)
Log.e(LOG_TAG, "first correct content:"
+ content.toString());
switch (content.getSourceType()) {
case SAT:
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.setCurrentLiveRoute(
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.getLiveRouteIDSat(
mainDecoderID));
break;
case TER:
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.setCurrentLiveRoute(
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.getLiveRouteIDTer(
mainDecoderID));
break;
case CAB:
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.setCurrentLiveRoute(
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.getLiveRouteIDCab(
mainDecoderID));
break;
case ANALOG:
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.setCurrentLiveRoute(
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.getLiveRouteIDAtv(
mainDecoderID));
break;
default:
IWEDIAService
.getInstance()
.getDtvManagerProxy()
.setCurrentLiveRoute(
tmpLiveRoute);
break;
}
/**
*************************************************************************************
*/
contentListControl.setActiveContent(content,
mDisplayId);
contentListControl
.setCurrentServiceIndex(content
.getIndex());
/**
*************************************************************************************
*/
Editor edit = IWEDIAService.getInstance()
.getPreferenceManager().edit();
edit.putInt("lastServiceIndex",
content.getIndex());
edit.commit();
// ///////////////////////////////////////////////
}
}
contentListControl.startVideoPlayback();
} catch (RemoteException e1) {
e1.printStackTrace();
}
numberOfInstalledRadioServices = 0;
numberOfInstalledTVServices = 0;
// numberOfInstalledDataServices = 0;
isScanStarted = false;
try {
scanCallback.scanFinished();
} catch (RemoteException e) {
e.printStackTrace();
}
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "scanFinished-end");
}
}
});
thr.start();
}
@Override
public void scanNoServiceSpace(int routeID) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "scan no service space");
}
try {
scanCallback.scanNoServiceSpace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void scanProgressChanged(int routeID, int arg0) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "scan progress changed:" + arg0);
}
try {
scanCallback.scanProgressChanged(arg0);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void scanTunFrequency(int routeID, int arg0) {
try {
scanCallback.scanTunFrequency(arg0);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void signalBer(int routeID, int arg0) {
try {
scanCallback.signalBer(arg0);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void installServiceDATAName(int routeID, String name) {
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "install service data:" + name);
}
try {
scanCallback.installService(new ServiceContent(name,
ServiceType.DATA_BROADCAST));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void signalQuality(int routeID, int arg0) {
try {
scanCallback.signalQuality(arg0);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void signalStrength(int routeID, int arg0) {
try {
scanCallback.signalStrength(arg0);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void networkChanged(int networkId) {
try {
contentListControl.getChannelsCallbackManager().networkChanged(
networkId);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void sat2ipServerDropped(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void triggerStatus(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void installStatus(ScanInstallStatus arg0) {
// TODO Auto-generated method stub
}
};
public static com.iwedia.dtv.scan.IScanCallback getScanCallback() {
return tunerCallback;
}
}