Panagiotis Triantafyllou

added back register device request, campaigns and articles implementation, new libs

# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<value>
<entry key="app">
<State />
</entry>
</value>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-02-13T08:44:19.612560Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=R58M42EM7YT" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$PROJECT_DIR$/../../../../../../gradle-6.6.1" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/warply_android_sdk" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="guide" />
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://developer.huawei.com/repo/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven2" />
<option name="name" value="maven2" />
<option name="url" value="https://plugins.gradle.org/m2/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>
\ No newline at end of file
This diff is collapsed. Click to expand it.
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -68,7 +68,7 @@ dependencies {
implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'com.google.android.material:material:1.12.0'
implementation 'com.google.android.material:material:1.13.0'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.google.guava:guava:33.0.0-android'
......@@ -99,14 +99,14 @@ dependencies {
implementation 'androidx.sqlite:sqlite:2.5.2'
//------------------------------ Retrofit -----------------------------//
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:3.0.0'
implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
//------------------------------ Lifecycle -----------------------------//
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
//------------------------------ Retrofit Logs -----------------------------//
// implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
implementation 'com.squareup.okhttp3:logging-interceptor:5.1.0'
}
// In every export please update the version number
......
......@@ -744,7 +744,7 @@ public enum Warply {
return;
}
if (!WarpUtils.isRegisteredWarply(context)) {
registerWarply(context);
registerWarply();
return;
}
if (WarpUtils.getIsDEVICEINFOENABLED(context))
......@@ -1378,7 +1378,7 @@ public enum Warply {
WarplyDBHelper.getInstance(mContext).deleteAllRequests();
WarplyDBHelper.getInstance(mContext).deleteAllPushRequests();
WarplyDBHelper.getInstance(mContext).deleteAllPushAckRequests();
String webId = result.optString("web_id", "");
String webId = result.optString("web_id", "deprecated");
WarpUtils.setWebId(mContext, webId);
String apiKey = result.optString("api_key", "");
WarpUtils.setApiKey(mContext, apiKey);
......
......@@ -10,6 +10,7 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
......@@ -24,7 +25,7 @@ import ly.warp.sdk.R;
import ly.warp.sdk.io.adapters.BannerAdapter;
import ly.warp.sdk.io.adapters.OfferAdapter;
import ly.warp.sdk.io.callbacks.CallbackReceiver;
import ly.warp.sdk.io.models.Campaign;
import ly.warp.sdk.io.models.BannerItem;
import ly.warp.sdk.io.models.DummyDataProvider;
import ly.warp.sdk.io.models.OfferCategory;
import ly.warp.sdk.io.models.OfferItem;
......@@ -85,6 +86,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Offe
private TextView mTvAllOffers, mTvAllFavorites, mTvAllViability, mTvAllFamily,
mTvAllCoffee, mTvAllTravelling, mTvAllKids, mTvAllPurchases;
private ImageView mIvProfile;
private ConstraintLayout mViewPager;
// ===========================================================
// Methods for/from SuperClass/Interfaces
......@@ -143,6 +145,8 @@ public class HomeActivity extends Activity implements View.OnClickListener, Offe
mPbLoading = findViewById(R.id.pb_loading);
mPbLoading.setOnTouchListener((v, event) -> true);
mViewPager = findViewById(R.id.cl_viewpager);
mIvProfile = findViewById(R.id.profile_icon);
mIvProfile.setOnClickListener(this);
......@@ -421,10 +425,14 @@ public class HomeActivity extends Activity implements View.OnClickListener, Offe
mBannerViewPager = findViewById(R.id.banner_viewpager);
mDotsContainer = findViewById(R.id.dots_container);
mBannerAdapter = new BannerAdapter(this, WarplyManagerHelper.getCampaignList());
mBannerAdapter.setOnBannerClickListener(campaign -> {
mBannerAdapter = new BannerAdapter(this, WarplyManagerHelper.getBannerList());
mBannerAdapter.setOnBannerCampaignClickListener(campaign -> {
startActivity(WarpViewActivity.createIntentFromURL(this, WarplyManagerHelper.constructCampaignUrl(campaign)));
});
mBannerAdapter.setOnBannerContentClickListener(article -> {
//TODO: click article
String s = "";
});
// Set the number of pages to preload for adjacent items
mBannerViewPager.setOffscreenPageLimit(5);
......@@ -432,7 +440,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Offe
mBannerViewPager.setAdapter(mBannerAdapter);
// Setup pagination dots
setupPaginationDots(WarplyManagerHelper.getCampaignList().size());
setupPaginationDots(WarplyManagerHelper.getBannerList().size());
// Handle page changes
mBannerViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
......@@ -486,26 +494,29 @@ public class HomeActivity extends Activity implements View.OnClickListener, Offe
}
}
private CallbackReceiver<ArrayList<Campaign>> mCampaignsCallback = new CallbackReceiver<ArrayList<Campaign>>() {
private CallbackReceiver<ArrayList<BannerItem>> mCampaignsCallback = new CallbackReceiver<ArrayList<BannerItem>>() {
@Override
public void onSuccess(ArrayList<Campaign> result) {
public void onSuccess(ArrayList<BannerItem> result) {
mPbLoading.setVisibility(View.GONE);
if (result != null && !result.isEmpty()) {
// Preloads the campaigns' images
result.forEach(campaign -> {
result.forEach(bannerItem -> {
Glide.with(getApplicationContext())
.load(campaign.getLogoUrl())
.load(bannerItem.isCampaign() ? bannerItem.getCampaign().getLogoUrl() : bannerItem.getContent().getImgPreview())
.diskCacheStrategy(DiskCacheStrategy.DATA)
.preload();
});
setupBannerCarousel();
} else {
mViewPager.setVisibility(View.GONE);
}
}
@Override
public void onFailure(int errorCode) {
mPbLoading.setVisibility(View.GONE);
mViewPager.setVisibility(View.GONE);
}
};
}
......
......@@ -15,25 +15,36 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.util.ArrayList;
import ly.warp.sdk.R;
import ly.warp.sdk.io.models.BannerItem;
import ly.warp.sdk.io.models.Campaign;
import ly.warp.sdk.io.models.Content;
public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.BannerViewHolder> {
private final Context mContext;
private final ArrayList<Campaign> mCampaigns;
private OnBannerClickListener mListener;
private final ArrayList<BannerItem> mBannerItems;
private OnBannerCampaignClickListener mListenerCampaign;
private OnBannerContentClickListener mListenerContent;
public interface OnBannerClickListener {
void onBannerClick(Campaign campaign);
public interface OnBannerCampaignClickListener {
void onBannerCampaignClick(Campaign campaign);
}
public BannerAdapter(Context context, ArrayList<Campaign> campaigns) {
public interface OnBannerContentClickListener {
void onBannerContentClick(Content content);
}
public BannerAdapter(Context context, ArrayList<BannerItem> campaigns) {
this.mContext = context;
this.mCampaigns = campaigns;
this.mBannerItems = campaigns;
}
public void setOnBannerClickListener(OnBannerClickListener listener) {
this.mListener = listener;
public void setOnBannerCampaignClickListener(OnBannerCampaignClickListener listener) {
this.mListenerCampaign = listener;
}
public void setOnBannerContentClickListener(OnBannerContentClickListener listener) {
this.mListenerContent = listener;
}
@NonNull
......@@ -45,27 +56,44 @@ public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.BannerView
@Override
public void onBindViewHolder(@NonNull BannerViewHolder holder, int position) {
Campaign campaignItem = mCampaigns.get(position);
BannerItem bannerItem = mBannerItems.get(position);
Glide.with(mContext)
if (bannerItem.isCampaign()) {
Glide.with(mContext)
// .setDefaultRequestOptions(
// RequestOptions
// .placeholderOf(R.drawable.demo_logo)
// .error(R.drawable.demo_logo))
.load(campaignItem.getLogoUrl())
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(holder.imageView);
holder.itemView.setOnClickListener(v -> {
if (mListener != null) {
mListener.onBannerClick(campaignItem);
}
});
.load(bannerItem.getCampaign().getLogoUrl())
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(holder.imageView);
holder.itemView.setOnClickListener(v -> {
if (mListenerCampaign != null) {
mListenerCampaign.onBannerCampaignClick(bannerItem.getCampaign());
}
});
} else {
Glide.with(mContext)
// .setDefaultRequestOptions(
// RequestOptions
// .placeholderOf(R.drawable.demo_logo)
// .error(R.drawable.demo_logo))
.load(bannerItem.getContent().getImgPreview())
.diskCacheStrategy(DiskCacheStrategy.DATA)
.into(holder.imageView);
holder.itemView.setOnClickListener(v -> {
if (mListenerContent != null) {
mListenerContent.onBannerContentClick(bannerItem.getContent());
}
});
}
}
@Override
public int getItemCount() {
return mCampaigns.size();
return mBannerItems.size();
}
static class BannerViewHolder extends RecyclerView.ViewHolder {
......
package ly.warp.sdk.io.models;
public class BannerItem {
public enum ItemType {
CAMPAIGN,
CONTENT
}
private ItemType type;
private Campaign campaign;
private Content content;
private int sorting;
public BannerItem(Campaign campaign) {
this.type = ItemType.CAMPAIGN;
this.campaign = campaign;
this.content = null;
this.sorting = campaign.getSorting();
}
public BannerItem(Content content) {
this.type = ItemType.CONTENT;
this.content = content;
this.campaign = null;
this.sorting = content.getSorting();
}
public ItemType getType() {
return type;
}
public Campaign getCampaign() {
return campaign;
}
public Content getContent() {
return content;
}
public boolean isCampaign() {
return type == ItemType.CAMPAIGN;
}
public boolean isContent() {
return type == ItemType.CONTENT;
}
}
......@@ -72,8 +72,6 @@ public class Campaign implements Parcelable, Serializable {
private static final String ACTIONS = "actions";
private static final String BUS_ID = "busId";
private static final String CAMPAIGN_TYPE_SETTINGS = "campaign_type_settings";
private static final String BANNER_IMAGE = "Banner_img";
private static final String BANNER_TITLE = "Banner_title";
private static final String CATEGORY_ID = "category_id";
private static final String COUPON_AVAILABILITY = "coupon_availability";
......@@ -103,8 +101,6 @@ public class Campaign implements Parcelable, Serializable {
private String busId;
private ArrayList<CampaignAction> actions = new ArrayList<>();
private String campaignTypeSettings;
private String bannerImage;
private String bannerTitle;
private String categoryId;
private Integer couponAvailability;
private String endDate, startDate;
......@@ -148,8 +144,6 @@ public class Campaign implements Parcelable, Serializable {
this.busId = "";
this.actions = new ArrayList<>();
this.campaignTypeSettings = "";
this.bannerImage = "";
this.bannerTitle = "";
this.couponAvailability = null;
this.categoryId = "";
this.endDate = "";
......@@ -186,20 +180,6 @@ public class Campaign implements Parcelable, Serializable {
this.isNew = json.optBoolean(IS_NEW);
this.sorting = json.optInt(SORTING);
this.extraFields = json.optString(EXTRA_FIELDS);
if (!TextUtils.isEmpty(this.extraFields)) {
JSONObject extraFieldsResp = WarpJSONParser.getJSONFromString(this.extraFields);
if (extraFieldsResp != null) {
if (extraFieldsResp.has("Banner_title")) {
this.bannerTitle = extraFieldsResp.optString(BANNER_TITLE, "");
}
if (extraFieldsResp.has("Banner_img")) {
this.bannerImage = extraFieldsResp.optString(BANNER_IMAGE, "");
}
}
} else {
this.bannerImage = "";
this.bannerTitle = "";
}
this.type = json.optString(TYPE);
this.expired = json.optBoolean(EXPIRED);
this.show = json.optBoolean(SHOW);
......@@ -651,22 +631,6 @@ public class Campaign implements Parcelable, Serializable {
this.campaignTypeSettings = campaignTypeSettings;
}
public String getBannerImage() {
return this.bannerImage;
}
public String getBannerTitle() {
return this.bannerTitle;
}
public void setBannerImage(String bannerImage) {
this.bannerImage = bannerImage;
}
public void setBannerTitle(String bannerTitle) {
this.bannerTitle = bannerTitle;
}
public String getEndDate() {
return endDate;
}
......
......@@ -33,12 +33,12 @@ public interface ApiService {
@Headers("Content-Type: application/json")
@POST("/partners/dei/app_login")
Call<ResponseBody> dehUser(@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_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);
@Headers("Content-Type: application/json")
@POST("/partners/cosmote/verify")
......@@ -97,14 +97,14 @@ public interface ApiService {
@Headers("Content-Type: application/json")
@POST("/api/mobile/v2/{appUuid}/context/")
Call<ResponseBody> getCampaignsAvailability(@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);
Call<ResponseBody> getArticles(@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);
@Headers("Content-Type: application/json")
@POST("/oauth/{appUuid}/context")
......@@ -118,18 +118,6 @@ 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> getMarketPassDetails(@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
// ===========================================================
......
......@@ -32,6 +32,7 @@ import java.util.ArrayList;
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.utils.managers.WarplyManager;
......@@ -52,6 +53,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>();
// ===========================================================
// Methods for/from SuperClass/Interfaces
......@@ -70,6 +72,15 @@ public class WarplyManagerHelper {
return mCampaignListAll;
}
public static void setBannerList(ArrayList<BannerItem> bannerList) {
mBannerListAll.clear();
mBannerListAll.addAll(bannerList);
}
public static ArrayList<BannerItem> getBannerList() {
return mBannerListAll;
}
public static void setCouponRedeemedList(CouponList couponRedeemedList) {
mCouponRedeemedList.clear();
mCouponRedeemedList.addAll(couponRedeemedList);
......
......@@ -55,6 +55,7 @@
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
......