Skip to content

Commit 21b6906

Browse files
authored
Merge pull request #1906 from fossasia/development
Merge development into master
2 parents 5e34f9f + 2b9282f commit 21b6906

9 files changed

+407
-1
lines changed

app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
android:theme="@style/AppTheme"
2828
tools:replace="android:icon">
2929
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
30+
<activity android:name=".activity.CreateConfigActivity"/>
3031
<activity
3132
android:name=".activity.ThermometerActivity"
3233
android:screenOrientation="portrait"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package io.pslab.activity;
2+
3+
import android.os.Bundle;
4+
import android.os.Environment;
5+
import android.support.design.widget.Snackbar;
6+
import android.support.v7.app.AppCompatActivity;
7+
import android.support.v7.widget.Toolbar;
8+
import android.util.SparseBooleanArray;
9+
import android.view.MenuItem;
10+
import android.view.View;
11+
import android.widget.AdapterView;
12+
import android.widget.ArrayAdapter;
13+
import android.widget.Button;
14+
import android.widget.EditText;
15+
import android.widget.ListView;
16+
import android.widget.Spinner;
17+
import android.widget.Toast;
18+
19+
import java.io.File;
20+
import java.io.FileWriter;
21+
import java.io.IOException;
22+
import java.util.ArrayList;
23+
24+
import io.pslab.R;
25+
import io.pslab.others.CSVLogger;
26+
import io.pslab.others.CustomSnackBar;
27+
28+
public class CreateConfigActivity extends AppCompatActivity {
29+
30+
private ArrayList<String> instrumentsList;
31+
private ArrayList<String[]> instrumentParamsList;
32+
private ArrayList<String[]> instrumentParamsListTitles;
33+
private ListView paramsListView;
34+
private int selectedItem = 0;
35+
private String intervalUnit = "sec";
36+
private EditText intervalEditText;
37+
private String interval;
38+
private View rootView;
39+
40+
@Override
41+
protected void onCreate(Bundle savedInstanceState) {
42+
super.onCreate(savedInstanceState);
43+
setContentView(R.layout.activity_create_config);
44+
Toolbar toolbar = findViewById(R.id.toolbar);
45+
rootView = findViewById(R.id.create_config_root_view);
46+
paramsListView = findViewById(R.id.params_list);
47+
Spinner selectInstrumentSpinner = findViewById(R.id.select_instrument_spinner);
48+
Spinner intervalUnitSpinner = findViewById(R.id.interval_unit_spinner);
49+
intervalEditText = findViewById(R.id.interval_edit_text);
50+
Button createConfigFileBtn = findViewById(R.id.create_config_btn);
51+
setSupportActionBar(toolbar);
52+
getSupportActionBar().setTitle(R.string.nav_config);
53+
if (getSupportActionBar() != null) {
54+
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
55+
getSupportActionBar().setDisplayShowHomeEnabled(true);
56+
}
57+
instrumentsList = new ArrayList<>();
58+
instrumentParamsList = new ArrayList<>();
59+
instrumentParamsListTitles = new ArrayList<>();
60+
createArrayLists();
61+
selectInstrumentSpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, instrumentsList));
62+
selectInstrumentSpinner.setSelection(0, true);
63+
createCheckboxList();
64+
selectInstrumentSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
65+
@Override
66+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
67+
selectedItem = position;
68+
createCheckboxList();
69+
}
70+
71+
@Override
72+
public void onNothingSelected(AdapterView<?> parent) {
73+
selectedItem = 0;
74+
}
75+
});
76+
77+
intervalUnitSpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.interval_units)));
78+
intervalUnitSpinner.setSelection(0, true);
79+
intervalUnitSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
80+
@Override
81+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
82+
intervalUnit = (String) parent.getItemAtPosition(position);
83+
}
84+
85+
@Override
86+
public void onNothingSelected(AdapterView<?> parent) {
87+
intervalUnit = "sec";
88+
}
89+
});
90+
91+
createConfigFileBtn.setOnClickListener(new View.OnClickListener() {
92+
@Override
93+
public void onClick(View v) {
94+
interval = intervalEditText.getText().toString();
95+
if (interval.length() == 0) {
96+
Toast.makeText(CreateConfigActivity.this, getResources().getString(R.string.no_interval_message), Toast.LENGTH_SHORT).show();
97+
} else {
98+
SparseBooleanArray selectedParams = paramsListView.getCheckedItemPositions();
99+
ArrayList<String> selectedParamsList = new ArrayList<>();
100+
for (int i = 0; i < paramsListView.getCount(); i++) {
101+
if (selectedParams.get(i)) {
102+
selectedParamsList.add(instrumentParamsList.get(selectedItem)[i]);
103+
}
104+
}
105+
createConfigFile(selectedParamsList);
106+
}
107+
}
108+
});
109+
}
110+
111+
private void createArrayLists() {
112+
113+
instrumentParamsList.add(getResources().getStringArray(R.array.oscilloscope_params));
114+
instrumentParamsList.add(getResources().getStringArray(R.array.multimeter_params));
115+
instrumentParamsList.add(getResources().getStringArray(R.array.logic_analyzer_params));
116+
instrumentParamsList.add(getResources().getStringArray(R.array.barometer_params));
117+
instrumentParamsList.add(getResources().getStringArray(R.array.luxmeter_params));
118+
instrumentParamsList.add(getResources().getStringArray(R.array.accelerometer_params));
119+
120+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.oscilloscope_params_title));
121+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.multimeter_params_title));
122+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.logic_analyzer_params_title));
123+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.barometer_params));
124+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.luxmeter_params));
125+
instrumentParamsListTitles.add(getResources().getStringArray(R.array.accelerometer_params_title));
126+
127+
instrumentsList.add(getResources().getString(R.string.oscilloscope));
128+
instrumentsList.add(getResources().getString(R.string.multimeter));
129+
instrumentsList.add(getResources().getString(R.string.logical_analyzer));
130+
instrumentsList.add(getResources().getString(R.string.baro_meter));
131+
instrumentsList.add(getResources().getString(R.string.lux_meter));
132+
instrumentsList.add(getResources().getString(R.string.accelerometer));
133+
}
134+
135+
private void createCheckboxList() {
136+
paramsListView.setAdapter(new ArrayAdapter<String>(CreateConfigActivity.this, android.R.layout.simple_list_item_multiple_choice, instrumentParamsListTitles.get(selectedItem)));
137+
paramsListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
138+
}
139+
140+
@Override
141+
public boolean onOptionsItemSelected(MenuItem item) {
142+
if (item.getItemId() == android.R.id.home) {
143+
finish();
144+
}
145+
return super.onOptionsItemSelected(item);
146+
}
147+
148+
private void createConfigFile(ArrayList<String> params) {
149+
String instrumentName = instrumentsList.get(selectedItem);
150+
String fileName = "pslab_config.txt";
151+
String basepath = Environment.getExternalStorageDirectory().getAbsolutePath();
152+
153+
File baseDirectory = new File(basepath + File.separator + CSVLogger.CSV_DIRECTORY);
154+
if (!baseDirectory.exists()) {
155+
try {
156+
baseDirectory.mkdir();
157+
} catch (Exception e) {
158+
e.printStackTrace();
159+
}
160+
}
161+
162+
File configFile = new File(basepath + File.separator + CSVLogger.CSV_DIRECTORY + File.separator + fileName);
163+
if (!configFile.exists()) {
164+
try {
165+
configFile.createNewFile();
166+
} catch (IOException e) {
167+
e.printStackTrace();
168+
}
169+
}
170+
try {
171+
FileWriter writer = new FileWriter(configFile);
172+
writer.write("instrument: " + instrumentName + "\n");
173+
writer.write("interval: " + interval + " " + intervalUnit + "\n");
174+
String param = String.join(",", params);
175+
writer.write("params: " + param);
176+
writer.flush();
177+
writer.close();
178+
CustomSnackBar.showSnackBar(rootView, getString(R.string.file_created_success_message), null, null, Snackbar.LENGTH_SHORT);
179+
} catch (IOException e) {
180+
e.printStackTrace();
181+
CustomSnackBar.showSnackBar(rootView, getString(R.string.file_created_fail_message), null, null, Snackbar.LENGTH_SHORT);
182+
}
183+
184+
}
185+
}

app/src/main/java/io/pslab/activity/MainActivity.java

+6
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,12 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
293293
shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage);
294294
startActivity(shareIntent);
295295
return true;
296+
case R.id.nav_generate_config:
297+
if (drawer != null) {
298+
drawer.closeDrawers();
299+
}
300+
startActivity(new Intent(MainActivity.this, CreateConfigActivity.class));
301+
break;
296302
default:
297303
navItemIndex = 0;
298304
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24.0"
5+
android:viewportHeight="24.0">
6+
<path
7+
android:fillColor="#FF000000"
8+
android:pathData="M20,6h-8l-2,-2L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM19,14h-3v3h-2v-3h-3v-2h3L14,9h2v3h3v2z"/>
9+
</vector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:id="@+id/create_config_root_view"
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent"
8+
tools:context=".activity.CreateConfigActivity">
9+
10+
<RelativeLayout
11+
android:layout_width="match_parent"
12+
android:layout_height="wrap_content"
13+
android:layout_below="@+id/top_app_bar_layout"
14+
android:padding="@dimen/home_fragment_padding">
15+
16+
<TextView
17+
android:id="@+id/select_instrument_title"
18+
style="@style/Base.TextAppearance.AppCompat.Title"
19+
android:layout_width="wrap_content"
20+
android:layout_height="wrap_content"
21+
android:layout_marginTop="@dimen/create_config_margin4"
22+
android:text="@string/select_instrument_title" />
23+
24+
<android.support.v7.widget.AppCompatSpinner
25+
android:id="@+id/select_instrument_spinner"
26+
android:layout_width="wrap_content"
27+
android:layout_height="wrap_content"
28+
android:layout_toEndOf="@id/select_instrument_title" />
29+
30+
<TextView
31+
android:id="@+id/time_interval_title"
32+
style="@style/Base.TextAppearance.AppCompat.Title"
33+
android:layout_width="wrap_content"
34+
android:layout_height="wrap_content"
35+
android:layout_below="@+id/select_instrument_title"
36+
android:layout_marginTop="@dimen/create_config_margin3"
37+
android:text="@string/time_interval_title" />
38+
39+
<EditText
40+
android:id="@+id/interval_edit_text"
41+
android:layout_width="wrap_content"
42+
android:layout_height="wrap_content"
43+
android:layout_below="@id/select_instrument_title"
44+
android:layout_marginStart="@dimen/margin_btn"
45+
android:layout_marginTop="@dimen/create_config_margin1"
46+
android:layout_toEndOf="@id/time_interval_title"
47+
android:hint="@string/time_interval_hint"
48+
android:inputType="number" />
49+
50+
<android.support.v7.widget.AppCompatSpinner
51+
android:id="@+id/interval_unit_spinner"
52+
android:layout_width="wrap_content"
53+
android:layout_height="wrap_content"
54+
android:layout_below="@+id/select_instrument_title"
55+
android:layout_marginStart="@dimen/margin_btn"
56+
android:layout_marginTop="@dimen/create_config_margin1"
57+
android:layout_toEndOf="@+id/interval_edit_text" />
58+
59+
<TextView
60+
android:id="@+id/select_params_title"
61+
style="@style/Base.TextAppearance.AppCompat.Title"
62+
android:layout_width="wrap_content"
63+
android:layout_height="wrap_content"
64+
android:layout_below="@id/time_interval_title"
65+
android:layout_centerHorizontal="true"
66+
android:layout_marginTop="@dimen/create_config_margin2"
67+
android:text="@string/select_params_title" />
68+
69+
<ListView
70+
android:id="@+id/params_list"
71+
android:layout_width="match_parent"
72+
android:layout_height="wrap_content"
73+
android:layout_above="@+id/create_config_btn"
74+
android:layout_below="@+id/select_params_title"
75+
android:layout_margin="@dimen/create_config_margin1" />
76+
77+
<Button
78+
android:id="@+id/create_config_btn"
79+
android:layout_width="wrap_content"
80+
android:layout_height="wrap_content"
81+
android:layout_alignParentBottom="true"
82+
android:layout_centerHorizontal="true"
83+
android:background="@color/colorPrimary"
84+
android:padding="@dimen/margin_btn"
85+
android:text="@string/create_config_btn_text"
86+
android:textColor="@color/white" />
87+
</RelativeLayout>
88+
89+
<android.support.design.widget.AppBarLayout
90+
android:id="@+id/top_app_bar_layout"
91+
android:layout_width="match_parent"
92+
android:layout_height="wrap_content"
93+
android:theme="@style/AppTheme.AppBarOverlay">
94+
95+
<android.support.v7.widget.Toolbar
96+
android:id="@+id/toolbar"
97+
android:layout_width="match_parent"
98+
android:layout_height="?attr/actionBarSize"
99+
android:background="?attr/colorPrimary"
100+
app:popupTheme="@style/AppTheme.PopupOverlay" />
101+
102+
</android.support.design.widget.AppBarLayout>
103+
</RelativeLayout>

app/src/main/res/menu/activity_main_drawer.xml

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
android:id="@+id/sensor_data_logger"
1414
android:icon="@drawable/ic_wifi_tethering_black_24dp"
1515
android:title="@string/logged_data" />
16+
<item
17+
android:id="@+id/nav_generate_config"
18+
android:icon="@drawable/create_config_icon"
19+
android:title="@string/nav_config" />
1620
<item
1721
android:id="@+id/nav_settings"
1822
android:icon="@drawable/ic_settings_black_24dp"

app/src/main/res/values/dimens.xml

+4
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@
328328
<dimen name="seekarc_padding">30dp</dimen>
329329
<dimen name="seekarc_edit_text">36sp</dimen>
330330

331+
<dimen name="create_config_margin1">10dp</dimen>
332+
<dimen name="create_config_margin2">20dp</dimen>
333+
<dimen name="create_config_margin3">22dp</dimen>
334+
<dimen name="create_config_margin4">12dp</dimen>
331335
<dimen name="sensor_sht21_margin">5dp</dimen>
332336
<dimen name="sht21_height">40dp</dimen>
333337
<dimen name="card_sht21_height">180dp</dimen>

0 commit comments

Comments
 (0)