/*
DevicePluginListFragment.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.manager.setting;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import org.deviceconnect.android.manager.BuildConfig;
import org.deviceconnect.android.manager.DConnectApplication;
import org.deviceconnect.android.manager.DevicePlugin;
import org.deviceconnect.android.manager.DevicePluginManager;
import org.deviceconnect.android.manager.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Device plug-in list fragment.
*
* @author NTT DOCOMO, INC.
*/
public class DevicePluginListFragment extends Fragment {
/** Adapter. */
private PluginAdapter mPluginAdapter;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onResume() {
super.onResume();
updatePluginList();
}
/**
* Create a PluginContainer from Device Plug-in.
* @param pm PackageManager.
* @param plugin ApplicationInfo.
* @return Instance of DeviceContainer
*/
private PluginContainer createContainer(final PackageManager pm, final DevicePlugin plugin) {
PluginContainer container = new PluginContainer();
container.setLabel(plugin.getDeviceName());
container.setPluginId(plugin.getPluginId());
container.setIcon(plugin.getPluginIcon());
container.setVersion(plugin.getVersionName());
return container;
}
/**
* Create a list of plug-in.
* @return list of plug-in.
*/
private List<PluginContainer> createPluginContainers() {
List<PluginContainer> containers = new ArrayList<>();
PackageManager pm = getActivity().getPackageManager();
DConnectApplication app = (DConnectApplication) getActivity().getApplication();
DevicePluginManager manager = app.getDevicePluginManager();
for (DevicePlugin plugin : manager.getDevicePlugins()) {
try {
ApplicationInfo info = pm.getApplicationInfo(plugin.getPackageName(), 0);
containers.add(createContainer(pm, plugin));
} catch (PackageManager.NameNotFoundException e) {
continue;
}
}
Collections.sort(containers, new Comparator<PluginContainer>() {
@Override
public int compare(final PluginContainer o1, final PluginContainer o2) {
String a = o1.getLabel();
String b = o2.getLabel();
return a.compareTo(b);
}
});
return containers;
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
mPluginAdapter = new PluginAdapter(getActivity(), createPluginContainers());
View rootView = inflater.inflate(R.layout.fragment_devicepluginlist, container, false);
ListView listView = (ListView) rootView.findViewById(R.id.listview_pluginlist);
listView.setAdapter(mPluginAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
openDevicePluginInformation(mPluginAdapter.getItem(position));
}
});
return rootView;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (android.R.id.home == item.getItemId()) {
getActivity().finish();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Update plug-in list.
*/
public void updatePluginList() {
if (mPluginAdapter == null) {
return;
}
if (getActivity() == null) {
return;
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mPluginAdapter.clear();
mPluginAdapter.addAll(createPluginContainers());
mPluginAdapter.notifyDataSetChanged();
}
});
}
/**
* Open device plug-in information activity.
*
* @param container plug-in container
*/
private void openDevicePluginInformation(final PluginContainer container) {
Intent intent = new Intent();
intent.setClass(getActivity(), DevicePluginInfoActivity.class);
intent.putExtra(DevicePluginInfoActivity.PLUGIN_ID, container.getPluginId());
startActivity(intent);
}
/**
* PluginContainer class.
*/
static class PluginContainer {
/** Label. */
private String mLabel;
/** Plug-in Id. */
private String mPluginId;
/** Version. */
private String mVersion;
/** Icon. */
private Drawable mIcon;
/**
* Get plug-in Label.
*
* @return Plug-in label.
*/
public String getLabel() {
return mLabel;
}
/**
* Set plug-in label.
*
* @param label Plug-in label.
*/
public void setLabel(final String label) {
if (label == null) {
mLabel = "Unknown";
} else {
mLabel = label;
}
}
/**
* Get plug-in id.
*
* @return Plug-in id.
*/
public String getPluginId() {
return mPluginId;
}
/**
* Set plug-in id.
*
* @param pluginId Plug-in id.
*/
public void setPluginId(final String pluginId) {
mPluginId = pluginId;
}
/**
* Get plug-in version.
*
* @return Plug-in version
*/
public String getVersion() {
return mVersion;
}
/**
* Set plug-in version.
*
* @param version Plug-in version
*/
public void setVersion(final String version) {
mVersion = version;
}
/**
* Get plug-in icon.
* @return icon
*/
public Drawable getIcon() {
return mIcon;
}
/**
* Set plug-in icon.
* @param icon plug-in icon
*/
public void setIcon(final Drawable icon) {
mIcon = icon;
}
}
/**
* PluginAdapter class.
*/
private class PluginAdapter extends ArrayAdapter<PluginContainer> {
/** LayoutInflater. */
private LayoutInflater mInflater;
/**
* Constructor.
*
* @param context Context.
* @param objects Plug-in list object.
*/
public PluginAdapter(final Context context, final List<PluginContainer> objects) {
super(context, 0, objects);
mInflater = (LayoutInflater) context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
View cv;
if (convertView == null) {
cv = mInflater.inflate(R.layout.item_deviceplugin_list, parent, false);
} else {
cv = convertView;
}
final PluginContainer plugin = getItem(position);
String name = plugin.getLabel();
TextView nameView = (TextView) cv.findViewById(R.id.devicelist_package_name);
nameView.setText(name);
Drawable icon = plugin.getIcon();
if (icon != null) {
ImageView iconView = (ImageView) cv.findViewById(R.id.devicelist_icon);
iconView.setImageDrawable(icon);
}
String version = plugin.getVersion();
TextView versionView = (TextView) cv.findViewById(R.id.devicelist_version);
versionView.setText(getString(R.string.activity_devicepluginlist_version) + version);
return cv;
}
}
}