package org.commcare.activities.components; import android.app.Activity; import android.content.Intent; import android.view.View; import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import org.commcare.CommCareApplication; import org.commcare.activities.CommCareActivity; import org.commcare.activities.HomeScreenBaseActivity; import org.commcare.adapters.MenuAdapter; import org.commcare.dalvik.R; import org.commcare.fragments.BreadcrumbBarFragment; import org.commcare.google.services.ads.AdLocation; import org.commcare.google.services.ads.AdMobManager; import org.commcare.session.SessionFrame; import org.commcare.suite.model.Entry; import org.commcare.suite.model.Menu; public class MenuList implements AdapterView.OnItemClickListener { protected CommCareActivity activity; protected AdapterView<ListAdapter> adapterView; protected MenuAdapter adapter; private boolean beingUsedInHomeScreen; private TextView header; /** * Injects a list (or grid) of CommCare modules/forms for the given menu id into the UI of * the given activity */ public static MenuList setupMenuViewInActivity(CommCareActivity activity, String menuId, boolean useGridMenu, boolean beingUsedInHomeScreen) { MenuList menuView; if (useGridMenu) { menuView = new MenuGrid(); } else { menuView = new MenuList(); } menuView.setupMenuInActivity(activity, menuId); menuView.beingUsedInHomeScreen = beingUsedInHomeScreen; return menuView; } public int getLayoutFileResource() { return R.layout.screen_suite_menu; } private void setupMenuInActivity(CommCareActivity activity, String menuId) { this.activity = activity; activity.setContentView(getLayoutFileResource()); initViewAndAdapter(menuId); setupAdapter(); requestBannerAd(); } protected void requestBannerAd() { AdMobManager.requestBannerAdForView(activity, (FrameLayout)activity.findViewById(R.id.ad_container), AdLocation.MenuList); } protected void initViewAndAdapter(String menuId) { adapterView = (ListView)activity.findViewById(R.id.screen_suite_menu_list); adapter = new MenuAdapter(activity, CommCareApplication.instance().getCommCarePlatform(), menuId); // in menu list only, we add a header if (header == null) { header = (TextView)activity.getLayoutInflater().inflate(R.layout.menu_list_header, null); } String subHeaderTitle = BreadcrumbBarFragment.getBestSubHeaderTitle(); if (subHeaderTitle != null) { header.setText(subHeaderTitle); // header must not be clickable ((ListView)adapterView).addHeaderView(header, null, false); } } protected void setupAdapter() { adapter.showAnyLoadErrors(activity); adapterView.setOnItemClickListener(this); adapterView.setAdapter(adapter); } public void refreshItems() { adapter.notifyDataSetChanged(); adapterView.setAdapter(adapter); } /** * Stores the path of selected form and finishes. */ @Override public void onItemClick(AdapterView listView, View view, int position, long id) { Object value = listView.getAdapter().getItem(position); if (value == null) { // Probably means that we clicked on the header view, so just ignore it return; } String commandId; if (value instanceof Entry) { commandId = ((Entry)value).getCommandId(); } else { commandId = ((Menu)value).getId(); } Intent i = new Intent(activity.getIntent()); i.putExtra(SessionFrame.STATE_COMMAND_ID, commandId); if (beingUsedInHomeScreen) { // If this MenuList is on our home screen, that means we can't finish() here because we // are already in our home activity. Instead, just manually launch the same code path // that would have been initiated by onActivityResult of HomeScreenBaseActivity HomeScreenBaseActivity homeActivity = (HomeScreenBaseActivity)activity; if (homeActivity.processReturnFromGetCommand(Activity.RESULT_OK, i)) { homeActivity.startNextSessionStepSafe(); } } else { activity.setResult(Activity.RESULT_OK, i); activity.finish(); } } }