Commit b2aec417b368162233a9462394df7eccc215a9a3

Authored by kingzh
0 parents
Exists in master

initialize

Showing 34 changed files with 993 additions and 0 deletions Side-by-side Diff

... ... @@ -0,0 +1,9 @@
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +.idea
  5 +.DS_Store
  6 +/build
  7 +/captures
  8 +.externalNativeBuild
  9 +.cxx
... ... @@ -0,0 +1,101 @@
  1 +# UnionSDK for Android接入文档
  2 +
  3 +
  4 +V6.0.4
  5 +2020年03月27日
  6 +
  7 +
  8 +## 版本概述
  9 +
  10 +此版本为使用AndroidStudio开发的版本,使用aar的方式提供sdk接入包,并使用gradle在线依赖方式,aar内别并不包含依赖包,请按此文档描述接入.
  11 +
  12 +此SDK适用android api>=16 的系统,编译器jdk8+.
  13 +
  14 +
  15 +## 1.依赖导入
  16 +配置gradle,以下为必须项
  17 +
  18 + repositories{
  19 + maven{
  20 + url "http://117.50.8.198:8081/nexus/content/repositories/sdk"
  21 + }
  22 + }
  23 +
  24 + dependencies {
  25 + implementation 'com.gt.union.sdk:GameSDK:6.0.4'
  26 +
  27 + }
  28 +
  29 +
  30 +## 2.向Gump平台索要游戏ID(AppID),完成代码接入
  31 +
  32 +* ActionCallback为通用的异步回调接口,所有的异步方法都是用此接口做回调.
  33 +此接口只有一个回调方法`onCallback(String event, Object... payload)`
  34 +其中参数event为当前回调的事件类型,用于区别不同的方法回调;payload为不同的回调负载,包含回调时需要传输的数据
  35 +
  36 +
  37 +
  38 +#### 1.获取SDKAgent对象,并执行初始化配置。
  39 +
  40 +
  41 + SDKAgent.object(Activity,appId).channel(channelId);
  42 +
  43 +
  44 +#### 2.调用SDKAgent的登录方法,将执行登录流程,需要一个Activity实例作参数和一个ActionCallback对象做登录结果接收
  45 +
  46 + sdkAgent.login(Activity,ActionCallback);
  47 +
  48 +
  49 +payload[0]为Boolean类型表示登录结果,成功登录后收到payload[1]为SessionKey对象,可以获取以下信息
  50 +
  51 + sessionKey.getUid();//获取用户的userid,此Id标识唯一用户!
  52 + sessionKey.getToken();//当前session的token
  53 + sessionKey.getExpires();//sessionKey的过期时间,类型Date
  54 +
  55 +#### 3.支付功能
  56 +
  57 +支付分为google play 官方Iab支付和三方支付,情况有两种:1)根据云端配置调用不同的支付方法 2)自行构建逻辑调用不同的支付方法
  58 +
  59 +* 获取云端配置
  60 +
  61 +`sdkAgent.judgePayment(Activity, serverId, roleId, ActionCallback);`
  62 +
  63 +payload[0]为boolean类型,true时应使用三方支付,false应使用iab支付
  64 +
  65 +* 调用Google Play Iab支付
  66 +
  67 +```
  68 + OrderForm order = new OrderForm()
  69 + .setServerId(serverId)//游戏服id
  70 + .setRoleId(roleId)//角色id
  71 + .setExtraInfo("orderId")//订单号
  72 + .setAmount(0.99f)//金额
  73 + .setCurrency("USD")//货币
  74 + .setProduct("gro.udc.mig.99");//商品id
  75 +
  76 + sdk.launchIap(MainActivity.this, order,ActionCallback);
  77 +```
  78 +
  79 +payload[0]为boolean类型,标明支付是否完成;payload[1]为错误描述
  80 +
  81 +
  82 +* 三方支付
  83 +
  84 +```
  85 + OrderForm order = new OrderForm()
  86 + .setServerId(serverId)//游戏服id
  87 + .setRoleId(roleId)//角色id
  88 + .setExtraInfo("orderId")//订单号
  89 + .setAmount(0.99f)//金额
  90 + .setCurrency("USD")//货币
  91 + .setProduct("gro.udc.mig.99");//商品id
  92 +
  93 + sdkAgent.goRecharge(MainActivity.this, order, ActionCallback);
  94 +```
  95 +payload[0]为boolean类型,true支付完成,false支付异常
  96 +
  97 +#### 4.注销登录
  98 +
  99 + sdkAgent.logout(ActionCallback);
  100 +当此方法调用后,用户退出登录,为了便于用户切换登录账户,请在游戏内提供用户注销的触发按钮
  101 +
... ... @@ -0,0 +1 @@
  1 +/build
... ... @@ -0,0 +1,50 @@
  1 +apply plugin: 'com.android.application'
  2 +
  3 +
  4 +repositories {
  5 + maven {
  6 + url "http://117.50.8.198:8081/nexus/content/repositories/sdk"
  7 + }
  8 + jcenter()
  9 + google()
  10 +}
  11 +
  12 +android {
  13 + compileSdkVersion 28
  14 + buildToolsVersion "29.0.3"
  15 +
  16 + defaultConfig {
  17 + applicationId "gro.udc.mig"
  18 + minSdkVersion 16
  19 + targetSdkVersion 28
  20 + versionCode 37
  21 + versionName "1.1"
  22 +
  23 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  24 + }
  25 +
  26 + buildTypes {
  27 + release {
  28 + minifyEnabled false
  29 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  30 + }
  31 + }
  32 + compileOptions {
  33 + sourceCompatibility = 1.8
  34 + targetCompatibility = 1.8
  35 + }
  36 +
  37 +}
  38 +
  39 +dependencies {
  40 + implementation fileTree(dir: 'libs', include: ['*.jar'])
  41 +
  42 + implementation 'androidx.appcompat:appcompat:1.1.0'
  43 + implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
  44 + testImplementation 'junit:junit:4.12'
  45 + androidTestImplementation 'androidx.test.ext:junit:1.1.1'
  46 + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
  47 +
  48 +// implementation project(':sdk')
  49 + implementation 'com.gt.union.sdk:GameSDK:6.0.4'
  50 +}
app/proguard-rules.pro
... ... @@ -0,0 +1,21 @@
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
app/src/androidTest/java/com/gt/union/sdk/demo/ExampleInstrumentedTest.java
... ... @@ -0,0 +1,27 @@
  1 +package com.gt.union.sdk.demo;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import androidx.test.platform.app.InstrumentationRegistry;
  6 +import androidx.test.ext.junit.runners.AndroidJUnit4;
  7 +
  8 +import org.junit.Test;
  9 +import org.junit.runner.RunWith;
  10 +
  11 +import static org.junit.Assert.*;
  12 +
  13 +/**
  14 + * Instrumented test, which will execute on an Android device.
  15 + *
  16 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
  17 + */
  18 +@RunWith(AndroidJUnit4.class)
  19 +public class ExampleInstrumentedTest {
  20 + @Test
  21 + public void useAppContext() {
  22 + // Context of the app under test.
  23 + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
  24 +
  25 + assertEquals("com.gt.union.sdk.demo", appContext.getPackageName());
  26 + }
  27 +}
app/src/main/AndroidManifest.xml
... ... @@ -0,0 +1,21 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + package="com.gt.union.sdk.demo">
  4 +
  5 + <application
  6 + android:allowBackup="true"
  7 + android:icon="@mipmap/ic_launcher"
  8 + android:label="@string/app_name"
  9 + android:roundIcon="@mipmap/ic_launcher_round"
  10 + android:supportsRtl="true"
  11 + android:theme="@style/AppTheme">
  12 + <activity android:name=".MainActivity">
  13 + <intent-filter>
  14 + <action android:name="android.intent.action.MAIN" />
  15 +
  16 + <category android:name="android.intent.category.LAUNCHER" />
  17 + </intent-filter>
  18 + </activity>
  19 + </application>
  20 +
  21 +</manifest>
0 22 \ No newline at end of file
app/src/main/java/com/gt/union/sdk/demo/MainActivity.java
... ... @@ -0,0 +1,155 @@
  1 +package com.gt.union.sdk.demo;
  2 +
  3 +import androidx.annotation.Nullable;
  4 +import androidx.appcompat.app.AppCompatActivity;
  5 +
  6 +import android.content.Intent;
  7 +import android.os.Bundle;
  8 +import android.view.View;
  9 +import android.widget.Button;
  10 +import android.widget.LinearLayout;
  11 +import android.widget.TextView;
  12 +import android.widget.Toast;
  13 +
  14 +import com.gt.union.sdk.SDKAgent;
  15 +import com.gt.union.sdk.callback.ActionCallback;
  16 +import com.gt.union.sdk.login.SessionKey;
  17 +import com.gt.union.sdk.recharge.OrderForm;
  18 +
  19 +public class MainActivity extends AppCompatActivity {
  20 +
  21 + private String appId = "10105";
  22 + private String channelId = "1067";
  23 + private String serverId = "222";
  24 + private String roleId = "222006003";
  25 +
  26 + private SDKAgent sdkAgent;
  27 +
  28 + private TextView tvInfo;
  29 + private LinearLayout sessionLayout;
  30 +
  31 + private Button btnLogin;
  32 +
  33 + private Button btnLogout;
  34 + private Button btnPay;
  35 + private Button btnIab;
  36 + private Button btnAutoJudge;
  37 +
  38 + @Override
  39 + protected void onCreate(Bundle savedInstanceState) {
  40 + super.onCreate(savedInstanceState);
  41 + setContentView(R.layout.activity_main);
  42 +
  43 + tvInfo = findViewById(R.id.info);
  44 + sessionLayout = findViewById(R.id.sessionLayout);
  45 +
  46 + btnLogin = findViewById(R.id.login);
  47 + btnLogout = findViewById(R.id.logout);
  48 + btnPay = findViewById(R.id.pay);
  49 + btnIab = findViewById(R.id.iab);
  50 + btnAutoJudge = findViewById(R.id.auto_judge_pay);
  51 +
  52 + btnLogin.setOnClickListener(new View.OnClickListener() {
  53 + @Override
  54 + public void onClick(View v) {
  55 + sdkAgent.login(MainActivity.this, new ActionCallback() {
  56 + @Override
  57 + public void onCallback(String event, Object... payload) {
  58 + if(event.equals(ActionCallback.ACTION_LOGIN)) {
  59 + boolean result = (boolean) payload[0];
  60 + if(result) {
  61 + SessionKey sessionKey = (SessionKey) payload[1];
  62 + tvInfo.setText(sessionKey.getUid());
  63 + sessionLayout.setVisibility(View.VISIBLE);
  64 + btnLogin.setVisibility(View.GONE);
  65 + }else{
  66 + Toast.makeText(MainActivity.this,"登录取消",Toast.LENGTH_SHORT).show();
  67 + }
  68 + }
  69 + }
  70 + });
  71 + }
  72 + });
  73 + btnLogout.setOnClickListener(new View.OnClickListener() {
  74 + @Override
  75 + public void onClick(View v) {
  76 + sdkAgent.logout(new ActionCallback() {
  77 + @Override
  78 + public void onCallback(String event, Object... payload) {
  79 + if(event.equals(ActionCallback.ACTION_LOGOUT)) {
  80 + sessionLayout.setVisibility(View.GONE);
  81 + btnLogin.setVisibility(View.VISIBLE);
  82 + }
  83 + }
  84 + });
  85 + }
  86 + });
  87 +
  88 + btnPay.setOnClickListener(new View.OnClickListener() {
  89 + @Override
  90 + public void onClick(View v) {
  91 + OrderForm order = new OrderForm();
  92 + order.setServerId(serverId).setRoleId(roleId).setExtraInfo("orderId").setAmount(0.99f).setCurrency("USD").setProduct("gro.udc.mig.99");
  93 +
  94 + sdkAgent.goRecharge(MainActivity.this, order, new ActionCallback() {
  95 + @Override
  96 + public void onCallback(String event, Object... payload) {
  97 + if(event.equals(ActionCallback.ACTION_PAY)) {
  98 + boolean result = (boolean) payload[0];
  99 + String res = result ? "支付成功" : "支付失败";
  100 + Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show();
  101 + }
  102 + }
  103 + });
  104 + }
  105 + });
  106 +
  107 + btnIab.setOnClickListener(new View.OnClickListener() {
  108 + @Override
  109 + public void onClick(View v) {
  110 + OrderForm order = new OrderForm();
  111 + order.setServerId(serverId).setRoleId(roleId).setExtraInfo("orderId").setAmount(0.99f).setCurrency("USD").setProduct("gro.udc.mig.99");
  112 + sdkAgent.launchIap(MainActivity.this, order, new ActionCallback() {
  113 + @Override
  114 + public void onCallback(String event, Object... payload) {
  115 + if(event.equals(ActionCallback.ACTION_PAY)) {
  116 + boolean result = (boolean) payload[0];
  117 + String des = (String) payload[1];
  118 + String res = result ? "Iab支付完成" : "Iab支付失败:"+des;
  119 + Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show();
  120 + }
  121 + }
  122 + });
  123 + }
  124 + });
  125 +
  126 + btnAutoJudge.setOnClickListener(new View.OnClickListener() {
  127 + @Override
  128 + public void onClick(View v) {
  129 + sdkAgent.judgePayment(MainActivity.this, serverId, roleId, new ActionCallback() {
  130 + @Override
  131 + public void onCallback(String event, Object... payload) {
  132 + if(event.equals(ActionCallback.ACTION_JUDGE)) {
  133 + boolean result = (boolean) payload[0];
  134 + if (result)
  135 + btnPay.performClick();
  136 + else
  137 + btnIab.performClick();
  138 + }
  139 + }
  140 + });
  141 + }
  142 + });
  143 +
  144 +
  145 + sdkAgent = SDKAgent.object(this, appId).channel(channelId);
  146 +
  147 +
  148 + }
  149 +
  150 + @Override
  151 + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  152 + if (!sdkAgent.onActivityResult(requestCode, resultCode, data))
  153 + super.onActivityResult(requestCode, resultCode, data);
  154 + }
  155 +}
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
... ... @@ -0,0 +1,30 @@
  1 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:aapt="http://schemas.android.com/aapt"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
  8 + <aapt:attr name="android:fillColor">
  9 + <gradient
  10 + android:endX="85.84757"
  11 + android:endY="92.4963"
  12 + android:startX="42.9492"
  13 + android:startY="49.59793"
  14 + android:type="linear">
  15 + <item
  16 + android:color="#44000000"
  17 + android:offset="0.0" />
  18 + <item
  19 + android:color="#00000000"
  20 + android:offset="1.0" />
  21 + </gradient>
  22 + </aapt:attr>
  23 + </path>
  24 + <path
  25 + android:fillColor="#FFFFFF"
  26 + android:fillType="nonZero"
  27 + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
  28 + android:strokeWidth="1"
  29 + android:strokeColor="#00000000" />
  30 +</vector>
0 31 \ No newline at end of file
app/src/main/res/drawable/ic_launcher_background.xml
... ... @@ -0,0 +1,170 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path
  8 + android:fillColor="#3DDC84"
  9 + android:pathData="M0,0h108v108h-108z" />
  10 + <path
  11 + android:fillColor="#00000000"
  12 + android:pathData="M9,0L9,108"
  13 + android:strokeWidth="0.8"
  14 + android:strokeColor="#33FFFFFF" />
  15 + <path
  16 + android:fillColor="#00000000"
  17 + android:pathData="M19,0L19,108"
  18 + android:strokeWidth="0.8"
  19 + android:strokeColor="#33FFFFFF" />
  20 + <path
  21 + android:fillColor="#00000000"
  22 + android:pathData="M29,0L29,108"
  23 + android:strokeWidth="0.8"
  24 + android:strokeColor="#33FFFFFF" />
  25 + <path
  26 + android:fillColor="#00000000"
  27 + android:pathData="M39,0L39,108"
  28 + android:strokeWidth="0.8"
  29 + android:strokeColor="#33FFFFFF" />
  30 + <path
  31 + android:fillColor="#00000000"
  32 + android:pathData="M49,0L49,108"
  33 + android:strokeWidth="0.8"
  34 + android:strokeColor="#33FFFFFF" />
  35 + <path
  36 + android:fillColor="#00000000"
  37 + android:pathData="M59,0L59,108"
  38 + android:strokeWidth="0.8"
  39 + android:strokeColor="#33FFFFFF" />
  40 + <path
  41 + android:fillColor="#00000000"
  42 + android:pathData="M69,0L69,108"
  43 + android:strokeWidth="0.8"
  44 + android:strokeColor="#33FFFFFF" />
  45 + <path
  46 + android:fillColor="#00000000"
  47 + android:pathData="M79,0L79,108"
  48 + android:strokeWidth="0.8"
  49 + android:strokeColor="#33FFFFFF" />
  50 + <path
  51 + android:fillColor="#00000000"
  52 + android:pathData="M89,0L89,108"
  53 + android:strokeWidth="0.8"
  54 + android:strokeColor="#33FFFFFF" />
  55 + <path
  56 + android:fillColor="#00000000"
  57 + android:pathData="M99,0L99,108"
  58 + android:strokeWidth="0.8"
  59 + android:strokeColor="#33FFFFFF" />
  60 + <path
  61 + android:fillColor="#00000000"
  62 + android:pathData="M0,9L108,9"
  63 + android:strokeWidth="0.8"
  64 + android:strokeColor="#33FFFFFF" />
  65 + <path
  66 + android:fillColor="#00000000"
  67 + android:pathData="M0,19L108,19"
  68 + android:strokeWidth="0.8"
  69 + android:strokeColor="#33FFFFFF" />
  70 + <path
  71 + android:fillColor="#00000000"
  72 + android:pathData="M0,29L108,29"
  73 + android:strokeWidth="0.8"
  74 + android:strokeColor="#33FFFFFF" />
  75 + <path
  76 + android:fillColor="#00000000"
  77 + android:pathData="M0,39L108,39"
  78 + android:strokeWidth="0.8"
  79 + android:strokeColor="#33FFFFFF" />
  80 + <path
  81 + android:fillColor="#00000000"
  82 + android:pathData="M0,49L108,49"
  83 + android:strokeWidth="0.8"
  84 + android:strokeColor="#33FFFFFF" />
  85 + <path
  86 + android:fillColor="#00000000"
  87 + android:pathData="M0,59L108,59"
  88 + android:strokeWidth="0.8"
  89 + android:strokeColor="#33FFFFFF" />
  90 + <path
  91 + android:fillColor="#00000000"
  92 + android:pathData="M0,69L108,69"
  93 + android:strokeWidth="0.8"
  94 + android:strokeColor="#33FFFFFF" />
  95 + <path
  96 + android:fillColor="#00000000"
  97 + android:pathData="M0,79L108,79"
  98 + android:strokeWidth="0.8"
  99 + android:strokeColor="#33FFFFFF" />
  100 + <path
  101 + android:fillColor="#00000000"
  102 + android:pathData="M0,89L108,89"
  103 + android:strokeWidth="0.8"
  104 + android:strokeColor="#33FFFFFF" />
  105 + <path
  106 + android:fillColor="#00000000"
  107 + android:pathData="M0,99L108,99"
  108 + android:strokeWidth="0.8"
  109 + android:strokeColor="#33FFFFFF" />
  110 + <path
  111 + android:fillColor="#00000000"
  112 + android:pathData="M19,29L89,29"
  113 + android:strokeWidth="0.8"
  114 + android:strokeColor="#33FFFFFF" />
  115 + <path
  116 + android:fillColor="#00000000"
  117 + android:pathData="M19,39L89,39"
  118 + android:strokeWidth="0.8"
  119 + android:strokeColor="#33FFFFFF" />
  120 + <path
  121 + android:fillColor="#00000000"
  122 + android:pathData="M19,49L89,49"
  123 + android:strokeWidth="0.8"
  124 + android:strokeColor="#33FFFFFF" />
  125 + <path
  126 + android:fillColor="#00000000"
  127 + android:pathData="M19,59L89,59"
  128 + android:strokeWidth="0.8"
  129 + android:strokeColor="#33FFFFFF" />
  130 + <path
  131 + android:fillColor="#00000000"
  132 + android:pathData="M19,69L89,69"
  133 + android:strokeWidth="0.8"
  134 + android:strokeColor="#33FFFFFF" />
  135 + <path
  136 + android:fillColor="#00000000"
  137 + android:pathData="M19,79L89,79"
  138 + android:strokeWidth="0.8"
  139 + android:strokeColor="#33FFFFFF" />
  140 + <path
  141 + android:fillColor="#00000000"
  142 + android:pathData="M29,19L29,89"
  143 + android:strokeWidth="0.8"
  144 + android:strokeColor="#33FFFFFF" />
  145 + <path
  146 + android:fillColor="#00000000"
  147 + android:pathData="M39,19L39,89"
  148 + android:strokeWidth="0.8"
  149 + android:strokeColor="#33FFFFFF" />
  150 + <path
  151 + android:fillColor="#00000000"
  152 + android:pathData="M49,19L49,89"
  153 + android:strokeWidth="0.8"
  154 + android:strokeColor="#33FFFFFF" />
  155 + <path
  156 + android:fillColor="#00000000"
  157 + android:pathData="M59,19L59,89"
  158 + android:strokeWidth="0.8"
  159 + android:strokeColor="#33FFFFFF" />
  160 + <path
  161 + android:fillColor="#00000000"
  162 + android:pathData="M69,19L69,89"
  163 + android:strokeWidth="0.8"
  164 + android:strokeColor="#33FFFFFF" />
  165 + <path
  166 + android:fillColor="#00000000"
  167 + android:pathData="M79,19L79,89"
  168 + android:strokeWidth="0.8"
  169 + android:strokeColor="#33FFFFFF" />
  170 +</vector>
app/src/main/res/layout/activity_main.xml
... ... @@ -0,0 +1,48 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto"
  4 + xmlns:tools="http://schemas.android.com/tools"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + android:orientation="vertical"
  8 + tools:context=".MainActivity">
  9 +
  10 + <TextView
  11 + android:id="@+id/info"
  12 + android:layout_width="wrap_content"
  13 + android:layout_height="wrap_content"
  14 + />
  15 +
  16 + <Button
  17 + android:id="@+id/login"
  18 + android:layout_width="match_parent"
  19 + android:layout_height="wrap_content"
  20 + android:text="登录"/>
  21 + <LinearLayout
  22 + android:id="@+id/sessionLayout"
  23 + android:layout_width="match_parent"
  24 + android:layout_height="wrap_content"
  25 + android:orientation="vertical"
  26 + android:visibility="gone">
  27 + <Button
  28 + android:id="@+id/logout"
  29 + android:layout_width="match_parent"
  30 + android:layout_height="wrap_content"
  31 + android:text="注销"/>
  32 + <Button
  33 + android:id="@+id/pay"
  34 + android:layout_width="match_parent"
  35 + android:layout_height="wrap_content"
  36 + android:text="三方支付"/>
  37 + <Button
  38 + android:id="@+id/iab"
  39 + android:layout_width="match_parent"
  40 + android:layout_height="wrap_content"
  41 + android:text="官方支付"/>
  42 + <Button
  43 + android:id="@+id/auto_judge_pay"
  44 + android:layout_width="match_parent"
  45 + android:layout_height="wrap_content"
  46 + android:text="先获取支付方式再支付"/>
  47 + </LinearLayout>
  48 +</LinearLayout>
0 49 \ No newline at end of file
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
... ... @@ -0,0 +1,5 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 +</adaptive-icon>
0 6 \ No newline at end of file
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
... ... @@ -0,0 +1,5 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 +</adaptive-icon>
0 6 \ No newline at end of file
app/src/main/res/mipmap-hdpi/ic_launcher.png

3.51 KB

app/src/main/res/mipmap-hdpi/ic_launcher_round.png

5.21 KB

app/src/main/res/mipmap-mdpi/ic_launcher.png

2.57 KB

app/src/main/res/mipmap-mdpi/ic_launcher_round.png

3.31 KB

app/src/main/res/mipmap-xhdpi/ic_launcher.png

4.81 KB

app/src/main/res/mipmap-xhdpi/ic_launcher_round.png

7.3 KB

app/src/main/res/mipmap-xxhdpi/ic_launcher.png

7.72 KB

app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png

11.6 KB

app/src/main/res/mipmap-xxxhdpi/ic_launcher.png

10.4 KB

app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png

16.2 KB

app/src/main/res/values/colors.xml
... ... @@ -0,0 +1,6 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <color name="colorPrimary">#6200EE</color>
  4 + <color name="colorPrimaryDark">#3700B3</color>
  5 + <color name="colorAccent">#03DAC5</color>
  6 +</resources>
app/src/main/res/values/strings.xml
... ... @@ -0,0 +1,3 @@
  1 +<resources>
  2 + <string name="app_name">UnionSDKDemo</string>
  3 +</resources>
app/src/main/res/values/styles.xml
... ... @@ -0,0 +1,11 @@
  1 +<resources>
  2 +
  3 + <!-- Base application theme. -->
  4 + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  5 + <!-- Customize your theme here. -->
  6 + <item name="colorPrimary">@color/colorPrimary</item>
  7 + <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  8 + <item name="colorAccent">@color/colorAccent</item>
  9 + </style>
  10 +
  11 +</resources>
app/src/test/java/com/gt/union/sdk/demo/ExampleUnitTest.java
... ... @@ -0,0 +1,17 @@
  1 +package com.gt.union.sdk.demo;
  2 +
  3 +import org.junit.Test;
  4 +
  5 +import static org.junit.Assert.*;
  6 +
  7 +/**
  8 + * Example local unit test, which will execute on the development machine (host).
  9 + *
  10 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
  11 + */
  12 +public class ExampleUnitTest {
  13 + @Test
  14 + public void addition_isCorrect() {
  15 + assertEquals(4, 2 + 2);
  16 + }
  17 +}
0 18 \ No newline at end of file
... ... @@ -0,0 +1,29 @@
  1 +// Top-level build file where you can add configuration options common to all sub-projects/modules.
  2 +
  3 +buildscript {
  4 +
  5 + repositories {
  6 + google()
  7 + jcenter()
  8 +
  9 + }
  10 + dependencies {
  11 + classpath 'com.android.tools.build:gradle:3.6.0'
  12 +
  13 +
  14 + // NOTE: Do not place your application dependencies here; they belong
  15 + // in the individual module build.gradle files
  16 + }
  17 +}
  18 +
  19 +allprojects {
  20 + repositories {
  21 + google()
  22 + jcenter()
  23 +
  24 + }
  25 +}
  26 +
  27 +task clean(type: Delete) {
  28 + delete rootProject.buildDir
  29 +}
... ... @@ -0,0 +1,20 @@
  1 +# Project-wide Gradle settings.
  2 +# IDE (e.g. Android Studio) users:
  3 +# Gradle settings configured through the IDE *will override*
  4 +# any settings specified in this file.
  5 +# For more details on how to configure your build environment visit
  6 +# http://www.gradle.org/docs/current/userguide/build_environment.html
  7 +# Specifies the JVM arguments used for the daemon process.
  8 +# The setting is particularly useful for tweaking memory settings.
  9 +org.gradle.jvmargs=-Xmx1536m
  10 +# When configured, Gradle will run in incubating parallel mode.
  11 +# This option should only be used with decoupled projects. More details, visit
  12 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
  13 +# org.gradle.parallel=true
  14 +# AndroidX package structure to make it clearer which packages are bundled with the
  15 +# Android operating system, and which are packaged with your app's APK
  16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
  17 +android.useAndroidX=true
  18 +# Automatically convert third-party libraries to use AndroidX
  19 +android.enableJetifier=true
  20 +
gradle/wrapper/gradle-wrapper.jar
No preview for this file type
gradle/wrapper/gradle-wrapper.properties
... ... @@ -0,0 +1,6 @@
  1 +#Sat Mar 21 09:30:16 CST 2020
  2 +distributionBase=GRADLE_USER_HOME
  3 +distributionPath=wrapper/dists
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
  6 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
... ... @@ -0,0 +1,172 @@
  1 +#!/usr/bin/env sh
  2 +
  3 +##############################################################################
  4 +##
  5 +## Gradle start up script for UN*X
  6 +##
  7 +##############################################################################
  8 +
  9 +# Attempt to set APP_HOME
  10 +# Resolve links: $0 may be a link
  11 +PRG="$0"
  12 +# Need this for relative symlinks.
  13 +while [ -h "$PRG" ] ; do
  14 + ls=`ls -ld "$PRG"`
  15 + link=`expr "$ls" : '.*-> \(.*\)$'`
  16 + if expr "$link" : '/.*' > /dev/null; then
  17 + PRG="$link"
  18 + else
  19 + PRG=`dirname "$PRG"`"/$link"
  20 + fi
  21 +done
  22 +SAVED="`pwd`"
  23 +cd "`dirname \"$PRG\"`/" >/dev/null
  24 +APP_HOME="`pwd -P`"
  25 +cd "$SAVED" >/dev/null
  26 +
  27 +APP_NAME="Gradle"
  28 +APP_BASE_NAME=`basename "$0"`
  29 +
  30 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  31 +DEFAULT_JVM_OPTS=""
  32 +
  33 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  34 +MAX_FD="maximum"
  35 +
  36 +warn () {
  37 + echo "$*"
  38 +}
  39 +
  40 +die () {
  41 + echo
  42 + echo "$*"
  43 + echo
  44 + exit 1
  45 +}
  46 +
  47 +# OS specific support (must be 'true' or 'false').
  48 +cygwin=false
  49 +msys=false
  50 +darwin=false
  51 +nonstop=false
  52 +case "`uname`" in
  53 + CYGWIN* )
  54 + cygwin=true
  55 + ;;
  56 + Darwin* )
  57 + darwin=true
  58 + ;;
  59 + MINGW* )
  60 + msys=true
  61 + ;;
  62 + NONSTOP* )
  63 + nonstop=true
  64 + ;;
  65 +esac
  66 +
  67 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  68 +
  69 +# Determine the Java command to use to start the JVM.
  70 +if [ -n "$JAVA_HOME" ] ; then
  71 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  72 + # IBM's JDK on AIX uses strange locations for the executables
  73 + JAVACMD="$JAVA_HOME/jre/sh/java"
  74 + else
  75 + JAVACMD="$JAVA_HOME/bin/java"
  76 + fi
  77 + if [ ! -x "$JAVACMD" ] ; then
  78 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  79 +
  80 +Please set the JAVA_HOME variable in your environment to match the
  81 +location of your Java installation."
  82 + fi
  83 +else
  84 + JAVACMD="java"
  85 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  86 +
  87 +Please set the JAVA_HOME variable in your environment to match the
  88 +location of your Java installation."
  89 +fi
  90 +
  91 +# Increase the maximum file descriptors if we can.
  92 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
  93 + MAX_FD_LIMIT=`ulimit -H -n`
  94 + if [ $? -eq 0 ] ; then
  95 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
  96 + MAX_FD="$MAX_FD_LIMIT"
  97 + fi
  98 + ulimit -n $MAX_FD
  99 + if [ $? -ne 0 ] ; then
  100 + warn "Could not set maximum file descriptor limit: $MAX_FD"
  101 + fi
  102 + else
  103 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
  104 + fi
  105 +fi
  106 +
  107 +# For Darwin, add options to specify how the application appears in the dock
  108 +if $darwin; then
  109 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
  110 +fi
  111 +
  112 +# For Cygwin, switch paths to Windows format before running java
  113 +if $cygwin ; then
  114 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
  115 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
  116 + JAVACMD=`cygpath --unix "$JAVACMD"`
  117 +
  118 + # We build the pattern for arguments to be converted via cygpath
  119 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
  120 + SEP=""
  121 + for dir in $ROOTDIRSRAW ; do
  122 + ROOTDIRS="$ROOTDIRS$SEP$dir"
  123 + SEP="|"
  124 + done
  125 + OURCYGPATTERN="(^($ROOTDIRS))"
  126 + # Add a user-defined pattern to the cygpath arguments
  127 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
  128 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
  129 + fi
  130 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  131 + i=0
  132 + for arg in "$@" ; do
  133 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
  134 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
  135 +
  136 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
  137 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
  138 + else
  139 + eval `echo args$i`="\"$arg\""
  140 + fi
  141 + i=$((i+1))
  142 + done
  143 + case $i in
  144 + (0) set -- ;;
  145 + (1) set -- "$args0" ;;
  146 + (2) set -- "$args0" "$args1" ;;
  147 + (3) set -- "$args0" "$args1" "$args2" ;;
  148 + (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
  149 + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
  150 + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
  151 + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
  152 + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
  153 + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
  154 + esac
  155 +fi
  156 +
  157 +# Escape application args
  158 +save () {
  159 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
  160 + echo " "
  161 +}
  162 +APP_ARGS=$(save "$@")
  163 +
  164 +# Collect all arguments for the java command, following the shell quoting and substitution rules
  165 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
  166 +
  167 +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
  168 +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  169 + cd "$(dirname "$0")"
  170 +fi
  171 +
  172 +exec "$JAVACMD" "$@"
... ... @@ -0,0 +1,84 @@
  1 +@if "%DEBUG%" == "" @echo off
  2 +@rem ##########################################################################
  3 +@rem
  4 +@rem Gradle startup script for Windows
  5 +@rem
  6 +@rem ##########################################################################
  7 +
  8 +@rem Set local scope for the variables with windows NT shell
  9 +if "%OS%"=="Windows_NT" setlocal
  10 +
  11 +set DIRNAME=%~dp0
  12 +if "%DIRNAME%" == "" set DIRNAME=.
  13 +set APP_BASE_NAME=%~n0
  14 +set APP_HOME=%DIRNAME%
  15 +
  16 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  17 +set DEFAULT_JVM_OPTS=
  18 +
  19 +@rem Find java.exe
  20 +if defined JAVA_HOME goto findJavaFromJavaHome
  21 +
  22 +set JAVA_EXE=java.exe
  23 +%JAVA_EXE% -version >NUL 2>&1
  24 +if "%ERRORLEVEL%" == "0" goto init
  25 +
  26 +echo.
  27 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  28 +echo.
  29 +echo Please set the JAVA_HOME variable in your environment to match the
  30 +echo location of your Java installation.
  31 +
  32 +goto fail
  33 +
  34 +:findJavaFromJavaHome
  35 +set JAVA_HOME=%JAVA_HOME:"=%
  36 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  37 +
  38 +if exist "%JAVA_EXE%" goto init
  39 +
  40 +echo.
  41 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  42 +echo.
  43 +echo Please set the JAVA_HOME variable in your environment to match the
  44 +echo location of your Java installation.
  45 +
  46 +goto fail
  47 +
  48 +:init
  49 +@rem Get command-line arguments, handling Windows variants
  50 +
  51 +if not "%OS%" == "Windows_NT" goto win9xME_args
  52 +
  53 +:win9xME_args
  54 +@rem Slurp the command line arguments.
  55 +set CMD_LINE_ARGS=
  56 +set _SKIP=2
  57 +
  58 +:win9xME_args_slurp
  59 +if "x%~1" == "x" goto execute
  60 +
  61 +set CMD_LINE_ARGS=%*
  62 +
  63 +:execute
  64 +@rem Setup the command line
  65 +
  66 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  67 +
  68 +@rem Execute Gradle
  69 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
  70 +
  71 +:end
  72 +@rem End local scope for the variables with windows NT shell
  73 +if "%ERRORLEVEL%"=="0" goto mainEnd
  74 +
  75 +:fail
  76 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  77 +rem the _cmd.exe /c_ return code!
  78 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
  79 +exit /b 1
  80 +
  81 +:mainEnd
  82 +if "%OS%"=="Windows_NT" endlocal
  83 +
  84 +:omega
... ... @@ -0,0 +1,2 @@
  1 +rootProject.name='UnionSDKDemo'
  2 +include ':app'