/*
* Copyright (C) 2014 Michell Bak
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.miz.mizuu;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.miz.functions.FileSource;
import com.miz.service.WireUpnpService;
import org.teleal.cling.android.AndroidUpnpService;
import org.teleal.cling.model.meta.Device;
import org.teleal.cling.model.meta.LocalDevice;
import org.teleal.cling.model.meta.RemoteDevice;
import org.teleal.cling.registry.DefaultRegistryListener;
import org.teleal.cling.registry.Registry;
import static com.miz.functions.MizLib.FILESOURCE;
import static com.miz.functions.MizLib.MOVIE;
import static com.miz.functions.MizLib.SERIAL_NUMBER;
import static com.miz.functions.MizLib.SERVER;
import static com.miz.functions.MizLib.TV_SHOW;
import static com.miz.functions.MizLib.TYPE;
public class AddUpnpFilesourceDialog extends Activity {
private ListView mListView;
private boolean isMovie = false;
private AndroidUpnpService upnpService;
private DeviceListRegistryListener deviceListRegistryListener;
private ArrayAdapter<UpnpDevice> deviceListAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.upnp_list);
mListView = (ListView) findViewById(android.R.id.list);
mListView.setEmptyView(findViewById(R.id.progressBar1));
isMovie = getIntent().getExtras().getString("type").equals("movie");
deviceListRegistryListener = new DeviceListRegistryListener();
deviceListAdapter = new ArrayAdapter<UpnpDevice>(this,
android.R.layout.simple_list_item_1);
mListView.setAdapter(deviceListAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), FileSourceBrowser.class);
intent.putExtra(SERIAL_NUMBER, !deviceListAdapter.getItem(arg2).getSerialNumber().isEmpty() ? deviceListAdapter.getItem(arg2).getSerialNumber() : deviceListAdapter.getItem(arg2).getUDNString());
intent.putExtra(SERVER, deviceListAdapter.getItem(arg2).getName());
intent.putExtra(TYPE, isMovie ? MOVIE : TV_SHOW);
intent.putExtra(FILESOURCE, FileSource.UPNP);
startActivity(intent);
finish();
}
});
getApplicationContext().bindService(new Intent(this, WireUpnpService.class), serviceConnection, Context.BIND_AUTO_CREATE);
}
@Override
public void onDestroy() {
super.onDestroy();
if (upnpService != null)
upnpService.getRegistry().removeListener(deviceListRegistryListener);
getApplicationContext().unbindService(serviceConnection);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
upnpService = (AndroidUpnpService) service;
//deviceListAdapter.clear();
for (Device<?, ?, ?> device : upnpService.getRegistry().getDevices()) {
deviceListRegistryListener.deviceAdded(new UpnpDevice(device));
}
// Getting ready for future device advertisements
upnpService.getRegistry().addListener(deviceListRegistryListener);
// Refresh device list
upnpService.getControlPoint().search();
}
public void onServiceDisconnected(ComponentName className) {
upnpService = null;
}
};
public class DeviceListRegistryListener extends DefaultRegistryListener {
@Override
public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
if (device.getType().getNamespace().equals("schemas-upnp-org")
&& device.getType().getType().equals("MediaServer")) {
deviceAdded(new UpnpDevice(device));
}
}
@Override
public void remoteDeviceRemoved(Registry registry, RemoteDevice device) {
deviceRemoved(new UpnpDevice(device));
}
@Override
public void localDeviceAdded(Registry registry, LocalDevice device) {
deviceAdded(new UpnpDevice(device));
}
@Override
public void localDeviceRemoved(Registry registry, LocalDevice device) {
deviceRemoved(new UpnpDevice(device));
}
public void deviceAdded(final UpnpDevice di) {
runOnUiThread(new Runnable() {
public void run() {
int position = deviceListAdapter.getPosition(di);
if (position >= 0) {
deviceListAdapter.remove(di);
deviceListAdapter.insert(di, position);
} else {
deviceListAdapter.add(di);
}
mListView.requestFocus();
}
});
}
public void deviceRemoved(final UpnpDevice di) {
runOnUiThread(new Runnable() {
public void run() {
deviceListAdapter.remove(di);
}
});
}
}
private class UpnpDevice {
private String mFriendlyName, mSerial, mUdn;
public UpnpDevice(Device<?, ?, ?> device) {
mFriendlyName = device.getDetails().getFriendlyName();
mSerial = device.getDetails().getSerialNumber();
mUdn = device.getIdentity().getUdn().toString();
}
@Override
public String toString() {
return mFriendlyName;
}
private String getName() {
return toString();
}
private String getSerialNumber() {
if (mSerial == null)
return "";
return mSerial;
}
private String getUDNString() {
return mUdn;
}
}
}