package com.apigee.sdkexplorer;
import android.app.Fragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import com.apigee.sdk.apm.android.ApigeeActiveSettings;
import com.apigee.sdk.apm.android.ApigeeMonitoringClient;
import com.apigee.sdk.apm.android.ApigeeWebViewClientLifecycleListener;
import com.apigee.sdk.apm.android.model.ApigeeMonitoringSettings;
import com.apigee.sdk.apm.android.model.AppConfigCustomParameter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class NetworkFragment extends Fragment implements NetworkResponseListener, ApigeeWebViewClientLifecycleListener
{
public static final String ERR_NETWORK_REQUIRED = "Network connectivity is required. Please restart the app.";
private Spinner spinnerWebSiteOrService;
private Spinner spinnerArtistSearch;
private TextView textField;
private Button buttonSearch;
private WebView webView;
private TextView textView;
private ProgressBar progressBar;
private int modeIndex;
private int searchIndex;
private SDKExplorerActivity mainActivity;
private ArrayList<ArtistSearchService> artistSearchServices;
private HttpRequestTask httpTask;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.network_layout, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mainActivity = (SDKExplorerActivity) getActivity();
modeIndex = 0;
searchIndex = 0;
httpTask = null;
spinnerWebSiteOrService = (Spinner) mainActivity.findViewById(R.id.spinnerWebSiteOrService);
String webOptions[] = {"Web Site","Web Service","Custom"};
ArrayAdapter<String> spinnerWebArrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item, webOptions);
spinnerWebArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
spinnerWebSiteOrService.setAdapter(spinnerWebArrayAdapter);
spinnerWebSiteOrService.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
{
modeIndex = position;
modeChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
spinnerArtistSearch = (Spinner) mainActivity.findViewById(R.id.spinnerArtistSearch);
artistSearchServices = new ArrayList<ArtistSearchService>();
ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance();
if ((null != monitoringClient) && monitoringClient.isInitialized()) {
ApigeeActiveSettings appConfigService = monitoringClient.getActiveSettings();
if (null != appConfigService) {
ApigeeMonitoringSettings appConfigModel = appConfigService.getConfigurations();
if (null != appConfigModel) {
Set<AppConfigCustomParameter> setParams = appConfigModel.getCustomConfigParameters();
if( setParams != null )
{
final int numberParams = setParams.size();
if (numberParams > 0)
{
Iterator<AppConfigCustomParameter> it = setParams.iterator();
AppConfigCustomParameter parameter;
while( it.hasNext() )
{
parameter = it.next();
String tag = parameter.getTag();
if( tag.equals(ConfigsFragment.InstaOpsDemoUrlConfigParam) )
{
String key = parameter.getParamKey();
String value = parameter.getParamValue();
if( (key != null) && (value != null) && (key.length() > 0) && (value.length() > 0) )
{
artistSearchServices.add(new ArtistSearchService(key,value));
}
}
}
}
}
}
}
}
// don't have any?
if( artistSearchServices.isEmpty() )
{
artistSearchServices.add(new ArtistSearchService("MusicBrainz","http://musicbrainz.org/ws/2/artist/?query=%@"));
artistSearchServices.add(new ArtistSearchService("Spotify","http://ws.spotify.com/search/1/artist?q=%@"));
}
// sort by name
Collections.sort(artistSearchServices, new ArtistSearchServiceSortByName());
final int numberSearchOptions = artistSearchServices.size();
String[] artistSearchOptions = new String[numberSearchOptions];
for( int i = 0; i < numberSearchOptions; ++i )
{
artistSearchOptions[i] = artistSearchServices.get(i).name;
}
// Application of the Array to the Spinner
ArrayAdapter<String> spinnerSearchArrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item, artistSearchOptions);
spinnerSearchArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
spinnerArtistSearch.setAdapter(spinnerSearchArrayAdapter);
spinnerArtistSearch.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
{
searchIndex = position;
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
textField = (TextView) mainActivity.findViewById(R.id.editArtistNameOrUrl);
textField.setMaxLines(1);
buttonSearch = (Button) mainActivity.findViewById(R.id.buttonSearch);
buttonSearch.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
performSearch();
}
});
textView = (TextView) mainActivity.findViewById(R.id.networkTextView);
if( textView != null )
{
if( ! mainActivity.hadConnectivityOnStartup() ) {
textView.setText(ERR_NETWORK_REQUIRED);
}
}
progressBar = (ProgressBar) mainActivity.findViewById(R.id.networkProgressBar);
if( progressBar != null ) {
progressBar.setVisibility(View.GONE);
}
//DOCSNIPPET_START
// This code snippet from Fragment's onActivityCreated method or
// Activity's onCreate method (depending on whether your application
// is using an Activity or Fragment for your WebView).
// Retrieve reference to the WebView widget
webView = (WebView) mainActivity.findViewById(R.id.networkWebView);
// Set the web view client using an instrumented version that's
// included in the Apigee Mobile Analytics SDK. This is needed
// to get the network performance metrics.
webView.setWebViewClient(new com.apigee.sdk.apm.android.ApigeeWebViewClient(this));
//DOCSNIPPET_END
if( webView != null ) {
if( ! mainActivity.hadConnectivityOnStartup() ) {
String htmlText = "<html><body>" + ERR_NETWORK_REQUIRED + "</body></html>";
webView.loadData(htmlText, "text/html", null);
}
}
modeChanged();
}
@Override
public void notifyNetworkResponseSuccess(String response)
{
if( progressBar != null ) {
progressBar.setVisibility(View.GONE);
}
textView.setVisibility(View.VISIBLE);
textView.setText(response);
}
@Override
public void notifyNetworkResponseFailure(Exception exception,String response)
{
if( progressBar != null ) {
progressBar.setVisibility(View.GONE);
}
textView.setVisibility(View.VISIBLE);
if( exception != null ) {
String localizedMessage = exception.getLocalizedMessage();
if( localizedMessage != null ) {
if( localizedMessage.equals("Socket closed") ) {
textView.setText("Connection timed out");
} else {
textView.setText("Error: " + exception.getLocalizedMessage());
}
} else {
textView.setText("Connection timed out");
}
} else if( response != null && response.length() > 0 ) {
textView.setText(response);
} else {
textView.setText("Unknown error occurred");
}
}
public void performSearch()
{
// dismiss keyboard
Context context = mainActivity.getApplicationContext();
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(textField.getWindowToken(), 0);
String enteredText = textField.getText().toString().trim();
if( modeIndex == 0 )
{
// web site
if( ! enteredText.startsWith("http:") && ! enteredText.startsWith("https:") )
{
enteredText = "http://" + enteredText;
}
webView.loadUrl(enteredText);
}
else if( modeIndex == 1 )
{
// web service artist search
String artistSearchUrl = artistSearchServices.get(searchIndex).url;
String encodedArtist = Uri.encode(enteredText);
// replace "%@" with encodedArtist
String searchStringWithArtist = artistSearchUrl.replaceAll("%@", encodedArtist);
if( httpTask != null ) {
httpTask.cancel(true);
}
textView.setVisibility(View.VISIBLE);
textView.setText(" Retrieving...");
if( progressBar != null ) {
progressBar.setVisibility(View.VISIBLE);
}
//TODO: make the timeout value configurable in app settings
httpTask = new HttpRequestTask(SDKExplorerActivity.networkHttpConnectionType,SDKExplorerActivity.timeoutMillis); // timeout in milliseconds
httpTask.setNetworkResponseListener(this);
httpTask.execute(searchStringWithArtist);
}
else if( modeIndex == 2 )
{
// custom url
if( ! enteredText.startsWith("http:") && ! enteredText.startsWith("https:") )
{
enteredText = "http://" + enteredText;
}
if( httpTask != null ) {
httpTask.cancel(true);
}
textView.setVisibility(View.VISIBLE);
textView.setText(" Retrieving...");
if( progressBar != null ) {
progressBar.setVisibility(View.VISIBLE);
}
//TODO: make the timeout value configurable in app settings
httpTask = new HttpRequestTask(SDKExplorerActivity.networkHttpConnectionType,SDKExplorerActivity.timeoutMillis); // timeout in milliseconds
httpTask.setNetworkResponseListener(this);
httpTask.execute(enteredText);
}
}
public void modeChanged()
{
String textEntryHint;
if( modeIndex == 0 )
{
// web site
textEntryHint = "Enter Web Site URL";
spinnerArtistSearch.setVisibility(View.GONE);
textView.setVisibility(View.GONE);
webView.setVisibility(View.VISIBLE);
}
else if (modeIndex == 1)
{
// web service
textEntryHint = "Enter Music Artist Name to Search";
spinnerArtistSearch.setVisibility(View.VISIBLE);
textView.setVisibility(View.VISIBLE);
webView.setVisibility(View.GONE);
}
else if( modeIndex == 2)
{
// custom
textEntryHint = "Enter Custom URL";
spinnerArtistSearch.setVisibility(View.GONE);
textView.setVisibility(View.VISIBLE);
webView.setVisibility(View.GONE);
}
else
{
textEntryHint = "";
}
textField.setText("");
textField.setHint(textEntryHint);
}
@Override
public void onPageStarted(WebView webView, String url, Bitmap favicon)
{
if( progressBar != null ) {
progressBar.setVisibility(View.VISIBLE);
}
}
@Override
public void onPageFinished(WebView view, String url)
{
if( progressBar != null ) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
}
}