package org.commcare.fragments;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.util.Pair;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import android.widget.Toast;
import org.commcare.activities.CommCareActivity;
import org.commcare.activities.CommCareSetupActivity;
import org.commcare.android.nsd.MicroNode;
import org.commcare.android.nsd.NSDDiscoveryTools;
import org.commcare.android.nsd.NsdServiceListener;
import org.commcare.dalvik.R;
import org.commcare.views.SquareButtonWithText;
import org.commcare.views.dialogs.DialogChoiceItem;
import org.commcare.views.dialogs.PaneledChoiceDialog;
import org.javarosa.core.services.locale.Localization;
import java.util.ArrayList;
/**
* Fragment for choosing app installation mode (barcode or manual install).
*
* @author Daniel Luna (dluna@dimagi.com)
*/
public class SelectInstallModeFragment extends Fragment implements NsdServiceListener {
private View mFetchHubContainer;
private TextView mErrorMessageView;
private ArrayList<MicroNode.AppManifest> mLocalApps = new ArrayList<>();
@Override
public void onResume() {
super.onResume();
NSDDiscoveryTools.registerForNsdServices(this.getContext(), this);
}
@Override
public void onPause() {
super.onPause();
NSDDiscoveryTools.unregisterForNsdServices(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.select_install_mode_fragment, container, false);
TextView setupMsg = (TextView)view.findViewById(R.id.str_setup_message);
setupMsg.setText(Localization.get("install.barcode.top"));
TextView setupMsg2 = (TextView)view.findViewById(R.id.str_setup_message_2);
setupMsg2.setText(Localization.get("install.barcode.bottom"));
SquareButtonWithText scanBarcodeButton = (SquareButtonWithText)view.findViewById(R.id.btn_fetch_uri);
final View barcodeButtonContainer = view.findViewById(R.id.btn_fetch_uri_container);
scanBarcodeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Activity currentActivity = getActivity();
if (currentActivity instanceof CommCareSetupActivity) {
((CommCareSetupActivity)currentActivity).clearErrorMessage();
}
Intent i = new Intent("com.google.zxing.client.android.SCAN");
i.putExtra("SCAN_FORMATS", "QR_CODE");
getActivity().startActivityForResult(i, CommCareSetupActivity.BARCODE_CAPTURE);
} catch (ActivityNotFoundException e) {
Toast.makeText(getActivity(), "No barcode scanner installed on phone!", Toast.LENGTH_SHORT).show();
barcodeButtonContainer.setVisibility(View.GONE);
}
}
});
SquareButtonWithText enterURLButton = (SquareButtonWithText)view.findViewById(R.id.enter_app_location);
enterURLButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SetupEnterURLFragment enterUrl = new SetupEnterURLFragment();
Activity currentActivity = getActivity();
if (currentActivity instanceof CommCareSetupActivity) {
((CommCareSetupActivity)currentActivity).setUiState(CommCareSetupActivity.UiState.IN_URL_ENTRY);
((CommCareSetupActivity)currentActivity).clearErrorMessage();
}
// if we use getChildFragmentManager, we're going to have a crash
FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(SelectInstallModeFragment.this.getId(), enterUrl);
ft.addToBackStack(null);
ft.commit();
}
});
SquareButtonWithText installFromLocal = (SquareButtonWithText)view.findViewById(R.id.btn_fetch_hub);
installFromLocal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Activity currentActivity = getActivity();
if (currentActivity instanceof CommCareSetupActivity) {
showLocalAppDialog();
}
}
});
mErrorMessageView = (TextView)view.findViewById(R.id.install_error_text);
showOrHideErrorMessage();
mFetchHubContainer = view.findViewById(R.id.btn_fetch_hub_container);
InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
return view;
}
private void showLocalAppDialog() {
ContextThemeWrapper wrapper = new ContextThemeWrapper(getContext(), R.style.DialogBaseTheme);
final PaneledChoiceDialog chooseApp = new PaneledChoiceDialog(wrapper,
Localization.get("install.choose.local.app"));
DialogChoiceItem[] items = new DialogChoiceItem[mLocalApps.size()];
int count = 0;
for (final MicroNode.AppManifest app : mLocalApps) {
DialogChoiceItem item = new DialogChoiceItem(app.getName(), -1, new View.OnClickListener() {
@Override
public void onClick(View v) {
Activity currentActivity = getActivity();
if (currentActivity instanceof CommCareSetupActivity) {
((CommCareSetupActivity)currentActivity).onURLChosen(app.getLocalUrl());
}
((CommCareActivity)getActivity()).dismissAlertDialog();
}
});
items[count] = item;
count++;
}
chooseApp.setChoiceItems(items);
((CommCareActivity)getActivity()).showAlertDialog(chooseApp);
}
@Override
public synchronized void onMicronodeDiscovery() {
boolean appsAvailable = false;
mLocalApps = new ArrayList<>();
for (MicroNode node : NSDDiscoveryTools.getAvailableMicronodes()) {
for (MicroNode.AppManifest application : node.getAvailableApplications()) {
mLocalApps.add(application);
appsAvailable = true;
}
}
Activity activity = getActivity();
if (appsAvailable && activity != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mFetchHubContainer.setVisibility(View.VISIBLE);
}
});
}
}
public void showOrHideErrorMessage() {
Activity currentActivity = getActivity();
if (currentActivity instanceof CommCareSetupActivity) {
String msg = ((CommCareSetupActivity) currentActivity).getErrorMessageToDisplay();
if (msg != null && !"".equals(msg)) {
mErrorMessageView.setText(msg);
mErrorMessageView.setVisibility(View.VISIBLE);
} else {
mErrorMessageView.setVisibility(View.GONE);
}
}
}
}