Skip to content

Commit

Permalink
[BUGFIX 27] Fix service leak by properly close and start service when…
Browse files Browse the repository at this point in the history
… activity is destroy
  • Loading branch information
trishika committed Apr 20, 2013
1 parent fdb369f commit 5bf2c55
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 9 deletions.
10 changes: 9 additions & 1 deletion src/org/droidupnp/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,22 @@ protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Log.d(TAG, "onCreated");
Log.d(TAG, "onCreated : " + savedInstanceState + factory + upnpServiceController);

// Use cling factory
if (factory == null)
factory = new org.droidupnp.controller.cling.Factory();

// Upnp service
if (upnpServiceController == null)
{
upnpServiceController = factory.createUpnpServiceController(this);
}
else
{
Log.i(TAG, "upnp service already exist, just resume it");
upnpServiceController.resume(this);
}

// Attach listener
Fragment contentDirectoryFragment = getFragmentManager().findFragmentById(R.id.ContentDirectoryFragment);
Expand Down Expand Up @@ -113,6 +120,7 @@ public void onPause()
Log.i(TAG, "onPause");
tab = getActionBar().getSelectedNavigationIndex();
getActionBar().removeAllTabs(); // Clear tab onPause, to avoid bug due to use of nested fragment
upnpServiceController.pause();
super.onPause();
}

Expand Down
26 changes: 20 additions & 6 deletions src/org/droidupnp/controller/cling/ServiceController.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,32 @@ public ServiceListener getServiceListener()
return upnpServiceListener;
}

private final Activity activity;
private Activity activity = null;

public ServiceController(Activity activity)
{
super();

upnpServiceListener = new ServiceListener();
resume(activity);
}

@Override
protected void finalize()
{
pause();
}

@Override
public void pause()
{
activity.unbindService(upnpServiceListener.getServiceConnexion());
activity = null;
}

@Override
public void resume(Activity activity)
{
this.activity = activity;

// This will start the UPnP service if it wasn't already started
Expand All @@ -54,9 +73,4 @@ public ServiceController(Activity activity)
Context.BIND_AUTO_CREATE);
}

@Override
protected void finalize()
{
activity.unbindService(upnpServiceListener.getServiceConnexion());
}
}
8 changes: 8 additions & 0 deletions src/org/droidupnp/controller/cling/ServiceListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public void refresh()
upnpService.getControlPoint().search();
}

@Override
public Collection<IUpnpDevice> getDeviceList()
{
ArrayList<IUpnpDevice> deviceList = new ArrayList<IUpnpDevice>();
Expand All @@ -65,6 +66,7 @@ public Collection<IUpnpDevice> getDeviceList()
return deviceList;
}

@Override
public Collection<IUpnpDevice> getFilteredDeviceList(ICallableFilter filter)
{
ArrayList<IUpnpDevice> deviceList = new ArrayList<IUpnpDevice>();
Expand Down Expand Up @@ -161,4 +163,10 @@ private void removeListenerSafe(IRegistryListener registryListener)
Log.d(TAG, "remove listener Safe");
upnpService.getRegistry().removeListener(new CRegistryListener(registryListener));
}

@Override
public void clearListener()
{
waitingListener.clear();
}
}
9 changes: 9 additions & 0 deletions src/org/droidupnp/controller/upnp/IUpnpServiceController.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import org.droidupnp.model.upnp.IServiceListener;
import org.droidupnp.model.upnp.IUpnpDevice;

import android.app.Activity;

public interface IUpnpServiceController {
public void setSelectedRenderer(IUpnpDevice renderer);

Expand All @@ -42,4 +44,11 @@ public interface IUpnpServiceController {
public void delSelectedContentDirectoryObserver(Observer o);

public IServiceListener getServiceListener();

// Pause the service
public void pause();

// Resume the service
public void resume(Activity activity);

}
10 changes: 10 additions & 0 deletions src/org/droidupnp/model/cling/UpnpService.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
import org.fourthline.cling.android.AndroidUpnpServiceConfiguration;
import org.fourthline.cling.android.AndroidUpnpServiceImpl;

import android.content.Intent;
import android.util.Log;

public class UpnpService extends AndroidUpnpServiceImpl {

@Override
Expand All @@ -37,4 +40,11 @@ public int getRegistryMaintenanceIntervalMillis()

};
}

@Override
public boolean onUnbind(Intent intent)
{
Log.d(this.getClass().getName(), "Unbind");
return super.onUnbind(intent);
}
}
2 changes: 2 additions & 0 deletions src/org/droidupnp/model/upnp/IServiceListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public interface IServiceListener {

public void removeListener(IRegistryListener registryListener);

public void clearListener();

public void refresh();

public Collection<IUpnpDevice> getDeviceList();
Expand Down
8 changes: 7 additions & 1 deletion src/org/droidupnp/view/ContentDirectoryDeviceFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,17 @@ protected boolean isSelected(IUpnpDevice device)
return false;
}

@Override
protected void select(IUpnpDevice device)
{
Main.upnpServiceController.setSelectedContentDirectory(device);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
Main.upnpServiceController.setSelectedContentDirectory(list.getItem(position).getDevice());
select(list.getItem(position).getDevice());
Log.d(TAG, "Set contentDirectory to " + list.getItem(position));
}
}
8 changes: 8 additions & 0 deletions src/org/droidupnp/view/ContentDirectoryFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,14 @@ public void onResume()
refresh();
}

@Override
public void onDestroy()
{
Log.i(TAG, "Destroy");
Main.upnpServiceController.delSelectedContentDirectoryObserver(this);
super.onDestroy();
}

public void printCurrentContentDirectoryInfo()
{
Log.i(TAG, "Device : " + Main.upnpServiceController.getSelectedContentDirectory().getDisplayString());
Expand Down
8 changes: 7 additions & 1 deletion src/org/droidupnp/view/RendererDeviceFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ protected boolean isSelected(IUpnpDevice device)
return false;
}

@Override
protected void select(IUpnpDevice device)
{
Main.upnpServiceController.setSelectedRenderer(device);
}

@Override
protected boolean filter(IUpnpDevice device)
{
Expand All @@ -69,7 +75,7 @@ protected void removed(IUpnpDevice d)
public void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
Main.upnpServiceController.setSelectedRenderer(list.getItem(position).getDevice());
select(list.getItem(position).getDevice());
Log.d(TAG, "Set renderer to " + list.getItem(position));
}
}
8 changes: 8 additions & 0 deletions src/org/droidupnp/view/RendererFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@ public void onPause()
super.onPause();
}

@Override
public void onDestroy()
{
Log.i(TAG, "Destroy");
Main.upnpServiceController.delSelectedRendererObserver(this);
super.onDestroy();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
Expand Down
5 changes: 5 additions & 0 deletions src/org/droidupnp/view/ServiceDiscoveryFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ protected boolean isSelected(IUpnpDevice device)
return false;
}

@Override
protected void select(IUpnpDevice device)
{
}

@Override
protected boolean filter(IUpnpDevice device)
{
Expand Down
10 changes: 10 additions & 0 deletions src/org/droidupnp/view/UpnpDeviceListFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ public void run()
position = list.getPosition(d);
getListView().setItemChecked(position, true);

// Reselect device to refresh it
select(d.getDevice());

Log.i(TAG, d.toString() + " is selected at position " + position);
}
}
Expand Down Expand Up @@ -190,6 +193,13 @@ public void run()
*/
protected abstract boolean isSelected(IUpnpDevice d);

/**
* Select a device
*
* @param device
*/
protected abstract void select(IUpnpDevice device);

/**
* Callback when device removed
*
Expand Down

0 comments on commit 5bf2c55

Please sign in to comment.