/*
SettingActivity.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.sphero.setting;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import org.deviceconnect.android.deviceplugin.sphero.BuildConfig;
import org.deviceconnect.android.deviceplugin.sphero.SpheroDeviceService;
import org.deviceconnect.android.deviceplugin.sphero.data.SpheroParcelable;
import org.deviceconnect.android.deviceplugin.sphero.setting.fragment.DeviceSelectionPageFragment;
import org.deviceconnect.android.deviceplugin.sphero.setting.fragment.PairingFragment;
import org.deviceconnect.android.deviceplugin.sphero.setting.fragment.WakeupFragment;
import org.deviceconnect.android.ui.activity.DConnectSettingPageFragmentActivity;
import java.lang.ref.WeakReference;
import java.util.List;
/**
* 設定画面用アクティビティ.
* @author NTT DOCOMO, INC.
*/
public class SettingActivity extends DConnectSettingPageFragmentActivity {
/** Action NameSpace. */
private static final String ACTION_NAMESPACE = SettingActivity.class.getPackage().getName() + ".action";
/**
* 新規に検知したデバイスを追加するアクション.
*/
public static final String ACTION_ADD_DEVICE = ACTION_NAMESPACE + ".ADD_DEVICE";
/**
* 接続済みのデバイスを追加するアクション.
*/
public static final String ACTION_ADD_CONNECTED_DEVICE = ACTION_NAMESPACE + ".ADD_CONNECTED_DEVICE";
/**
* 接続されていないデバイスを追加するアクション.
*/
public static final String ACTION_ADD_FOUNDED_DEVICE = ACTION_NAMESPACE + ".ADD_FOUNDED_DEVICE";
/**
* デバイスを削除するアクション.
*/
public static final String ACTION_REMOVE_DEVICE = ACTION_NAMESPACE + ".REMOVE_DEVICE";
/**
* すべてのデバイスを削除するアクション.
*/
public static final String ACTION_REMOVE_DEVICE_ALL = ACTION_NAMESPACE + ".REMOVE_DEVICE_ALL";
/**
* デバイスを削除するアクション.
*/
public static final String ACTION_CONNECTED = ACTION_NAMESPACE + ".ACTION_CONNECTED";
/**
* デバイスを切断するアクション.
*/
public static final String ACTION_DISCONNECTED = ACTION_NAMESPACE + ".ACTION_DISCONNECTED";
/**
* デバイスを削除するアクション.
*/
public static final String ACTION_DELETED = ACTION_NAMESPACE + ".ACTION_DELETED";
/**
* Extraキー : {@value} .
*/
public static final String EXTRA_DEVICE = "device";
/**
* Extraキー : {@value} .
*/
public static final String EXTRA_IS_CONNECTED = "is_connected";
/**
* Extraキー : {@value} .
*/
public static final String EXTRA_DEVICES = "devices";
/**
* サービスから通知を受けるブロードキャストレシーバ.
*/
private BroadcastReceiver mReceiver;
/**
* デバイス操作のリスナー.
* Fragmentをページングするため、weak参照で持つ。
*/
private WeakReference<DeviceControlListener> mListener;
/**
* ページのクラスリスト.
*/
@SuppressWarnings("rawtypes")
private static final Class[] PAGES = {
WakeupFragment.class,
PairingFragment.class,
DeviceSelectionPageFragment.class,
};
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_ADD_DEVICE);
filter.addAction(ACTION_REMOVE_DEVICE);
filter.addAction(ACTION_REMOVE_DEVICE_ALL);
filter.addAction(ACTION_ADD_CONNECTED_DEVICE);
filter.addAction(ACTION_CONNECTED);
filter.addAction(ACTION_DISCONNECTED);
filter.addAction(ACTION_ADD_FOUNDED_DEVICE);
filter.addAction(ACTION_DELETED);
mReceiver = new ServiceReceiver();
lbm.registerReceiver(mReceiver, filter);
}
@Override
public int getPageCount() {
return PAGES.length;
}
@Override
public Fragment createPage(final int position) {
Fragment page;
try {
page = (Fragment) PAGES[position].newInstance();
} catch (InstantiationException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
page = null;
} catch (IllegalAccessException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
page = null;
}
return page;
}
/**
* 指定されたアクションを投げる.
*
* @param action アクション
*/
private void sendAction(final String action) {
Intent i = new Intent(this, SpheroDeviceService.class);
i.setAction(action);
LocalBroadcastManager.getInstance(this).sendBroadcast(i);
}
/**
* 接続済みのデバイス一覧を取得するブロードキャストを投げる.
*/
public void sendGetConnectedDevicesBroadcast() {
sendAction(SpheroDeviceService.ACTION_GET_CONNECTED);
}
/**
* 接続されていないデバイス一覧を取得するブロードキャストを投げる.
*/
public void sendGetFoundedDevicesBroadcast() {
sendAction(SpheroDeviceService.ACTION_GET_FOUND);
}
/**
* 検知開始のブロードキャストを投げる.
*/
public void sendStartDiscoveryBroadcast() {
sendAction(SpheroDeviceService.ACTION_START_DISCOVERY);
}
/**
* 検知停止のブロードキャストを投げる.
*/
public void sendStopDiscoveryBroadcast() {
sendAction(SpheroDeviceService.ACTION_STOP_DISCOVERY);
}
/**
* 接続のブロードキャストを投げる.
*
* @param serviceId サービスID
*/
public void sendConnectBroadcast(final String serviceId) {
Intent i = new Intent(this, SpheroDeviceService.class);
i.setAction(SpheroDeviceService.ACTION_CONNECT);
i.putExtra(SpheroDeviceService.EXTRA_ID, serviceId);
LocalBroadcastManager.getInstance(this).sendBroadcast(i);
}
/**
* Spheroを削除するブロードキャストを投げる.
* @param serviceId サービスID
*/
public void sendDeleteSpheroBroadcast(final String serviceId) {
Intent i = new Intent(this, SpheroDeviceService.class);
i.setAction(SpheroDeviceService.ACTION_DELETE_DEVICE);
i.putExtra(SpheroDeviceService.EXTRA_ID, serviceId);
LocalBroadcastManager.getInstance(this).sendBroadcast(i);
}
/**
* 接続解除のブロードキャストを投げる.
*
* @param serviceId サービスID
*/
public void sendDisonnectBroadcast(final String serviceId) {
Intent i = new Intent(this, SpheroDeviceService.class);
i.setAction(SpheroDeviceService.ACTION_DISCONNECT);
i.putExtra(SpheroDeviceService.EXTRA_ID, serviceId);
LocalBroadcastManager.getInstance(this).sendBroadcast(i);
}
/**
* リスナーを設定する.
*
* @param listener リスナー
*/
public void setDeviceControlListener(final DeviceControlListener listener) {
mListener = new WeakReference<SettingActivity.DeviceControlListener>(listener);
}
/**
* サービスからのブロードキャストを受け取るレシーバー.
*/
private class ServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if (mListener == null || mListener.get() == null) {
return;
}
String action = intent.getAction();
if (action.equals(ACTION_ADD_DEVICE)) {
SpheroParcelable sd = (SpheroParcelable) intent.getParcelableExtra(EXTRA_DEVICE);
mListener.get().onDeviceFound(sd);
} else if (action.equals(ACTION_ADD_FOUNDED_DEVICE)) {
List<SpheroParcelable> devices = intent.getParcelableArrayListExtra(EXTRA_DEVICES);
for (SpheroParcelable sd : devices) {
mListener.get().onDeviceFound(sd);
}
} else if (action.equals(ACTION_REMOVE_DEVICE)) {
SpheroParcelable sd = (SpheroParcelable) intent.getParcelableExtra(EXTRA_DEVICE);
mListener.get().onDeviceLost(sd);
} else if (action.equals(ACTION_REMOVE_DEVICE_ALL)) {
mListener.get().onDeviceLostAll();
} else if (action.equals(ACTION_ADD_CONNECTED_DEVICE)) {
List<Parcelable> devices = intent.getParcelableArrayListExtra(EXTRA_DEVICES);
mListener.get().onConnectedDevices(devices);
} else if (action.equals(ACTION_CONNECTED)) {
SpheroParcelable sd = (SpheroParcelable) intent.getParcelableExtra(EXTRA_DEVICE);
mListener.get().onDeviceConnected(sd);
} else if (action.equals(ACTION_DISCONNECTED)) {
SpheroParcelable sd = (SpheroParcelable) intent.getParcelableExtra(EXTRA_DEVICE);
mListener.get().onDeviceDisconnected(sd);
} else if (action.equals(ACTION_DELETED)) {
SpheroParcelable sd = (SpheroParcelable) intent.getParcelableExtra(EXTRA_DEVICE);
mListener.get().onDeviceDeleted(sd);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
lbm.unregisterReceiver(mReceiver);
}
/**
* デバイスの検知情報などの通知を受けるリスナー.
*/
public interface DeviceControlListener {
/**
* 接続済みのデバイスを受信した場合に呼び出される.
*
* @param devices 接続済みデバイスの一覧。無い場合は空のリストが渡される。
*/
void onConnectedDevices(List<Parcelable> devices);
/**
* デバイスが見つかった場合に呼び出される.
*
* @param device デバイス
*/
void onDeviceFound(SpheroParcelable device);
/**
* デバイスが消失した場合に呼び出される.
*
* @param device デバイス
*/
void onDeviceLost(SpheroParcelable device);
/**
* すべてのデバイスの消失を通知します.
*/
void onDeviceLostAll();
/**
* デバイスが接続された場合に呼び出される.
*
* @param device デバイス
*/
void onDeviceConnected(SpheroParcelable device);
/**
* デバイスが切断された場合に呼び出される.
*
* @param device デバイス
*/
void onDeviceDisconnected(SpheroParcelable device);
/**
* デバイスが削除された場合に呼び出される.
*
* @param device デバイス
*/
void onDeviceDeleted(SpheroParcelable device);
}
}