/* DConnectSystemProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager.profile; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.manager.DConnectMessageService; import org.deviceconnect.android.manager.DConnectService; import org.deviceconnect.android.manager.DevicePlugin; import org.deviceconnect.android.manager.DevicePluginManager; import org.deviceconnect.android.manager.R; import org.deviceconnect.android.manager.request.DConnectRequest; import org.deviceconnect.android.manager.request.RemoveEventsRequest; import org.deviceconnect.android.manager.setting.KeywordDialogActivity; import org.deviceconnect.android.manager.setting.SettingActivity; import org.deviceconnect.android.manager.util.DConnectUtil; import org.deviceconnect.android.profile.DConnectProfile; import org.deviceconnect.android.profile.DConnectProfileProvider; import org.deviceconnect.android.profile.SystemProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; import org.deviceconnect.message.intent.message.IntentDConnectMessage; import org.deviceconnect.profile.SystemProfileConstants; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * System プロファイル. * * @author NTT DOCOMO, INC. */ public class DConnectSystemProfile extends SystemProfile { /** プロファイル管理クラス. */ private final DConnectProfileProvider mProvider; /** プラグイン管理クラス. */ private final DevicePluginManager mPluginMgr; /** * コンストラクタ. * * @param provider プロファイル管理クラス * @param pluginMgr プラグイン管理クラス */ public DConnectSystemProfile(final DConnectProfileProvider provider, final DevicePluginManager pluginMgr) { mProvider = provider; mPluginMgr = pluginMgr; addApi(mGetRequest); addApi(mPutKeywordRequest); addApi(mDeleteEvents); } @Override protected Class<? extends Activity> getSettingPageActivity(final Intent request, final Bundle param) { return SettingActivity.class; } private final DConnectApi mGetRequest = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { setResult(response, DConnectMessage.RESULT_OK); setVersion(response, DConnectUtil.getVersionName(getContext())); SharedPreferences sp = getContext().getSharedPreferences(getContext().getPackageName() + "_preferences", Context.MODE_PRIVATE); setName(response, sp.getString(getContext().getString(R.string.key_settings_dconn_name), null)); setUuid(response, sp.getString(getContext().getString(R.string.key_settings_dconn_uuid), null)); // サポートしているプロファイル一覧設定 List<String> supports = new ArrayList<String>(); List<DConnectProfile> profiles = mProvider.getProfileList(); for (int i = 0; i < profiles.size(); i++) { supports.add(profiles.get(i).getProfileName()); } setSupports(response, supports.toArray(new String[supports.size()])); // プラグインの一覧を設定 List<Bundle> plugins = new ArrayList<Bundle>(); List<DevicePlugin> p = mPluginMgr.getDevicePlugins(); for (int i = 0; i < p.size(); i++) { DevicePlugin plugin = p.get(i); String serviceId = mPluginMgr.appendServiceId(plugin, null); Bundle b = new Bundle(); b.putString(PARAM_ID, serviceId); b.putString(PARAM_NAME, plugin.getDeviceName()); b.putString(PARAM_PACKAGE_NAME, plugin.getPackageName()); b.putString(PARAM_VERSION, plugin.getVersionName()); setSupports(b, plugin.getSupportProfiles()); plugins.add(b); } response.putExtra(PARAM_PLUGINS, plugins.toArray(new Bundle[plugins.size()])); return true; } }; private final DConnectApi mPutKeywordRequest = new PutApi() { @Override public String getAttribute() { return SystemProfileConstants.ATTRIBUTE_KEYWORD; } @Override public boolean onRequest(final Intent request, final Intent response) { DConnectRequest req = new DConnectRequest() { /** ロックオブジェクト. */ protected final Object mLockObj = new Object(); /** リクエストコード. */ protected int mRequestCode; @Override public void setResponse(final Intent response) { super.setResponse(response); synchronized (mLockObj) { mLockObj.notifyAll(); } } @Override public boolean hasRequestCode(final int requestCode) { return mRequestCode == requestCode; } @Override public void run() { // リクエストコードを作成する mRequestCode = UUID.randomUUID().hashCode(); // キーワード表示用のダイアログを表示 Intent intent = new Intent(getContext(), KeywordDialogActivity.class); intent.putExtra(IntentDConnectMessage.EXTRA_REQUEST_CODE, mRequestCode); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); // ダイアログからの返答を待つ if (mResponse == null) { waitForResponse(); } // レスポンスを返却 setResult(response, DConnectMessage.RESULT_OK); ((DConnectService) getContext()).sendResponse(request, response); } /** * 各デバイスからのレスポンスを待つ. * * この関数から返答があるのは以下の条件になる。 * <ul> * <li>デバイスプラグインからレスポンスがあった場合 * <li>指定された時間無いにレスポンスが返ってこない場合 * </ul> */ protected void waitForResponse() { synchronized (mLockObj) { try { mLockObj.wait(mTimeout); } catch (InterruptedException e) { // do-nothing } } } }; req.setContext(getContext()); req.setRequest(request); ((DConnectMessageService) getContext()).addRequest(req); return false; } }; private final DConnectApi mDeleteEvents = new DeleteApi() { @Override public String getAttribute() { return SystemProfileConstants.ATTRIBUTE_EVENTS; } @Override public boolean onRequest(final Intent request, final Intent response) { // dConnectManagerに登録されているイベントを削除 String origin = request.getStringExtra(IntentDConnectMessage.EXTRA_ORIGIN); EventManager.INSTANCE.removeEvents(origin); // 各デバイスプラグインにイベントを削除依頼を送る RemoveEventsRequest req = new RemoveEventsRequest(); req.setContext(getContext()); req.setRequest(request); req.setDevicePluginManager(mPluginMgr); ((DConnectMessageService) getContext()).addRequest(req); return false; } }; public static boolean isWakeUpRequest(final Intent request) { String profile = getProfile(request); String inter = getInterface(request); String attribute = getAttribute(request); return PROFILE_NAME.equals(profile) && INTERFACE_DEVICE.equals(inter) && ATTRIBUTE_WAKEUP.equals(attribute); } }