Android Open Source - DroidUPnP Service Listener






From Project

Back to project page DroidUPnP.

License

The source code is released under:

GNU General Public License

If you think the Android project DroidUPnP listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright (C) 2013 Aurlien Chabot <aurelien@chabot.fr>
 * /*from w  ww. j av  a 2s  .co m*/
 * This file is part of DroidUPNP.
 * 
 * DroidUPNP is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * DroidUPNP is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with DroidUPNP.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.droidupnp.controller.cling;

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;

import org.droidupnp.Main;
import org.droidupnp.model.cling.CDevice;
import org.droidupnp.model.cling.CRegistryListener;
import org.droidupnp.model.mediaserver.ContentDirectoryService;
import org.droidupnp.model.mediaserver.MediaServer;
import org.droidupnp.model.upnp.ICallableFilter;
import org.droidupnp.model.upnp.IRegistryListener;
import org.droidupnp.model.upnp.IServiceListener;
import org.droidupnp.model.upnp.IUpnpDevice;
import org.droidupnp.view.SettingsActivity;
import org.fourthline.cling.android.AndroidUpnpService;
import org.fourthline.cling.model.ValidationException;
import org.fourthline.cling.model.meta.Device;

import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;

@SuppressWarnings("rawtypes")
public class ServiceListener implements IServiceListener
{
  private static final String TAG = "Cling.ServiceListener";

  protected AndroidUpnpService upnpService;
  protected ArrayList<IRegistryListener> waitingListener;

  private MediaServer mediaServer = null;
  private Context ctx = null;

  public ServiceListener(Context ctx)
  {
    waitingListener = new ArrayList<IRegistryListener>();
    this.ctx = ctx;
  }

  @Override
  public void refresh()
  {
    upnpService.getControlPoint().search();
  }

  @Override
  public Collection<IUpnpDevice> getDeviceList()
  {
    ArrayList<IUpnpDevice> deviceList = new ArrayList<IUpnpDevice>();
    if(upnpService != null && upnpService.getRegistry() != null) {
      for (Device device : upnpService.getRegistry().getDevices()) {
        deviceList.add(new CDevice(device));
      }
    }
    return deviceList;
  }

  @Override
  public Collection<IUpnpDevice> getFilteredDeviceList(ICallableFilter filter)
  {
    ArrayList<IUpnpDevice> deviceList = new ArrayList<IUpnpDevice>();
    try
    {
      if(upnpService != null && upnpService.getRegistry() != null) {
        for (Device device : upnpService.getRegistry().getDevices()) {
          IUpnpDevice upnpDevice = new CDevice(device);
          filter.setDevice(upnpDevice);

          if (filter.call())
            deviceList.add(upnpDevice);
        }
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return deviceList;
  }

  protected ServiceConnection serviceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service)
    {
      Log.i(TAG, "Service connexion");
      upnpService = (AndroidUpnpService) service;

      SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx);
      if(sharedPref.getBoolean(SettingsActivity.CONTENTDIRECTORY_SERVICE, true))
      {
        try
        {
          // Local content directory
          if(mediaServer == null)
          {
            mediaServer = new MediaServer(Main.getLocalIpAddress(ctx), ctx);
            mediaServer.start();
          }
          else
          {
            mediaServer.restart();
          }
          upnpService.getRegistry().addDevice(mediaServer.getDevice());
        }
        catch (UnknownHostException e1)
        {
          Log.e(TAG, "Creating demo device failed");
          Log.e(TAG, "exception", e1);
        }
        catch (ValidationException e2)
        {
          Log.e(TAG, "Creating demo device failed");
          Log.e(TAG, "exception", e2);
        }
        catch (IOException e3)
        {
          Log.e(TAG, "Starting http server failed");
          Log.e(TAG, "exception", e3);
        }
      }
      else if(mediaServer != null)
      {
        mediaServer.stop();
        mediaServer = null;
      }

      for (IRegistryListener registryListener : waitingListener)
      {
        addListenerSafe(registryListener);
      }

      // Search asynchronously for all devices, they will respond soon
      upnpService.getControlPoint().search();
    }

    @Override
    public void onServiceDisconnected(ComponentName className)
    {
      Log.i(TAG, "Service disconnected");
      upnpService = null;
    }
  };

  @Override
  public ServiceConnection getServiceConnexion()
  {
    return serviceConnection;
  }

  public AndroidUpnpService getUpnpService()
  {
    return upnpService;
  }

  @Override
  public void addListener(IRegistryListener registryListener)
  {
    Log.d(TAG, "Add Listener !");
    if (upnpService != null)
      addListenerSafe(registryListener);
    else
      waitingListener.add(registryListener);
  }

  private void addListenerSafe(IRegistryListener registryListener)
  {
    assert upnpService != null;
    Log.d(TAG, "Add Listener Safe !");

    // Get ready for future device advertisements
    upnpService.getRegistry().addListener(new CRegistryListener(registryListener));

    // Now add all devices to the list we already know about
    for (Device device : upnpService.getRegistry().getDevices())
    {
      registryListener.deviceAdded(new CDevice(device));
    }
  }

  @Override
  public void removeListener(IRegistryListener registryListener)
  {
    Log.d(TAG, "remove listener");
    if (upnpService != null)
      removeListenerSafe(registryListener);
    else
      waitingListener.remove(registryListener);
  }

  private void removeListenerSafe(IRegistryListener registryListener)
  {
    assert upnpService != null;
    Log.d(TAG, "remove listener Safe");
    upnpService.getRegistry().removeListener(new CRegistryListener(registryListener));
  }

  @Override
  public void clearListener()
  {
    waitingListener.clear();
  }
}




Java Source Code List

fi.iki.elonen.NanoHTTPD.java
fi.iki.elonen.ServerRunner.java
fi.iki.elonen.SimpleWebServer.java
org.droidupnp.DrawerFragment.java
org.droidupnp.Main.java
org.droidupnp.controller.cling.ContentDirectoryCommand.java
org.droidupnp.controller.cling.Factory.java
org.droidupnp.controller.cling.RendererCommand.java
org.droidupnp.controller.cling.ServiceController.java
org.droidupnp.controller.cling.ServiceListener.java
org.droidupnp.controller.upnp.IUpnpServiceController.java
org.droidupnp.controller.upnp.UpnpDebugListener.java
org.droidupnp.model.CObservable.java
org.droidupnp.model.cling.CDevice.java
org.droidupnp.model.cling.CRegistryListener.java
org.droidupnp.model.cling.RendererState.java
org.droidupnp.model.cling.TrackMetadata.java
org.droidupnp.model.cling.UpnpRegistry.java
org.droidupnp.model.cling.UpnpServiceController.java
org.droidupnp.model.cling.UpnpService.java
org.droidupnp.model.cling.didl.ClingAudioItem.java
org.droidupnp.model.cling.didl.ClingDIDLContainer.java
org.droidupnp.model.cling.didl.ClingDIDLItem.java
org.droidupnp.model.cling.didl.ClingDIDLObject.java
org.droidupnp.model.cling.didl.ClingDIDLParentContainer.java
org.droidupnp.model.cling.didl.ClingImageItem.java
org.droidupnp.model.cling.didl.ClingVideoItem.java
org.droidupnp.model.cling.localContent.AlbumContainer.java
org.droidupnp.model.cling.localContent.ArtistContainer.java
org.droidupnp.model.cling.localContent.AudioContainer.java
org.droidupnp.model.cling.localContent.CustomContainer.java
org.droidupnp.model.cling.localContent.DynamicContainer.java
org.droidupnp.model.cling.localContent.ImageContainer.java
org.droidupnp.model.cling.localContent.VideoContainer.java
org.droidupnp.model.mediaserver.ContentDirectoryService.java
org.droidupnp.model.mediaserver.MediaServer.java
org.droidupnp.model.upnp.ARendererState.java
org.droidupnp.model.upnp.CallableContentDirectoryFilter.java
org.droidupnp.model.upnp.CallableRendererFilter.java
org.droidupnp.model.upnp.ContentDirectoryDiscovery.java
org.droidupnp.model.upnp.DeviceDiscovery.java
org.droidupnp.model.upnp.DeviceListener.java
org.droidupnp.model.upnp.ICallableFilter.java
org.droidupnp.model.upnp.IContentDirectoryCommand.java
org.droidupnp.model.upnp.IDeviceDiscoveryObserver.java
org.droidupnp.model.upnp.IFactory.java
org.droidupnp.model.upnp.IRegistryListener.java
org.droidupnp.model.upnp.IRendererCommand.java
org.droidupnp.model.upnp.IRendererState.java
org.droidupnp.model.upnp.IServiceListener.java
org.droidupnp.model.upnp.IUpnpDevice.java
org.droidupnp.model.upnp.IUpnpRegistry.java
org.droidupnp.model.upnp.PeeringConnectionManager.java
org.droidupnp.model.upnp.RendererDiscovery.java
org.droidupnp.model.upnp.didl.DIDLDevice.java
org.droidupnp.model.upnp.didl.IDIDLContainer.java
org.droidupnp.model.upnp.didl.IDIDLItem.java
org.droidupnp.model.upnp.didl.IDIDLObject.java
org.droidupnp.model.upnp.didl.IDIDLParentContainer.java
org.droidupnp.view.ContentDirectoryDeviceFragment.java
org.droidupnp.view.ContentDirectoryDialog.java
org.droidupnp.view.ContentDirectoryEnabler.java
org.droidupnp.view.ContentDirectoryFragment.java
org.droidupnp.view.Content.java
org.droidupnp.view.DIDLObjectDisplay.java
org.droidupnp.view.DeviceDisplay.java
org.droidupnp.view.DeviceFragment.java
org.droidupnp.view.DeviceInfoDialog.java
org.droidupnp.view.PlaylistFragment.java
org.droidupnp.view.RendererDeviceFragment.java
org.droidupnp.view.RendererDialog.java
org.droidupnp.view.RendererFragment.java
org.droidupnp.view.ServiceDiscoveryFragment.java
org.droidupnp.view.SettingsActivity.java
org.droidupnp.view.UpnpDeviceListFragment.java