Page MenuHomec4science

SurveyActivity.java
No OneTemporary

File Metadata

Created
Wed, Aug 14, 19:17

SurveyActivity.java

package ch.epfl.esl.elevatedmonitor;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
public class SurveyActivity extends AppCompatActivity {
// It is static and therefore accessible from static fragments, and passed by reference
// to the list adapters, hence it can be used to save the state of each button
private static JSONArray questionnaires;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_survey);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
// Get the questions
final SharedPreferences prefs = getSharedPreferences(Constants.APP_SETTINGS, Context.MODE_PRIVATE);
String conf = prefs.getString(Constants.REMOTE_CONFIGURATION, null);
if (conf == null) {
Toast.makeText(this, "Remote configuration missing. Connect to internet and retry", Toast.LENGTH_LONG).show();
finish();
}
questionnaires = JSON.parseObject(conf).getJSONArray("questionnaires");
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
ViewPager mViewPager = findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = findViewById(R.id.tabs);
for (Object question : questionnaires) {
tabLayout.addTab(tabLayout.newTab().setText(((JSONObject) question).getString("title_en")));
}
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(view -> {
if (mViewPager.getCurrentItem() < mSectionsPagerAdapter.getCount() - 1) {
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);
} else {
JSONObject answers = new JSONObject();
// Save recording reference in questionnaire
answers.put("recording_id", getIntent().getStringExtra("recording_id"));
// Get a clean set of answers from questionnaire
for (Object q : questionnaires) {
JSONObject question = (JSONObject) q;
JSONObject answer = new JSONObject();
switch (question.getString("question_type")) {
case "choices":
for (Object item : question.getJSONArray("choices")) {
JSONObject choice = (JSONObject) item;
answer.put(choice.getString("choice_code"), choice.getBoolean("checked"));
}
break;
case "slider":
JSONObject slider = question.getJSONObject("slider");
answer.put(slider.getString("slider_code"), slider.getInteger("value"));
break;
default:
}
answers.put(question.getString("title_code"), answer);
}
String serialized = answers.toJSONString();
saveAnswers(serialized);
//Snackbar.make(view, "Questionnaire saved. Thank you.", Snackbar.LENGTH_LONG).setAction("Action", null).show();
finish();
// // Save and send the data to Firebase
// FirebaseDatabase database = FirebaseDatabase.getInstance();
// String identifier = getIntent().getStringExtra("identifier");
// DatabaseReference myRef = database.getReference("questionnaires/" + identifier);
//
// myRef.setValue(serialized).addOnSuccessListener(aVoid -> {
// Snackbar.make(view, "Questionnaire saved. Thank you.", Snackbar.LENGTH_LONG).setAction("Action", null).show();
// finish();
// });
//
// Snackbar.make(view, "Saving the questionnaire…", Snackbar.LENGTH_SHORT).setAction("Action", null).show();
}
});
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == mSectionsPagerAdapter.getCount() - 1) {
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.colorAccent)));
fab.setImageResource(android.R.drawable.ic_menu_send);
} else {
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.colorPrimary)));
fab.setImageResource(android.R.drawable.ic_media_next);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// // Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.menu_questionnaire, menu);
// return true;
// }
//
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
// // Handle action bar item clicks here. The action bar will
// // automatically handle clicks on the Home/Up button, so long
// // as you specify a parent activity in AndroidManifest.xml.
// int id = item.getItemId();
//
// //noinspection SimplifiableIfStatement
// if (id == R.id.action_settings) {
// return true;
// }
//
// return super.onOptionsItemSelected(item);
// }
protected static void saveAnswers(String answer) {
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS + File.separator
+"Questionnaires");
boolean pathIsThere;
if (!path.isDirectory()) {
pathIsThere = path.mkdirs();
} else {
pathIsThere = true;
}
if (pathIsThere) {
boolean fileExist = false;
File file = new File(path, "Questionnaire_" + Calendar.getInstance().getTime().toString() + ".csv");
if (!file.exists()) {
//Create file
try {
fileExist = file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} else {
fileExist = true;
}
if (fileExist) {
try {
FileOutputStream stream = new FileOutputStream(file);
try {
stream.write(answer.getBytes());
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
assert getArguments() != null;
int question_number = getArguments().getInt(ARG_SECTION_NUMBER);
JSONObject question = questionnaires.getJSONObject(question_number);
View rootView;
TextView textView;
switch (question.getString("question_type")) {
case "choices":
rootView = inflater.inflate(R.layout.fragment_survey_choices, container, false);
textView = rootView.findViewById(R.id.section_label);
textView.setText(Html.fromHtml(question.getString("description_en")));
RecyclerView rv = rootView.findViewById(R.id.choices_recycler_view);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), question.getJSONArray("choices"));
rv.setLayoutManager(new GridLayoutManager(getContext(), 1));
rv.setAdapter(adapter);
break;
case "slider":
rootView = inflater.inflate(R.layout.fragment_survey_slider, container, false);
JSONObject slider = question.getJSONObject("slider");
textView = rootView.findViewById(R.id.section_label);
textView.setText(Html.fromHtml(question.getString("description_en")));
SeekBar seekBar = rootView.findViewById(R.id.seekBar);
Integer initialValue = slider.getInteger("value");
if (initialValue == null) {
initialValue = 5;
}
seekBar.setProgress(initialValue);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
slider.put("value", progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Empty
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Empty
}
});
break;
default:
rootView = inflater.inflate(R.layout.fragment_survey_unknown, container, false);
}
return rootView;
}
}
class SectionsPagerAdapter extends FragmentPagerAdapter {
SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PlaceholderFragment.newInstance(position);
}
@Override
public int getCount() {
return questionnaires.size();
}
}
}

Event Timeline