/* IRKitVirtualDeviceFragment.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.irkit.settings.fragment; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import org.deviceconnect.android.deviceplugin.irkit.IRKitDeviceService; import org.deviceconnect.android.deviceplugin.irkit.R; import org.deviceconnect.android.deviceplugin.irkit.data.IRKitDBHelper; import org.deviceconnect.android.deviceplugin.irkit.data.VirtualDeviceData; import org.deviceconnect.android.deviceplugin.irkit.settings.activity.IRKitVirtualDeviceListActivity; import java.util.ArrayList; import java.util.List; /** * IRKit Virtual Device List fragment. * * @author NTT DOCOMO, INC. */ public class IRKitVirtualDeviceFragment extends Fragment implements IRKitCreateVirtualDeviceDialogFragment.IRKitVirtualDeviceCreateEventListener { /** Adapter. */ private VirtualDeviceAdapter mVirtualDeviceAdapter; /** Devices. */ private List<VirtualDeviceData> mVirtuals; /** サービスID. */ private String mServiceId; /** DB Helper. */ private IRKitDBHelper mDBHelper; /** 削除モードフラグ. */ private boolean mIsRemoved; /** 削除フラグリスト. */ private List<Boolean> mIsRemoves; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); setHasOptionsMenu(true); } @Override public void onCreated() { updateVirtualDeviceList(); } @Override public void onResume() { super.onResume(); mIsRemoved = false; updateVirtualDeviceList(); } /** * サービスID を受け取る. * @param serviceId サービスID */ public void setServiceId(final String serviceId) { mServiceId = serviceId; } /** * IRKitのVirtual Device データを保持する。 * @param device IRKitのVirtual Device データ * @return DeviceContainer */ private VirtualDeviceContainer createContainer(final VirtualDeviceData device) { VirtualDeviceContainer container = new VirtualDeviceContainer(); if (device.getCategoryName().equals("ライト")) { container.setIcon(getResources().getDrawable(R.drawable.light)); } else { container.setIcon(getResources().getDrawable(R.drawable.tv)); } container.setLabel(device.getDeviceName()); container.setIsRemove(false); return container; } /** * IRKitデバイスのリストの取得. * @return IRKitデバイスのリスト. */ private List<VirtualDeviceContainer> createDeviceContainers() { List<VirtualDeviceContainer> containers = new ArrayList<VirtualDeviceContainer>(); mVirtuals = mDBHelper.getVirtualDevicesByServiceId(mServiceId); if (mVirtuals != null) { mIsRemoves = new ArrayList<Boolean>(); for (int i = 0; i < mVirtuals.size(); i++) { mIsRemoves.add(false); } for (VirtualDeviceData device : mVirtuals) { containers.add(createContainer(device)); } } return containers; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { final MenuItem menuItem = menu.add(getString(R.string.menu_close)); menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { if (item.getTitle().equals(menuItem.getTitle())) { getActivity().finish(); } return true; } }); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { IRKitCreateVirtualDeviceDialogFragment.setEventListner(this); mDBHelper = new IRKitDBHelper(getActivity()); mVirtualDeviceAdapter = new VirtualDeviceAdapter(getActivity(), createDeviceContainers()); View rootView = inflater.inflate(R.layout.fragment_virtual_device_list, container, false); final View addLayout = rootView.findViewById(R.id.add_btn); final View deleteLayout = rootView.findViewById(R.id.remove_btn); addLayout.setVisibility(View.VISIBLE); deleteLayout.setVisibility(View.GONE); Button cancelDeviceBtn = (Button) rootView.findViewById(R.id.cancel_virtual_device); cancelDeviceBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { addLayout.setVisibility(View.VISIBLE); deleteLayout.setVisibility(View.GONE); mIsRemoved = false; updateVirtualDeviceList(); } }); Button deleteDeviceBtn = (Button) rootView.findViewById(R.id.remove_virtual_device2); deleteDeviceBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isRemove()) { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); alertBuilder.setTitle(getString(R.string.remove_virtual_device_title)); alertBuilder.setMessage(getString(R.string.remove_virtual_device_message)); alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { removeCheckVirtualDevices(); addLayout.setVisibility(View.VISIBLE); deleteLayout.setVisibility(View.GONE); mIsRemoved = false; updateVirtualDeviceList(); } }); alertBuilder.setNegativeButton("Cancel", null); alertBuilder.create().show(); } else { IRKitCreateVirtualDeviceDialogFragment.showAlert(getActivity(), getString(R.string.remove_virtual_device_title), getString(R.string.remove_virtual_select_device)); updateVirtualDeviceList(); } } }); Button addDeviceBtn = (Button) rootView.findViewById(R.id.add_virtual_device); addDeviceBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { IRKitCategorySelectDialogFragment irkitDialog = IRKitCategorySelectDialogFragment.newInstance(mServiceId); irkitDialog.show(getActivity().getFragmentManager(), "fragment_dialog"); updateVirtualDeviceList(); } }); Button selectDeleteDeviceBtn = (Button) rootView.findViewById(R.id.remove_virtual_device); selectDeleteDeviceBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { addLayout.setVisibility(View.GONE); deleteLayout.setVisibility(View.VISIBLE); mIsRemoved = true; updateVirtualDeviceList(); } }); ListView listView = (ListView) rootView.findViewById(R.id.listview_devicelist); listView.setItemsCanFocus(true); listView.setAdapter(mVirtualDeviceAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { if (mIsRemoved) { CheckBox removeCheck = (CheckBox) view.findViewById(R.id.delete_check); removeCheck.setChecked(!removeCheck.isChecked()); } else { IRKitVirtualDeviceListActivity activity = (IRKitVirtualDeviceListActivity) getActivity(); activity.startApp(IRKitVirtualDeviceListActivity.MANAGE_VIRTUAL_PROFILE_PAGE, mVirtuals.get(position).getServiceId()); } } }); 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 device list. */ public void updateVirtualDeviceList() { if (mVirtualDeviceAdapter == null) { return; } if (getActivity() == null) { return; } getActivity().runOnUiThread(new Runnable() { @Override public void run() { mVirtualDeviceAdapter.clear(); mVirtualDeviceAdapter.addAll(createDeviceContainers()); mVirtualDeviceAdapter.notifyDataSetChanged(); } }); } /** * Virtual Device を削除する. */ private void removeCheckVirtualDevices() { boolean isRemoved = false; for (int i = 0; i < mIsRemoves.size(); i++) { if (mIsRemoves.get(i).booleanValue()) { VirtualDeviceData device = mVirtuals.get(i); isRemoved = mDBHelper.removeVirtualDevice(device.getServiceId()); if (isRemoved) { sendEventOnRemoved(device); } } } if (isRemoved) { IRKitCreateVirtualDeviceDialogFragment.showAlert(getActivity(), getString(R.string.remove_virtual_device_title), getString(R.string.remove_virtual_device_success)); } else { IRKitCreateVirtualDeviceDialogFragment.showAlert(getActivity(), getString(R.string.remove_virtual_device_title), getString(R.string.remove_virtual_device_failure)); } } private void sendEventOnRemoved(final VirtualDeviceData device) { Activity activity = getActivity(); if (activity == null) { return; } Intent intent = new Intent(IRKitDeviceService.ACTION_VIRTUAL_DEVICE_REMOVED); intent.putExtra(IRKitDeviceService.EXTRA_VIRTUAL_DEVICE_ID, device.getServiceId()); LocalBroadcastManager.getInstance(activity).sendBroadcast(intent); } /** * チェックされているかどうかを確認する. */ private boolean isRemove() { boolean isRemoved = false; for (int i = 0; i < mIsRemoves.size(); i++) { if (mIsRemoves.get(i).booleanValue()) { isRemoved = true; break; } } return isRemoved; } /** * VirtualDeviceContainer. */ static class VirtualDeviceContainer { /** ラベル. */ private String mLabel; /** アイコン. */ private Drawable mIcon; /** チェック状態. */ private boolean mIsRemove; /** * デバイスラベルの取得. * * @return デバイスラベル. */ public String getLabel() { return mLabel; } /** * デバイスラベルの設定. * * @param label デバイスラベル. */ public void setLabel(final String label) { if (label == null) { mLabel = "Unknown"; } else { mLabel = label; } } /** * デバイスアイコンの取得. * @return デバイスアイコン */ public Drawable getIcon() { return mIcon; } /** * デバイスアイコンの設定. * @param icon デバイスアイコン */ public void setIcon(final Drawable icon) { mIcon = icon; } /** * デバイスを削除するかどうかを設定する. * @param isRemove true:削除, false: 削除しない */ public void setIsRemove(final boolean isRemove) { mIsRemove = isRemove; } /** * デバイスを削除するかどうかを指定する. * @return 削除するかどうか */ public boolean isRemove() { return mIsRemove; } } /** * VirtualDeviceAdapter. */ private class VirtualDeviceAdapter extends ArrayAdapter<VirtualDeviceContainer> { /** LayoutInflater. */ private LayoutInflater mInflater; /** * コンストラクタ. * * @param context Context. * @param objects DeviceList. */ public VirtualDeviceAdapter(final Context context, final List<VirtualDeviceContainer> 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 = convertView; if (cv == null) { cv = mInflater.inflate(R.layout.item_irkitdevice_list, parent, false); } else { cv = convertView; } final VirtualDeviceContainer device = getItem(position); String name = device.getLabel(); TextView nameView = (TextView) cv.findViewById(R.id.devicelist_package_name); nameView.setText(name); Drawable icon = device.getIcon(); if (icon != null) { ImageView iconView = (ImageView) cv.findViewById(R.id.devicelist_icon); iconView.setImageDrawable(icon); } CheckBox removeCheck = (CheckBox) cv.findViewById(R.id.delete_check); if (mIsRemoved) { removeCheck.setVisibility(View.VISIBLE); removeCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { mIsRemoves.set(position, b); } }); removeCheck.setChecked(device.isRemove()); removeCheck.setFocusable(false); } else { removeCheck.setVisibility(View.GONE); removeCheck.setOnCheckedChangeListener(null); } return cv; } } }