/*
* AndFHEM - Open Source Android application to control a FHEM home automation
* server.
*
* Copyright (c) 2011, Matthias Klass or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU GENERAL PUBLIC LICENSE, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GENERAL PUBLIC LICENSE
* for more details.
*
* You should have received a copy of the GNU GENERAL PUBLIC LICENSE
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package li.klass.fhem.fragments.core;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.support.v4.app.FragmentActivity;
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.ScrollView;
import android.widget.Toast;
import com.google.common.collect.ImmutableSet;
import javax.inject.Inject;
import li.klass.fhem.R;
import li.klass.fhem.adapter.devices.core.DeviceAdapter;
import li.klass.fhem.dagger.ApplicationComponent;
import li.klass.fhem.domain.core.DeviceType;
import li.klass.fhem.domain.core.FhemDevice;
import li.klass.fhem.service.advertisement.AdvertisementService;
import li.klass.fhem.service.graph.gplot.SvgGraphDefinition;
import li.klass.fhem.service.intent.DeviceIntentService;
import li.klass.fhem.service.intent.FavoritesIntentService;
import li.klass.fhem.service.intent.RoomListIntentService;
import li.klass.fhem.service.room.FavoritesService;
import li.klass.fhem.util.FhemResultReceiver;
import li.klass.fhem.util.device.DeviceActionUtil;
import li.klass.fhem.widget.notification.NotificationSettingView;
import static li.klass.fhem.constants.Actions.DEVICE_GRAPH_DEFINITIONS;
import static li.klass.fhem.constants.Actions.DISMISS_EXECUTING_DIALOG;
import static li.klass.fhem.constants.Actions.FAVORITE_ADD;
import static li.klass.fhem.constants.Actions.FAVORITE_REMOVE;
import static li.klass.fhem.constants.Actions.GET_DEVICE_FOR_NAME;
import static li.klass.fhem.constants.Actions.SHOW_EXECUTING_DIALOG;
import static li.klass.fhem.constants.BundleExtraKeys.CONNECTION_ID;
import static li.klass.fhem.constants.BundleExtraKeys.DEVICE;
import static li.klass.fhem.constants.BundleExtraKeys.DEVICE_DISPLAY_NAME;
import static li.klass.fhem.constants.BundleExtraKeys.DEVICE_GRAPH_DEFINITION;
import static li.klass.fhem.constants.BundleExtraKeys.DEVICE_NAME;
import static li.klass.fhem.constants.BundleExtraKeys.DO_REFRESH;
import static li.klass.fhem.constants.BundleExtraKeys.LAST_UPDATE;
import static li.klass.fhem.constants.BundleExtraKeys.RESULT_RECEIVER;
import static li.klass.fhem.constants.ResultCodes.SUCCESS;
public class DeviceDetailFragment extends BaseFragment {
@Inject
FavoritesService favoritesService;
@Inject
AdvertisementService advertisementService;
private String deviceName;
private FhemDevice device;
private String connectionId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
deviceName = args.getString(DEVICE_NAME);
connectionId = args.getString(CONNECTION_ID);
}
@Override
protected void inject(ApplicationComponent applicationComponent) {
applicationComponent.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View superView = super.onCreateView(inflater, container, savedInstanceState);
if (superView != null) return superView;
View view = inflater.inflate(R.layout.device_detail_view, container, false);
advertisementService.addAd(view, getActivity());
return view;
}
@Override
public void update(boolean doUpdate) {
hideEmptyView();
if (doUpdate) getActivity().sendBroadcast(new Intent(SHOW_EXECUTING_DIALOG));
getActivity().startService(new Intent(GET_DEVICE_FOR_NAME)
.setClass(getActivity(), RoomListIntentService.class)
.putExtra(CONNECTION_ID, connectionId)
.putExtra(DO_REFRESH, doUpdate)
.putExtra(DEVICE_NAME, deviceName)
.putExtra(RESULT_RECEIVER, new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
FragmentActivity activity = getActivity();
if (activity == null) return;
activity.sendBroadcast(new Intent(DISMISS_EXECUTING_DIALOG));
if (resultCode == SUCCESS && getView() != null) {
device = (FhemDevice) resultData.getSerializable(DEVICE);
ImmutableSet<SvgGraphDefinition> grapDefinitions = (ImmutableSet<SvgGraphDefinition>) resultData.getSerializable(DEVICE_GRAPH_DEFINITIONS);
long lastUpdate = resultData.getLong(LAST_UPDATE);
if (device == null) return;
DeviceAdapter adapter = DeviceType.getAdapterFor(device);
if (adapter == null) {
return;
}
loadGraphs();
activity.supportInvalidateOptionsMenu();
adapter.attach(DeviceDetailFragment.this.getActivity());
ScrollView scrollView = findScrollView();
if (scrollView != null) {
scrollView.removeAllViews();
scrollView.addView(adapter.createDetailView(activity, device, grapDefinitions, connectionId, lastUpdate));
}
}
}
}));
}
private void loadGraphs() {
getActivity().startService(new Intent(DEVICE_GRAPH_DEFINITIONS)
.setClass(getActivity(), DeviceIntentService.class)
.putExtra(CONNECTION_ID, connectionId)
.putExtra(DEVICE_NAME, deviceName)
.putExtra(RESULT_RECEIVER, new FhemResultReceiver() {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode != SUCCESS
|| getView() == null
|| resultData == null
|| !resultData.containsKey(DEVICE_GRAPH_DEFINITION)) {
return;
}
View detailView = findScrollView().getChildAt(0);
DeviceAdapter adapter = DeviceType.getAdapterFor(device);
if (adapter == null) {
return;
}
ImmutableSet<SvgGraphDefinition> graphs = (ImmutableSet<SvgGraphDefinition>) resultData.get(DEVICE_GRAPH_DEFINITION);
adapter.attachGraphs(getActivity(), detailView, graphs, connectionId, device);
detailView.invalidate();
}
}));
}
private ScrollView findScrollView() {
return (ScrollView) getView().findViewById(R.id.deviceDetailView);
}
@Override
public CharSequence getTitle(Context context) {
String name = getArguments().getString(DEVICE_DISPLAY_NAME);
if (name == null) {
name = getArguments().getString(DEVICE_NAME);
}
return name;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if (device != null) {
inflater.inflate(R.menu.device_menu, menu);
if (favoritesService.isFavorite(deviceName, getActivity())) {
menu.removeItem(R.id.menu_favorites_add);
} else {
menu.removeItem(R.id.menu_favorites_remove);
}
menu.removeItem(R.id.menu_rename);
menu.removeItem(R.id.menu_delete);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_favorites_add:
case R.id.menu_favorites_remove: {
final boolean isAdd = item.getItemId() == R.id.menu_favorites_add;
getActivity().startService(new Intent(isAdd ? FAVORITE_ADD : FAVORITE_REMOVE)
.setClass(getActivity(), FavoritesIntentService.class)
.putExtra(DEVICE, device)
.putExtra(RESULT_RECEIVER, new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode != SUCCESS) return;
Toast.makeText(getActivity(),
isAdd ? R.string.context_favoriteadded : R.string.context_favoriteremoved,
Toast.LENGTH_SHORT).show();
update(false);
}
}));
break;
}
case R.id.menu_room:
DeviceActionUtil.moveDevice(getActivity(), device);
break;
case R.id.menu_alias:
DeviceActionUtil.setAlias(getActivity(), device);
break;
case R.id.menu_notification:
new NotificationSettingView(getActivity(), deviceName).show(getActivity());
break;
default:
return false;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean canChildScrollUp() {
return super.canChildScrollUp() || findScrollView().getScrollY() > 0;
}
}