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