package org.openhab.habclient.rule; import android.app.ActionBar; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import org.openhab.domain.IOpenHABWidgetControl; import org.openhab.domain.rule.IEntityDataType; import org.openhab.domain.rule.IRuleEditActivity; import org.openhab.domain.rule.IRuleOperationBuildListener; import org.openhab.domain.rule.IRuleProvider; import org.openhab.domain.rule.Rule; import org.openhab.domain.rule.RuleAction; import org.openhab.domain.rule.RuleOperation; import org.openhab.domain.rule.operators.RuleOperator; import org.openhab.domain.user.AccessModifier; import org.openhab.domain.user.User; import org.openhab.habclient.HABApplication; import org.openhab.habclient.dagger.DaggerRuleEditActivityComponent; import org.openhab.habdroid.R; import java.util.HashMap; import java.util.Locale; import javax.inject.Inject; public class RuleEditActivity extends Activity implements IRuleEditActivity, ActionBar.TabListener { private enum RuleActivityMode { OPERATION_EDITOR, ACTION_LIST } private SectionsPagerAdapter mSectionsPagerAdapter; private ViewPager mViewPager; private Rule mRule; private RuleActivityMode mRuleActivityMode; private IRuleOperationBuildListener mRuleOperationBuildListener; private RuleActionDialogFragment.RuleActionBuildListener mRuleActionBuildListener; private IEntityDataType mOperandToEdit; private RuleAction mActionUnderConstruction; private RuleOperation mOperationUnderConstruction; @Inject IOpenHABWidgetControl mWidgetControl; @Inject IRuleProvider mRuleProvider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rule_edit); DaggerRuleEditActivityComponent.builder() .appComponent(((HABApplication)getApplication()).appComponent()) .build() .inject(this); String userId = getIntent().getExtras().getString(User.ARG_USER_ID); String ruleId = getIntent().getExtras().getString(Rule.ARG_RULE_ID); mRule = mRuleProvider.getUserRule(userId, ruleId); if(mRule == null) { mRule = mRuleProvider.createNewRule(userId, AccessModifier.ReadOnly ,"Initial rule name"); mRule.setEnabled(true); } // Set up the action bar. final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager(), this); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.rule_edit_pager); mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); // For each of the sections in the app, add a tab to the action bar. for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { actionBar.addTab( actionBar.newTab() .setText(mSectionsPagerAdapter.getPageTitle(i)) .setTabListener(this)); } } @Override public void onResume() { super.onResume(); Log.d("LifeCy.RuleEditActivity", "onResume()"); } @Override public void onPause() { super.onPause(); Log.d("LifeCy.RuleEditActivity", "onPause()"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.room_config, menu); return true; } @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); } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { mViewPager.setCurrentItem(tab.getPosition()); mRuleActivityMode = tab.getPosition() == 0? RuleActivityMode.OPERATION_EDITOR : RuleActivityMode.ACTION_LIST; setRuleOperationBuildListener((IRuleOperationBuildListener)mSectionsPagerAdapter.getItem(tab.getPosition())); mSectionsPagerAdapter.updateItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } private IEntityDataType getEntityDataBySourceId(String dataSourceId) { if(dataSourceId == null) return null; //TODO - TA: implement return null; } public RuleOperator getOperatorBySourceId(String dataSourceId) { //TODO - TA: implement return null; } @Override public String getRuleName() { return mRule.getName(); } @Override public void setRuleName(String name) { mRule.setName(name); } @Override public Rule getRule() { return mRule; } @Override public void setRule(Rule rule) { mRule = rule; //TODO - TA: Update Table, List and UI } public RuleOperation getOperationByOperandSourceId(String dataSourceId) { HashMap<String, RuleOperation> entityMap = getRule().getRuleOperation().getRuleOperationHash(); return entityMap.get(dataSourceId); } public IRuleOperationBuildListener getRuleOperationBuildListener() { return mRuleOperationBuildListener; } public void setRuleOperationBuildListener(IRuleOperationBuildListener ruleOperationBuildListener) { this.mRuleOperationBuildListener = ruleOperationBuildListener; } public void setActionUnderConstruction(RuleAction action) { mActionUnderConstruction = action; } public RuleAction getActionUnderConstruction() { return mActionUnderConstruction; } public void setRuleActionBuildListener(RuleActionDialogFragment.RuleActionBuildListener listener) { mRuleActionBuildListener = listener; } public RuleActionDialogFragment.RuleActionBuildListener getRuleActionBuildListener() { return mRuleActionBuildListener; } @Deprecated //TODO - TA: Replace this with getOperationToEdit().getOperand(index) public IEntityDataType getOperandToEdit() { return mOperandToEdit; } @Deprecated //TODO - TA: Replace this with getOperationToEdit().setOperand(index, value) public void setOperandToEdit(IEntityDataType operand) { mOperandToEdit = operand; } public void setOperationToEdit(RuleOperation ruleOperation) { mOperationUnderConstruction = ruleOperation; } public RuleOperation getOperationToEdit() { return mOperationUnderConstruction; } public class SectionsPagerAdapter extends FragmentPagerAdapter { private RuleOperationFragment mRuleOperationFragment; private RuleActionFragment mRuleActionFragment; public SectionsPagerAdapter(FragmentManager fm, RuleEditActivity activity) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: if(mRuleOperationFragment == null) mRuleOperationFragment = RuleOperationFragment.newInstance(); mRuleOperationFragment.onUpdateView(); return mRuleOperationFragment; case 1: if(mRuleActionFragment == null) mRuleActionFragment = RuleActionFragment.newInstance(); mRuleActionFragment.onUpdateView(); return mRuleActionFragment; } return null; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.rule_tab_if).toUpperCase(l); case 1: return getString(R.string.rule_tab_then).toUpperCase(l); } return null; } public void updateItem(int position) { switch (position) { case 0: if(mRuleOperationFragment != null) mRuleOperationFragment.onUpdateView(); break; case 1: if(mRuleActionFragment != null) mRuleActionFragment.onUpdateView(); break; } } } }