diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ef9319 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/* +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/README.md b/README.md new file mode 100644 index 0000000..3072b49 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +1.工程中build.gradle 中 http://47.94.86.25:8081/repository/maven-group/和http://47.94.86.25:8081/repository/maven-beta/ 的用户名和密码 +2.修改applicationId,以及添加对用包名的google-services.json文件 +3. 修改清单文件(AndroidManifest.xml) 中的AppsFlyerLib_key,flurry_key,com.facebook.sdk.ApplicationId,com.google.android.gms.ads.APPLICATION_ID 的值 +4.thinkingDataKey, + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..cd4efef --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + + defaultConfig { + applicationId "test.test.test" + minSdkVersion 21 + targetSdkVersion 29 + versionCode 100 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ndk { + abiFilters 'armeabi-v7a', 'arm64-v8a' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +apply plugin: 'com.google.gms.google-services' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + api 'com.plugins.sdk:Analytics:5.4.8' + api 'com.plugins.sdk:aD_v4:5.4.8' + api 'com.plugins.sdk:payment:5.4.8' + implementation 'androidx.appcompat:appcompat:1.2.0' +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..d23526e --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "84374916356", + "project_id": "bubblington-shooting-design", + "storage_bucket": "bubblington-shooting-design.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:84374916356:android:0b3827b19705eb39435451", + "android_client_info": { + "package_name": "com.quzizi.fbbubble" + } + }, + "oauth_client": [ + { + "client_id": "84374916356-vs6omjuhrppk0lr1ldmhemc1vppjijtg.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAgWCd2xo0Tfb3_JbGFjOjGyloZWN0t2Vg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "84374916356-vs6omjuhrppk0lr1ldmhemc1vppjijtg.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..1a9c0f5 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,405 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile +-verbose +#指定压缩级别 +-optimizationpasses 5 +#混淆时应用侵入式重载 +-overloadaggressively +#使用字符串"SourceFile"来替代真正的类 +-renamesourcefileattribute SourceFile +#抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 混淆时所采用的算法 +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* +#包名不混合大小写 +-dontusemixedcaseclassnames +#把混淆类中的方法名也混淆了 +-useuniqueclassmembernames +#优化时允许访问并修改有修饰符的类和类的成员 +-allowaccessmodification +#将混淆过得类移到根目录下 +-repackageclasses + +-keepclasseswithmembernames class * { + native ; +} + +#保留资源文件 +-keepclassmembers class **.R$* { + public static ; +} + +# The support library contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontwarn android.support.** + +-keep public class com.google.android.gms.* { public *; } +-dontwarn com.google.android.gms.** +-keep class * extends java.util.ListResourceBundle { + protected Object[][] getContents(); +} + +-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { + public static final *** NULL; +} + +-keepnames @com.google.android.gms.common.annotation.KeepName class * +-keepclassmembernames class * { + @com.google.android.gms.common.annotation.KeepName *; +} + +-keepnames class * implements android.os.Parcelable { + public static final ** CREATOR; +} + +# 保留bolts下的所有类及其内部类 +-keep class bolts.** {*;} +-dontwarn bolts.** + +# 保留fastjson下的所有类及其内部类 +-keep class com.alibaba.fastjson.** {*;} +-dontwarn com.alibaba.fastjson.** + +# 保留com.android.vending.billing下的所有类及其内部类 +-keep class com.android.vending.billing.** {*;} +-dontwarn com.android.vending.billing.** + +# 保留applovin下的所有类及其内部类 +-keep class com.applovin.** {*;} +-dontwarn com.applovin.** + +# 保留appsflyer下的所有类及其内部类 +-keep class com.appsflyer.** {*;} +-dontwarn com.appsflyer.** + +# 保留avos下的所有类及其内部类 +-keep class com.avos.** {*;} +-dontwarn com.avos.** + +# 保留avoscloud下的所有类及其内部类 +-keep class com.avoscloud.** {*;} +-dontwarn com.avoscloud.** + +# 保留avoscloud_gcm下的所有类及其内部类 +-keep class com.avoscloud_gcm.** {*;} +-dontwarn com.avoscloud_gcm.** + +-keep class com.mopub.** {*;} +-dontwarn com.mopub.** + + +-keep class org.xmlpull.** {*;} +-dontwarn org.xmlpull.** + + +# 保留facebook下的所有类及其内部类 +-keep class com.facebook.** {*;} +-dontwarn com.facebook.** + +# 保留flurry下的所有类及其内部类 +-keep class com.flurry.** {*;} +-dontwarn com.flurry.** + +# 保留google下的所有类及其内部类 +-keep class com.google.** {*;} +-dontwarn com.google.** + +# 保留picasso下的所有类及其内部类 +-keep class com.squareup.picasso.** {*;} +-dontwarn com.squareup.picasso.** + +# 保留bugly下的所有类及其内部类 +-keep class com.tencent.bugly.** {*;} +-dontwarn com.tencent.bugly.** + +# 保留unity3d下的所有类及其内部类 +-keep class com.unity3d.ads.** {*;} +-dontwarn com.unity3d.ads.** + +# 保留httpclient下的所有类及其内部类 +-keep class cz.msebera.** {*;} +-dontwarn cz.msebera.** + +# 保留async http下的所有类及其内部类 +-keep class com.loopj.android.http.** {*;} +-dontwarn com.loopj.android.http.** + +-keep class android.net.**{*;} +-dontwarn android.net.** + +-keep class android.util.**{*;} +-dontwarn android.util.** + +-keep class org.apache.http.** {*;} +-dontwarn org.apache.http.** + +-keep class okhttp3.** {*;} +-dontwarn okhttp3.** + +-keep class okio.** {*;} +-dontwarn okio.** + +-keep class org.cocos2dx.** {*;} +-dontwarn org.cocos2dx.** + +-keep class com.millennialmedia.** {*;} +-dontwarn com.millennialmedia.** + +-keep class com.liulishuo.filedownloader.** {*;} +-dontwarn com.liulishuo.filedownloader.** + +-keep class com.github.siyamed.** {*;} +-dontwarn com.github.siyamed.** + +-keep class com.custom.** {*;} +-dontwarn com.custom.** + +-keep class com.vungle.publisher.** {*;} +-dontwarn com.vungle.publisher.** + +-keep class dagger.** {*;} +-dontwarn dagger.** + +-keep class de.greenrobot.event.** {*;} +-dontwarn de.greenrobot.event.** + +-keep class javax.inject.** {*;} +-dontwarn javax.inject.** + +-keep class rx.** {*;} +-dontwarn rx.** + +-keep class rx.adjust.** {*;} +-dontwarn rx.adjust.** + +-keep class dalvik.system.** {*;} +-dontwarn dalvik.system.** + +-keep class android.os.** {*;} +-dontwarn android.os.** + +-keep class android.content.** {*;} +-dontwarn android.content.** + +-keep class com.google.android.** {*;} +-dontwarn com.google.android.** + +-keep class com.inmobi.** { *; } +-dontwarn com.inmobi.** + +# Vungle +-keep class com.vungle.** { *; } +-dontwarn com.vungle.** + +# Moat SDK +-keep class com.moat.** { *; } +-dontwarn com.moat.** + +-keep class android.** { *; } +-dontwarn android.** + +-keep class com.android.** {*;} +-dontwarn com.android.** + +# Okio +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement + +# Retrofit +-dontwarn okio.** +-dontwarn retrofit2.Platform$Java8 + +# Gson +-keepattributes Signature +-keepattributes *Annotation* +-dontwarn sun.misc.** +-keep class com.google.gson.examples.android.model.** { *; } +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + +#ironsource +-keep class com.ironsource.** { *;} +-dontwarn com.ironsource.** + + +#inmobi +-keep class com.inmobi.** { *; } +-dontwarn com.inmobi.** +-keep class com.integralads.** { *; } +-dontwarn com.integralads.** +-keep class com.moat.** { *; } +-dontwarn com.moat.** + + + #mobvista +-keepattributes Signature +-keepattributes *Annotation* +-keep class com.mintegral.** {*; } +-keep interface com.mintegral.** {*; } +-keep class android.support.v4.** { *; } +-dontwarn com.mintegral.** +-keep class **.R$* { public static final int mintegral*; } +-keep class com.alphab.** {*; } +-keep interface com.alphab.** {*; } + + +#Adcolony +-keep class com.adcolony.** {*; } +-dontwarn com.adcolony.** +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +#Tapjoy +-keep class com.tapjoy.** { *; } +-keepattributes JavascriptInterface +-keepattributes *Annotation* +-keep class * extends java.util.ListResourceBundle { +protected Object[][] getContents(); +} +-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { +public static final *** NULL; +} +-keepnames @com.google.android.gms.common.annotation.KeepName class * +-keepclassmembernames class * { +@com.google.android.gms.common.annotation.KeepName *; +} +-keepnames class * implements android.os.Parcelable { +public static final ** CREATOR; +} +-keep class com.google.android.gms.ads.identifier.** { *; } +-dontwarn com.tapjoy.** + +# 更新 unity3d下的所有类及其内部类 +-keep class com.unity3d.** {*;} +-dontwarn com.unity3d.** + +#Fyber +-keep class com.heyzap.** {*;} +-keep class com.fyber.** {*;} +-dontwarn com.heyzap.** +-dontwarn com.fyber.** +-keep class androidx.** {*;} +-dontwarn androidx.** +-keep class com.plugins.lib.base.SharedPreferencesUtils {*;} +-keep class com.plugin.analytics.AnalyticsControl {*;} + +# 保留chartboost 新添加 +-keep class com.chartboost.** {*;} +-dontwarn com.chartboost.** +-keep class com.chartboost_helium.** {*;} +-dontwarn com.chartboost_helium.** +-keep class com.moat.** {*;} +-dontwarn com.moat.** +-keepattributes *Annotation* +-keepclassmembers class ** { + @org.greenrobot.eventbus.Subscribe ; +} +-keep class org.greenrobot.** {*;} +-dontwarn org.greenrobot.** +-keep enum org.greenrobot.eventbus.ThreadMode { *; } + +#vungle更新=========== +# Vungle +-keep class com.vungle.** { *; } +-dontwarn com.vungle.** +-keep class com.vungle.warren.downloader.DownloadRequest +-dontwarn com.vungle.warren.error.VungleError$ErrorCode +-dontwarn com.vungle.warren.downloader.DownloadRequest$Status +-keepclassmembers enum com.vungle.warren.** { *; } + + +# Moat SDK +-keep class com.moat.** { *; } +-dontwarn com.moat.** +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-keepattributes *Annotation* + +# Retrofit +-keepattributes Signature, InnerClasses +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.-KotlinExtensions + +# Okio+OkHttp +-dontwarn okhttp3.** +-dontwarn okio.** +-dontwarn javax.annotation.** +-dontwarn org.conscrypt.** +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase +#======================================= + +#穿山甲=============================== + +-keep class com.bytedance.** {*;} +-keep class com.androidquery.** {*;} +-keep class com.ss.** {*;} +-keep class com.com.bytedance.** {*;} +-dontwarn com.androidquery.** +-dontwarn com.ss.** +-dontwarn com.com.bytedance.** +-dontwarn com.bytedance.** +-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;} +#======================================= + +#Display +#======================================= +-keep class com.brandio.** { *;} +-dontwarn com.brandio.** +-keep class iab.omid.**{ *;} +-dontwarn iab.omid.** +#======================================= + +#GDTAD +#======================================= +-keep class com.qq.e.** { *;} +-dontwarn com.qq.e.** +#======================================= + +##sigmob========= +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +-keep class sun.misc.Unsafe { *; } +-dontwarn com.sigmob.** +-keep class com.sigmob.**.**{*;} +-keep class com.bun.miitmdid.core.** {*;} +-dontwarn com.bun.miitmdid.core.** +##END sigmob========= + +##KuaiShou========= +-keep class org.chromium.** {*;} +-keep class org.chromium.** { *; } +-keep class aegon.chrome.** { *; } +-keep class com.kwai.**{ *; } +-keep class com.kwad.**{ *; } +-dontwarn com.kwai.** +-dontwarn com.kwad.** +-dontwarn com.ksad.** +-dontwarn aegon.chrome.** +##END KuaiShou==== \ No newline at end of file diff --git a/app/src/androidTest/java/com/quzizi/fbbubble/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/quzizi/fbbubble/ExampleInstrumentedTest.java new file mode 100644 index 0000000..794ac97 --- /dev/null +++ b/app/src/androidTest/java/com/quzizi/fbbubble/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.quzizi.fbbubble; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.quzizi.fbbubble", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..55fbfe1 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/quzizi/fbbubble/MainActivity.java b/app/src/main/java/com/quzizi/fbbubble/MainActivity.java new file mode 100644 index 0000000..53ebb0b --- /dev/null +++ b/app/src/main/java/com/quzizi/fbbubble/MainActivity.java @@ -0,0 +1,479 @@ +package com.quzizi.fbbubble; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + + +import androidx.appcompat.app.AppCompatActivity; + +import com.adControler.AdControler; +import com.adListener.RewardedVideoListener; +import com.framework.pay.GooglePay; +import com.framework.pay.OnPayListener; +import com.plugin.analytics.AnalyticsControl; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Map; +import java.util.TreeMap; + +public class MainActivity extends AppCompatActivity implements View.OnClickListener, OnPayListener { + private String TAG = MainActivity.class.getSimpleName(); + private TextView mSetUserId, mGetUserId; + private TextView mUserProperty, mMultipleProperty; + private TextView mUserAddProperty, mUserAddMultipleProperty; + private TextView mUserOnceProperty, mUserMultipleOnceProperty; + private TextView mEvent, mMarketEvent; + private TextView mShowBanner, mHideBanner, mShowInterstitial, mShowRewardVideo, mShowOpen, mShowInGame, mHideInGame; + private Activity mActivity; + private TextView mPayConfig, mGoogleProduct, mOwnedProducts, mPay, mConsumePurchase; + private JSONArray mInAppProductPayArray; + private ArrayList mInAppProductIdList; + private JSONObject mPayConfigObject; + private String mPaySuccess; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initView(); + setListener(); + mActivity = this; + //url="https://collect.playdayy.com/" + AnalyticsControl.activeThinkingData(mActivity, getString(R.string.thinkingDataKey),getString(R.string.url),true); +// AdControler.useTestServer(); +// AdControler.setTestDevice(getString(R.string.facebookDeviceId), getString(R.string.admobDeviceId));//上线前注释 + final RelativeLayout layout = new RelativeLayout(this); + //layout全屏的方式添加到当前界面中 + addContentView(layout, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + AdControler.init(mActivity, layout, false);//初始化 在确保在主进程中 + AdControler.start();//开始拉取广告配置,自动加载广告id + //是否需要下发订单信息 + GooglePay.initPaySDKWithNewApi(mActivity,true); + GooglePay.useCnServer(); //测试服务器 + try{ + GooglePay.setPayListener(this); + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void initView() { + mSetUserId = findViewById(R.id.setId);//设置用户属性 + mGetUserId = findViewById(R.id.getId);//获取用户属性 + + mUserProperty = findViewById(R.id.property);//设置用户属性 + mMultipleProperty = findViewById(R.id.multipleProperty);//设置多参用户属性 + + mUserAddProperty = findViewById(R.id.addProperty);//用户累计属性 + mUserAddMultipleProperty = findViewById(R.id.addMultipleProperty);//多元用户累加属性 + + mUserOnceProperty = findViewById(R.id.onceProperty);//设置一次性用户属性 + mUserMultipleOnceProperty = findViewById(R.id.multipleOnceProperty);//多元用户属性 + + mEvent = findViewById(R.id.event);//事件打点 + mMarketEvent = findViewById(R.id.marketEvent);//投放打点 + + mShowBanner = findViewById(R.id.showBanner);//展示Banner + mHideBanner = findViewById(R.id.hideBanner);//隐藏插屏 + mShowInterstitial = findViewById(R.id.showInterstitial);//展示插屏 + mShowRewardVideo = findViewById(R.id.showRewardVideo);//展示激励视频 + mShowOpen = findViewById(R.id.showOpenAd);//展示开屏广告 + mShowInGame = findViewById(R.id.showIngame);//展示Ingame + mHideInGame = findViewById(R.id.hideIngame);//隐藏Ingame + + // + mPayConfig = findViewById(R.id.payConfig); + mGoogleProduct = findViewById(R.id.googleProduct);//隐藏Ingame + mOwnedProducts = findViewById(R.id.ownedProducts);//隐藏Ingame + mPay = findViewById(R.id.pay);//隐藏Ingame + mConsumePurchase = findViewById(R.id.consumePurchase);//消耗商品 + } + + /** + * + */ + private void setListener() { + mSetUserId.setOnClickListener(this); + mGetUserId.setOnClickListener(this); + mUserProperty.setOnClickListener(this); + mMultipleProperty.setOnClickListener(this); + mUserAddProperty.setOnClickListener(this); + mUserAddMultipleProperty.setOnClickListener(this); + mUserOnceProperty.setOnClickListener(this); + mUserMultipleOnceProperty.setOnClickListener(this); + mEvent.setOnClickListener(this); + mMarketEvent.setOnClickListener(this); + //广告 + mShowBanner.setOnClickListener(this); + mHideBanner.setOnClickListener(this); + mShowInterstitial.setOnClickListener(this); + mShowRewardVideo.setOnClickListener(this); + mShowOpen.setOnClickListener(this); + mShowInGame.setOnClickListener(this); + mHideInGame.setOnClickListener(this); + //支付 + mPayConfig.setOnClickListener(this); + mGoogleProduct.setOnClickListener(this); + mOwnedProducts.setOnClickListener(this); + mPay.setOnClickListener(this); + mConsumePurchase.setOnClickListener(this); + //设置激励视频监听 + AdControler.setRewardedAdListener(new RewardedVideoListener() { + @Override + public void rewaredVideoReady() { + //激励视频加载好了 + Toast.makeText(mActivity, R.string.rewardVideoReady, Toast.LENGTH_SHORT).show(); + } + + @Override + public void rewaredVideoCompleted() { + //激励视频领取奖励 + Log.i(TAG, "MainActivity>>>rewaredVideoCompleted: =="); + Toast.makeText(mActivity, R.string.obtainReward, Toast.LENGTH_SHORT).show(); + } + + @Override + public void rewardVideoFailed() { + //激励视频播放失败 + Log.i(TAG, "MainActivity>>>rewardVideoFailed: =="); + } + }); + + } + + @Override + protected void onResume() { + super.onResume(); + AnalyticsControl.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + AnalyticsControl.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + AnalyticsControl.onDestroy(); + GooglePay.destroy(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + GooglePay.onActivityResult(requestCode, resultCode, data); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.setId: + AnalyticsControl.setUserId(mActivity, "2020mmddhhss"); + break; + case R.id.getId: + String usrId = AnalyticsControl.getUserId(mActivity);//该id 通过setUserId设置的数据 + Log.i(TAG, "MainActivity>>>onClick: 获取到的用户id==" + usrId); + String distinctId = AnalyticsControl.getUserDistinctId(mActivity); //改id 是thinkingdata 自动生成的 + Log.i(TAG, "MainActivity>>>onClick: 获取到的访客id==" + distinctId); + break; + case R.id.property: + AnalyticsControl.setUserProperty(mActivity, "demoKey", "demoValue"); //设置用户属性 + break; + case R.id.multipleProperty: + JSONObject object = new JSONObject(); + try { + object.put("demoKeyString", "demoValue"); + object.put("demoKeyInt", 2020); + object.put("demoKeyDouble", 2020.8); + object.put("demoKeyBoolean", true); + + } catch (JSONException e) { + e.printStackTrace(); + } + AnalyticsControl.setUserProperties(mActivity, object); + break; + case R.id.addProperty: + //每触发一次属性demoKeyAddInt的值就增加1 + AnalyticsControl.setAddedProperty(mActivity, "demoKeyAddInt", 1); + break; + case R.id.addMultipleProperty: + JSONObject addObject = new JSONObject(); + try { + addObject.put("demoKeyAddInt", 2); + addObject.put("demoKeyDouble", 2020.8); + } catch (JSONException e) { + e.printStackTrace(); + } + //每触发一次demoKeyAddInt属性值增加2,demoKeyDouble属性值增加2020.8 + AnalyticsControl.setAddedProperties(mActivity, addObject); + break; + case R.id.onceProperty: + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + //无论触发多少次,demoRegisterTime的属性值永远是安装后第一次设置的时间 + AnalyticsControl.setOnceProperty(mActivity, "demoRegisterTime", formatter.format(currentTime));// + + break; + case R.id.multipleOnceProperty: + try { + JSONObject objectOnnce = new JSONObject(); + objectOnnce.put("demoRegisterVersion", "1.0.0"); + objectOnnce.put("demoRegisterData", new Date()); + AnalyticsControl.setOnceProperties(mActivity, objectOnnce); + } catch (Exception e) { + e.printStackTrace(); + } + break; + case R.id.event: + try { + JSONObject eventObject = new JSONObject(); + eventObject.put("demoTime", new Date()); + eventObject.put("demoNum", 1); + AnalyticsControl.sendEvent("demoEventName", eventObject.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + + break; + case R.id.marketEvent: + try { + + Bundle bundle = new Bundle(); + bundle.putString("demoKey", "demoValue"); + AnalyticsControl.sendFacebookEvent("demoEventName", bundle); + AnalyticsControl.sendFirebaseEvent("tf_demoEventName", bundle); + Map map = new TreeMap<>(); + map.put("demoKey", "demoValue"); + AnalyticsControl.sendAppsFlyerEvent(mActivity, "demoEventName", map); + } catch (Exception e) { + e.printStackTrace(); + } + + break; + case R.id.showBanner: + if (!AdControler.isBannerReady()) { + Toast.makeText(mActivity, R.string.bannerNoFill, Toast.LENGTH_SHORT).show(); + } + AdControler.showBottomADBannar(AdControler.ADPOS_BOTTOM); + + + break; + case R.id.hideBanner: + AdControler.hiddenBannarWithStack(); + + break; + case R.id.showInterstitial: + if (AdControler.isInterstitialReady()) { + AdControler.showInterstitialAD(); + } else { + Toast.makeText(mActivity, R.string.interstitialNoFill, Toast.LENGTH_SHORT).show(); + } + + break; + case R.id.showRewardVideo: + if (AdControler.isRewardVideoReady()) { + AdControler.showRewardVideo(); + } else { + Toast.makeText(mActivity, R.string.rewardVideoNoFill, Toast.LENGTH_SHORT).show(); + } + break; + case R.id.showOpenAd: + if (AdControler.isOpenAdReady()) { + AdControler.showOpenAd(); + } else { + Toast.makeText(mActivity, R.string.openAdNoFill, Toast.LENGTH_SHORT).show(); + } + + break; + case R.id.showIngame: + JSONObject params = new JSONObject(); + try { + JSONObject objectParams = new JSONObject(); + objectParams.put("w", 800); + objectParams.put("h", 800); + objectParams.put("top", 50); + objectParams.put("centerH", 10); + params.put("view", objectParams); + objectParams = new JSONObject(); + objectParams.put("w", 150); + objectParams.put("h", 150); + objectParams.put("top", 10); + objectParams.put("left", 10); + params.put("icon", objectParams); + objectParams = new JSONObject(); + objectParams.put("w", 500); + objectParams.put("h", 150); + objectParams.put("top", 20); + objectParams.put("left", 170); + objectParams.put("color", "#000000"); + objectParams.put("size", "24"); + params.put("title", objectParams); + objectParams = new JSONObject(); + objectParams.put("w", 700); + objectParams.put("h", 100); + objectParams.put("top", 170); + objectParams.put("left", 50); + objectParams.put("color", "#000000"); + objectParams.put("size", "16"); + params.put("body", objectParams); + objectParams = new JSONObject(); + objectParams.put("w", 800); + objectParams.put("h", 400); + objectParams.put("top", 300); + objectParams.put("left", 0); + params.put("media", objectParams); + objectParams = new JSONObject(); + objectParams.put("w", 500); + objectParams.put("h", 80); + objectParams.put("color", "#0000ff"); + objectParams.put("bottom", 10); + objectParams.put("centerH", 20); + params.put("button", objectParams); + objectParams = new JSONObject(); + objectParams.put("color", "#ff0000"); + objectParams.put("size", "20"); + params.put("action", objectParams); + } catch (Exception e) { + Log.i(TAG, "MainActivity>>>onClick: ==" + e.toString()); + } + if (!AdControler.isInGameReady()) { + Toast.makeText(mActivity, R.string.inGameNoFill, Toast.LENGTH_SHORT).show(); + } + + new Thread(new Runnable() { + @Override + public void run() { + Log.i(TAG, "MainActivity>>>run: ==" + params.toString()); + AdControler.showInGameAD(params.toString()); + } + }).start(); + break; + case R.id.hideIngame: + AdControler.hiddenInGameAD(); + break; + //支付系统 + case R.id.payConfig: + String payMessage = GooglePay.getPayConfig(); + Log.i(TAG, "MainActivity>>>onClick: =支付数据=" + payMessage); + try { + mPayConfigObject = new JSONObject(payMessage); + //内购订单 + mInAppProductPayArray = mPayConfigObject.getJSONArray("inAppProductInfo"); + } catch (Exception e) { + e.printStackTrace(); + } + break; + case R.id.googleProduct: + mInAppProductIdList = new ArrayList<>(); + try { + if (mInAppProductPayArray == null) { + Toast.makeText(mActivity, R.string.inspectionProcess, Toast.LENGTH_SHORT).show(); + return; + } + for (int i = 0; i < mInAppProductPayArray.length(); i++) { + JSONObject inAppProductMessage = mInAppProductPayArray.getJSONObject(i); + String id = inAppProductMessage.getString("payId"); + Log.i(TAG, "MainActivity>>>onClick: ==" + id); + mInAppProductIdList.add(id); + } + } catch (Exception e) { + e.printStackTrace(); + } + GooglePay.requestProducts(mInAppProductIdList, null); + break; + case R.id.ownedProducts: + ArrayList ownedProductList = GooglePay.getOwnedProducts(); + Log.i(TAG, "MainActivity>>>onClick: ==" + ownedProductList); + break; + case R.id.pay: + if (mInAppProductIdList == null || mInAppProductPayArray == null || mPayConfigObject == null || mInAppProductIdList.size() == 0 ) { + Toast.makeText(mActivity, R.string.inspectionProcess, Toast.LENGTH_SHORT).show(); + return; + } + try { + JSONObject payObject = new JSONObject(); + payObject.put("productId", mInAppProductIdList.get(0));//这里随机支付第一个商品的id + payObject.put("time", System.currentTimeMillis() / 1000); + payObject.put("name", mInAppProductPayArray.getJSONObject(0).get("name")); + payObject.put("group", mPayConfigObject.get("groupIndex")); + payObject.put("consumable", mPayConfigObject.get("consumable")); + payObject.put("shopItemId", mPayConfigObject.get("shopItemId")); + GooglePay.payForProduct(payObject.toString(), false,"scene","USD",0,0);//这个是内购商品,不是订阅商品 + } catch (Exception e) { + e.printStackTrace(); + } + + break; + case R.id.consumePurchase: + if (mPaySuccess != null) { + GooglePay.consumePurchase(mPaySuccess, false);//此处支付的不是订阅商品, + } else { + Toast.makeText(mActivity, "没有拿到支付成功数据", Toast.LENGTH_SHORT).show(); + } + break; + } + } + + @Override + public void onPaySuccess(String s) { + //支付成功 的数据s 消耗时使用 + Log.i(TAG, "MainActivity>>>onPaySuccess: ==" + s); + mPaySuccess = s; + } + + @Override + public void onPayFailed(String s) { + Log.i(TAG, "MainActivity>>>onPayFailed: 支付失败==" + s); + } + + @Override + public void onPayCancel() { + Log.i(TAG, "MainActivity>>>onPayCancel: =="); + } + + @Override + public void onRequestProducts(ArrayList arrayList) { + Log.i(TAG, "MainActivity>>>onRequestProducts: ==" + arrayList.toString()); + } + + @Override + public void onQuerySubsProducts(ArrayList arrayList) { + Log.i(TAG, "MainActivity>>>onQuerySubsProducts: =="); + } + + @Override + public void onConfigData(String s) { + Log.i(TAG, "MainActivity>>>onConfigData: ==" + s); + } + + @Override + public void onConfigDataFailed(String s) { + Log.i(TAG, "MainActivity>>>onConfigDataFailed: ==" + s); + } + + @Override + public void onOrderUploaded() { + Log.i(TAG, "MainActivity>>>onOrderUploaded: =="); + } + + @Override + public void onOrderUploadedFailed() { + Log.i(TAG, "MainActivity>>>onOrderUploadedFailed: =="); + } +} diff --git a/app/src/main/java/com/quzizi/fbbubble/MyApplication.java b/app/src/main/java/com/quzizi/fbbubble/MyApplication.java new file mode 100644 index 0000000..3f6628c --- /dev/null +++ b/app/src/main/java/com/quzizi/fbbubble/MyApplication.java @@ -0,0 +1,19 @@ +package com.quzizi.fbbubble; + +import android.app.Application; + +import com.plugin.analytics.AnalyticsControl; +import com.plugins.lib.firebase.FirebaseHelper; + + +/** + * Created on 2020/8/12. + **/ +public class MyApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + AnalyticsControl.initAnalytics(this); + FirebaseHelper.init(this); + } +} diff --git a/app/src/main/res/drawable/ripple_bg.xml b/app/src/main/res/drawable/ripple_bg.xml new file mode 100644 index 0000000..e3af6fc --- /dev/null +++ b/app/src/main/res/drawable/ripple_bg.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..d02bd79 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..030098f --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #6200EE + #3700B3 + #03DAC5 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..21eff4c --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,38 @@ + + PluginsDemo + 257285502517991 + 设置用户ID + 获取用户ID + 设置用户属性 + 多参属性 + 单一累加属性 + 多参累加属性 + 单一永久属性 + 多参永久属性 + 事件打点 + 投放事件打点 + 展示banner + 隐藏banner + 展示插屏广告 + 展示激励视频 + 展示开屏广告 + 展示InGame + 隐藏InGame + 拉取服务器数据 + 拉取商店详情 + 持有订单查询 + 发起支付 + 消耗商品 + D7BDE0F6F4C421B66FAA239F0A63075B + de263ff7-94d3-4458-8506-95bf20109e24 + ec7466297eb640fd817eb5c830c2b144 + 激励视频填充 + 领取奖励 + Banner 未填充 + 插屏广告未填充 + 激励视频未填充 + 开屏广告未填充 + InGame未填充 + 检查流程以及包名是否正确 + "https://collect.playdayy.com/" + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..5885930 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/src/test/java/com/quzizi/fbbubble/ExampleUnitTest.java b/app/src/test/java/com/quzizi/fbbubble/ExampleUnitTest.java new file mode 100644 index 0000000..240f3ed --- /dev/null +++ b/app/src/test/java/com/quzizi/fbbubble/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.quzizi.fbbubble; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..9d9accf --- /dev/null +++ b/build.gradle @@ -0,0 +1,57 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + mavenCentral() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.4.3' + classpath 'com.google.gms:google-services:4.3.4' + + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + mavenCentral() + + maven { url 'https://jitpack.io' } + maven{ + url "http://47.94.86.25:8081/repository/maven-group/" + credentials { + username "pub45153" + password "mhjfk5asj2" + } + } + maven{ + url "http://47.94.86.25:8081/repository/maven-beta/" + credentials { + username "pub45153" + password "mhjfk5asj2" + } + } + maven { + name "Tapjoy's maven repo" + url "https://tapjoy.bintray.com/maven" + } + maven { url "https://repo1.maven.org/maven2/com/chartboost/chartboost-sdk/" } + maven { url "https://cdn2.inner-active.mobi/legacy-maven/marketplace" } + maven { url 'https://dl.bintray.com/ironsource-mobile/android-sdk'} + maven { url "https://adcolony.bintray.com/AdColony" } + maven { url "http://maven.display.io/" } + + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..199d16e --- /dev/null +++ b/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..5207a7d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Aug 11 19:55:13 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..98b3d88 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name='androidDemo' +include ':app' -- libgit2 0.21.0