package com.apigee.sdkexplorer;
import android.app.Fragment;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.apigee.sdk.apm.android.ApigeeActiveSettings;
import com.apigee.sdk.apm.android.ApigeeMonitoringClient;
import com.apigee.sdk.apm.android.AppMon;
import com.apigee.sdk.apm.android.ApplicationConfigurationService;
import com.apigee.sdk.apm.android.model.ApigeeApp;
import com.apigee.sdk.apm.android.model.ApigeeMobileAPMConstants;
import com.apigee.sdk.apm.android.model.ApigeeMonitoringSettings;
import com.apigee.sdk.apm.android.model.AppConfigCustomParameter;
import com.apigee.sdk.apm.android.model.AppConfigOverrideFilter;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
public class ConfigsFragment extends Fragment implements ListViewDataSource {
public static String InstaOpsDemoUrlConfigParam = "DEMO_URL";
public static String keyAppName = "App Name";
public static String keyAppOwner = "App Owner";
public static String keyAppStatus = "App Status";
public static String keyAppDescription = "App Description";
public static String keyApplicationId = "Application Id";
public static String keyEnvironment = "Environment";
public static String keyApigeeDeviceId = "Apigee Device Id";
public static String keyDeviceInfo = "Device Info";
public static String keyDeviceIdFilter = "Device Id Filter";
public static String keyDeviceIdFilters = "Device Id Filters";
public static String keyAppInfo = "App Info";
public static String keyNetwork = "Network";
public static String keyConfig = "Config";
public static String keyConfiguration = "Configuration";
public static String keyCustomConfigParameters = "Custom Config Parameters";
public static String keyDateCreated = "Date Created";
public static String keyDateLastModified = "Date Last Modified";
private ArrayList<String> listSectionNames;
private HashMap<String,HashMap<String,String>> mapData;
private SDKExplorerActivity mainActivity;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mainActivity = (SDKExplorerActivity) getActivity();
prepDataSource();
ListView listView = new ListView(mainActivity);
final SectionedListViewAdapter adapter;
adapter = new SectionedListViewAdapter(listView,this);
listView.setAdapter(adapter);
return listView;
}
public void prepDataSource()
{
listSectionNames = new ArrayList<String>();
listSectionNames.add(keyAppInfo);
listSectionNames.add(keyAppStatus);
listSectionNames.add(keyConfig);
listSectionNames.add(keyDeviceInfo);
ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance();
if ((monitoringClient != null) && monitoringClient.isInitialized()) {
HashMap<String,HashMap<String,String>> viewData = new HashMap<String,HashMap<String,String>>();
ApigeeActiveSettings appConfigService = monitoringClient.getActiveSettings();
ApigeeApp compositeAppConfigModel = appConfigService.getApigeeApp();
ApigeeMonitoringSettings appConfigModel = appConfigService.getConfigurations();
HashMap<String,String> mapCustomConfigParams = loadCustomConfigParameters();
if( mapCustomConfigParams != null ) {
listSectionNames.add(keyCustomConfigParameters);
}
viewData.put(keyAppStatus, loadAppStatus());
viewData.put(keyDeviceInfo, loadDeviceInfo());
viewData.put(keyAppInfo, loadAppInfoFromSettings(compositeAppConfigModel));
viewData.put(keyConfig, loadConfigFromSettings(appConfigModel));
if( mapCustomConfigParams != null ) {
viewData.put(keyCustomConfigParameters, mapCustomConfigParams);
}
HashMap<String,String> dict = loadConfigParams(appConfigModel);
if( dict != null && !dict.isEmpty() )
{
viewData.put(keyCustomConfigParameters, dict);
}
dict = loadFilters(compositeAppConfigModel.getDeviceIdFilters(),keyDeviceIdFilter);
if( dict != null && !dict.isEmpty() )
{
viewData.put(keyDeviceIdFilters, dict);
}
mapData = viewData;
} else {
mapData = null;
}
}
public HashMap<String,String> loadCustomConfigParameters()
{
HashMap<String,String> info = null;
ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance();
if ((monitoringClient != null) && monitoringClient.isInitialized()) {
ApigeeActiveSettings appConfigService = monitoringClient.getActiveSettings();
ApigeeMonitoringSettings appConfigModel = appConfigService.getConfigurations();
Set<AppConfigCustomParameter> setParams = appConfigModel.getCustomConfigParameters();
if( setParams != null )
{
final int numberParams = setParams.size();
if (numberParams > 0)
{
info = new HashMap<String,String>();
Iterator<AppConfigCustomParameter> it = setParams.iterator();
AppConfigCustomParameter parameter;
int i = 0;
while( it.hasNext() )
{
parameter = it.next();
String tag = parameter.getTag();
String key = parameter.getParamKey();
String value = parameter.getParamValue();
++i;
info.put(tag + "[" + i + "]", key + " = " + value);
}
}
}
}
return info;
}
public HashMap<String,String> loadDeviceInfo()
{
HashMap<String,String> info = new HashMap<String,String>();
info.put(keyApigeeDeviceId, AppMon.getApigeeDeviceId());
return info;
}
public String activeNetworkStatus()
{
String status = "Not Connected";
if ( mainActivity.hadConnectivityOnStartup() ) {
try {
ConnectivityManager connectivityManager = (ConnectivityManager) mainActivity
.getSystemService(Context.CONNECTIVITY_SERVICE);
if( connectivityManager != null ) {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null) {
String networkTypeName = networkInfo.getTypeName();
if( networkTypeName != null ) {
status = formatString(networkTypeName).toUpperCase();
}
}
}
} catch (Exception e) {
status = "Unknown";
}
}
return status;
}
public String activeConfiguration()
{
String activeConfiguration = "N/A";
ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance();
if ((null != monitoringClient) && monitoringClient.isInitialized()) {
ApigeeActiveSettings appConfigService = monitoringClient.getActiveSettings();
if (null != appConfigService) {
ApigeeMonitoringSettings appConfigModel = appConfigService.getConfigurations();
if (null != appConfigModel) {
String appConfigType = appConfigModel.getAppConfigType();
if( appConfigType.equals(ApigeeMobileAPMConstants.CONFIG_TYPE_DEVICE_LEVEL)) {
activeConfiguration = "DEVICE LEVEL";
} else if( appConfigType.equals(ApigeeMobileAPMConstants.CONFIG_TYPE_DEVICE_TYPE) ) {
activeConfiguration = "DEVICE TYPE";
} else if( appConfigType.equals(ApigeeMobileAPMConstants.CONFIG_TYPE_AB) ) {
activeConfiguration = "A/B";
} else {
activeConfiguration = "DEFAULT";
}
}
}
}
return activeConfiguration;
}
public HashMap<String,String> loadAppStatus()
{
HashMap<String,String> status = new HashMap<String,String>();
status.put(keyNetwork, activeNetworkStatus());
status.put(keyConfiguration, activeConfiguration());
return status;
}
public HashMap<String,String> loadAppInfoFromSettings(ApigeeApp model)
{
if( model != null )
{
HashMap<String,String> info = new HashMap<String,String>();
info.put(keyAppName, model.getAppName());
info.put(keyDateCreated, availableDateValue(model.getCreatedDate()));
info.put(keyDateLastModified, availableDateValue(model.getLastModifiedDate()));
return info;
}
return null;
}
public String logLevelFromInt(int logLevel)
{
switch(logLevel)
{
//TODO: do we have constants already defined for these elsewhere?
case 2:
return "Verbose";
case 3:
return "Debug";
case 4:
return "Info";
case 5:
return "Warn";
case 6:
return "Error";
case 7:
return "Assert";
default:
return "Verbose";
}
}
public String availableDateValue(java.util.Date date)
{
if( date == null )
{
return "N/A";
}
return DateFormat.getDateInstance().format(date);
}
public String availableStrValue(String str)
{
if( str == null)
{
return "N/A";
}
return str;
}
public String displayValueForBoolean(boolean boolValue)
{
return boolValue ? "Yes" : "No";
}
public HashMap<String,String> loadConfigFromSettings(ApigeeMonitoringSettings model)
{
HashMap<String,String> cfg = new HashMap<String,String>();
if( model != null )
{
ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance();
if ((null != monitoringClient) && monitoringClient.isInitialized()) {
ApplicationConfigurationService appConfigService = monitoringClient.getActiveSettings();
if (null != appConfigService) {
ApigeeApp compositeAppConfigModel = appConfigService.getApigeeApp();
if (null != compositeAppConfigModel) {
cfg.put("Monitoring Disabled", compositeAppConfigModel.getMonitoringDisabled() ? "Yes" : "No");
}
}
//TODO: check for A/B Testing
//if (settings.activeConfiguration == kInstaOpsABTesting) {
// [cfg setObject:[self availableNumValue:settings.abtestingPercentage] forKey:@"A/B Testing Percentage"];
//}
//cfg.put("Settings Description", availableStrValue(model.getDescription()));
cfg.put("Date Last Modified", availableDateValue(model.getLastModifiedDate()));
cfg.put("Network Monitoring Enabled", displayValueForBoolean(model.getNetworkMonitoringEnabled()));
cfg.put("Log Monitoring Enabled", displayValueForBoolean(model.getEnableLogMonitoring()));
cfg.put("Log Level", logLevelFromInt(model.getLogLevelToMonitor()));
cfg.put("Session Data Capture", displayValueForBoolean(model.getSessionDataCaptureEnabled()));
cfg.put("Battery Status Capture", displayValueForBoolean(model.getBatteryStatusCaptureEnabled()));
cfg.put("IMEI Capture", displayValueForBoolean(model.getIMEICaptureEnabled()));
cfg.put("Obfuscate IMEI", displayValueForBoolean(model.getObfuscateIMEI()));
cfg.put("Device Id Capture", displayValueForBoolean(model.getDeviceIdCaptureEnabled()));
cfg.put("Obfuscate Device Id", displayValueForBoolean(model.getObfuscateDeviceId()));
cfg.put("Device Model Capture", displayValueForBoolean(model.getDeviceModelCaptureEnabled()));
cfg.put("Location Capture", displayValueForBoolean(model.getLocationCaptureEnabled()));
cfg.put("Network Carrier Capture", displayValueForBoolean(model.getNetworkCarrierCaptureEnabled()));
cfg.put("Upload When Roaming", displayValueForBoolean(model.getEnableUploadWhenRoaming()));
cfg.put("Upload When Mobile", displayValueForBoolean(model.getEnableUploadWhenMobile()));
cfg.put("Upload Interval", model.getAgentUploadIntervalInSeconds().toString());
cfg.put("Sampling rate", model.getSamplingRate().toString());
}
}
return cfg;
}
public HashMap<String,String> loadConfigParams(ApigeeMonitoringSettings model)
{
int numberParams = 0;
Set<AppConfigCustomParameter> setParams = model.getCustomConfigParameters();
if( setParams != null )
{
numberParams = setParams.size();
if (numberParams > 0)
{
HashMap<String,String> dictionary = new HashMap<String,String>();
int number = 1;
Iterator<AppConfigCustomParameter> it = setParams.iterator();
AppConfigCustomParameter parameter;
while( it.hasNext() )
{
parameter = it.next();
String key = parameter.getTag() + "[" + number + "]";
String value = parameter.getParamKey() + " = " + parameter.getParamValue();
dictionary.put(key, value);
++number;
}
return dictionary;
}
}
return null;
}
public HashMap<String,String> loadFilters(Set<AppConfigOverrideFilter> filters,String label)
{
int numberFilters = 0;
if( filters != null )
{
numberFilters = filters.size();
if( numberFilters > 0 )
{
HashMap<String,String> dictionary = new HashMap<String,String>();
int number = 1;
Iterator<AppConfigOverrideFilter> it = filters.iterator();
AppConfigOverrideFilter filter;
while( it.hasNext() )
{
filter = it.next();
String key = label + "[" + number + "]";
dictionary.put(key,filter.getFilterValue());
++number;
}
return dictionary;
}
}
return null;
}
@Override
public int numberOfSectionsInListView(ListView listView)
{
if (listSectionNames != null) {
return listSectionNames.size();
}
return 0;
}
@Override
public int listViewNumberOfRowsInSection(ListView listView, int section)
{
String sectionKey = listSectionNames.get(section);
if (mapData != null) {
HashMap<String,String> mapSectionRows = mapData.get(sectionKey);
if( mapSectionRows != null )
{
return mapSectionRows.size();
}
}
return 0;
}
@Override
public String listViewTitleForHeaderInSection(ListView listView, int section)
{
return listSectionNames.get(section);
}
@Override
public View listViewCellForRowAtIndexPath(ListView listView, View convertView, IndexPath indexPath)
{
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) listView.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.config_row_layout, null);
}
TextView tvName = (TextView) convertView.findViewById(R.id.tvName);
TextView tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
String sectionKey = listSectionNames.get(indexPath.section);
String key;
String value;
if (mapData != null) {
HashMap<String,String> mapSectionRows = mapData.get(sectionKey);
Set<String> rowKeys = mapSectionRows.keySet();
SortedSet<String> sortedRowKeys = new TreeSet<String>(rowKeys);
ArrayList<String> sequentialSortedRowKeys = new ArrayList<String>(sortedRowKeys);
key = sequentialSortedRowKeys.get(indexPath.row);
value = mapSectionRows.get(key);
} else {
key = "";
value = "";
}
tvName.setText(key);
tvDescription.setText(value);
return convertView;
}
private String formatString(String s)
{
if (s == null || s.length() == 0)
{
s = "UNKNOWN";
}
return s;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
}