package com.lechucksoftware.proxy.proxysettings.ui.fragments;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.text.Editable;
import android.text.TextWatcher;
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.RelativeLayout;
import android.widget.ScrollView;
import com.lechucksoftware.proxy.proxysettings.App;
import com.lechucksoftware.proxy.proxysettings.R;
import com.lechucksoftware.proxy.proxysettings.constants.Requests;
import com.lechucksoftware.proxy.proxysettings.db.PacEntity;
import com.lechucksoftware.proxy.proxysettings.tasks.AsyncDeleteProxy;
import com.lechucksoftware.proxy.proxysettings.tasks.AsyncSaveProxy;
import com.lechucksoftware.proxy.proxysettings.tasks.AsyncUpdateLinkedWiFiAP;
import com.lechucksoftware.proxy.proxysettings.ui.activities.MasterActivity;
import com.lechucksoftware.proxy.proxysettings.ui.base.BaseDialogFragment;
import com.lechucksoftware.proxy.proxysettings.ui.components.InputField;
import com.lechucksoftware.proxy.proxysettings.ui.dialogs.UpdateLinkedWifiAPAlertDialog;
import com.lechucksoftware.proxy.proxysettings.utils.UIUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import be.shouldit.proxy.lib.ProxyStatusItem;
import be.shouldit.proxy.lib.enums.ProxyStatusProperties;
import be.shouldit.proxy.lib.utils.ProxyUtils;
import timber.log.Timber;
public class PacDetailFragment extends BaseDialogFragment
{
public static PacDetailFragment instance;
public static final String TAG = PacDetailFragment.class.getSimpleName();
// Arguments
private static final String SELECTED_PAC_ARG = "SELECTED_PAC_ARG";
private boolean saveEnabled;
private boolean deleteEnabled;
private InputField pacUrlFile;
private Long selectedPacId;
private PacEntity selectedPac;
private UIHandler uiHandler;
private RelativeLayout proxyInUseBanner;
private RelativeLayout proxyDuplicatedBanner;
private ScrollView proxyScrollView;
private Map<ProxyStatusProperties,CharSequence> validationErrors;
public static PacDetailFragment newInstance(Long pacId)
{
PacDetailFragment instance = new PacDetailFragment();
Bundle args = new Bundle();
args.putSerializable(SELECTED_PAC_ARG, pacId);
instance.setArguments(args);
return instance;
}
public static PacDetailFragment newInstance()
{
PacDetailFragment instance = new PacDetailFragment();
return instance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.pac_preferences, container, false);
setHasOptionsMenu(true);
getUIComponents(v);
return v;
}
@Override
public void onResume()
{
super.onResume();
Bundle args = getArguments();
uiHandler = new UIHandler();
validationErrors = new HashMap<ProxyStatusProperties, CharSequence>();
if (args != null && args.containsKey(SELECTED_PAC_ARG))
{
selectedPacId = (Long) getArguments().getSerializable(SELECTED_PAC_ARG);
selectedPac = (PacEntity) App.getDBManager().getPac(selectedPacId);
deleteEnabled = true;
}
if (selectedPac == null)
{
selectedPac = new PacEntity();
deleteEnabled = false;
}
uiHandler.callRefreshUI();
}
private void getUIComponents(View v)
{
proxyScrollView = (ScrollView) v.findViewById(R.id.proxy_scrollview);
proxyInUseBanner = (RelativeLayout) v.findViewById(R.id.proxy_in_use_banner);
proxyDuplicatedBanner = (RelativeLayout) v.findViewById(R.id.proxy_duplicated_banner);
pacUrlFile = (InputField) v.findViewById(R.id.pac_url);
pacUrlFile.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
@Override
public void afterTextChanged(Editable editable)
{
checkValidation();
}
});
}
private boolean validatePacUrlFile()
{
String value = pacUrlFile.getValue();
pacUrlFile.setError(null);
ProxyStatusItem item = ProxyUtils.isPACValidURI(value);
validationErrors.remove(item.statusCode);
if (!item.result)
{
pacUrlFile.setError(item.message);
validationErrors.put(item.statusCode, item.message);
return false;
}
else
{
selectedPac.setPacUrlFile(value);
return true;
}
}
private void checkValidation()
{
if (validatePacUrlFile())
{
enableSave();
}
else
{
disableSave();
}
// TODO: Add check for duplicated configuration to Async handler
proxyDuplicatedBanner.setVisibility(View.GONE);
Uri urlFile = selectedPac.getPacUriFile();
if (urlFile != null)
{
List<Long> duplicatedIDs = App.getDBManager().findDuplicatedPac(urlFile.toString());
if (selectedPac.isPersisted())
{
proxyDuplicatedBanner.setVisibility(UIUtils.booleanToVisibility(duplicatedIDs.size() > 1));
}
else
{
proxyDuplicatedBanner.setVisibility(UIUtils.booleanToVisibility(duplicatedIDs.size() > 0));
}
}
}
private void refreshUI()
{
if (selectedPac != null)
{
proxyInUseBanner.setVisibility(UIUtils.booleanToVisibility(selectedPac.getInUse()));
pacUrlFile.setValue(selectedPac.getPacUriFile());
checkValidation();
}
else
{
// TODO: Add handling here
Timber.e(new Exception(),"NO PROXY SELECTED");
}
}
private class UIHandler extends Handler
{
@Override
public void handleMessage(Message message)
{
Bundle b = message.getData();
// Timber.w("handleMessage: " + b.toString());
refreshUI();
}
public void callRefreshUI()
{
sendEmptyMessage(0);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.proxy_details, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu)
{
MenuItem saveMenuItem = menu.findItem(R.id.menu_save);
if (saveMenuItem != null)
{
saveMenuItem.setVisible(saveEnabled);
}
MenuItem deleteMenuItem = menu.findItem(R.id.menu_delete);
if (deleteMenuItem != null)
{
deleteMenuItem.setVisible(deleteEnabled);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
Intent mainIntent = new Intent(getActivity(), MasterActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mainIntent);
return true;
case R.id.menu_save:
saveProxy();
return true;
case R.id.menu_delete:
deleteProxy();
return true;
}
return super.onOptionsItemSelected(item);
}
private void saveProxy()
{
try
{
if (selectedPac.getInUse())
{
UpdateLinkedWifiAPAlertDialog updateDialog = UpdateLinkedWifiAPAlertDialog.newInstance();
updateDialog.setTargetFragment(this, Requests.UPDATE_LINKED_WIFI_AP);
updateDialog.show(getFragmentManager(), "UpdateLinkedWifiAPAlertDialog");
}
else
{
AsyncSaveProxy asyncSaveProxy = new AsyncSaveProxy(this, selectedPac);
asyncSaveProxy.execute();
getActivity().finish();
}
}
catch (Exception e)
{
Timber.e(e,"Exception saving proxy");
}
}
private void deleteProxy()
{
try
{
if (selectedPac.getInUse())
{
UIUtils.showError(getActivity(), R.string.proxy_in_use_cannot_delete);
}
else
{
AsyncDeleteProxy asyncDeleteProxy = new AsyncDeleteProxy(this, selectedPac);
asyncDeleteProxy.execute();
getActivity().finish();
}
}
catch (Exception e)
{
Timber.e(e, "Exception deleting proxy");
}
}
public void enableSave()
{
saveEnabled = true;
FragmentActivity activity = getActivity();
if (activity != null)
{
activity.invalidateOptionsMenu();
}
}
public void disableSave()
{
saveEnabled = false;
FragmentActivity activity = getActivity();
if (activity != null)
{
activity.invalidateOptionsMenu();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == Requests.UPDATE_LINKED_WIFI_AP)
{
PacEntity persistedPac = App.getDBManager().getPac(selectedPac.getId());
AsyncSaveProxy asyncSaveProxy = new AsyncSaveProxy(this,selectedPac);
asyncSaveProxy.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
AsyncUpdateLinkedWiFiAP asyncUpdateLinkedWiFiAP = new AsyncUpdateLinkedWiFiAP(getActivity(), persistedPac, selectedPac);
asyncUpdateLinkedWiFiAP.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
getActivity().finish();
}
}
}