Panagiotis Triantafyllou

deh requests, new models, dynamic couponsets in home activity

......@@ -5,6 +5,7 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
......@@ -17,12 +18,15 @@ import org.json.JSONObject;
import ly.warp.sdk.R;
import ly.warp.sdk.activities.HomeActivity;
import ly.warp.sdk.io.callbacks.CallbackReceiver;
import ly.warp.sdk.io.models.User;
import ly.warp.sdk.utils.WarpUtils;
import ly.warp.sdk.utils.managers.WarplyManager;
public class HomeFragment extends Fragment implements View.OnClickListener {
private RelativeLayout mPbLoading;
private LinearLayout mRlSmFlow;
private EditText mEtLogin;
private LinearLayout mLlLogin;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
......@@ -36,15 +40,13 @@ public class HomeFragment extends Fragment implements View.OnClickListener {
mPbLoading.setOnTouchListener((v, event) -> true);
mRlSmFlow = view.findViewById(R.id.ll_sm_flow);
mRlSmFlow.setOnClickListener(this);
mEtLogin = view.findViewById(R.id.et_login);
mLlLogin = view.findViewById(R.id.ll_login);
mLlLogin.setOnClickListener(this);
WarpUtils.applyEdgeToEdge(getActivity(),
view.findViewById(R.id.rl_header),
null);
// 6012049321, 6012049322, 6012049323, 7000000831 history, 7000000826
// prod 6006552990, prod 6005892749, live 3000184910,prod 7000070282, live 3000136179
// mPbLoading.setVisibility(View.VISIBLE);
// WarplyManager.getDehUser("aggeliki@warp.ly", mLoginReceiver);
}
@Override
......@@ -59,6 +61,11 @@ public class HomeFragment extends Fragment implements View.OnClickListener {
// WarplyManager.logout(mLogoutReceiver);
// return;
// }
if (view.getId() == R.id.ll_login) {
mPbLoading.setVisibility(View.VISIBLE);
WarplyManager.login(mEtLogin.getText().toString(), mLoginReceiver);
return;
}
if (view.getId() == R.id.ll_sm_flow) {
Intent myIntent = new Intent(getContext(), HomeActivity.class);
startActivity(myIntent);
......@@ -87,8 +94,9 @@ public class HomeFragment extends Fragment implements View.OnClickListener {
private final CallbackReceiver<JSONObject> mLoginReceiver = new CallbackReceiver<JSONObject>() {
@Override
public void onSuccess(JSONObject result) {
mPbLoading.setVisibility(View.GONE);
// mPbLoading.setVisibility(View.GONE);
Toast.makeText(getActivity(), "LOGIN SUCCESS", Toast.LENGTH_SHORT).show();
WarplyManager.getUser(mUserReceiver);
}
@Override
......@@ -97,4 +105,20 @@ public class HomeFragment extends Fragment implements View.OnClickListener {
Toast.makeText(getActivity(), "LOGIN ERROR", Toast.LENGTH_SHORT).show();
}
};
private final CallbackReceiver<User> mUserReceiver = new CallbackReceiver<User>() {
@Override
public void onSuccess(User user) {
mPbLoading.setVisibility(View.GONE);
Toast.makeText(getActivity(), "USER SUCCESS", Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(getContext(), HomeActivity.class);
startActivity(myIntent);
}
@Override
public void onFailure(int errorCode) {
mPbLoading.setVisibility(View.GONE);
Toast.makeText(getActivity(), "USER ERROR", Toast.LENGTH_SHORT).show();
}
};
}
\ No newline at end of file
......
......@@ -47,6 +47,24 @@ public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.BannerView
this.mListenerContent = listener;
}
private String getCampaignImage(BannerItem item) {
if (item.getCampaign().getExtraFields() != null) {
if (!item.getCampaign().getExtraFields().isNull("banner_img_mobile")) {
return item.getCampaign().getExtraFields().optString("banner_img_mobile", "");
}
}
return item.getCampaign().getLogoUrl();
}
private String getContentImage(BannerItem item) {
if (!item.getContent().getImg().isEmpty()) {
return item.getContent().getImg().get(0);
}
return item.getContent().getImgPreview();
}
@NonNull
@Override
public BannerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
......@@ -64,7 +82,7 @@ public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.BannerView
// RequestOptions
// .placeholderOf(R.drawable.demo_logo)
// .error(R.drawable.demo_logo))
.load(bannerItem.getCampaign().getLogoUrl())
.load(getCampaignImage(bannerItem))
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(holder.imageView);
......@@ -79,7 +97,7 @@ public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.BannerView
// RequestOptions
// .placeholderOf(R.drawable.demo_logo)
// .error(R.drawable.demo_logo))
.load(bannerItem.getContent().getImgPreview())
.load(getContentImage(bannerItem))
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(holder.imageView);
......
package ly.warp.sdk.io.adapters;
import android.content.Context;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import ly.warp.sdk.R;
import ly.warp.sdk.io.models.Couponset;
import ly.warp.sdk.utils.TopRoundedCornersTransformation;
import ly.warp.sdk.utils.WarpUtils;
public class CouponsetAdapter extends RecyclerView.Adapter<CouponsetAdapter.CouponsetViewHolder> {
private final List<Couponset> couponsets;
private final Context context;
private OnCouponsetClickListener listener;
public interface OnCouponsetClickListener {
void onCouponsetClick(Couponset couponset, int position);
}
public CouponsetAdapter(Context context, List<Couponset> couponsets) {
this.context = context;
this.couponsets = couponsets;
}
public void setOnCouponsetClickListener(OnCouponsetClickListener listener) {
this.listener = listener;
}
@NonNull
@Override
public CouponsetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.demo_item_offer, parent, false);
return new CouponsetViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CouponsetViewHolder holder, int position) {
Couponset couponset = couponsets.get(position);
holder.bind(couponset, position);
}
@Override
public int getItemCount() {
return couponsets.size();
}
public class CouponsetViewHolder extends RecyclerView.ViewHolder {
private final ImageView ivOfferImage;
private final ImageView ivFavorite;
private final ImageView ivLogo;
private final TextView tvPrice;
private final TextView tvTitle;
private final TextView tvDescription;
private final TextView tvValidity;
CouponsetViewHolder(@NonNull View itemView) {
super(itemView);
ivOfferImage = itemView.findViewById(R.id.iv_offer_image);
ivFavorite = itemView.findViewById(R.id.iv_favorite);
ivLogo = itemView.findViewById(R.id.iv_logo);
tvPrice = itemView.findViewById(R.id.tv_price);
tvTitle = itemView.findViewById(R.id.tv_title);
tvDescription = itemView.findViewById(R.id.tv_description);
tvValidity = itemView.findViewById(R.id.tv_validity);
WarpUtils.renderCustomFont(context, R.font.ping_lcg_bold, tvPrice, tvTitle);
WarpUtils.renderCustomFont(context, R.font.ping_lcg_regular, tvDescription, tvValidity);
itemView.setOnClickListener(v -> {
int position = getAdapterPosition();
if (listener != null && position != RecyclerView.NO_POSITION) {
listener.onCouponsetClick(couponsets.get(position), position);
}
});
}
private void bind(Couponset couponset, int position) {
tvTitle.setText(couponset.getName() != null ? couponset.getName() : "");
tvDescription.setText(couponset.getShortDescription() != null ? couponset.getShortDescription() : "");
tvPrice.setText(couponset.getDiscount() != null ? couponset.getDiscount() : "");
if (couponset.getEndDate() != null && !couponset.getEndDate().isEmpty()) {
tvValidity.setText(formatValidityDate(couponset.getEndDate()));
tvValidity.setVisibility(View.VISIBLE);
} else {
tvValidity.setVisibility(View.GONE);
}
ivFavorite.setImageResource(R.drawable.demo_heart);
loadCouponsetImage(couponset.getImgPreview());
if (couponset.getMerchant() != null && couponset.getMerchant().getImgPreview() != null) {
loadMerchantLogo(couponset.getMerchant().getImgPreview());
} else {
ivLogo.setVisibility(View.GONE);
}
}
private String formatValidityDate(String endDate) {
try {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Date date = inputFormat.parse(endDate);
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM", Locale.getDefault());
return "έως " + outputFormat.format(date);
} catch (ParseException e) {
try {
SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
Date date = inputFormat2.parse(endDate);
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM", Locale.getDefault());
return "έως " + outputFormat.format(date);
} catch (ParseException e2) {
return endDate;
}
}
}
private void loadCouponsetImage(String imageUrl) {
if (imageUrl != null && !imageUrl.isEmpty()) {
int radiusInPixels = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 9,
context.getResources().getDisplayMetrics());
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.DATA)
.transform(new CenterCrop(), new TopRoundedCornersTransformation(radiusInPixels))
.into(ivOfferImage);
}
}
private void loadMerchantLogo(String logoUrl) {
if (logoUrl != null && !logoUrl.isEmpty()) {
ivLogo.setVisibility(View.VISIBLE);
Glide.with(context)
.load(logoUrl)
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(ivLogo);
} else {
ivLogo.setVisibility(View.GONE);
}
}
}
}
This diff is collapsed. Click to expand it.
......@@ -5,6 +5,7 @@ import java.util.concurrent.TimeUnit;
import ly.warp.sdk.Warply;
import ly.warp.sdk.utils.WarplyProperty;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
......@@ -48,11 +49,11 @@ public class ApiClient {
private static OkHttpClient getClient() {
/* Logs Enabled */
// HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
// interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return new OkHttpClient.Builder()
// .addInterceptor(interceptor) // Logs Enabled
.addInterceptor(interceptor) // Logs Enabled
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
......
......@@ -32,7 +32,7 @@ public interface ApiService {
@Headers("Content-Type: application/json")
@POST("/partners/dei/app_login")
Call<ResponseBody> dehUser(@Body RequestBody request,
Call<ResponseBody> loginUser(@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,
......@@ -41,14 +41,16 @@ public interface ApiService {
@Header(WarpConstants.HEADER_SIGNATURE) String signature);
@Headers("Content-Type: application/json")
@POST("/partners/dei/verify")
Call<ResponseBody> verifyUser(@Body RequestBody request,
@POST("/oauth/{appUuid}/context")
Call<ResponseBody> getUser(@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_SIGNATURE) String signature,
@Header(WarpConstants.HEADER_AUTHORIZATION) String bearer);
@Headers("Content-Type: application/json")
@POST("/oauth/{appUuid}/logout")
......@@ -59,7 +61,8 @@ public interface ApiService {
@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_SIGNATURE) String signature,
@Header(WarpConstants.HEADER_AUTHORIZATION) String bearer);
@Headers("Content-Type: application/json")
@POST("/user/v5/{appUuid}/logout")
......@@ -70,7 +73,8 @@ public interface ApiService {
@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_SIGNATURE) String signature,
@Header(WarpConstants.HEADER_AUTHORIZATION) String bearer);
@Headers("Content-Type: application/json")
@POST("/oauth/{appUuid}/context")
......
......@@ -29,12 +29,14 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import ly.warp.sdk.Warply;
import ly.warp.sdk.db.WarplyDBHelper;
import ly.warp.sdk.io.models.BannerItem;
import ly.warp.sdk.io.models.Campaign;
import ly.warp.sdk.io.models.CouponList;
import ly.warp.sdk.io.models.Couponset;
import ly.warp.sdk.utils.managers.WarplyManager;
/**
......@@ -54,6 +56,7 @@ public class WarplyManagerHelper {
private static CouponList mCouponRedeemedList = new CouponList();
private static ArrayList<Campaign> mCampaignListAll = new ArrayList<Campaign>();
private static ArrayList<BannerItem> mBannerListAll = new ArrayList<BannerItem>();
private static LinkedHashMap<String, ArrayList<Couponset>> mCouponsetCategorizedMap = new LinkedHashMap<>();
// ===========================================================
// Methods for/from SuperClass/Interfaces
......@@ -81,6 +84,15 @@ public class WarplyManagerHelper {
return mBannerListAll;
}
public static void setCouponsetCategorizedMap(LinkedHashMap<String, ArrayList<Couponset>> couponsetMap) {
mCouponsetCategorizedMap.clear();
mCouponsetCategorizedMap.putAll(couponsetMap);
}
public static LinkedHashMap<String, ArrayList<Couponset>> getCouponsetCategorizedMap() {
return mCouponsetCategorizedMap;
}
public static void setCouponRedeemedList(CouponList couponRedeemedList) {
mCouponRedeemedList.clear();
mCouponRedeemedList.addAll(couponRedeemedList);
......
......@@ -6,15 +6,12 @@
android:layout_height="260dp"
android:background="@drawable/demo_shape_white_border_grey">
<!-- Main Offer Image -->
<ImageView
android:id="@+id/iv_offer_image"
android:layout_width="match_parent"
android:layout_height="140dp"
android:scaleType="centerCrop"
tools:src="@drawable/demo_home_banner1" />
android:scaleType="centerCrop" />
<!-- Heart Icon (Favorite) -->
<ImageView
android:id="@+id/iv_favorite"
android:layout_width="32dp"
......@@ -22,7 +19,6 @@
android:layout_margin="8dp"
android:src="@drawable/demo_heart" />
<!-- Price Badge -->
<TextView
android:id="@+id/tv_price"
android:layout_width="68dp"
......@@ -35,7 +31,6 @@
android:textSize="16sp"
tools:text="17,95€" />
<!-- Content Section -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
......@@ -50,7 +45,6 @@
android:orientation="vertical"
app:layout_constraintGuide_percent="0.7" />
<!-- Title -->
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
......@@ -63,7 +57,6 @@
app:layout_constraintTop_toTopOf="parent"
tools:text="Móvo 17,95" />
<!-- Description -->
<TextView
android:id="@+id/tv_description"
android:layout_width="0dp"
......@@ -77,7 +70,6 @@
app:layout_constraintTop_toBottomOf="@+id/tv_title"
tools:text="2 πίτσες &amp; Coca-COLA 1,5lt" />
<!-- Validity Date -->
<TextView
android:id="@+id/tv_validity"
android:layout_width="wrap_content"
......@@ -92,7 +84,6 @@
app:layout_constraintBottom_toBottomOf="parent"
tools:text="έως 30-09" />
<!-- Brand Logo -->
<ImageView
android:id="@+id/iv_logo"
android:layout_width="60dp"
......@@ -100,7 +91,6 @@
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:scaleType="centerInside"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/demo_avis" />
......
......@@ -43,8 +43,8 @@
android:layout_marginBottom="8dp"
android:maxLines="1"
android:scrollHorizontally="true"
android:textColor="@color/custom_black2"
android:text="@string/welcome_user" />
android:text="@string/welcome_user"
android:textColor="@color/custom_black2" />
</RelativeLayout>
<ImageView
......@@ -83,7 +83,8 @@
android:layout_marginHorizontal="8dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="16dp"
android:background="@drawable/shape_rectangle_rounded_white">
android:background="@drawable/shape_rectangle_rounded_white"
android:visibility="gone">
<LinearLayout
android:id="@+id/ll_sm_flow"
......@@ -94,7 +95,8 @@
android:layout_marginStart="16dp"
android:background="@drawable/selector_button_light_blue"
android:gravity="center"
android:orientation="horizontal">
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
......@@ -107,5 +109,40 @@
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/ll_login_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/rl_header"
android:layout_marginTop="24dp"
android:paddingHorizontal="24dp"
android:orientation="vertical">
<EditText
android:id="@+id/et_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:text="p.anagnostou+1201@dei.gr"/>
<LinearLayout
android:id="@+id/ll_login"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginTop="16dp"
android:background="@drawable/selector_button_light_blue"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:includeFontPadding="false"
android:text="@string/demo_login"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</ScrollView>
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="48dp">
<LinearLayout
android:id="@+id/ll_section_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:id="@+id/tv_section_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/custom_black2"
android:textSize="16sp"
tools:text="Top Offers (10)" />
<TextView
android:id="@+id/tv_section_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo_shape_transparent_border_black"
android:paddingHorizontal="16dp"
android:paddingVertical="5dp"
android:text="@string/demo_all"
android:textColor="@color/custom_black3"
android:textSize="14sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_section_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_section_header"
android:layout_marginTop="16dp"
android:clipToPadding="false"
android:orientation="horizontal"
android:paddingHorizontal="16dp" />
</RelativeLayout>
......@@ -6,6 +6,7 @@
<string name="welcome_user">User</string>
<string name="menu_home">Αρχική</string>
<string name="demo_home">Αρχική οθόνη</string>
<string name="demo_login">Σύνδεση</string>
<string name="demo_all">Όλα</string>
<string name="demo_offer">Προσφορά</string>
<string name="demo_more">Περισσότερα</string>
......