package org.openhab.habclient; import android.app.ActionBar; import android.app.Activity; import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.speech.RecognizerIntent; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import org.openhab.domain.IApplicationModeProvider; import org.openhab.domain.IOpenHABWidgetProvider; import org.openhab.domain.IRestCommunication; import org.openhab.domain.model.OpenHABWidget; import org.openhab.domain.model.OpenHABWidgetType; import org.openhab.domain.command.ICommandAnalyzer; import org.openhab.habclient.dagger.DaggerMainComponent; import org.openhab.habclient.rule.RuleListActivity; import org.openhab.habdroid.R; import java.util.EnumSet; import javax.inject.Inject; public class MainActivity extends Activity implements NavigationDrawerFragment.NavigationDrawerCallbacks { /** * Fragment managing the behaviors, interactions and presentation of the navigation drawer. */ private NavigationDrawerFragment mNavigationDrawerFragment; private UnitPlacementFragment configFragment = null; private RoomFlipperFragment flipperFragment = null; /** * Used to store the last screen title. For use in {@link #restoreActionBar()}. */ private CharSequence mTitle; private static final String mRestRequestTag = "HABClient.MainActivity"; @Inject IRestCommunication mRestCommunication; @Inject IOpenHABWidgetProvider mWidgetProvider; @Inject IApplicationModeProvider mApplicationModeProvider; @Inject ICommandAnalyzer mCommandAnalyzer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_drawer); DaggerMainComponent.builder() .appComponent(((HABApplication) getApplication()).appComponent()) .build() .inject(this); mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.navigation_drawer); mTitle = getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp( R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); mRestCommunication.requestOpenHABSitemap("https://demo.openhab.org:8443/rest/sitemaps/demo", false, "Flipper MainActivity"); } @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getFragmentManager(); if(mRestCommunication != null) { mRestCommunication.requestOpenHABSitemap((String) null, false, mRestRequestTag); //TODO - Run this temporary fix code after REST onSuccess in order to make it work... for (OpenHABWidget widget : mWidgetProvider.getWidgetList(EnumSet.of(OpenHABWidgetType.Group, OpenHABWidgetType.SitemapText))) { if (widget == null) Log.e(HABApplication.getLogTag(), "Got OpenHABWidget = NULL from OpenHABWidgetProvider in " + HABApplication.getLogTag(2)); else if (widget.hasChildren()) mRestCommunication.requestOpenHABSitemap(widget, false, mRestRequestTag); } } switch (position) { case 0: fragmentManager.beginTransaction() .replace(R.id.container, RoomFlipperFragment.newInstance(position + 1)) .commit(); break; case 1: fragmentManager.beginTransaction() .replace(R.id.container, UnitPlacementFragment.newInstance(position + 1)) .commit(); break; case 2: fragmentManager.beginTransaction() .replace(R.id.container, RoomConfigFragment.newInstance()) .commit(); break; default: Intent i = new Intent(this, RuleListActivity.class); startActivity(i); break; } } public void onSectionAttached(int number) { switch (number) { case 1: mTitle = getString(R.string.title_room_flipper); break; case 2: mTitle = getString(R.string.title_unit_placement); break; case 3: mTitle = getString(R.string.title_room_config); break; case 4: mTitle = getString(R.string.title_rule_config); break; } } public void restoreActionBar() { ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); actionBar.setTitle(mTitle); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.global, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void selectNavigationDrawerItem(int itemIndex) { mNavigationDrawerFragment.selectItem(itemIndex); } public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; private RoomFlipper mRoomFlipper; public void startVoiceRecognition(RoomFlipper roomFlipper) { mRoomFlipper = roomFlipper; Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES/*LANGUAGE_MODEL_FREE_FORM*/); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_navigate_rooms)); startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { final HABApplication application = ((HABApplication) getApplication()); mCommandAnalyzer.analyzeRoomNavigation(data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS), mApplicationModeProvider.getAppMode()); // mCommandAnalyzer.analyzeCommand(data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS), mApplicationModeProvider.getAppMode()); super.onActivityResult(requestCode, resultCode, data); } } }