package org.openhab.habclient;
/**
* Created by Tony Alpskog in 2013.
*/
import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
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.TextView;
import org.openhab.domain.IApplicationModeProvider;
import org.openhab.domain.INotificationHost;
import org.openhab.domain.INotificationSender;
import org.openhab.domain.IOpenHABWidgetProvider;
import org.openhab.domain.IRestCommunication;
import org.openhab.domain.IRoomProvider;
import org.openhab.domain.command.ICommandAnalyzer;
import org.openhab.domain.model.ApplicationMode;
import org.openhab.domain.model.Room;
import org.openhab.domain.model.RoomConfigEvent;
import org.openhab.domain.model.SitemapUpdateEvent;
import org.openhab.domain.user.User;
import org.openhab.habclient.dagger.DaggerRoomFlipperComponent;
import org.openhab.habclient.rule.RuleListActivity;
import org.openhab.habdroid.R;
import org.openhab.habdroid.ui.OpenHABMainActivity;
import javax.inject.Inject;
import de.greenrobot.event.EventBus;
/**
* A placeholder fragment containing a simple view.
*/
public class RoomFlipperFragment extends Fragment implements RoomFlipper.OnRoomShiftListener, ICommandAnalyzer.OnShowRoomListener {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
final String TAG = "RoomFlipperFragment";
private RoomFlipper mRoomViewFlipper;
private TextView mRoomLabel;
@Inject INotificationHost mNotificationHost;
@Inject INotificationSender mNotificationSender;
@Inject ICommandAnalyzer mSpeechResultAnalyzer;
@Inject IRoomProvider mRoomProvider;
@Inject IApplicationModeProvider mApplicationModeProvider;
@Inject IRoomDataContainer mRoomDataContainer;
@Inject IRoomImageProvider mRoomImageProvider;
@Inject IRestCommunication mRestCommunication;
@Inject IOpenHABWidgetProvider mWidgetProvider;//TODO - temporary
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static RoomFlipperFragment newInstance(int sectionNumber) {
RoomFlipperFragment fragment = new RoomFlipperFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public RoomFlipperFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerRoomFlipperComponent.builder()
.appComponent(((HABApplication) getActivity().getApplication()).appComponent())
.build()
.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_room_flipper, container, false);
mRoomLabel = (TextView) rootView.findViewById(R.id.room_flipper_section_label);
mRoomViewFlipper = (RoomFlipper) rootView.findViewById(R.id.flipper);
mRoomViewFlipper.setDisplayedChild(0);//Show middle image as initial image
mRoomViewFlipper.setGestureListener(new GestureListener(rootView, true));
mRoomViewFlipper.setOnRoomShiftListener(this);
mRoomViewFlipper.setRoomFlipperAdapter(new RoomFlipperAdapter(mRoomDataContainer.getFlipperRoom(), mRoomImageProvider));
mRoomLabel.setText(getRoomLabel());
setHasOptionsMenu(true);
mSpeechResultAnalyzer.setOnShowRoomListener(this);
EventBus.getDefault().register(this);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER));
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//TODO - Create dynamic menu
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.room_flipper_default, menu);
//menu.findItem(R.id.action_remove).setVisible()
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_edit_room_from_flipper:
Room roomToEdit = mRoomDataContainer.getFlipperRoom();
Log.d("Edit Room", "onOptionsItemSelected() - Edit room action on room<" + roomToEdit.getId() + ">");
mRoomDataContainer.setConfigRoom(roomToEdit);
Intent intent = new Intent(getActivity(), RoomConfigActivity.class);
startActivity(intent);
// ((MainActivity) getActivity()).selectNavigationDrawerItem(2);//TODO - Use enum as fragment identifier.
return true;
case R.id.action_add_room_from_flipper:
Log.d("Add Room", "onOptionsItemSelected() - Add room");
mRoomDataContainer.setConfigRoom(mRoomProvider.createNewRoom());
intent = new Intent(getActivity(), RoomConfigActivity.class);
startActivity(intent);
// ((MainActivity) getActivity()).selectNavigationDrawerItem(2);//TODO - Use enum as fragment identifier.
return true;
case R.id.action_speak_room_from_flipper:
Intent broadcastIntent = new Intent("Wear_Command");
broadcastIntent.putExtra("Wear_Command", "get kitchen temperature");
broadcastIntent.putExtra("Android_Wear_Conversation_Id", 0);
((MainActivity) getActivity()).sendBroadcast(broadcastIntent);
// ((MainActivity) getActivity()).startVoiceRecognition(mRoomViewFlipper);
return true;
case R.id.action_go_to_list_view:
// Get launch intent for application
Intent widgetListIntent = new Intent(getActivity().getApplicationContext(), OpenHABMainActivity.class);
widgetListIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
widgetListIntent.setAction("SHOW_PAGE_AS_LIST");//TODO - Centralize this parameter
try {
widgetListIntent.putExtra("pageUrl", "openhab://sitemaps/demo/" + mRoomDataContainer.getFlipperRoom().getRoomWidget().getLinkedPage().getId());
} catch (NullPointerException e) {
return true;//Probably because no OpenHAB group was attached to the room.
}
// Start launch activity
getActivity().startActivity(widgetListIntent);
return true;
case R.id.action_start_wear_app:
mNotificationSender.startSession("OpenHAB", mWidgetProvider.getWidgetByItemName("Light_GF_Kitchen_Ceiling"), "Kitchen Dishwasher leakage detected");
mNotificationSender.startSession("Person", new User(), "Hi, this is a test message");
mNotificationSender.startSession("Person", new User(), "Hi, this is another message");
return true;
case R.id.action_open_rules:
Intent i = new Intent(getActivity(), RuleListActivity.class);
startActivity(i);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onResume() {
super.onResume();
mApplicationModeProvider.setAppMode(ApplicationMode.RoomFlipper);
mRoomLabel.setText(getRoomLabel());
mRoomViewFlipper.getCurrentUnitContainer().redrawAllUnits();
mNotificationHost.registerReceivers();
requestRemoteRoomUpdate();
}
@Override
public void onPause() {
super.onPause();
// mNotificationSender.unregisterReceivers();
cancelRemoteRoomUpdate();
}
@Override
public boolean onRoomShift(Gesture gesture, Room room) {
Log.d("Flip Room", "onRoomShift() - Shifted to room<" + room.getId() + ">");
mRoomDataContainer.setFlipperRoom(room);
mRoomLabel.setText(getRoomLabel());
requestRemoteRoomUpdate();
return false;
}
private String getRoomLabel() {
if(mRoomDataContainer.getFlipperRoom().getRoomWidget() == null)
return this.getString(R.string.missing_openhab_group_for_room);
return mRoomDataContainer.getFlipperRoom().getName();
}
private void requestRemoteRoomUpdate() {
cancelRemoteRoomUpdate();
if(mRoomDataContainer.getFlipperRoom() != null) {
mRestCommunication.requestOpenHABSitemap(mRoomDataContainer.getFlipperRoom().getRoomWidget(), false, TAG);
mRestCommunication.requestOpenHABSitemap(mRoomDataContainer.getFlipperRoom().getRoomWidget(), true, TAG);//used
}
}
private void cancelRemoteRoomUpdate() {
mRestCommunication.cancelRequests(TAG);
}
@Override
public void onShowRoom(Room room) {
mRoomViewFlipper.showRoom(room);
}
public void onEvent(SitemapUpdateEvent updateEvent){
if(updateEvent.isUpdateFinished())
mRoomViewFlipper.getCurrentUnitContainer().redrawAllUnits();
}
public void onEvent(RoomConfigEvent roomConfigEvent){
if(mRoomViewFlipper.getCurrentUnitContainer().getRoom().equals(roomConfigEvent.getRoom()) && roomConfigEvent.getEventType() == RoomConfigEvent.EventType.ConfigurationChanged)
mRoomViewFlipper.getCurrentUnitContainer().setRoom(roomConfigEvent.getRoom());//Force an update.
}
}