Toggle navigation
Toggle navigation
This project
Loading...
Sign in
open-source
/
warply_android_sdk_maven_plugin
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
Panagiotis Triantafyllou
2026-03-20 12:56:27 +0200
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
dbe2ad5832fcfc73bc768ddaffbef77c38d31550
dbe2ad58
1 parent
fd1ab6b0
questionnaire part3
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
404 additions
and
16 deletions
warply_android_sdk/src/main/java/ly/warp/sdk/activities/HomeActivity.java
warply_android_sdk/src/main/java/ly/warp/sdk/io/models/User.java
warply_android_sdk/src/main/java/ly/warp/sdk/io/volley/ApiService.java
warply_android_sdk/src/main/java/ly/warp/sdk/utils/managers/WarplyManager.java
warply_android_sdk/src/main/java/ly/warp/sdk/activities/HomeActivity.java
View file @
dbe2ad5
package
ly
.
warp
.
sdk
.
activities
;
import
android.app.Activity
;
import
android.app.AlertDialog
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
android.os.Handler
;
...
...
@@ -34,6 +35,7 @@ import com.google.common.util.concurrent.MoreExecutors;
import
com.google.common.util.concurrent.SettableFuture
;
import
org.json.JSONArray
;
import
org.json.JSONObject
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
...
...
@@ -80,6 +82,8 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
private
LinearLayout
mSectionsContainer
;
private
RelativeLayout
mSectionsLoading
;
private
int
mCurrentQuestionIndex
=
0
;
private
ArrayList
<
User
.
QuestionnaireAnswer
>
mQuestionnaireAnswers
=
new
ArrayList
<>();
private
String
[]
mCustom1Selections
=
new
String
[
3
];
private
SettableFuture
<
ArrayList
<
CarouselItem
>>
carouselFuture
=
SettableFuture
.
create
();
private
SettableFuture
<
LinkedHashMap
<
String
,
ArrayList
<
Couponset
>>>
couponsetsFuture
=
SettableFuture
.
create
();
...
...
@@ -117,7 +121,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
public
void
onSuccess
(
List
<
Object
>
result
)
{
runOnUiThread
(()
->
{
User
user
=
WarplyManagerHelper
.
getUser
();
if
(
user
!=
null
&&
user
.
getQuestionnaireAnswers
()
==
null
&&
user
.
getQuestionnaire
()
!=
null
)
{
if
(
user
!=
null
&&
(
user
.
getQuestionnaireAnswers
()
==
null
||
user
.
getQuestionnaireAnswers
().
isEmpty
())
&&
user
.
getQuestionnaire
()
!=
null
)
{
new
Handler
(
getMainLooper
()).
postDelayed
(()
->
showQuestionnaireDialog
(
user
.
getQuestionnaire
()),
1000
);
}
});
...
...
@@ -138,8 +142,10 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
@Override
public
void
onClick
(
View
v
)
{
if
(
v
.
getId
()
==
R
.
id
.
profile_icon
)
{
// Intent myIntent = new Intent(HomeActivity.this, ProfileActivity.class);
// startActivity(myIntent);
User
user
=
WarplyManagerHelper
.
getUser
();
if
(
user
!=
null
&&
user
.
getQuestionnaire
()
!=
null
)
{
showQuestionnaireDialog
(
user
.
getQuestionnaire
());
}
return
;
}
if
(
v
.
getId
()
==
R
.
id
.
ll_my_coupons
)
{
...
...
@@ -558,6 +564,18 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
});
mCurrentQuestionIndex
=
0
;
mCustom1Selections
=
new
String
[
3
];
// Seed session answers from server answers if they exist (button trigger / re-open case)
// This ensures prefill works correctly when the user opens the questionnaire again
User
user
=
WarplyManagerHelper
.
getUser
();
ArrayList
<
User
.
QuestionnaireAnswer
>
serverAnswers
=
(
user
!=
null
)
?
user
.
getQuestionnaireAnswers
()
:
null
;
if
(
serverAnswers
!=
null
&&
!
serverAnswers
.
isEmpty
())
{
mQuestionnaireAnswers
=
new
ArrayList
<>(
serverAnswers
);
}
else
{
mQuestionnaireAnswers
=
new
ArrayList
<>();
}
renderQuestion
(
questionnaire
,
dialogView
,
bottomSheetDialog
);
bottomSheetDialog
.
setOnShowListener
(
dialog
->
{
...
...
@@ -607,6 +625,18 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
List
<
Integer
>
selectedPositions
=
new
ArrayList
<>();
// Look up existing answer from session answers
// mQuestionnaireAnswers is already seeded with server answers on dialog open,
// so this single lookup covers both the auto-trigger and button-trigger cases
User
.
QuestionnaireAnswer
existingAnswer
=
null
;
for
(
User
.
QuestionnaireAnswer
qa
:
mQuestionnaireAnswers
)
{
if
(
qa
.
getQuestionId
()
==
question
.
getId
())
{
existingAnswer
=
qa
;
break
;
}
}
final
User
.
QuestionnaireAnswer
prefillAnswer
=
existingAnswer
;
if
(
"select"
.
equals
(
type
))
{
tvQuestionHeaderSubtitle
.
setVisibility
(
View
.
GONE
);
...
...
@@ -614,8 +644,11 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
TextView
tvDropdownTitle
=
dropdownHeader
.
findViewById
(
R
.
id
.
tv_dropdown_option_header
);
ImageView
ivArrow
=
dropdownHeader
.
findViewById
(
R
.
id
.
iv_terms_arrow
);
String
optionHeaderText
=
options
!=
null
&&
options
.
length
()
>
0
?
options
.
optString
(
0
)
:
"Επιλέξτε"
;
tvDropdownTitle
.
setText
(
optionHeaderText
);
// Prefill: if answer exists, show it; otherwise show first option as placeholder
String
prefillText
=
(
prefillAnswer
!=
null
&&
!
prefillAnswer
.
getAnswerList
().
isEmpty
())
?
prefillAnswer
.
getAnswerList
().
get
(
0
)
:
(
options
!=
null
&&
options
.
length
()
>
0
?
options
.
optString
(
0
)
:
"Επιλέξτε"
);
tvDropdownTitle
.
setText
(
prefillText
);
WarpUtils
.
renderCustomFont
(
this
,
R
.
font
.
ping_lcg_regular
,
tvDropdownTitle
);
llOptionsContainer
.
addView
(
dropdownHeader
);
...
...
@@ -672,6 +705,15 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
}
else
if
(
"custom1"
.
equals
(
type
))
{
String
[]
headers
=
{
"Ενήλικες"
,
"Παιδιά έως 9 ετών"
,
"Παιδιά 10-18 ετών"
};
// Prefill mCustom1Selections from existing answer
mCustom1Selections
=
new
String
[
3
];
if
(
prefillAnswer
!=
null
)
{
ArrayList
<
String
>
prefillList
=
prefillAnswer
.
getAnswerList
();
for
(
int
k
=
0
;
k
<
Math
.
min
(
prefillList
.
size
(),
3
);
k
++)
{
mCustom1Selections
[
k
]
=
prefillList
.
get
(
k
);
}
}
if
(
options
!=
null
)
{
for
(
int
i
=
0
;
i
<
options
.
length
();
i
++)
{
Object
outerItem
=
options
.
opt
(
i
);
...
...
@@ -705,7 +747,10 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
);
dropdownHeader
.
setLayoutParams
(
dropdownParams
);
tvDropdownTitle
.
setText
(
"Επιλέξτε"
);
// Prefill: show saved selection or default placeholder
String
custom1Prefill
=
(
mCustom1Selections
[
i
]
!=
null
&&
!
mCustom1Selections
[
i
].
isEmpty
())
?
mCustom1Selections
[
i
]
:
"Επιλέξτε"
;
tvDropdownTitle
.
setText
(
custom1Prefill
);
WarpUtils
.
renderCustomFont
(
this
,
R
.
font
.
ping_lcg_regular
,
tvDropdownTitle
);
llCustomContainer
.
addView
(
dropdownHeader
);
...
...
@@ -749,8 +794,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
final
int
headerIndex
=
i
;
listPopupWindow
.
setOnItemClickListener
((
parent
,
view
,
position
,
id
)
->
{
selectedPositions
.
clear
();
selectedPositions
.
add
(
headerIndex
*
100
+
position
);
mCustom1Selections
[
headerIndex
]
=
popupOptions
.
get
(
position
);
tvDropdownTitle
.
setText
(
popupOptions
.
get
(
position
));
listPopupWindow
.
dismiss
();
});
...
...
@@ -778,7 +822,15 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
TextView
tvOptionTitle
=
optionView
.
findViewById
(
R
.
id
.
tv_option_title
);
tvOptionTitle
.
setText
(
optionText
);
WarpUtils
.
renderCustomFont
(
this
,
R
.
font
.
ping_lcg_bold
,
tvOptionTitle
);
// Prefill: check if this option was previously selected
boolean
isPrefilled
=
prefillAnswer
!=
null
&&
prefillAnswer
.
getAnswerList
().
contains
(
optionText
);
if
(
isPrefilled
)
{
llOptionContainer
.
setBackground
(
AppCompatResources
.
getDrawable
(
this
,
R
.
drawable
.
shape_questionnaire_option_selected
));
selectedPositions
.
add
(
position
);
}
else
{
llOptionContainer
.
setBackground
(
AppCompatResources
.
getDrawable
(
this
,
R
.
drawable
.
shape_questionnaire_option_unselected
));
}
optionView
.
setOnClickListener
(
v
->
{
if
(
"string"
.
equals
(
type
))
{
...
...
@@ -810,15 +862,81 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
}
llNextButton
.
setOnClickListener
(
v
->
{
saveAnswer
(
question
,
selectedPositions
,
options
,
type
);
if
(
mCurrentQuestionIndex
<
questionnaire
.
getQuestions
().
size
()
-
1
)
{
mCurrentQuestionIndex
++;
renderQuestion
(
questionnaire
,
dialogView
,
dialog
);
}
else
{
// Final screen, leave action empty as requested
// Final screen: submit answers to the backend
String
questionnaireId
=
questionnaire
.
getQuestionnaireId
();
WarplyManager
.
saveQuestionnaire
(
mQuestionnaireAnswers
,
questionnaireId
,
new
CallbackReceiver
<
JSONObject
>()
{
@Override
public
void
onSuccess
(
JSONObject
result
)
{
dialog
.
dismiss
();
WarplyManager
.
getUser
(
mUserReceiver
);
if
(!
isFinishing
())
{
new
AlertDialog
.
Builder
(
HomeActivity
.
this
)
.
setTitle
(
getString
(
R
.
string
.
demo_questionnaire_title
))
.
setMessage
(
"Οι απαντήσεις σου αποθηκεύτηκαν επιτυχώς!"
)
.
setPositiveButton
(
"OK"
,
(
d
,
which
)
->
d
.
dismiss
())
.
show
();
}
}
@Override
public
void
onFailure
(
int
errorCode
)
{
dialog
.
dismiss
();
if
(!
isFinishing
())
{
new
AlertDialog
.
Builder
(
HomeActivity
.
this
)
.
setTitle
(
getString
(
R
.
string
.
demo_questionnaire_title
))
.
setMessage
(
"Κάτι πήγε στραβά. Παρακαλώ δοκίμασε ξανά."
)
.
setPositiveButton
(
"OK"
,
(
d
,
which
)
->
d
.
dismiss
())
.
show
();
}
}
});
}
});
}
private
void
saveAnswer
(
User
.
Question
question
,
List
<
Integer
>
selectedPositions
,
JSONArray
options
,
String
type
)
{
// Remove any previously saved answer for this question_id (handles going back + re-answering)
mQuestionnaireAnswers
.
removeIf
(
a
->
a
.
getQuestionId
()
==
question
.
getId
());
User
.
QuestionnaireAnswer
answer
=
new
User
.
QuestionnaireAnswer
();
answer
.
setQuestionId
(
question
.
getId
());
answer
.
setVersion
(
question
.
getVersion
());
if
(
"string"
.
equals
(
type
)
||
"select"
.
equals
(
type
))
{
if
(!
selectedPositions
.
isEmpty
())
{
JSONArray
arr
=
new
JSONArray
();
arr
.
put
(
options
.
optString
(
selectedPositions
.
get
(
0
)));
answer
.
setAnswer
(
arr
);
answer
.
setSingleAnswer
(
true
);
mQuestionnaireAnswers
.
add
(
answer
);
}
}
else
if
(
"multi"
.
equals
(
type
))
{
if
(!
selectedPositions
.
isEmpty
())
{
JSONArray
arr
=
new
JSONArray
();
for
(
int
pos
:
selectedPositions
)
{
arr
.
put
(
options
.
optString
(
pos
));
}
answer
.
setAnswer
(
arr
);
answer
.
setSingleAnswer
(
false
);
mQuestionnaireAnswers
.
add
(
answer
);
}
}
else
if
(
"custom1"
.
equals
(
type
))
{
JSONArray
arr
=
new
JSONArray
();
for
(
String
sel
:
mCustom1Selections
)
{
arr
.
put
(
sel
!=
null
?
sel
:
""
);
}
answer
.
setAnswer
(
arr
);
answer
.
setSingleAnswer
(
false
);
mQuestionnaireAnswers
.
add
(
answer
);
}
}
private
final
CallbackReceiver
<
ArrayList
<
CarouselItem
>>
mCarouselCallback
=
new
CallbackReceiver
<
ArrayList
<
CarouselItem
>>()
{
@Override
public
void
onSuccess
(
ArrayList
<
CarouselItem
>
result
)
{
...
...
@@ -882,4 +1000,14 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
Toast
.
makeText
(
HomeActivity
.
this
,
"COUPONS ERROR"
,
Toast
.
LENGTH_SHORT
).
show
();
}
};
private
final
CallbackReceiver
<
User
>
mUserReceiver
=
new
CallbackReceiver
<
User
>()
{
@Override
public
void
onSuccess
(
User
user
)
{
}
@Override
public
void
onFailure
(
int
errorCode
)
{
}
};
}
...
...
warply_android_sdk/src/main/java/ly/warp/sdk/io/models/User.java
View file @
dbe2ad5
...
...
@@ -72,7 +72,7 @@ public class User implements Parcelable, Serializable {
private
String
msisdn
;
private
String
profileMetadata
;
private
Questionnaire
questionnaire
;
private
JSONObject
questionnaireAnswers
;
private
ArrayList
<
QuestionnaireAnswer
>
questionnaireAnswers
;
private
JSONObject
userAnswers
;
private
String
userId
;
private
JSONArray
userSegments
;
...
...
@@ -128,7 +128,18 @@ public class User implements Parcelable, Serializable {
this
.
msisdn
=
optNullableString
(
json
,
MSISDN
);
this
.
profileMetadata
=
optNullableString
(
json
,
PROFILE_METADATA
);
this
.
questionnaire
=
json
.
isNull
(
QUESTIONNAIRE
)
?
null
:
new
Questionnaire
(
json
.
optJSONObject
(
QUESTIONNAIRE
));
this
.
questionnaireAnswers
=
json
.
optJSONObject
(
QUESTIONNAIRE_ANSWERS
);
JSONArray
answersArr
=
json
.
optJSONArray
(
QUESTIONNAIRE_ANSWERS
);
if
(
answersArr
!=
null
)
{
this
.
questionnaireAnswers
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
answersArr
.
length
();
i
++)
{
JSONObject
answerJson
=
answersArr
.
optJSONObject
(
i
);
if
(
answerJson
!=
null
)
{
this
.
questionnaireAnswers
.
add
(
new
QuestionnaireAnswer
(
answerJson
));
}
}
}
else
{
this
.
questionnaireAnswers
=
null
;
}
this
.
userAnswers
=
json
.
optJSONObject
(
USER_ANSWERS
);
this
.
userId
=
optNullableString
(
json
,
USER_ID
);
this
.
userSegments
=
json
.
optJSONArray
(
USER_SEGMENTS
);
...
...
@@ -164,7 +175,18 @@ public class User implements Parcelable, Serializable {
}
try
{
String
questionnaireAnswersStr
=
source
.
readString
();
this
.
questionnaireAnswers
=
questionnaireAnswersStr
!=
null
?
new
JSONObject
(
questionnaireAnswersStr
)
:
null
;
if
(
questionnaireAnswersStr
!=
null
)
{
this
.
questionnaireAnswers
=
new
ArrayList
<>();
JSONArray
answersArr
=
new
JSONArray
(
questionnaireAnswersStr
);
for
(
int
i
=
0
;
i
<
answersArr
.
length
();
i
++)
{
JSONObject
answerJson
=
answersArr
.
optJSONObject
(
i
);
if
(
answerJson
!=
null
)
{
this
.
questionnaireAnswers
.
add
(
new
QuestionnaireAnswer
(
answerJson
));
}
}
}
else
{
this
.
questionnaireAnswers
=
null
;
}
}
catch
(
JSONException
e
)
{
this
.
questionnaireAnswers
=
null
;
}
...
...
@@ -194,7 +216,15 @@ public class User implements Parcelable, Serializable {
dest
.
writeString
(
this
.
consumerMetadata
!=
null
?
this
.
consumerMetadata
.
toString
()
:
null
);
dest
.
writeString
(
this
.
favoriteCouponsets
!=
null
?
this
.
favoriteCouponsets
.
toString
()
:
null
);
dest
.
writeString
(
this
.
questionnaire
!=
null
?
this
.
questionnaire
.
toString
()
:
null
);
dest
.
writeString
(
this
.
questionnaireAnswers
!=
null
?
this
.
questionnaireAnswers
.
toString
()
:
null
);
if
(
this
.
questionnaireAnswers
!=
null
)
{
JSONArray
answersArr
=
new
JSONArray
();
for
(
QuestionnaireAnswer
qa
:
this
.
questionnaireAnswers
)
{
answersArr
.
put
(
qa
.
toJSONObject
());
}
dest
.
writeString
(
answersArr
.
toString
());
}
else
{
dest
.
writeString
(
null
);
}
dest
.
writeString
(
this
.
userAnswers
!=
null
?
this
.
userAnswers
.
toString
()
:
null
);
dest
.
writeString
(
this
.
userSegments
!=
null
?
this
.
userSegments
.
toString
()
:
null
);
}
...
...
@@ -215,7 +245,15 @@ public class User implements Parcelable, Serializable {
jObj
.
put
(
MSISDN
,
this
.
msisdn
!=
null
?
this
.
msisdn
:
JSONObject
.
NULL
);
jObj
.
put
(
PROFILE_METADATA
,
this
.
profileMetadata
!=
null
?
this
.
profileMetadata
:
JSONObject
.
NULL
);
jObj
.
put
(
QUESTIONNAIRE
,
this
.
questionnaire
!=
null
?
this
.
questionnaire
.
toJSONObject
()
:
JSONObject
.
NULL
);
jObj
.
put
(
QUESTIONNAIRE_ANSWERS
,
this
.
questionnaireAnswers
!=
null
?
this
.
questionnaireAnswers
:
JSONObject
.
NULL
);
if
(
this
.
questionnaireAnswers
!=
null
)
{
JSONArray
answersArr
=
new
JSONArray
();
for
(
QuestionnaireAnswer
qa
:
this
.
questionnaireAnswers
)
{
answersArr
.
put
(
qa
.
toJSONObject
());
}
jObj
.
put
(
QUESTIONNAIRE_ANSWERS
,
answersArr
);
}
else
{
jObj
.
put
(
QUESTIONNAIRE_ANSWERS
,
JSONObject
.
NULL
);
}
jObj
.
put
(
USER_ANSWERS
,
this
.
userAnswers
!=
null
?
this
.
userAnswers
:
JSONObject
.
NULL
);
jObj
.
put
(
USER_ID
,
this
.
userId
!=
null
?
this
.
userId
:
JSONObject
.
NULL
);
jObj
.
put
(
USER_SEGMENTS
,
this
.
userSegments
!=
null
?
this
.
userSegments
:
JSONObject
.
NULL
);
...
...
@@ -312,7 +350,7 @@ public class User implements Parcelable, Serializable {
return
questionnaire
;
}
public
JSONObject
getQuestionnaireAnswers
()
{
public
ArrayList
<
QuestionnaireAnswer
>
getQuestionnaireAnswers
()
{
return
questionnaireAnswers
;
}
...
...
@@ -372,7 +410,7 @@ public class User implements Parcelable, Serializable {
this
.
questionnaire
=
questionnaire
;
}
public
void
setQuestionnaireAnswers
(
JSONObject
questionnaireAnswers
)
{
public
void
setQuestionnaireAnswers
(
ArrayList
<
QuestionnaireAnswer
>
questionnaireAnswers
)
{
this
.
questionnaireAnswers
=
questionnaireAnswers
;
}
...
...
@@ -417,6 +455,108 @@ public class User implements Parcelable, Serializable {
return
listData
;
}
public
static
class
QuestionnaireAnswer
implements
Parcelable
,
Serializable
{
private
int
questionId
;
private
JSONArray
answer
;
// Stored as JSONArray internally for uniformity
private
int
version
;
private
boolean
isSingleAnswer
;
// Tracks original format for serialization
public
QuestionnaireAnswer
()
{}
public
QuestionnaireAnswer
(
JSONObject
json
)
{
if
(
json
!=
null
)
{
this
.
questionId
=
json
.
optInt
(
"question_id"
,
-
1
);
this
.
version
=
json
.
optInt
(
"version"
,
0
);
Object
rawAnswer
=
json
.
opt
(
"answer"
);
if
(
rawAnswer
instanceof
JSONArray
)
{
this
.
answer
=
(
JSONArray
)
rawAnswer
;
this
.
isSingleAnswer
=
false
;
}
else
{
// Single string answer — wrap into JSONArray for uniformity
this
.
answer
=
new
JSONArray
();
this
.
answer
.
put
(
rawAnswer
!=
null
?
rawAnswer
.
toString
()
:
""
);
this
.
isSingleAnswer
=
true
;
}
}
}
protected
QuestionnaireAnswer
(
Parcel
in
)
{
questionId
=
in
.
readInt
();
version
=
in
.
readInt
();
isSingleAnswer
=
in
.
readByte
()
!=
0
;
try
{
String
answerStr
=
in
.
readString
();
answer
=
answerStr
!=
null
?
new
JSONArray
(
answerStr
)
:
null
;
}
catch
(
JSONException
e
)
{
answer
=
null
;
}
}
@Override
public
void
writeToParcel
(
Parcel
dest
,
int
flags
)
{
dest
.
writeInt
(
questionId
);
dest
.
writeInt
(
version
);
dest
.
writeByte
((
byte
)
(
isSingleAnswer
?
1
:
0
));
dest
.
writeString
(
answer
!=
null
?
answer
.
toString
()
:
null
);
}
@Override
public
int
describeContents
()
{
return
0
;
}
public
static
final
Creator
<
QuestionnaireAnswer
>
CREATOR
=
new
Creator
<
QuestionnaireAnswer
>()
{
@Override
public
QuestionnaireAnswer
createFromParcel
(
Parcel
in
)
{
return
new
QuestionnaireAnswer
(
in
);
}
@Override
public
QuestionnaireAnswer
[]
newArray
(
int
size
)
{
return
new
QuestionnaireAnswer
[
size
];
}
};
public
JSONObject
toJSONObject
()
{
JSONObject
jObj
=
new
JSONObject
();
try
{
jObj
.
put
(
"question_id"
,
this
.
questionId
);
jObj
.
put
(
"version"
,
this
.
version
);
// Serialize back to original format
if
(
this
.
isSingleAnswer
&&
this
.
answer
!=
null
&&
this
.
answer
.
length
()
>
0
)
{
jObj
.
put
(
"answer"
,
this
.
answer
.
optString
(
0
));
}
else
{
jObj
.
put
(
"answer"
,
this
.
answer
!=
null
?
this
.
answer
:
JSONObject
.
NULL
);
}
}
catch
(
JSONException
e
)
{
if
(
WarpConstants
.
DEBUG
)
e
.
printStackTrace
();
}
return
jObj
;
}
public
int
getQuestionId
()
{
return
questionId
;
}
public
void
setQuestionId
(
int
questionId
)
{
this
.
questionId
=
questionId
;
}
public
JSONArray
getAnswer
()
{
return
answer
;
}
public
void
setAnswer
(
JSONArray
answer
)
{
this
.
answer
=
answer
;
}
public
boolean
isSingleAnswer
()
{
return
isSingleAnswer
;
}
public
void
setSingleAnswer
(
boolean
singleAnswer
)
{
isSingleAnswer
=
singleAnswer
;
}
public
int
getVersion
()
{
return
version
;
}
public
void
setVersion
(
int
version
)
{
this
.
version
=
version
;
}
/**
* Convenience method to get the answer as a list of strings.
*/
public
ArrayList
<
String
>
getAnswerList
()
{
ArrayList
<
String
>
list
=
new
ArrayList
<>();
if
(
answer
!=
null
)
{
for
(
int
i
=
0
;
i
<
answer
.
length
();
i
++)
{
list
.
add
(
answer
.
optString
(
i
));
}
}
return
list
;
}
}
public
static
class
Questionnaire
implements
Parcelable
,
Serializable
{
private
String
questionnaireId
;
private
ArrayList
<
Question
>
questions
;
...
...
warply_android_sdk/src/main/java/ly/warp/sdk/io/volley/ApiService.java
View file @
dbe2ad5
...
...
@@ -204,6 +204,18 @@ public interface ApiService {
@Header
(
WarpConstants
.
HEADER_SIGNATURE
)
String
signature
,
@Header
(
WarpConstants
.
HEADER_AUTHORIZATION
)
String
bearer
);
@Headers
(
"Content-Type: application/json"
)
@POST
(
"/oauth/{appUuid}/context"
)
Call
<
ResponseBody
>
saveQuestionnaire
(
@Path
(
"appUuid"
)
String
appUuid
,
@Body
RequestBody
request
,
@Header
(
WarpConstants
.
HEADER_DATE
)
String
timeStamp
,
@Header
(
WarpConstants
.
HEADER_LOYALTY_BUNDLE_ID
)
String
bundleId
,
@Header
(
WarpConstants
.
HEADER_UNIQUE_DEVICE_ID
)
String
deviceId
,
@Header
(
WarpConstants
.
HEADER_CHANNEL
)
String
channel
,
@Header
(
WarpConstants
.
HEADER_WEB_ID
)
String
webId
,
@Header
(
WarpConstants
.
HEADER_SIGNATURE
)
String
signature
,
@Header
(
WarpConstants
.
HEADER_AUTHORIZATION
)
String
bearer
);
// ===========================================================
// Getter & Setter
// ===========================================================
...
...
warply_android_sdk/src/main/java/ly/warp/sdk/utils/managers/WarplyManager.java
View file @
dbe2ad5
...
...
@@ -1549,4 +1549,112 @@ public class WarplyManager {
});
return
future
;
}
public
static
void
saveQuestionnaire
(
ArrayList
<
User
.
QuestionnaireAnswer
>
answers
,
String
questionnaireId
,
final
CallbackReceiver
<
JSONObject
>
receiver
)
{
WarpUtils
.
log
(
"************* WARPLY Questionnaire Request ********************"
);
WarpUtils
.
log
(
"[WARP Trace] WARPLY Questionnaire Request is active"
);
WarpUtils
.
log
(
"**************************************************"
);
ApiService
service
=
ApiClient
.
getRetrofitInstance
().
create
(
ApiService
.
class
);
ListeningExecutorService
executorService
=
MoreExecutors
.
listeningDecorator
(
Executors
.
newFixedThreadPool
(
1
));
ListenableFuture
<
JSONObject
>
futureFilters
=
saveQuestionnaireRetro
(
answers
,
questionnaireId
,
service
);
ListenableFuture
<
List
<
Object
>>
allResultsFuture
=
Futures
.
allAsList
(
futureFilters
);
ListenableFuture
<
JSONObject
>
mergedResultFuture
=
Futures
.
transformAsync
(
allResultsFuture
,
results
->
{
JSONObject
resultFilters
=
(
JSONObject
)
results
.
get
(
0
);
return
executorService
.
submit
(()
->
resultFilters
);
},
executorService
);
Futures
.
addCallback
(
mergedResultFuture
,
new
FutureCallback
<
JSONObject
>()
{
@Override
public
void
onSuccess
(
JSONObject
mergedResult
)
{
executorService
.
shutdownNow
();
new
Handler
(
Looper
.
getMainLooper
()).
post
(()
->
receiver
.
onSuccess
(
mergedResult
));
}
@Override
public
void
onFailure
(
Throwable
throwable
)
{
executorService
.
shutdownNow
();
new
Handler
(
Looper
.
getMainLooper
()).
post
(()
->
receiver
.
onFailure
(
2
));
}
},
executorService
);
}
private
static
ListenableFuture
<
JSONObject
>
saveQuestionnaireRetro
(
ArrayList
<
User
.
QuestionnaireAnswer
>
answers
,
String
questionnaireId
,
ApiService
service
)
{
SettableFuture
<
JSONObject
>
future
=
SettableFuture
.
create
();
String
timeStamp
=
DateFormat
.
format
(
"yyyy-MM-dd hh:mm:ss"
,
System
.
currentTimeMillis
()).
toString
();
String
apiKey
=
WarpUtils
.
getApiKey
(
Warply
.
getWarplyContext
());
String
webId
=
WarpUtils
.
getWebId
(
Warply
.
getWarplyContext
());
// Serialize answers list to JSONArray using toJSONObject() on each element
JSONArray
answersJsonArray
=
new
JSONArray
();
for
(
User
.
QuestionnaireAnswer
answer
:
answers
)
{
answersJsonArray
.
put
(
answer
.
toJSONObject
());
}
Map
<
String
,
Object
>
jsonParamsDetails
=
new
ArrayMap
<>();
Map
<
String
,
Object
>
jsonParams
=
new
ArrayMap
<>();
jsonParams
.
put
(
"action"
,
"handle_user_details"
);
jsonParams
.
put
(
"process"
,
"questionnaire"
);
jsonParams
.
put
(
"del_empty"
,
false
);
Map
<
String
,
Object
>
jsonParamsQuestionnaireAnswers
=
new
ArrayMap
<>();
jsonParamsQuestionnaireAnswers
.
put
(
"questionnaire_answers"
,
answersJsonArray
);
jsonParamsQuestionnaireAnswers
.
put
(
"questionnaire_id"
,
questionnaireId
);
jsonParamsQuestionnaireAnswers
.
put
(
"first_write"
,
false
);
jsonParams
.
put
(
"data"
,
jsonParamsQuestionnaireAnswers
);
jsonParamsDetails
.
put
(
"consumer_data"
,
jsonParams
);
RequestBody
detailsRequest
=
RequestBody
.
create
(
MediaType
.
get
(
"application/json; charset=utf-8"
),
(
new
JSONObject
(
jsonParamsDetails
)).
toString
());
Call
<
ResponseBody
>
detailsCall
=
service
.
saveQuestionnaire
(
WarplyProperty
.
getAppUuid
(
Warply
.
getWarplyContext
()),
detailsRequest
,
timeStamp
,
"android:"
+
Warply
.
getWarplyContext
().
getPackageName
(),
new
WarplyDeviceInfoCollector
(
Warply
.
getWarplyContext
()).
getUniqueDeviceId
(),
"mobile"
,
webId
,
WarpUtils
.
produceSignature
(
apiKey
+
timeStamp
),
"Bearer "
+
WarplyDBHelper
.
getInstance
(
Warply
.
getWarplyContext
()).
getAuthValue
(
"access_token"
)
);
detailsCall
.
enqueue
(
new
Callback
<
ResponseBody
>()
{
@Override
public
void
onResponse
(
@NonNull
Call
<
ResponseBody
>
call
,
@NonNull
Response
<
ResponseBody
>
response
)
{
if
(
response
.
code
()
==
200
&&
response
.
body
()
!=
null
)
{
JSONObject
jobjDetailsResponse
=
null
;
try
{
jobjDetailsResponse
=
new
JSONObject
(
response
.
body
().
string
());
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
if
(
jobjDetailsResponse
!=
null
&&
jobjDetailsResponse
.
has
(
"status"
)
&&
jobjDetailsResponse
.
optString
(
"status"
,
"2"
).
equals
(
"1"
))
{
JSONObject
newResult
=
new
JSONObject
();
try
{
newResult
.
putOpt
(
"status"
,
1
);
newResult
.
putOpt
(
"message"
,
"Success"
);
future
.
set
(
newResult
);
}
catch
(
JSONException
e
)
{
e
.
printStackTrace
();
future
.
set
(
new
JSONObject
());
}
}
else
{
future
.
set
(
new
JSONObject
());
}
}
else
if
(
String
.
valueOf
(
response
.
code
()).
startsWith
(
"5"
))
{
future
.
set
(
new
JSONObject
());
}
else
{
// future.set(new CouponsetsList());
future
.
setException
(
new
Throwable
());
}
}
@Override
public
void
onFailure
(
@NonNull
Call
<
ResponseBody
>
call
,
@NonNull
Throwable
t
)
{
// future.set(new CouponsetsList());
future
.
setException
(
new
Throwable
());
}
});
return
future
;
}
}
...
...
Please
register
or
login
to post a comment