Panagiotis Triantafyllou

plugin configuration

Showing 697 changed files with 311 additions and 1297 deletions
......@@ -43,7 +43,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':libraries:warply_android_sdk')
implementation project(':warply_android_sdk')
//Support
implementation 'androidx.appcompat:appcompat:1.4.1'
......
......@@ -5,11 +5,13 @@ buildscript {
mavenCentral()
google()
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.huawei.agconnect:agcp:1.6.2.300'
classpath 'io.github.gradle-nexus:publish-plugin:1.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......@@ -21,5 +23,9 @@ allprojects {
mavenCentral()
google()
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://plugins.gradle.org/m2/' }
}
}
apply plugin: 'io.github.gradle-nexus.publish-plugin'
apply from: "${rootDir}/scripts/publish-root.gradle"
\ No newline at end of file
......
package ly.warp.sdk.views;
import android.content.Context;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.text.TextUtils;
import ly.warp.sdk.BuildConfig;
import ly.warp.sdk.Warply;
import ly.warp.sdk.fragments.WarpViewFragment;
import ly.warp.sdk.io.callbacks.CallbackReceiver;
import ly.warp.sdk.io.callbacks.SimpleCallbackReceiver;
import ly.warp.sdk.io.models.CampaignList;
import ly.warp.sdk.io.request.WarplyInboxRequest;
public class CampaignViewLoader implements CallbackReceiver<CampaignList> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private DisplayBuilder mLastDisplayBuilder;
private SimpleCallbackReceiver<CampaignList> mExternalListener;
// ===========================================================
// Constructors
// ===========================================================
public CampaignViewLoader(Context context) {
Warply.getInitializer(context).init();
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void onSuccess(CampaignList result) {
if (result != null && result.size() > 0) {
showWarplyFragment(mLastDisplayBuilder, result.get(0).getSessionUUID());
}
notifySuccessExternalListener(result);
}
@Override
public void onFailure(int errorCode) {
notifyFailureExternalListener(errorCode);
}
// ===========================================================
// Methods
// ===========================================================
private void requestCampaignsIfNeed(DisplayBuilder builder, WarplyInboxRequest request, String sessionUuid) {
if (request != null && TextUtils.isEmpty(sessionUuid)) {
mLastDisplayBuilder = builder;
Warply.getInbox(request, this);
} else if (!TextUtils.isEmpty(sessionUuid)) {
showWarplyFragment(builder, sessionUuid);
notifySuccessExternalListener(null);
}
}
private void showWarplyFragment(DisplayBuilder builder, String sessionUuid) {
if (builder != null && builder.fragmentManager != null) {
WarpViewFragment warpFragment = WarpViewFragment.newInstance(sessionUuid, builder.isUseProgress, builder.isShowCloseBtn);
FragmentTransaction transaction = builder.fragmentManager.beginTransaction()
.replace(builder.containerId, warpFragment,
WarpViewFragment.class.getSimpleName())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (builder.isAddToBackStack) {
transaction.addToBackStack(null);
}
try {
transaction.commit();
} catch (IllegalStateException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
}
}
}
private void notifySuccessExternalListener(CampaignList campaigns) {
if (mExternalListener != null) {
mExternalListener.onSuccess(campaigns);
}
}
private void notifyFailureExternalListener(int errorCode) {
if (mExternalListener != null) {
mExternalListener.onFailure(errorCode);
}
}
// ===========================================================
// Getter & Setter
// ===========================================================
public void setCampaignsListener(SimpleCallbackReceiver<CampaignList> listener) {
this.mExternalListener = listener;
}
public DisplayBuilder DisplayBuilder() {
return new DisplayBuilder();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public class DisplayBuilder {
private boolean isUseProgress = false;
private boolean isShowCloseBtn = true;
private boolean isAddToBackStack = true;
private FragmentManager fragmentManager;
private int containerId;
public void display(FragmentActivity activity, WarplyInboxRequest request) {
if (activity != null && !activity.isFinishing()) {
display(activity, android.R.id.content, request);
}
}
public void display(FragmentActivity activity, int containerId, WarplyInboxRequest request) {
if (activity != null && !activity.isFinishing()) {
this.fragmentManager = activity.getSupportFragmentManager();
this.containerId = containerId;
requestCampaignsIfNeed(this, request, null);
}
}
public void display(Fragment parentFragment, int containerId, WarplyInboxRequest request) {
if (parentFragment != null && parentFragment.getActivity() != null && !parentFragment.getActivity().isFinishing()) {
this.fragmentManager = parentFragment.getChildFragmentManager();
this.containerId = containerId;
requestCampaignsIfNeed(this, request, null);
}
}
public void display(FragmentActivity activity, String sessionUuid) {
if (activity != null && !activity.isFinishing()) {
display(activity, android.R.id.content, sessionUuid);
}
}
public void display(FragmentActivity activity, int containerId, String sessionUuid) {
if (activity != null && !activity.isFinishing()) {
this.fragmentManager = activity.getSupportFragmentManager();
this.containerId = containerId;
requestCampaignsIfNeed(this, null, sessionUuid);
}
}
public void display(Fragment parentFragment, int containerId, String sessionUuid) {
if (parentFragment != null && parentFragment.getActivity() != null && !parentFragment.getActivity().isFinishing()) {
this.fragmentManager = parentFragment.getChildFragmentManager();
this.containerId = containerId;
requestCampaignsIfNeed(this, null, sessionUuid);
}
}
public DisplayBuilder setUseProgress(boolean use) {
this.isUseProgress = use;
return this;
}
public DisplayBuilder setShowCloseBtn(boolean show) {
this.isShowCloseBtn = show;
return this;
}
public DisplayBuilder setAddToBackStack(boolean add) {
this.isAddToBackStack = add;
return this;
}
}
}
package ly.warp.sdk.views.adapters.mix;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import ly.warp.sdk.io.models.Campaign;
import ly.warp.sdk.utils.WarpUtils;
import ly.warp.sdk.utils.managers.WarplyAnalyticsManager;
/**
* Helper class that used within the {@Link CampaignsMixController}
* and allow to track native campaigns events.
* Mix adapters monitor 2 types of events: view campaign in list and click on campaign item.
*/
public class CampaignsMixTracker {
// ===========================================================
// Constants
// ===========================================================
private enum TrackEvent {
CAMPAIGN_VIEW("native_campaign_view"), CAMPAIGN_CLICK("native_campaign_click");
private String type;
TrackEvent(String type) {
this.type = type;
}
public String getTrackMessage(@NonNull Campaign campaign) {
return type + ":" + campaign.getSessionUUID();
}
}
// ===========================================================
// Fields
// ===========================================================
private CampaignsMixController mMixController;
private int mOldFirstVisibleItem = -1;
private HashSet<Integer> mVisibleCampaignIndexes;
private Set<Integer> mNewCampaignIndexes;
private Set<Integer> mUpdatedCampaignIndexes;
// ===========================================================
// Constructors
// ===========================================================
public CampaignsMixTracker(@NonNull CampaignsMixController mixController) {
mMixController = mixController;
mVisibleCampaignIndexes = new HashSet<>();
mNewCampaignIndexes = new HashSet<>();
mUpdatedCampaignIndexes = new HashSet<>();
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
/**
* call in onScroll for correct results
*
* @param firstVisiblePosition - first visible position in global adapter
* @param lastVisibleItemPosition - last visible position in global adapter
*/
public void trackCampaignsView(int firstVisiblePosition, int lastVisibleItemPosition) {
if (lastVisibleItemPosition >= firstVisiblePosition && mOldFirstVisibleItem != firstVisiblePosition) {
mOldFirstVisibleItem = firstVisiblePosition;
/*Log.i("list_view_scroll", "first: " + firstVisibleItem + " visibleCount: " + visibleItemCount +
" last: " +lastVisibleItem);*/
mNewCampaignIndexes.clear();
mUpdatedCampaignIndexes.clear();
for (int i = firstVisiblePosition; i < lastVisibleItemPosition + 1; i++) {
if (mMixController.getItemViewType(i) == mMixController.getCampaignItemViewType()) {
// if new campaign index
if (mVisibleCampaignIndexes.add(i)) {
mNewCampaignIndexes.add(i);
} else {
mUpdatedCampaignIndexes.add(i);
}
}
}
// retain only visible indexes
mVisibleCampaignIndexes.clear();
mVisibleCampaignIndexes.addAll(mUpdatedCampaignIndexes);
mVisibleCampaignIndexes.addAll(mNewCampaignIndexes);
// update new campaigns
if (mNewCampaignIndexes.size() > 0) {
new TrackCampaignsTask(mNewCampaignIndexes, TrackEvent.CAMPAIGN_VIEW).execute();
}
}
}
public void trackCampaignClick(Campaign campaign) {
if (campaign != null) {
new TrackCampaignsTask(campaign, TrackEvent.CAMPAIGN_CLICK).execute();
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
private class TrackCampaignsTask extends AsyncTask<Void, Void, Void> {
private List<Campaign> mmTrackCampaigns;
private TrackEvent mmTrackEvent;
private TrackCampaignsTask(Set<Integer> indexes, TrackEvent event) {
mmTrackEvent = event;
if (indexes != null && indexes.size() > 0) {
mmTrackCampaigns = new ArrayList<>(indexes.size());
for (int index : indexes) {
Campaign camp = mMixController.getCampaignItem(index);
if (camp != null) {
mmTrackCampaigns.add(camp);
}
}
}
}
private TrackCampaignsTask(Campaign campaign, TrackEvent event) {
mmTrackEvent = event;
if (campaign != null) {
mmTrackCampaigns = new ArrayList<>(1);
mmTrackCampaigns.add(campaign);
}
}
@Override
protected Void doInBackground(Void... params) {
if (mmTrackCampaigns != null) {
for (Campaign campaign : mmTrackCampaigns) {
WarplyAnalyticsManager.logEvent(null, mmTrackEvent.getTrackMessage(campaign), null);
WarpUtils.log("track_campaigns - " + mmTrackEvent.getTrackMessage(campaign) + " - " + campaign.getTitle());
}
}
return null;
}
}
}
package ly.warp.sdk.views.dialogs;
import android.content.Context;
import androidx.appcompat.app.AlertDialog;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import ly.warp.sdk.R;
import ly.warp.sdk.activities.WarpViewActivity;
import ly.warp.sdk.io.models.Campaign;
/**
* Created by Panagiotis Triantafyllou on 28-Mar-19.
*/
public class InAppDialog {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private static Context mContext;
private static AlertDialog mInAppDialog;
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public static void showDefaultInAppDialog(Context context, Campaign campaignToShow, boolean showViewBtn, int v) {
mContext = context;
showDefaultInAppDialog(context, campaignToShow, showViewBtn);
}
private static void showDefaultInAppDialog(final Context context, final Campaign campaignToShow, boolean showViewBtn) {
if (mInAppDialog != null && mInAppDialog.isShowing()) {
mInAppDialog.dismiss();
}
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View customView = inflater.inflate(R.layout.layout_inapp_alert_dialog_default, null);
LinearLayout customButtonsView = customView.findViewById(R.id.ll_custom_buttons_view);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.RIGHT | Gravity.END;
ImageView campaignImage = customView.findViewById(R.id.iv_inapp_image);
TextView campaignTitle = customView.findViewById(R.id.tv_inapp_title);
TextView campaignSubtitle = customView.findViewById(R.id.tv_inapp_subtitle);
Glide
.with(context)
.load(campaignToShow.getLogoUrl())
.placeholder(R.drawable.ic_default_campaign)
.into(campaignImage);
campaignTitle.setText(campaignToShow.getTitle());
campaignSubtitle.setText(campaignToShow.getSubtitle());
if (showViewBtn) {
String[] items = {"View", "Close"};
TextView viewBtn = new TextView(context);
viewBtn.setId(0);
viewBtn.setTag(items[0]);
viewBtn.setText(items[0]);
viewBtn.setTextAppearance(context, R.style.InAppButtonsStyle);
viewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.startActivity(WarpViewActivity.createIntentFromSessionUUID(mContext,
campaignToShow.getSessionUUID()));
mInAppDialog.dismiss();
}
});
customButtonsView.addView(viewBtn, params);
// dialog.setItems(items, new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// switch (which) {
// case 0:
// context.startActivity(WarpViewActivity.createIntentFromSessionUUID(context,
// campaignToShow.getSessionUUID()));
// break;
//
// case 1:
// break;
// }
// }
// });
mInAppDialog = new AlertDialog.Builder(context)
.setView(customView)
.create();
mInAppDialog.show();
} else {
// AlertDialog.Builder dialog = new AlertDialog.Builder(context);
// mInAppDialog.setView(customView);
// mInAppDialog.setNegativeButton("Close", new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int id) {
// }
// });
// mInAppDialog = new AlertDialog.Builder(context)
// .create();
// mInAppDialog.show();
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}
package ly.warp.sdk.views.dialogs;
public interface OnClickButtonListener {
void onClickButton(int which);
}
\ No newline at end of file
package ly.warp.sdk.views.dialogs;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import java.util.Date;
public class RateDialog {
private static RateDialog singleton;
private Context context;
private final RateDialogOptions options = new RateDialogOptions();
private int installDate = -1;
private int launchTimes = -1;
private int remindInterval = 1;
private int eventsTimes = -1;
private boolean isDebug = false;
public RateDialog(Context context) {
this.context = context;
}
public static RateDialog with(Context context) {
if (singleton == null) {
synchronized (RateDialog.class) {
if (singleton == null) {
singleton = new RateDialog(context);
}
}
}
return singleton;
}
public void launch() {
if(RatePreferenceHelper.isFirstLaunch(context)) {
RatePreferenceHelper.setInstallDate(context);
}
RatePreferenceHelper.setLaunchTimes(context, RatePreferenceHelper.getLaunchTimes(context) + 1);
}
public static boolean showRateDialogIfMeetsConditions(Activity activity) {
boolean isMeetsConditions = singleton.isDebug || singleton.shouldShowRateDialog();
if (isMeetsConditions) {
singleton.showRateDialog(activity);
}
return isMeetsConditions;
}
public static boolean passSignificantEventAndConditions(Activity activity) {
return passSignificantEvent(activity, singleton.shouldShowRateDialog());
}
private static boolean passSignificantEvent(Activity activity, boolean shouldShow) {
int eventTimes = RatePreferenceHelper.getEventTimes(activity);
RatePreferenceHelper.setEventTimes(activity, ++eventTimes);
boolean isMeetsConditions = singleton.isDebug || (singleton.isOverEventTimes() && shouldShow);
if (isMeetsConditions) {
singleton.showRateDialog(activity);
}
return isMeetsConditions;
}
public RateDialog clearPreferenceSettings() {
RatePreferenceHelper.setAgreeShowDialog(context, true);
RatePreferenceHelper.clearSharedPreferences(context);
return this;
}
private static boolean isOverDate(long targetDate, int threshold) {
return new Date().getTime() - targetDate >= threshold * 24 * 60 * 60 * 1000;
}
public boolean shouldShowRateDialog() {
return RatePreferenceHelper.getIsAgreeShowDialog(context) &&
isOverLaunchTimes() &&
isOverInstallDate() &&
isOverIntervalDate();
}
public boolean isOverInstallDate() {
if(installDate == -1)
return true;
return isOverDate(RatePreferenceHelper.getInstallDate(context), installDate);
}
public boolean isOverIntervalDate() {
return isOverDate(RatePreferenceHelper.getRemindIntervalDate(context), remindInterval);
}
public boolean isOverLaunchTimes() {
if(launchTimes == -1)
return true;
return RatePreferenceHelper.getLaunchTimes(context) >= launchTimes;
}
public boolean isOverEventTimes() {
if(eventsTimes == -1)
return true;
return RatePreferenceHelper.getEventTimes(context) >= launchTimes;
}
public RateDialog setInstallDate(int installDate) {
this.installDate = installDate;
return this;
}
public RateDialog setLaunchTimes(int launchTimes) {
this.launchTimes = launchTimes;
return this;
}
public RateDialog setRemindInterval(int remindInterval) {
this.remindInterval = remindInterval;
return this;
}
public RateDialog setEventsTimes(int eventsTimes) {
this.eventsTimes = eventsTimes;
return this;
}
public RateDialog setShowNeutralButton(boolean isShowNeutralButton) {
options.setShowNeutralButton(isShowNeutralButton);
return this;
}
public RateDialog setShowTitle(boolean isShowTitle) {
options.setShowTitle(isShowTitle);
return this;
}
public RateDialog setView(View view) {
options.setView(view);
return this;
}
public RateDialog setOnClickButtonListener(OnClickButtonListener listener) {
options.setListener(listener);
return this;
}
public RateDialog setTitle(int resourceId) {
options.setTitleResId(resourceId);
return this;
}
public RateDialog setTitle(String title) {
options.setTitleText(title);
return this;
}
public RateDialog setMessage(int resourceId) {
options.setMessageResId(resourceId);
return this;
}
public RateDialog setMessage(String message) {
options.setMessageText(message);
return this;
}
public RateDialog setTextPositive(int resourceId) {
options.setTextPositiveResId(resourceId);
return this;
}
public RateDialog setTextPositive(String positiveText) {
options.setPositiveText(positiveText);
return this;
}
public RateDialog setTextNeutral(int resourceId) {
options.setTextNeutralResId(resourceId);
return this;
}
public RateDialog setTextNeutral(String neutralText) {
options.setNeutralText(neutralText);
return this;
}
public RateDialog setTextNegative(int resourceId) {
options.setTextNegativeResId(resourceId);
return this;
}
public RateDialog setTextNegative(String negativeText) {
options.setNegativeText(negativeText);
return this;
}
public RateDialog setCancelable(boolean cancelable) {
options.setCancelable(cancelable);
return this;
}
public RateDialog setPackageType(String packageType) {
options.setPackageType(packageType);
return this;
}
public RateDialog setPackageId(String packageId) {
options.setPackageId(packageId);
return this;
}
public RateDialog setDialogStyle(int style) {
options.setDialogStyleResId(style);
return this;
}
public RateDialog setIsDebug(boolean isDebug) {
this.isDebug = isDebug;
return this;
}
public void showRateDialog(Activity activity) {
if (!activity.isFinishing()) {
RateDialogManager.with(activity).create(options).show();
}
}
}
package ly.warp.sdk.views.dialogs;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import static ly.warp.sdk.utils.constants.WarpConstants.PACKAGE_TITLE_GOOGLE;
final class RateDialogManager {
private static RateDialogManager singleton;
private static Context context;
static Dialog dialog = null;
private RateDialogManager() {
}
private RateDialogManager(Context context) {
this.context = context;
}
public static RateDialogManager with(Context context) {
if (singleton == null) {
synchronized (RateDialogManager.class) {
if (singleton == null) {
singleton = new RateDialogManager(context);
}
}
}
return singleton;
}
public RateDialogManager create(final RateDialogOptions options) {
if (dialog != null)
return this;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
dialog = createDialog(context, options);
} else {
dialog = createMaterialDialog(context, options);
}
return this;
}
public void show() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
showDialog();
} else {
showMaterialDialog();
}
}
static private void showDialog() {
AlertDialog alertDialog = (AlertDialog) dialog;
alertDialog.show();
try {
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
LinearLayout linearLayout = (LinearLayout) button.getParent();
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
} catch (Exception ex) {
}
}
static private void showMaterialDialog() {
androidx.appcompat.app.AlertDialog alertDialog = (androidx.appcompat.app.AlertDialog) dialog;
alertDialog.show();
try {
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
LinearLayout linearLayout = (LinearLayout) button.getParent();
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
} catch (Exception ex) {
}
}
static private AlertDialog.Builder getDialogBuilder(final Context context) {
return new AlertDialog.Builder(context);
}
static private androidx.appcompat.app.AlertDialog.Builder getMaterialDialogBuilder(final Context context, final RateDialogOptions options) {
return new androidx.appcompat.app.AlertDialog.Builder(context, options.getDialogStyleResId());
}
static private Dialog createDialog(final Context context, final RateDialogOptions options) {
AlertDialog.Builder builder = getDialogBuilder(context);
builder.setMessage(options.getMessageText(context));
if (options.shouldShowTitle()) builder.setTitle(options.getTitleText(context));
builder.setCancelable(options.getCancelable());
View view = options.getView();
if (view != null) builder.setView(view);
final OnClickButtonListener listener = options.getListener();
builder.setPositiveButton(options.getPositiveText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intentToAppstore = null;
if (options.getPackageType() == PACKAGE_TITLE_GOOGLE)
intentToAppstore = IntentHelper.createIntentForGooglePlay(context);
context.startActivity(intentToAppstore);
RatePreferenceHelper.setAgreeShowDialog(context, false);
if (listener != null) listener.onClickButton(which);
}
});
if (options.shouldShowNeutralButton()) {
builder.setNeutralButton(options.getNeutralText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RatePreferenceHelper.setRemindIntervalDate(context);
if (listener != null) listener.onClickButton(which);
}
});
}
builder.setNegativeButton(options.getNegativeText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RatePreferenceHelper.setAgreeShowDialog(context, false);
if (listener != null) listener.onClickButton(which);
}
});
return builder.create();
}
static private Dialog createMaterialDialog(final Context context, final RateDialogOptions options) {
androidx.appcompat.app.AlertDialog.Builder builder = getMaterialDialogBuilder(context, options);
builder.setMessage(options.getMessageText(context));
if (options.shouldShowTitle()) builder.setTitle(options.getTitleText(context));
builder.setCancelable(options.getCancelable());
View view = options.getView();
if (view != null) builder.setView(view);
final OnClickButtonListener listener = options.getListener();
builder.setPositiveButton(options.getPositiveText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intentToAppstore = null;
if (options.getPackageType() == PACKAGE_TITLE_GOOGLE)
intentToAppstore = IntentHelper.createIntentForGooglePlay(context);
context.startActivity(intentToAppstore);
RatePreferenceHelper.setAgreeShowDialog(context, false);
if (listener != null) listener.onClickButton(which);
}
});
if (options.shouldShowNeutralButton()) {
builder.setNeutralButton(options.getNeutralText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RatePreferenceHelper.setRemindIntervalDate(context);
if (listener != null) listener.onClickButton(which);
}
});
}
builder.setNegativeButton(options.getNegativeText(context), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RatePreferenceHelper.setAgreeShowDialog(context, false);
if (listener != null) listener.onClickButton(which);
}
});
return builder.create();
}
}
\ No newline at end of file
package ly.warp.sdk.views.dialogs;
import android.content.Context;
import android.view.View;
import ly.warp.sdk.R;
import static ly.warp.sdk.utils.constants.WarpConstants.PACKAGE_TITLE_GOOGLE;
final class RateDialogOptions {
private boolean showNeutralButton = true;
private boolean showTitle = true;
private boolean cancelable = false;
private String packageType = PACKAGE_TITLE_GOOGLE;
private String packageId = "";
private int titleResId = R.string.rate_dialog_title;
private int messageResId = R.string.rate_dialog_message;
private int textPositiveResId = R.string.rate_dialog_positive;
private int textNeutralResId = R.string.rate_diloag_neutral;
private int textNegativeResId = R.string.rate_dialog_negative;
private int dialogStyleResId = R.style.AppCompatAlertDialogStyle;
private String titleText = null;
private String messageText = null;
private String positiveText = null;
private String neutralText = null;
private String negativeText = null;
private View view;
private OnClickButtonListener listener;
public boolean shouldShowNeutralButton() {
return showNeutralButton;
}
public void setShowNeutralButton(boolean showNeutralButton) {
this.showNeutralButton = showNeutralButton;
}
public boolean shouldShowTitle() {
return showTitle;
}
public void setShowTitle(boolean showTitle) {
this.showTitle = showTitle;
}
public boolean getCancelable() {
return cancelable;
}
public void setCancelable(boolean cancelable) {
this.cancelable = cancelable;
}
public String getPackageType() {
return packageType;
}
public void setPackageType(String packageType) {
this.packageType = packageType;
}
public String getPackageId() {
return packageId;
}
public void setPackageId(String packageId) {
this.packageId = packageId;
}
public int getTitleResId() {
return titleResId;
}
public void setTitleResId(int titleResId) {
this.titleResId = titleResId;
}
public int getMessageResId() {
return messageResId;
}
public void setMessageResId(int messageResId) {
this.messageResId = messageResId;
}
public int getTextPositiveResId() {
return textPositiveResId;
}
public void setTextPositiveResId(int textPositiveResId) {
this.textPositiveResId = textPositiveResId;
}
public int getTextNeutralResId() {
return textNeutralResId;
}
public void setTextNeutralResId(int textNeutralResId) {
this.textNeutralResId = textNeutralResId;
}
public int getTextNegativeResId() {
return textNegativeResId;
}
public void setTextNegativeResId(int textNegativeResId) {
this.textNegativeResId = textNegativeResId;
}
public int getDialogStyleResId() {
return dialogStyleResId;
}
public void setDialogStyleResId(int dialogStyleResId) {
this.dialogStyleResId = dialogStyleResId;
}
public View getView() {
return view;
}
public void setView(View view) {
this.view = view;
}
public OnClickButtonListener getListener() {
return listener;
}
public void setListener(OnClickButtonListener listener) {
this.listener = listener;
}
public String getTitleText(Context context) {
if (titleText == null) {
return context.getString(titleResId);
}
return titleText;
}
public void setTitleText(String titleText) {
this.titleText = titleText;
}
public String getMessageText(Context context) {
if (messageText == null) {
return context.getString(messageResId);
}
return messageText;
}
public void setMessageText(String messageText) {
this.messageText = messageText;
}
public String getPositiveText(Context context) {
if (positiveText == null) {
return context.getString(textPositiveResId);
}
return positiveText;
}
public void setPositiveText(String positiveText) {
this.positiveText = positiveText;
}
public String getNeutralText(Context context) {
if (neutralText == null) {
return context.getString(textNeutralResId);
}
return neutralText;
}
public void setNeutralText(String neutralText) {
this.neutralText = neutralText;
}
public String getNegativeText(Context context) {
if (negativeText == null) {
return context.getString(textNegativeResId);
}
return negativeText;
}
public void setNegativeText(String negativeText) {
this.negativeText = negativeText;
}
}
\ No newline at end of file
package ly.warp.sdk.views.dialogs;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Date;
final class RatePreferenceHelper {
private static final String PREF_FILE_NAME = "ratedialog_rate_pref_file";
private static final String PREF_KEY_INSTALL_DATE = "ratedialog_rate_install_date";
private static final String PREF_KEY_LAUNCH_TIMES = "ratedialog_rate_launch_times";
private static final String PREF_KEY_IS_AGREE_SHOW_DIALOG = "ratedialog_rate_is_agree_show_dialog";
private static final String PREF_KEY_REMIND_INTERVAL = "ratedialog_rate_remind_interval";
private static final String PREF_KEY_EVENT_TIMES = "ratedialog_rate_event_times";
private RatePreferenceHelper() {
}
static SharedPreferences getPreferences(Context context) {
return context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
}
static SharedPreferences.Editor getPreferencesEditor(Context context) {
return getPreferences(context).edit();
}
/**
* Clear data in shared preferences
*
* @param context context
*/
static void clearSharedPreferences(Context context) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.remove(PREF_KEY_INSTALL_DATE);
editor.remove(PREF_KEY_LAUNCH_TIMES);
editor.remove(PREF_KEY_REMIND_INTERVAL);
editor.remove(PREF_KEY_EVENT_TIMES);
editor.apply();
}
/**
* Set agree flag about show dialog.
* If it is false, rate dialog will never shown unless data is cleared.
*
* @param context context
* @param isAgree agree with showing rate dialog
*/
static void setAgreeShowDialog(Context context, boolean isAgree) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.putBoolean(PREF_KEY_IS_AGREE_SHOW_DIALOG, isAgree);
editor.apply();
}
/**
* get agree flag about show dialog.
* If it is false, rate dialog will never shown unless data is cleared.
*
* @param context context
*/
static boolean getIsAgreeShowDialog(Context context) {
return getPreferences(context).getBoolean(PREF_KEY_IS_AGREE_SHOW_DIALOG, true);
}
/**
* set remind interval date.
* If remind interval date is over than setting days, rate dialog will appear.
*
* @param context context
*/
static void setRemindIntervalDate(Context context) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.remove(PREF_KEY_REMIND_INTERVAL);
editor.putLong(PREF_KEY_REMIND_INTERVAL, new Date().getTime());
editor.apply();
}
/**
* get remind interval date.
* If remind interval date is over than setting days, rate dialog will appear.
*
* @param context context
*/
static long getRemindIntervalDate(Context context) {
return getPreferences(context).getLong(PREF_KEY_REMIND_INTERVAL, 0);
}
/**
* set install date.
* If install date is over than setting days, rate dialog will appear.
*
* @param context context
*/
static void setInstallDate(Context context) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.putLong(PREF_KEY_INSTALL_DATE, new Date().getTime());
editor.apply();
}
/**
* get install date.
* If install date is over than setting days, rate dialog will appear.
*
* @param context context
*/
static long getInstallDate(Context context) {
return getPreferences(context).getLong(PREF_KEY_INSTALL_DATE, 0);
}
/**
* set luanch times date.
* If launch time is over than setting times, rate dialog will appear.
*
* @param context context
* @param launchTimes launchTimes
*/
static void setLaunchTimes(Context context, int launchTimes) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.putInt(PREF_KEY_LAUNCH_TIMES, launchTimes);
editor.apply();
}
/**
* get luanch times date.
* If launch time is over than setting times, rate dialog will appear.
*
* @param context context
*/
static int getLaunchTimes(Context context) {
return getPreferences(context).getInt(PREF_KEY_LAUNCH_TIMES, 0);
}
/**
* check if first launch or not.
* If launching first time, andialog will set luanch date.
*
* @param context context
*/
static boolean isFirstLaunch(Context context) {
return getPreferences(context).getLong(PREF_KEY_INSTALL_DATE, 0) == 0L;
}
/**
* set event times date.
* If event time is over than setting times, rate dialog will appear.
*
* @param context context
*/
static int getEventTimes(Context context) {
return getPreferences(context).getInt(PREF_KEY_EVENT_TIMES, 0);
}
/**
* set event times date.
* If event time is over than setting times, rate dialog will appear.
*
* @param context context
*/
static void setEventTimes(Context context, int eventTimes) {
SharedPreferences.Editor editor = getPreferencesEditor(context);
editor.putInt(PREF_KEY_EVENT_TIMES, eventTimes);
editor.apply();
}
}
\ No newline at end of file
apply plugin: 'maven-publish'
apply plugin: 'signing'
task androidSourcesJar(type: Jar) {
archiveClassifier.set('sources')
if (project.plugins.findPlugin("com.android.library")) {
// For Android libraries
from android.sourceSets.main.java.srcDirs
from android.sourceSets.main.kotlin.srcDirs
} else {
// For pure Kotlin libraries, in case you have them
from sourceSets.main.java.srcDirs
from sourceSets.main.kotlin.srcDirs
}
}
artifacts {
archives androidSourcesJar
}
group = PUBLISH_GROUP_ID
version = PUBLISH_VERSION
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
// The coordinates of the library, being set from variables that
// we'll set up later
groupId PUBLISH_GROUP_ID
artifactId PUBLISH_ARTIFACT_ID
version PUBLISH_VERSION
// Two artifacts, the `aar` (or `jar`) and the sources
if (project.plugins.findPlugin("com.android.library")) {
from components.release
} else {
from components.java
}
artifact androidSourcesJar
// artifact javadocJar
// Mostly self-explanatory metadata
pom {
name = PUBLISH_ARTIFACT_ID
description = 'Warply Android SDK Maven Plugin'
url = 'https://git.warp.ly/open-source/warply_android_sdk_maven_plugin'
licenses {
license {
name = 'Warply Ltd. All rights reserved'
url = 'https://git.warp.ly/open-source/warply_android_sdk_maven_plugin'
}
}
developers {
developer {
id = 'panostr'
name = 'Panagiotis Triantafyllou'
email = 'panost@warp.ly'
}
// Add all other devs here...
}
// Version control info - if you're using GitHub, follow the
// format as seen here
scm {
connection = 'scm:git:git.warp.ly/open-source/warply_android_sdk_maven_plugin.git'
developerConnection = 'scm:git:ssh://git.warp.ly/open-source/warply_android_sdk_maven_plugin.git'
url = 'https://git.warp.ly/open-source/warply_android_sdk_maven_plugin/tree/master'
}
}
}
}
}
}
signing {
useInMemoryPgpKeys(
rootProject.ext["signing.keyId"],
rootProject.ext["signing.key"],
rootProject.ext["signing.password"],
)
sign publishing.publications
}
\ No newline at end of file
// Create variables with empty default values
// keyId is the last 8 characters of the GPG key
ext["signing.keyId"] = ''
// password is the passphrase of the GPG key
ext["signing.password"] = ''
// key is the base64 private GPG key
ext["signing.key"] = ''
// osshrUsername and ossrhPassword are the account details for MavenCentral
// which we’ve chosen at the Jira registration step (Sonatype site))
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''
ext["sonatypeStagingProfileId"] = ''
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
// Read local.properties file first if it exists
Properties p = new Properties()
new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) }
p.each { name, value -> ext[name] = value }
} else {
// Use system environment variables
ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME')
ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD')
ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID')
ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID')
ext["signing.password"] = System.getenv('SIGNING_PASSWORD')
ext["signing.key"] = System.getenv('SIGNING_KEY')
}
// Set up Sonatype repository
nexusPublishing {
repositories {
sonatype {
stagingProfileId = sonatypeStagingProfileId
username = ossrhUsername
password = ossrhPassword
nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
}
}
}
\ No newline at end of file
include ':app'
include 'libraries:warply_android_sdk'
include ':warply_android_sdk'
......
apply plugin: 'com.android.library'
ext {
PUBLISH_GROUP_ID = 'ly.warp'
PUBLISH_VERSION = '4.5.0'
PUBLISH_ARTIFACT_ID = 'warply-android-sdk'
}
apply from: "${rootProject.projectDir}/scripts/publish-module.gradle"
android {
compileSdkVersion 31
......
/**
* Automatically generated file. DO NOT MODIFY
*/
package ly.warp.sdk;
public final class BuildConfig {
public static final boolean DEBUG = false;
public static final String LIBRARY_PACKAGE_NAME = "ly.warp.sdk";
public static final String BUILD_TYPE = "release";
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ly.warp.sdk" >
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="31" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.SEND" />
<application>
<!-- For Huawei Push -->
<meta-data
android:name="push_kit_auto_init_enabled"
android:value="true" />
<meta-data
android:name="com.huawei.hms.client.channel.androidMarket"
android:value="false" />
<activity
android:name="ly.warp.sdk.activities.WarpViewActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name="ly.warp.sdk.dexter.PermissionsActivity"
android:exported="false"
android:launchMode="singleInstance"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Light.NoTitleBar" />
<!-- Service used for updating user's location. -->
<service
android:name="ly.warp.sdk.services.UpdateUserLocationService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<service
android:name="ly.warp.sdk.services.WarplyBeaconsRangingService"
android:exported="false" />
<!-- Service used for in app notification. -->
<service
android:name="ly.warp.sdk.services.WarpInAppNotificationService"
android:exported="false" />
<!-- FCM Service for push notifications -->
<service
android:name="ly.warp.sdk.services.FCMBaseMessagingService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- Service used for handling Huawei Push Notifications, comment if we are in Google build -->
<service
android:name="ly.warp.sdk.services.HMSBaseMessagingService"
android:exported="false" >
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
<receiver
android:name="ly.warp.sdk.receivers.LocationChangedReceiver"
android:exported="false" />
<receiver
android:name="ly.warp.sdk.receivers.ConnectivityChangedReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="dollar_openBracket_applicationId_closeBracket" />
</intent-filter>
</receiver>
<receiver
android:name="ly.warp.sdk.receivers.BluetoothStateChangeReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
</intent-filter>
</receiver>
<receiver
android:name="ly.warp.sdk.receivers.WarplyInAppNotificationReceiver"
android:exported="false" />
</application>
</manifest>
\ No newline at end of file
{
"version": 3,
"artifactType": {
"type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
"kind": "Directory"
},
"applicationId": "ly.warp.sdk",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"outputFile": "AndroidManifest.xml"
}
],
"elementType": "File"
}
\ No newline at end of file
aarFormatVersion=1.0
aarMetadataVersion=1.0
minCompileSdk=1
{"compiler-4.12.0.jar (com.github.bumptech.glide:compiler:4.12.0)":true}
\ No newline at end of file
This diff could not be displayed because it is too large.
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\jniLibs"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\release\jniLibs"/></dataSet></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\shaders"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\release\shaders"/></dataSet></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\assets"/><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\build\intermediates\shader_assets\release\out"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\release\assets"/></dataSet></merger>
\ No newline at end of file
#Fri Jan 28 15:22:24 EET 2022
C\:\\Users\\Warply\\Documents\\Warply\\Android\\warply_android_sdk_maven_plugin\\warply_android_sdk\\src\\main\\res\\drawable-xhdpi\\ic_default_campaign.png=C\:\\Users\\Warply\\Documents\\Warply\\Android\\warply_android_sdk_maven_plugin\\warply_android_sdk\\build\\intermediates\\packaged_res\\release\\drawable-xhdpi-v4\\ic_default_campaign.png
C\:\\Users\\Warply\\Documents\\Warply\\Android\\warply_android_sdk_maven_plugin\\warply_android_sdk\\src\\main\\res\\layout\\layout_inapp_alert_dialog_default.xml=C\:\\Users\\Warply\\Documents\\Warply\\Android\\warply_android_sdk_maven_plugin\\warply_android_sdk\\build\\intermediates\\packaged_res\\release\\layout\\layout_inapp_alert_dialog_default.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorAccent">#044C86</color>
<color name="colorPrimary">#0a1a50</color>
<color name="colorPrimaryDark">#0a1a50</color>
<string name="rate_dialog_message">If you enjoy using this app, would you mind taking a moment to rate it? It won\'t take more than a minute. Thanks for your support!</string>
<string name="rate_dialog_negative">No, Thanks</string>
<string name="rate_dialog_positive">Rate Now</string>
<string name="rate_dialog_title">Rate App</string>
<string name="rate_diloag_neutral">Remind Me Later</string>
<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:layout_gravity">right</item>
<!--<item name="colorAccent">#23a890</item>-->
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:background">@android:color/white</item>
</style>
<style name="InAppButtonsStyle" parent="@android:style/Widget.TextView">
<item name="android:textSize">18sp</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res"/><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\build\generated\res\rs\release"/><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\build\generated\res\resValues\release"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res"><file name="ic_default_campaign" path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res\drawable-xhdpi\ic_default_campaign.png" qualifiers="xhdpi-v4" type="drawable"/><file name="layout_inapp_alert_dialog_default" path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res\layout\layout_inapp_alert_dialog_default.xml" qualifiers="" type="layout"/><file path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res\values\colors.xml" qualifiers=""><color name="colorPrimary">#0a1a50</color><color name="colorAccent">#044C86</color><color name="colorPrimaryDark">#0a1a50</color></file><file path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res\values\strings.xml" qualifiers=""><string name="rate_dialog_title">Rate App</string><string name="rate_dialog_message">If you enjoy using this app, would you mind taking a moment to rate it? It won\'t take more than a minute. Thanks for your support!</string><string name="rate_dialog_positive">Rate Now</string><string name="rate_diloag_neutral">Remind Me Later</string><string name="rate_dialog_negative">No, Thanks</string></file><file path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\main\res\values\styles.xml" qualifiers=""><style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:layout_gravity">right</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:background">@android:color/white</item>
</style><style name="InAppButtonsStyle" parent="@android:style/Widget.TextView">
<item name="android:textSize">18sp</item>
<item name="android:textStyle">bold</item>
</style></file></source><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\build\generated\res\rs\release"/><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\build\generated\res\resValues\release"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="release$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\release\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="release" generated-set="release$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\Warply\Documents\Warply\Android\warply_android_sdk_maven_plugin\warply_android_sdk\src\release\res"/></dataSet><mergedItems/></merger>
\ No newline at end of file
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.