1 package com.hwloc.lstopo; 2 3 import android.app.Activity; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.net.Uri; 7 import android.os.Bundle; 8 import android.util.DisplayMetrics; 9 import android.view.View; 10 import android.widget.ArrayAdapter; 11 import android.widget.Button; 12 import android.widget.EditText; 13 import android.widget.Spinner; 14 import android.widget.Toast; 15 16 import com.android.volley.Request; 17 import com.android.volley.RequestQueue; 18 import com.android.volley.Response; 19 import com.android.volley.VolleyError; 20 import com.android.volley.toolbox.JsonObjectRequest; 21 import com.android.volley.toolbox.Volley; 22 23 import org.json.JSONArray; 24 import org.json.JSONException; 25 import org.json.JSONObject; 26 27 import java.util.ArrayList; 28 import java.util.Arrays; 29 import java.util.Collections; 30 import java.util.List; 31 32 // Create a window to choose the filter to download topology 33 public class Filters extends Activity { 34 @Override onCreate(Bundle savedInstanceState)35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 38 setContentView(R.layout.filters); 39 final Context activity = this; 40 final Spinner architecture = findViewById(R.id.architecture); 41 final Spinner sub_architecture = findViewById(R.id.sub_architecture); 42 final Spinner uname_architecture = findViewById(R.id.uname_architecture); 43 final Spinner core = findViewById(R.id.core); 44 final Spinner packages = findViewById(R.id.packages); 45 final Spinner cpu_vendor = findViewById(R.id.cpu_vendor); 46 final Spinner cpu_family = findViewById(R.id.cpu_family); 47 final Spinner NUMA = findViewById(R.id.NUMA); 48 final Spinner chassis = findViewById(R.id.chassis); 49 final Spinner year = findViewById(R.id.year); 50 List<Spinner> tmpList = Arrays.asList(architecture, core, packages, sub_architecture, uname_architecture, NUMA, chassis, cpu_family, year, cpu_vendor); 51 final ArrayList<Spinner> selects = new ArrayList<>(tmpList); 52 53 // Set windows size 54 DisplayMetrics dm = new DisplayMetrics(); 55 getWindowManager().getDefaultDisplay().getMetrics(dm); 56 int width = dm.widthPixels; 57 int height = dm.heightPixels; 58 getWindow().setLayout((int) (width * 0.8), (int) (height * 0.6)); 59 60 final RequestQueue queue = Volley.newRequestQueue(this); 61 final String url = "https://hwloc-xmls.herokuapp.com"; 62 final String url2 = "https://hwloc-xmls.herokuapp.com/json"; 63 64 // Get all topologies 65 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() { 66 @Override 67 public void onResponse(JSONObject response) { 68 try { 69 final JSONArray xmls = response.getJSONArray("xml"); 70 // Get a list of all filters available for each Spinner 71 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url2, new Response.Listener<JSONObject>() { 72 @Override 73 public void onResponse(JSONObject tags) { 74 String option_info; 75 // For each Spinner 76 for( Spinner select : selects ){ 77 ArrayList<String> options = new ArrayList<>(); 78 // Run through every topology and look for new filter 79 for( int i = 0 ; i < xmls.length() ; i++ ){ 80 try { 81 String title = xmls.getJSONObject(i).getString("title").substring(0, xmls.getJSONObject(i).getString("title").length()-4); 82 JSONObject xml_tags = tags.getJSONObject(title); 83 option_info = xml_tags.getString(String.valueOf(select.getTag())); 84 85 if(String.valueOf(select.getTag()).equals("nbcores")) 86 option_info = "≥ " + Integer.parseInt(option_info)/10 + "0"; 87 88 if(!options.contains(option_info)) 89 options.add(option_info); 90 91 } catch (JSONException e) { 92 e.printStackTrace(); 93 } 94 } 95 Collections.sort(options); 96 options.add(0, String.valueOf(select.getTag())); 97 // add filters found to the Spinner 98 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, options); 99 arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 100 select.setAdapter(arrayAdapter); 101 } 102 } 103 }, new Response.ErrorListener() { 104 105 @Override 106 public void onErrorResponse(VolleyError error) { 107 Toast.makeText(activity, error.getMessage(), Toast.LENGTH_LONG).show(); 108 } 109 }); 110 queue.add(jsonObjectRequest); 111 } catch (JSONException e) { 112 e.printStackTrace(); 113 } 114 } 115 }, new Response.ErrorListener() { 116 117 @Override 118 public void onErrorResponse(VolleyError error) { 119 Toast.makeText(activity, error.getMessage(), Toast.LENGTH_LONG).show(); 120 } 121 }); 122 123 queue.add(jsonObjectRequest); 124 125 final EditText title = findViewById(R.id.input); 126 Button apply = findViewById(R.id.apply); 127 128 // Create json object containing json filters 129 apply.setOnClickListener(new View.OnClickListener() { 130 @Override 131 public void onClick(View v) { 132 JSONObject json = new JSONObject(); 133 try { 134 json.put("architecture", architecture.getSelectedItemPosition() != 0 ? architecture.getSelectedItem().toString() : null); 135 json.put("sub-architecture", sub_architecture.getSelectedItemPosition() != 0 ? sub_architecture.getSelectedItem().toString() : null); 136 json.put("uname-architecture", uname_architecture.getSelectedItemPosition() != 0 ? uname_architecture.getSelectedItem().toString() : null); 137 json.put("nbcores", core.getSelectedItemPosition() != 0 ? core.getSelectedItem().toString().substring(1) : null); 138 json.put("cpu-vendor", cpu_vendor.getSelectedItemPosition() != 0 ? cpu_vendor.getSelectedItem().toString() : null); 139 json.put("cpu-family", cpu_family.getSelectedItemPosition() != 0 ? cpu_family.getSelectedItem().toString() : null); 140 json.put("nbpackages", packages.getSelectedItemPosition() != 0 ? packages.getSelectedItem().toString() : null); 141 json.put("NUMA", NUMA.getSelectedItemPosition() != 0 ? NUMA.getSelectedItem().toString() : null); 142 json.put("Chassis", chassis.getSelectedItemPosition() != 0 ? chassis.getSelectedItem().toString() : null); 143 json.put("year", year.getSelectedItemPosition() != 0 ? year.getSelectedItem().toString() : null); 144 json.put("title", title.getText()); 145 } catch (JSONException e) { 146 e.printStackTrace(); 147 } 148 149 // Send the filters back to mainActivity 150 Intent returnIntent = new Intent(); 151 returnIntent.setData(Uri.parse(json.toString())); 152 setResult(RESULT_OK, returnIntent); 153 finish(); 154 } 155 }); 156 157 } 158 } 159