Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F77490771
SurveyActivity.java
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Aug 14, 19:17
Size
12 KB
Mime Type
text/x-java
Expires
Fri, Aug 16, 19:17 (2 d)
Engine
blob
Format
Raw Data
Handle
19876644
Attached To
R9555 Android app for multimodal data acquisition from wearables
SurveyActivity.java
View Options
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
Log In to Comment