package org.deviceconnect.android.uiapp.activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import org.deviceconnect.android.uiapp.DConnectApplication;
import org.deviceconnect.android.uiapp.R;
import org.deviceconnect.android.uiapp.data.DCDevicePlugin;
import org.deviceconnect.android.uiapp.data.DCProfile;
import org.deviceconnect.android.uiapp.data.DCService;
import org.deviceconnect.android.uiapp.utils.Utils;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.DConnectResponseMessage;
import org.deviceconnect.message.DConnectSDK;
import org.deviceconnect.profile.ServiceDiscoveryProfileConstants;
import java.util.ArrayList;
import java.util.List;
public class ServiceListActivity extends BasicActivity {
/**
* サービスリスト.
*/
private ServiceAdapter mServiceAdapter;
/**
* プラグインリスト.
*/
private List<DCDevicePlugin> mPluginList = new ArrayList<>();
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service_list);
mServiceAdapter = new ServiceAdapter();
GridView gridView = (GridView) findViewById(R.id.activity_service_list_grid_view);
if (gridView != null) {
gridView.setAdapter(mServiceAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
openServiceFragment(mServiceAdapter.mServices.get(position));
}
});
}
getSystem(new OnReceivedDevicePluginListener() {
@Override
public void onReceived(final List<DCDevicePlugin> pluginList) {
mPluginList = pluginList;
discoverServices();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_refresh) {
discoverServices();
} else if (id == R.id.action_settings) {
openSettings();
} else if (id == R.id.action_plugins) {
openPluginListActivity();
}
return super.onOptionsItemSelected(item);
}
/**
* サービス一覧を取得する.
*/
private void discoverServices() {
getSDK().serviceDiscovery(new DConnectSDK.OnResponseListener() {
@Override
public void onResponse(final DConnectResponseMessage response) {
if (response.getResult() == DConnectMessage.RESULT_OK) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mServiceAdapter.mServices = generateServiceList(response);
mServiceAdapter.notifyDataSetInvalidated();
}
});
} else {
int errorCode = response.getErrorCode();
switch (DConnectMessage.ErrorCode.getInstance(errorCode)) {
case SCOPE:
case AUTHORIZATION:
case EXPIRED_ACCESS_TOKEN:
case EMPTY_ACCESS_TOKEN:
case NOT_FOUND_CLIENT_ID:
String[] profiles = new String[ DConnectApplication.SCOPES.size()];
DConnectApplication.SCOPES.toArray(profiles);
String appName = getString(R.string.app_name);
getSDK().authorization(appName, profiles, new DConnectSDK.OnAuthorizationListener() {
@Override
public void onResponse(final String clientId, final String accessToken) {
getSDK().setAccessToken(accessToken);
discoverServices();
}
@Override
public void onError(final int errorCode, final String errorMessage) {
}
});
break;
default:
// TODO: エラー処理
break;
}
}
}
});
}
/**
* Device Connect Managerのレスポンスからサービスリストを生成します.
* @param response Device Connect Managerからのレスポンス
* @return サービスリスト
*/
private List<DCService> generateServiceList(final DConnectResponseMessage response) {
List<Object> services = response.getList(ServiceDiscoveryProfileConstants.PARAM_SERVICES);
if (services == null) {
return new ArrayList<>();
}
List<DCService> tempServices = new ArrayList<>();
for (Object obj : services) {
DConnectMessage service = (DConnectMessage) obj;
String id = service.getString(ServiceDiscoveryProfileConstants.PARAM_ID);
String name = service.getString(ServiceDiscoveryProfileConstants.PARAM_NAME);
boolean online = service.getBoolean(ServiceDiscoveryProfileConstants.PARAM_ONLINE);
List<Object> scopes = service.getList(ServiceDiscoveryProfileConstants.PARAM_SCOPES);
String type = service.getString(ServiceDiscoveryProfileConstants.PARAM_TYPE);
DCService tmp = new DCService(id, name);
tmp.setOnline(online);
if (scopes != null) {
for (Object o : scopes) {
tmp.addService(new DCProfile((String) o));
}
}
tmp.setType(type);
tempServices.add(tmp);
}
return tempServices;
}
private void openSettings() {
Intent intent = new Intent();
intent.setClass(this, SettingsActivity.class);
startActivity(intent);
}
private void openServiceFragment(final DCService service) {
Intent intent = new Intent();
intent.setClass(this, ServiceActivity.class);
intent.putExtra("serviceId", service.getId());
intent.putExtra("name", service.getName());
startActivity(intent);
}
private void openPluginListActivity() {
Intent intent = new Intent();
intent.setClass(this, PluginListActivity.class);
startActivity(intent);
}
private String getPackageName(final String serviceId) {
for (DCDevicePlugin plugin : mPluginList) {
if (serviceId.contains(plugin.getId())) {
return plugin.getPackageName();
}
}
return null;
}
private class ServiceAdapter extends BaseAdapter {
private List<DCService> mServices = new ArrayList<>();
@Override
public int getCount() {
return mServices.size();
}
@Override
public Object getItem(final int position) {
return mServices.get(position);
}
@Override
public long getItemId(final int position) {
return position;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = getLayoutInflater().inflate(R.layout.item_service_list, null);
}
DCService service = (DCService) getItem(position);
TextView textView = (TextView) view.findViewById(R.id.item_name);
if (textView != null) {
textView.setText(service.getName());
}
ImageView typeView = (ImageView) view.findViewById(R.id.item_type);
if (typeView != null) {
String type = service.getType();
switch (ServiceDiscoveryProfileConstants.NetworkType.getInstance(type)) {
case WIFI:
setNetworkTypeIcon(typeView, service, R.drawable.wifi_on);
break;
case BLUETOOTH:
case BLE:
setNetworkTypeIcon(typeView, service, R.drawable.bluetooth_on);
break;
case NFC:
setNetworkTypeIcon(typeView, service, R.drawable.nfc_on);
break;
}
}
ImageView imageView = (ImageView) view.findViewById(R.id.item_icon);
if (imageView != null) {
// String packageName = getPackageName(service.getId());
// if (packageName != null) {
// try {
// PackageManager pm = getPackageManager();
// ApplicationInfo app = pm.getApplicationInfo(packageName, 0);
// setIcon(imageView, service, pm.getApplicationIcon(app.packageName));
// } catch (PackageManager.NameNotFoundException e) {
// }
// }
setIcon(imageView, service, getResources().getDrawable(R.drawable.ic_launcher));
}
return view;
}
private void setNetworkTypeIcon(final ImageView imageView, final DCService service, final int resId) {
setIcon(imageView, service, getResources().getDrawable(resId));
}
private void setIcon(final ImageView imageView, final DCService service, final Drawable icon) {
if (icon == null) {
imageView.setVisibility(View.GONE);
return;
}
Drawable newIcon = icon;
if (!service.isOnline()) {
newIcon = Utils.convertToGrayScale(icon);
} else {
newIcon.setColorFilter(null);
}
imageView.setVisibility(View.VISIBLE);
imageView.setImageDrawable(newIcon);
}
}
}