瀏覽代碼

v1.0.0开发:浮标功能开发

maijinpei 3 年之前
父節點
當前提交
9ee75ef1be
共有 56 個文件被更改,包括 1715 次插入320 次删除
  1. 87 27
      demo/src/main/java/com/demo/xinrui/DemoActivity.kt
  2. 3 0
      library_xinrui/src/main/AndroidManifest.xml
  3. 1 1
      library_xinrui/src/main/java/com/yyrh/advertisement/AdSdkCallback.java
  4. 1 1
      library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseManager.java
  5. 35 0
      library_xinrui/src/main/java/com/yyrh/core/entity/SdkBackLoginInfo.java
  6. 108 0
      library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterService.java
  7. 88 0
      library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterServiceManager.java
  8. 103 4
      library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginActivity.java
  9. 137 0
      library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginViewModel.java
  10. 158 33
      library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/AccountLauncherFragment.java
  11. 1 32
      library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/PhoneRegisterFragment.java
  12. 1 36
      library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/QuickRegisterFragment.java
  13. 3 2
      library_xinrui/src/main/java/com/yyrh/factory/ChannelSdkOperation.java
  14. 72 32
      library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java
  15. 41 7
      library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java
  16. 8 10
      library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java
  17. 52 53
      library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java
  18. 1 1
      library_xinrui/src/main/java/com/yyrh/sdk/callback/ExitCallback.java
  19. 5 3
      library_xinrui/src/main/java/com/yyrh/sdk/callback/LoginCallback.java
  20. 4 2
      library_xinrui/src/main/java/com/yyrh/sdk/callback/LogoutCallback.java
  21. 3 2
      library_xinrui/src/main/java/com/yyrh/sdk/callback/PayCallback.java
  22. 2 2
      library_xinrui/src/main/java/com/yyrh/sdk/callback/PayOrderCallback.java
  23. 1 1
      library_xinrui/src/main/java/com/yyrh/sdk/callback/RealNameMsgCallback.java
  24. 2 2
      library_xinrui/src/main/java/com/yyrh/sdk/callback/RegisterCallback.java
  25. 3 3
      library_xinrui/src/main/java/com/yyrh/sdk/callback/ShowPolicyCallback.java
  26. 7 4
      library_xinrui/src/main/java/com/yyrh/sdk/callback/UserPolicyCallback.java
  27. 0 2
      library_xinrui/src/main/java/com/yyrh/ui/PageJsInteraction.java
  28. 2 0
      library_xinrui/src/main/java/com/yyrh/ui/dialog/AutoLauncherDialog.java
  29. 79 0
      library_xinrui/src/main/java/com/yyrh/ui/dialog/TipsDialog.java
  30. 1 2
      library_xinrui/src/main/java/com/yyrh/ui/dialog/TipsToast.java
  31. 370 0
      library_xinrui/src/main/java/com/yyrh/ui/floatview/FloatingBall.java
  32. 135 0
      library_xinrui/src/main/java/com/yyrh/ui/floatview/FloatingBallMenu.java
  33. 1 1
      library_xinrui/src/main/java/com/yyrh/utils/TimeDownUtils.java
  34. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_account_center_img.png
  35. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_delete_img.png
  36. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_floating_ball_img.png
  37. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_menu_dismiss_img.png
  38. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_pick_down_img.png
  39. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_pick_up_img.png
  40. 二進制
      library_xinrui/src/main/res/drawable-xhdpi/hnyy_switch_account_img.png
  41. 10 0
      library_xinrui/src/main/res/drawable/hnyy_account_list_bg.xml
  42. 5 0
      library_xinrui/src/main/res/drawable/hnyy_btn_light_purple_bg.xml
  43. 1 1
      library_xinrui/src/main/res/drawable/hnyy_btn_purple_bg.xml
  44. 1 1
      library_xinrui/src/main/res/drawable/hnyy_btn_white_bg.xml
  45. 1 1
      library_xinrui/src/main/res/drawable/hnyy_container_white_bg.xml
  46. 1 1
      library_xinrui/src/main/res/drawable/hnyy_et_frame_focused_bg.xml
  47. 1 1
      library_xinrui/src/main/res/drawable/hnyy_et_frame_normal_bg.xml
  48. 5 0
      library_xinrui/src/main/res/drawable/hnyy_floating_ball_menu_bg.xml
  49. 27 0
      library_xinrui/src/main/res/layout/hnyy_account_list_item.xml
  50. 17 0
      library_xinrui/src/main/res/layout/hnyy_floating_ball_menu.xml
  51. 15 0
      library_xinrui/src/main/res/layout/hnyy_floating_ball_menu_item.xml
  52. 0 29
      library_xinrui/src/main/res/layout/hnyy_iab_activity.xml
  53. 39 2
      library_xinrui/src/main/res/layout/hnyy_login_account_launcher.xml
  54. 45 21
      library_xinrui/src/main/res/layout/hnyy_tips_dialog.xml
  55. 31 0
      library_xinrui/src/main/res/layout/hnyy_tips_toast.xml
  56. 1 0
      library_xinrui/src/main/res/values/colors.xml

+ 87 - 27
demo/src/main/java/com/demo/xinrui/DemoActivity.kt

@@ -1,10 +1,12 @@
 package com.demo.xinrui
 
 import android.app.Activity
+import android.content.Intent
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
 import android.os.Message
+import android.view.KeyEvent
 import android.view.View
 import android.widget.Button
 import android.widget.LinearLayout
@@ -12,14 +14,11 @@ import android.widget.ScrollView
 import android.widget.TextView
 import cn.yyxx.support.hawkeye.LogUtils
 import cn.yyxx.support.hawkeye.ToastUtils
-import com.yyrh.core.entity.Session
-import com.yyrh.core.impl.login.LoginActivity
 import com.yyrh.sdk.SDKEntry
 import com.yyrh.sdk.callback.InitCallback
 import com.yyrh.sdk.callback.LoginCallback
-import com.yyrh.ui.dialog.TipsToast
-import com.yyrh.utils.SessionUtils
-import com.yyrh.utils.YYLog
+import com.yyrh.sdk.callback.LogoutCallback
+import kotlin.system.exitProcess
 
 /**
  * @author #Suyghur.
@@ -58,26 +57,35 @@ class DemoActivity : Activity(), View.OnClickListener {
         LogUtils.handler = handler
         SDKEntry.getSdkInstance().initSdk(this, object : InitCallback {
             override fun onInitSuccess(msg: String?) {
-                ToastUtils.toastInfo(this@DemoActivity, msg)
+                ToastUtils.toastInfo(this@DemoActivity, "onInitSuccess: $msg")
             }
 
             override fun onInitFailed(msg: String?) {
-                ToastUtils.toastInfo(this@DemoActivity, msg)
+                ToastUtils.toastInfo(this@DemoActivity, "onInitFailed: $msg")
             }
 
             override fun onInitError(msg: String?) {
-                ToastUtils.toastInfo(this@DemoActivity, msg)
+                ToastUtils.toastInfo(this@DemoActivity, "onInitError: $msg")
 
             }
 
             override fun onGetOaid(isSuccess: Boolean, oaid: String?) {
-                ToastUtils.toastInfo(this@DemoActivity, oaid)
+                ToastUtils.toastInfo(this@DemoActivity, "onGetOaid: $oaid")
             }
 
             override fun onShowGameExit() {
             }
-
         }, true)
+
+        SDKEntry.getSdkInstance().setSDKLogoutListener(this, object : LogoutCallback {
+            override fun onLogoutSuccess() {
+                ToastUtils.toastInfo(this@DemoActivity, "onLogoutSuccess")
+            }
+
+            override fun onLogoutFailed() {
+                ToastUtils.toastInfo(this@DemoActivity, "onLogoutFailed")
+            }
+        })
     }
 
     private fun initView() {
@@ -106,23 +114,6 @@ class DemoActivity : Activity(), View.OnClickListener {
         }
     }
 
-    override fun onResume() {
-        super.onResume()
-        SDKEntry.getSdkInstance().sdkOnResume(this)
-    }
-
-    override fun onPause() {
-        super.onPause()
-        SDKEntry.getSdkInstance().sdkOnPause(this)
-
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        SDKEntry.getSdkInstance().sdkOnDestroy(this)
-
-    }
-
     override fun onClick(v: View?) {
         v?.apply {
             when (id) {
@@ -142,7 +133,76 @@ class DemoActivity : Activity(), View.OnClickListener {
 
                     })
                 }
+                2 -> {
+                    SDKEntry.getSdkInstance().logout()
+                    SDKEntry.getSdkInstance().login(this@DemoActivity, object : LoginCallback {
+                        override fun onLoginSuccess(token: String?) {
+                            ToastUtils.toastInfo(this@DemoActivity, "登录成功,token: $token")
+                        }
+
+                        override fun onLoginFailed(msg: String?) {
+                            ToastUtils.toastInfo(this@DemoActivity, "登录失败,msg: $msg")
+                        }
+
+                        override fun onLoginError(msg: String?) {
+                            ToastUtils.toastInfo(this@DemoActivity, "登录失败,msg: $msg")
+                        }
+                    })
+                }
             }
         }
     }
+
+    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            SDKEntry.getSdkInstance().exitGame(this) {
+                if (it) {
+                    finish()
+                }
+            }
+            return true
+        }
+        return super.onKeyDown(keyCode, event)
+    }
+
+    override fun onStart() {
+        super.onStart()
+        SDKEntry.getSdkInstance().sdkOnStart(this)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        SDKEntry.getSdkInstance().sdkOnResume(this)
+    }
+
+    override fun onRestart() {
+        super.onRestart()
+        SDKEntry.getSdkInstance().sdkOnRestart(this)
+    }
+
+    override fun onPause() {
+        super.onPause()
+        SDKEntry.getSdkInstance().sdkOnPause(this)
+    }
+
+    override fun onStop() {
+        super.onStop()
+        SDKEntry.getSdkInstance().sdkOnStop(this)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        SDKEntry.getSdkInstance().sdkOnDestroy(this)
+        exitProcess(0)
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
+        super.onActivityResult(requestCode, resultCode, data)
+        SDKEntry.getSdkInstance().onActivityResult(this, requestCode, resultCode, data)
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        SDKEntry.getSdkInstance().sdkOnNewIntent(this, intent)
+    }
 }

+ 3 - 0
library_xinrui/src/main/AndroidManifest.xml

@@ -26,6 +26,9 @@
             android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
             android:windowSoftInputMode="adjustResize|stateHidden|stateVisible" />
 
+        <service
+            android:name="com.yyrh.core.impl.floatball.FloatCenterService"
+            android:exported="true" />
     </application>
 
 </manifest>

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/advertisement/AdSdkCallback.java

@@ -23,7 +23,7 @@ public interface AdSdkCallback {
 
     void onPause(Activity activity);
 
-    void onDestory(Activity activity);
+    void onDestroy(Activity activity);
 
     void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
 

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseManager.java

@@ -88,7 +88,7 @@ public class AdvertiseManager {
         }
     }
 
-    public void onDestory(Activity activity) {
+    public void onDestroy(Activity activity) {
         if (advertise != null) {
             advertise.onDestory(activity);
         }

+ 35 - 0
library_xinrui/src/main/java/com/yyrh/core/entity/SdkBackLoginInfo.java

@@ -0,0 +1,35 @@
+package com.yyrh.core.entity;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class SdkBackLoginInfo {
+
+    public String userId = "";
+    public boolean isRegUser = false;
+    public boolean isRealName = false;
+    public String userCenterUrl = "";
+    public String realNameUrl = "";
+
+    private volatile static SdkBackLoginInfo INSTANCE = null;
+
+    public static SdkBackLoginInfo getInstance() {
+        if (INSTANCE == null) {
+            synchronized (SdkBackLoginInfo.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new SdkBackLoginInfo();
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void reset() {
+        this.userId = "";
+        this.isRegUser = false;
+        this.isRealName = false;
+        this.userCenterUrl = "";
+        this.realNameUrl = "";
+    }
+}

+ 108 - 0
library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterService.java

@@ -0,0 +1,108 @@
+package com.yyrh.core.impl.floatball;
+
+import android.app.Activity;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+import android.support.annotation.Nullable;
+import android.widget.ImageView;
+
+import com.yyrh.factory.SdkManager;
+import com.yyrh.ui.floatview.FloatingBall;
+import com.yyrh.ui.floatview.FloatingBallMenu;
+
+import java.util.ArrayList;
+
+import cn.yyxx.support.ResUtils;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class FloatCenterService extends Service {
+
+    private FloatingBall floatingBall = null;
+    private Activity activity = null;
+
+    private final FloatingBall.IFloatingBallCallback callback = new FloatingBall.IFloatingBallCallback() {
+        @Override
+        public void onUpdateBallView(ImageView ballView, boolean isLeftLocation, boolean isHide) {
+            ballView.setBackgroundResource(ResUtils.getResId(activity, "hnyy_floating_ball_img", "drawable"));
+        }
+
+        @Override
+        public ArrayList<FloatingBallMenu.Item> onInitMenuData() {
+            ArrayList<FloatingBallMenu.Item> items = new ArrayList<>();
+            items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.ACCOUNT_CENTER, ""));
+            items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.SWITCH_ACCOUNT, ""));
+            items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.MENU_DISMISS, ""));
+            return items;
+        }
+
+        @Override
+        public void onMenuItemClick(FloatingBallMenu.Item item, int pos) {
+
+        }
+
+        @Override
+        public void onExpandMenu(boolean hasRedDot) {
+
+        }
+
+        @Override
+        public void onDismissMenu() {
+            if (floatingBall != null) {
+                floatingBall.dismissMenu();
+            }
+        }
+    };
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    public void initService(Activity activity) {
+        this.activity = activity;
+    }
+
+    public void attach() {
+        if (activity == null) {
+            return;
+        }
+        if (floatingBall == null) {
+            floatingBall = new FloatingBall(activity, SdkManager.defaultManager().isLandscape, callback);
+        }
+        floatingBall.attach();
+    }
+
+    public void detach() {
+        if (floatingBall != null) {
+            floatingBall.detach();
+        }
+    }
+
+    public void release() {
+        if (floatingBall != null) {
+            floatingBall.release();
+        }
+    }
+
+    @Nullable
+    @Override
+    public IBinder onBind(Intent intent) {
+        return new FloatCenterServiceBinder();
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        return super.onStartCommand(intent, flags, startId);
+    }
+
+    class FloatCenterServiceBinder extends Binder {
+        FloatCenterService getService() {
+            return FloatCenterService.this;
+        }
+    }
+}

+ 88 - 0
library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterServiceManager.java

@@ -0,0 +1,88 @@
+package com.yyrh.core.impl.floatball;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.yyrh.core.impl.floatball.FloatCenterService.FloatCenterServiceBinder;
+import com.yyrh.utils.YYLog;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class FloatCenterServiceManager {
+
+    private volatile static FloatCenterServiceManager INSTANCE = null;
+
+    private FloatCenterService service = null;
+    private Activity activity = null;
+    private Intent intent = null;
+    private boolean isBindService = false;
+
+    private final ServiceConnection serviceConnection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder iBinder) {
+            service = ((FloatCenterServiceBinder) iBinder).getService();
+            service.initService(activity);
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+
+        }
+    };
+
+    public static FloatCenterServiceManager getInstance() {
+        if (INSTANCE == null) {
+            synchronized (FloatCenterServiceManager.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new FloatCenterServiceManager();
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void init(Activity activity) {
+        this.activity = activity;
+        if (service == null) {
+            intent = new Intent(activity.getApplicationContext(), FloatCenterService.class);
+            activity.getApplicationContext().startService(intent);
+            activity.getApplicationContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+            isBindService = true;
+        }
+    }
+
+    public void attach() {
+        if (service == null) {
+            YYLog.e("浮标服务未初始化或发生异常");
+            return;
+        }
+        service.attach();
+    }
+
+    public void detach() {
+        if (service == null) {
+            return;
+        }
+        service.detach();
+    }
+
+    public void release() {
+        if (service == null) {
+            return;
+        }
+        service.release();
+        if (isBindService) {
+            activity.getApplicationContext().unbindService(serviceConnection);
+            activity.getApplicationContext().stopService(intent);
+        }
+        intent = null;
+        activity = null;
+    }
+
+}

+ 103 - 4
library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginActivity.java

@@ -6,6 +6,10 @@ import android.content.Context;
 import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
@@ -16,11 +20,16 @@ import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 
+import com.yyrh.core.entity.Session;
 import com.yyrh.core.impl.login.fragment.AccountLauncherFragment;
 import com.yyrh.core.impl.login.fragment.PhoneRegisterFragment;
 import com.yyrh.core.impl.login.fragment.QuickRegisterFragment;
 import com.yyrh.core.internal.IImplCallback;
 import com.yyrh.ui.dialog.AgreementDialog;
+import com.yyrh.ui.dialog.AutoLauncherDialog;
+import com.yyrh.utils.SessionUtils;
+import com.yyrh.utils.TimeDownUtils;
+import com.yyrh.utils.YYLog;
 
 import java.util.LinkedList;
 
@@ -41,7 +50,27 @@ public class LoginActivity extends FragmentActivity {
     private PhoneRegisterFragment phoneRegisterFragment;
     private final LinkedList<String> fragmentStack = new LinkedList<>();
     private String currentFragmentTag;
-    private Dialog agreementDialog;
+    public LoginViewModel viewModel;
+    private Dialog agreementDialog = null;
+    private AutoLauncherDialog autoLoginDialog = null;
+    private Session session = null;
+    private boolean isCancelLogin = false;
+
+    private final Handler handler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            if (msg.what == 101) {
+                YYLog.d("cancel: " + isCancelLogin);
+                if (isCancelLogin) {
+                    hideAutoLoginDialog();
+                    return;
+                }
+                autoLoginDialog.getButton().setEnabled(false);
+                autoLoginDialog.getButton().setBackgroundResource(ResUtils.getResId(LoginActivity.this, "hnyy_btn_light_purple_bg", "drawable"));
+                viewModel.accountLauncher(LoginActivity.this, session.userName, session.pwd);
+            }
+        }
+    };
 
 
     public static void start(Activity activity, boolean auto, boolean isLand, IImplCallback callback) {
@@ -55,6 +84,18 @@ public class LoginActivity extends FragmentActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        this.viewModel = new LoginViewModel(new LoginViewModel.ISignInCallback() {
+            @Override
+            public void onSuccess(String result) {
+                hideAutoLoginDialog();
+                implCallback.onResult(1, result);
+            }
+
+            @Override
+            public void onFailed(String result) {
+                implCallback.onResult(0, result);
+            }
+        });
         initView();
     }
 
@@ -67,7 +108,7 @@ public class LoginActivity extends FragmentActivity {
         if (!isLandscape) {
             AndroidBug5497Workaround.assistActivity(this);
         }
-        initFragment();
+        showAutoLoginDialog();
     }
 
     private void initFragment() {
@@ -94,8 +135,6 @@ public class LoginActivity extends FragmentActivity {
                 }
                 switchFragment(phoneRegisterFragment, tag);
                 break;
-
-
         }
     }
 
@@ -139,6 +178,66 @@ public class LoginActivity extends FragmentActivity {
         agreementDialog.show();
     }
 
+    private void showAutoLoginDialog() {
+        if (autoLoginDialog != null) {
+            if (autoLoginDialog.isShowing()) {
+                autoLoginDialog.dismiss();
+            }
+            autoLoginDialog = null;
+        }
+        this.session = SessionUtils.getInstance().getLocalLastSession();
+
+        if (session == null || !autoLogin) {
+            initFragment();
+            return;
+        }
+
+        autoLoginDialog = new AutoLauncherDialog(this);
+        autoLoginDialog.getButton().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                // 取消自动登录
+                isCancelLogin = true;
+                hideAutoLoginDialog();
+                initFragment();
+            }
+        });
+        autoLoginDialog.show();
+        // 延迟2s发起登录
+        handler.sendEmptyMessageDelayed(101, 2000);
+    }
+
+    private void hideAutoLoginDialog() {
+        if (autoLoginDialog != null) {
+            autoLoginDialog.dismiss();
+//            TimeDownUtils.cancel();
+            autoLoginDialog = null;
+        }
+    }
+
+    private void changeTimeNum() {
+        if (!TimeDownUtils.isRunning()) {
+            TimeDownUtils.start(2, new TimeDownUtils.TimeCallback() {
+                @Override
+                public void onTime(int time) {
+                    Message msg = Message.obtain();
+                    msg.what = 101;
+                    msg.obj = time;
+                    handler.sendMessage(msg);
+                }
+            });
+        } else {
+            TimeDownUtils.resetCallback(new TimeDownUtils.TimeCallback() {
+                @Override
+                public void onTime(int time) {
+                    Message msg = Message.obtain();
+                    msg.what = 101;
+                    msg.obj = time;
+                    handler.sendMessage(msg);
+                }
+            });
+        }
+    }
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {

+ 137 - 0
library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginViewModel.java

@@ -0,0 +1,137 @@
+package com.yyrh.core.impl.login;
+
+import android.app.Activity;
+import android.text.TextUtils;
+
+import com.yyrh.core.entity.ResultInfo;
+import com.yyrh.core.entity.SdkBackLoginInfo;
+import com.yyrh.core.entity.Session;
+import com.yyrh.core.internal.IRequestCallback;
+import com.yyrh.core.network.SdkRequest;
+import com.yyrh.ui.dialog.TipsToast;
+import com.yyrh.utils.SessionUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import cn.yyxx.support.JsonUtils;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class LoginViewModel {
+
+    private ISignInCallback callback;
+
+    public LoginViewModel(ISignInCallback callback) {
+        this.callback = callback;
+    }
+
+    public void accountLauncher(final Activity activity, final String userName, final String pwd) {
+        SdkRequest.accountLauncher(activity, userName, pwd, new IRequestCallback() {
+            @Override
+            public void onResponse(ResultInfo resultInfo) {
+                if (resultInfo.code == 1) {
+                    try {
+                        JSONObject jsonObject = new JSONObject(resultInfo.data);
+                        Session session = new Session();
+                        String uid = "";
+                        String token = "";
+                        if (JsonUtils.hasJsonKey(jsonObject, "channel_uid")) {
+                            uid = jsonObject.getString("channel_uid");
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "token")) {
+                            token = jsonObject.getString("token");
+                        }
+                        SdkBackLoginInfo.getInstance().userId = uid;
+                        session.userId = uid;
+                        session.userName = userName;
+                        session.pwd = pwd;
+                        SessionUtils.getInstance().saveSession(session);
+                        TipsToast.showSuccessMsg(activity, resultInfo.msg);
+                        callback.onSuccess(token);
+                        activity.finish();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                } else {
+                    String msg = resultInfo.msg;
+                    if (TextUtils.isEmpty(msg)) {
+                        msg = "登录发生异常,请重试";
+                    }
+                    TipsToast.showErrorMsg(activity, msg);
+                    callback.onFailed(msg);
+                }
+            }
+        });
+    }
+
+    public void accountRegister(final Activity activity, final String userName, final String pwd) {
+        SdkRequest.accountRegister(activity, userName, pwd, new IRequestCallback() {
+            @Override
+            public void onResponse(ResultInfo resultInfo) {
+                if (resultInfo.code == 1) {
+                    try {
+                        JSONObject jsonObject = new JSONObject(resultInfo.data);
+                        Session session = new Session();
+                        session.userId = jsonObject.getString("channel_uid");
+                        session.userName = userName;
+                        session.pwd = pwd;
+                        SessionUtils.getInstance().saveSession(session);
+                        TipsToast.showSuccessMsg(activity, resultInfo.msg);
+                        callback.onSuccess(jsonObject.getString("token"));
+                        activity.finish();
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                    }
+
+                } else {
+                    String msg = resultInfo.msg;
+                    if (TextUtils.isEmpty(msg)) {
+                        msg = "注册发生异常,请重试";
+                    }
+                    TipsToast.showErrorMsg(activity, msg);
+                    callback.onFailed(msg);
+                }
+            }
+        });
+    }
+
+    public void phoneRegister(final Activity activity, String phone, final String pwd, String captcha) {
+        SdkRequest.phoneRegister(activity, phone, pwd, captcha, new IRequestCallback() {
+            @Override
+            public void onResponse(ResultInfo resultInfo) {
+                if (resultInfo.code == 1) {
+                    try {
+                        JSONObject jsonObject = new JSONObject(resultInfo.data);
+                        Session session = new Session();
+                        session.userId = jsonObject.getString("channel_uid");
+                        session.userName = jsonObject.getString("uname");
+                        session.pwd = pwd;
+                        SessionUtils.getInstance().saveSession(session);
+                        TipsToast.showSuccessMsg(activity, resultInfo.msg);
+                        callback.onSuccess(jsonObject.getString("token"));
+                        activity.finish();
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                    }
+                } else {
+                    String msg = resultInfo.msg;
+                    if (TextUtils.isEmpty(msg)) {
+                        msg = "注册发生异常,请重试";
+                    }
+                    TipsToast.showErrorMsg(activity, msg);
+                    callback.onFailed(msg);
+                }
+            }
+        });
+    }
+
+    interface ISignInCallback {
+
+        void onSuccess(String result);
+
+        void onFailed(String result);
+    }
+}

+ 158 - 33
library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/AccountLauncherFragment.java

@@ -1,31 +1,32 @@
 package com.yyrh.core.impl.login.fragment;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.text.InputType;
 import android.text.TextUtils;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
 import android.widget.TextView;
 
 import com.yyrh.core.entity.ClickType;
-import com.yyrh.core.entity.ResultInfo;
 import com.yyrh.core.entity.Session;
 import com.yyrh.core.impl.login.LoginActivity;
 import com.yyrh.core.impl.login.LoginFragmentTag;
-import com.yyrh.core.internal.IRequestCallback;
-import com.yyrh.core.network.SdkRequest;
 import com.yyrh.factory.SdkManager;
 import com.yyrh.ui.dialog.TipsToast;
 import com.yyrh.ui.widget.EventEditText;
 import com.yyrh.utils.SessionUtils;
 
-import org.json.JSONException;
-import org.json.JSONObject;
+import java.util.ArrayList;
 
 import cn.yyxx.support.ResUtils;
 
@@ -36,12 +37,17 @@ import cn.yyxx.support.ResUtils;
 public class AccountLauncherFragment extends Fragment implements View.OnClickListener {
 
     private View view;
+    private LayoutInflater mInflater;
     private LoginActivity loginImpl;
     private EventEditText eetAccount, eetPwd;
     private Button btnLauncher, btnRegister;
     private ImageView ivCheck;
     private TextView tvAgreement, tvPrivacy;
-    private int imgCheck, imgUncheck, imgShow, imgHide;
+    private int imgCheck, imgUncheck, imgShow, imgHide, imgUp, imgDown;
+    private RelativeLayout rlAccountList;
+    private ScrollView svAccountList;
+    private LinearLayout llAccountList;
+    private ArrayList<Session> userList = new ArrayList<>();
     private boolean check = false;
     private boolean showText = false;
 
@@ -50,6 +56,7 @@ public class AccountLauncherFragment extends Fragment implements View.OnClickLis
     @Override
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         super.onCreateView(inflater, container, savedInstanceState);
+        this.mInflater = inflater;
         if (getActivity() instanceof LoginActivity) {
             loginImpl = (LoginActivity) getActivity();
         }
@@ -66,12 +73,22 @@ public class AccountLauncherFragment extends Fragment implements View.OnClickLis
         imgUncheck = ResUtils.getResId(getActivity(), "hnyy_uncheck_img", "drawable");
         imgShow = ResUtils.getResId(getActivity(), "hnyy_show_img", "drawable");
         imgHide = ResUtils.getResId(getActivity(), "hnyy_hide_img", "drawable");
+        imgUp = ResUtils.getResId(getActivity(), "hnyy_pick_up_img", "drawable");
+        imgDown = ResUtils.getResId(getActivity(), "hnyy_pick_down_img", "drawable");
+
 
         eetAccount = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_eet_account", "id"));
         eetAccount.getLeftImageView().setBackgroundResource(ResUtils.getResId(getActivity(), "hnyy_account_img", "drawable"));
         eetAccount.getLeftImageView().setVisibility(View.VISIBLE);
         eetAccount.getEditText().setHint("请输入账号");
         eetAccount.getEditText().setText("test1231");
+        eetAccount.getRightImageView().setBackgroundResource(imgDown);
+        eetAccount.getRightImageView().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                changeAccountList();
+            }
+        });
 
         eetPwd = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_eet_pwd", "id"));
         eetPwd.getLeftImageView().setBackgroundResource(ResUtils.getResId(getActivity(), "hnyy_pwd_img", "drawable"));
@@ -117,8 +134,109 @@ public class AccountLauncherFragment extends Fragment implements View.OnClickLis
         tvPrivacy.setOnClickListener(this);
         tvPrivacy.setTag(ClickType.ACTION_PRIVACY);
 
+        rlAccountList = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_rl_account_list", "id"));
+        svAccountList = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_sv_account_list", "id"));
+        llAccountList = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_ll_account_list", "id"));
+        rlAccountList.setVisibility(View.GONE);
+
+        autoFillAccountInfo();
+    }
+
+    private void autoFillAccountInfo() {
+        ArrayList<Session> temp = SessionUtils.getInstance().getLocalSessionLimit3();
+        if (temp == null || temp.size() == 0) {
+            eetAccount.getRightImageView().setVisibility(View.GONE);
+            return;
+        }
+        for (Session session : temp) {
+            if (userList == null) {
+                userList = new ArrayList<>();
+            }
+            userList.add(session);
+        }
+        if (userList != null && userList.size() > 0) {
+            Session session = userList.get(0);
+            if (session != null) {
+                eetAccount.getEditText().setText(session.userName);
+                eetPwd.getEditText().setText(session.pwd);
+            }
+            if (userList.size() > 1) {
+                initAccountList();
+                eetAccount.getRightImageView().setVisibility(View.VISIBLE);
+            } else {
+                eetAccount.getRightImageView().setVisibility(View.GONE);
+                rlAccountList.setVisibility(View.GONE);
+            }
+        } else {
+            eetAccount.getRightImageView().setVisibility(View.GONE);
+            rlAccountList.setVisibility(View.GONE);
+        }
+    }
+
+    private void initAccountList() {
+        llAccountList.removeAllViews();
+        // 单行高
+        int height = 100;
+        if (eetAccount.getLayoutParams().height != -1 || eetAccount.getLayoutParams().height != 0) {
+            height = eetAccount.getLayoutParams().height;
+        }
+        // ScrollView最大高度
+        int maxHeight = 0;
+        if (userList != null && userList.size() > 0) {
+            if (userList.size() < 3) {
+                maxHeight = userList.size() * height;
+            } else {
+                maxHeight = (userList.size() - 1) * height;
+            }
+        }
+
+        // 循环添加列
+        for (int i = 0; i < userList.size(); i++) {
+            Session session = userList.get(i);
+            // 添加列线
+            LinearLayout.LayoutParams lineParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2);
+            View line = new View(getActivity());
+            line.setLayoutParams(lineParams);
+            line.setBackgroundColor(Color.parseColor("#4D505050"));
+            if (llAccountList.getChildCount() > 0) {
+                llAccountList.addView(line);
+            }
+            // 添加账号
+            View view = mInflater.inflate(ResUtils.getResId(getActivity(), "hnyy_account_list_item", "layout"), null);
+            view.setOnClickListener(new AccountItemClick(session));
+
+            TextView tvAccountName = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_tv_name", "id"));
+            tvAccountName.setGravity(Gravity.CENTER_VERTICAL);
+            tvAccountName.setPadding(15, 0, 0, 0);
+            tvAccountName.setText(session.userName);
+
+            ImageView ivDelete = view.findViewById(ResUtils.getResId(getActivity(), "hnyy_iv_delete", "id"));
+            ivDelete.setOnClickListener(new AccountItemDeleteClick(session));
+
+            view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height));
+            llAccountList.addView(view, llAccountList.getChildCount());
+        }
+        svAccountList.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, maxHeight));
+    }
+
+    private void hideAccountList() {
+        if (userList != null && userList.size() > 0 && rlAccountList.getVisibility() == View.VISIBLE) {
+            eetAccount.getRightImageView().setBackgroundResource(imgDown);
+            rlAccountList.setVisibility(View.GONE);
+        }
+    }
+
+    private void changeAccountList() {
+        if (rlAccountList.getVisibility() == View.GONE) {
+            eetAccount.getRightImageView().setBackgroundResource(imgUp);
+            rlAccountList.setVisibility(View.VISIBLE);
+        } else {
+            eetAccount.getRightImageView().setBackgroundResource(imgDown);
+            rlAccountList.setVisibility(View.GONE);
+        }
     }
 
+
     private void changeCheck() {
         if (check) {
             check = false;
@@ -144,33 +262,7 @@ public class AccountLauncherFragment extends Fragment implements View.OnClickLis
             TipsToast.showErrorMsg(getActivity(), "请您先勾选同意下方协议");
             return;
         }
-        SdkRequest.accountLauncher(getActivity(), userName, pwd, new IRequestCallback() {
-            @Override
-            public void onResponse(ResultInfo resultInfo) {
-                if (resultInfo.code == 1) {
-                    try {
-                        JSONObject jsonObject = new JSONObject(resultInfo.data);
-                        Session session = new Session();
-                        session.userId = jsonObject.getString("channel_uid");
-                        session.userName = userName;
-                        session.pwd = pwd;
-                        SessionUtils.getInstance().saveSession(session);
-                        TipsToast.showSuccessMsg(getActivity(), resultInfo.msg);
-                        LoginActivity.implCallback.onResult(1, jsonObject.getString("token"));
-                        getActivity().finish();
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                } else {
-                    String msg = resultInfo.msg;
-                    if (TextUtils.isEmpty(msg)) {
-                        msg = "登录发生异常,请重试";
-                    }
-                    TipsToast.showErrorMsg(getActivity(), msg);
-                    LoginActivity.implCallback.onResult(0, msg);
-                }
-            }
-        });
+        loginImpl.viewModel.accountLauncher(getActivity(), userName, pwd);
     }
 
 
@@ -197,4 +289,37 @@ public class AccountLauncherFragment extends Fragment implements View.OnClickLis
                 break;
         }
     }
+
+    private class AccountItemClick implements View.OnClickListener {
+
+        private Session session = null;
+
+        AccountItemClick(Session session) {
+            this.session = session;
+        }
+
+        @Override
+        public void onClick(View v) {
+            eetAccount.getRightImageView().setBackgroundResource(imgUp);
+            hideAccountList();
+            eetAccount.getEditText().setText(session.userName);
+            eetPwd.getEditText().setText(session.pwd);
+        }
+    }
+
+    private class AccountItemDeleteClick implements View.OnClickListener {
+
+        private Session session = null;
+
+        AccountItemDeleteClick(Session session) {
+            this.session = session;
+        }
+
+        @Override
+        public void onClick(View v) {
+            SessionUtils.getInstance().removeSession(session.userId);
+            userList.clear();
+            autoFillAccountInfo();
+        }
+    }
 }

+ 1 - 32
library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/PhoneRegisterFragment.java

@@ -18,7 +18,6 @@ import android.widget.TextView;
 
 import com.yyrh.core.entity.ClickType;
 import com.yyrh.core.entity.ResultInfo;
-import com.yyrh.core.entity.Session;
 import com.yyrh.core.entity.SmsAction;
 import com.yyrh.core.impl.login.LoginActivity;
 import com.yyrh.core.internal.IRequestCallback;
@@ -27,12 +26,8 @@ import com.yyrh.factory.SdkManager;
 import com.yyrh.ui.dialog.TipsToast;
 import com.yyrh.ui.widget.EventEditText;
 import com.yyrh.ui.widget.VerifyEditText;
-import com.yyrh.utils.SessionUtils;
 import com.yyrh.utils.TimeDownUtils;
 
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import cn.yyxx.support.ResUtils;
 
 /**
@@ -203,33 +198,7 @@ public class PhoneRegisterFragment extends Fragment implements View.OnClickListe
             TipsToast.showErrorMsg(getActivity(), "请您先勾选同意下方协议");
             return;
         }
-        SdkRequest.phoneRegister(getActivity(), phone, pwd, captcha, new IRequestCallback() {
-            @Override
-            public void onResponse(ResultInfo resultInfo) {
-                if (resultInfo.code == 1) {
-                    try {
-                        JSONObject jsonObject = new JSONObject(resultInfo.data);
-                        Session session = new Session();
-                        session.userId = jsonObject.getString("channel_uid");
-                        session.userName = jsonObject.getString("uname");
-                        session.pwd = pwd;
-                        SessionUtils.getInstance().saveSession(session);
-                        TipsToast.showSuccessMsg(getActivity(), resultInfo.msg);
-                        LoginActivity.implCallback.onResult(1, jsonObject.getString("token"));
-                        getActivity().finish();
-                    } catch (JSONException e) {
-                        e.printStackTrace();
-                    }
-                } else {
-                    String msg = resultInfo.msg;
-                    if (TextUtils.isEmpty(msg)) {
-                        msg = "注册发生异常,请重试";
-                    }
-                    TipsToast.showErrorMsg(getActivity(), msg);
-                    LoginActivity.implCallback.onResult(0, msg);
-                }
-            }
-        });
+        loginImpl.viewModel.phoneRegister(getActivity(), phone, pwd, captcha);
     }
 
     private void changeTimeNum() {

+ 1 - 36
library_xinrui/src/main/java/com/yyrh/core/impl/login/fragment/QuickRegisterFragment.java

@@ -13,19 +13,11 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.yyrh.core.entity.ClickType;
-import com.yyrh.core.entity.ResultInfo;
-import com.yyrh.core.entity.Session;
 import com.yyrh.core.impl.login.LoginActivity;
 import com.yyrh.core.impl.login.LoginFragmentTag;
-import com.yyrh.core.internal.IRequestCallback;
-import com.yyrh.core.network.SdkRequest;
 import com.yyrh.factory.SdkManager;
 import com.yyrh.ui.dialog.TipsToast;
 import com.yyrh.ui.widget.EventEditText;
-import com.yyrh.utils.SessionUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
 
 import cn.yyxx.support.ResUtils;
 
@@ -158,34 +150,7 @@ public class QuickRegisterFragment extends Fragment implements View.OnClickListe
             TipsToast.showErrorMsg(getActivity(), "请您先勾选同意下方协议");
             return;
         }
-        SdkRequest.accountRegister(getActivity(), userName, pwd, new IRequestCallback() {
-            @Override
-            public void onResponse(ResultInfo resultInfo) {
-                if (resultInfo.code == 1) {
-                    try {
-                        JSONObject jsonObject = new JSONObject(resultInfo.data);
-                        Session session = new Session();
-                        session.userId = jsonObject.getString("channel_uid");
-                        session.userName = userName;
-                        session.pwd = pwd;
-                        SessionUtils.getInstance().saveSession(session);
-                        TipsToast.showSuccessMsg(getActivity(), resultInfo.msg);
-                        LoginActivity.implCallback.onResult(1, jsonObject.getString("token"));
-                        getActivity().finish();
-                    } catch (JSONException e) {
-                        e.printStackTrace();
-                    }
-
-                } else {
-                    String msg = resultInfo.msg;
-                    if (TextUtils.isEmpty(msg)) {
-                        msg = "注册发生异常,请重试";
-                    }
-                    TipsToast.showErrorMsg(getActivity(), msg);
-                    LoginActivity.implCallback.onResult(0, msg);
-                }
-            }
-        });
+        loginImpl.viewModel.accountRegister(getActivity(), userName, pwd);
     }
 
     @Override

+ 3 - 2
library_xinrui/src/main/java/com/yyrh/factory/ChannelSdkOperation.java

@@ -13,6 +13,7 @@ import com.yyrh.core.internal.IImplCallback;
 import com.yyrh.sdk.SDKEntry;
 import com.yyrh.sdk.YyrhSdkManager;
 import com.yyrh.sdk.callback.InitCallback;
+import com.yyrh.sdk.callback.LogoutCallback;
 import com.yyrh.sdk.callback.RealNameMsgCallback;
 import com.yyrh.utils.Utils;
 import com.yyrh.utils.YYLog;
@@ -75,8 +76,8 @@ public class ChannelSdkOperation implements ISdkOperation {
     }
 
     @Override
-    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback) {
-        channelSdk.setSDKLogoutListener(ac, sdkCallback);
+    public void setSDKLogoutListener(Activity activity, ChannelSdkCallback sdkCallback) {
+        channelSdk.setSDKLogoutListener(activity, sdkCallback);
     }
 
     @Override

+ 72 - 32
library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java

@@ -20,7 +20,9 @@ import com.dolin.zap.Zap;
 import com.yyrh.constant.RoleInfo;
 import com.yyrh.core.SDKDrive;
 import com.yyrh.core.entity.ResultInfo;
+import com.yyrh.core.entity.SdkBackLoginInfo;
 import com.yyrh.core.entity.bean.InitBean;
+import com.yyrh.core.impl.floatball.FloatCenterServiceManager;
 import com.yyrh.core.internal.IRequestCallback;
 import com.yyrh.core.network.Host;
 import com.yyrh.core.network.SdkRequest;
@@ -28,14 +30,16 @@ import com.yyrh.networking.NetRequestApi;
 import com.yyrh.sdk.SDKEntry;
 import com.yyrh.sdk.SdkCallback;
 import com.yyrh.sdk.YyrhSdkManager;
+import com.yyrh.sdk.callback.ExitCallback;
 import com.yyrh.sdk.callback.InitCallback;
 import com.yyrh.sdk.callback.LoginCallback;
+import com.yyrh.sdk.callback.LogoutCallback;
+import com.yyrh.sdk.callback.PayCallback;
 import com.yyrh.sdk.callback.PayOrderCallback;
 import com.yyrh.sdk.callback.RealNameMsgCallback;
 import com.yyrh.utils.FileUtils;
 import com.yyrh.utils.MMKVUtils;
 import com.yyrh.utils.YYLog;
-import com.yythird.base.ChannelSdkCallback;
 import com.yythird.sdk.ChannelSDK;
 
 import org.json.JSONObject;
@@ -53,6 +57,9 @@ public class SdkManager {
 
     private InitCallback initCallback = null;
     private LoginCallback loginCallback = null;
+    private LogoutCallback logoutCallback = null;
+    private PayCallback payCallback = null;
+    private ExitCallback exitCallback = null;
 
     private long clickLoginTime = 0L;
 
@@ -61,6 +68,7 @@ public class SdkManager {
     public boolean isLandscape = false;
     private static boolean hasReadIds = false;
     private static String deviceIds = "";
+    private boolean initState = false;
 
 
     private final AtomicInteger timeCount = new AtomicInteger(0);
@@ -88,17 +96,26 @@ public class SdkManager {
 
         @Override
         public void onLoginSuccess(String token) {
-
+            if (loginCallback == null) {
+                return;
+            }
+            loginCallback.onLoginSuccess(token);
         }
 
         @Override
         public void onLoginFailed(String msg) {
-
+            if (loginCallback == null) {
+                return;
+            }
+            loginCallback.onLoginFailed(msg);
         }
 
         @Override
         public void onLoginError(String msg) {
-
+            if (loginCallback == null) {
+                return;
+            }
+            loginCallback.onLoginError(msg);
         }
 
         @Override
@@ -113,7 +130,14 @@ public class SdkManager {
 
         @Override
         public void onInitCallback(boolean success, String msg) {
-
+            if (initCallback == null) {
+                return;
+            }
+            if (success) {
+                initCallback.onInitSuccess(msg);
+            } else {
+                initCallback.onInitFailed(msg);
+            }
         }
 
         @Override
@@ -123,17 +147,30 @@ public class SdkManager {
 
         @Override
         public void onLogOutCallback(String msg) {
-
+            if (logoutCallback == null) {
+                return;
+            }
+            logoutCallback.onLogoutSuccess();
         }
 
         @Override
         public void onPayFinishCallback(boolean success, String msg) {
-
+            if (payCallback == null) {
+                return;
+            }
+            if (success) {
+                payCallback.onPaySuccess(msg);
+            } else {
+                payCallback.onPayFailed(msg);
+            }
         }
 
         @Override
         public void onExiGameCallback(boolean success, String msg) {
-
+            if (exitCallback == null) {
+                return;
+            }
+            exitCallback.onExit(success);
         }
 
         @Override
@@ -181,7 +218,7 @@ public class SdkManager {
 
         @Override
         public String onGetChannelUid() {
-            return null;
+            return SdkBackLoginInfo.getInstance().userId;
         }
 
         @Override
@@ -204,13 +241,6 @@ public class SdkManager {
         return manager;
     }
 
-    /**
-     * operation
-     */
-    public void onInitSuccess(Activity activity) {
-        operation = SdkFactory.GetSdk();
-    }
-
     public void attachBaseContext(Application application, Context context) {
         YYLog.initZap(application);
         SDKDrive.getInstance().initDrive(application);
@@ -258,14 +288,14 @@ public class SdkManager {
                                 YYLog.i("加载设备信息成功,共延迟" + timeCount + "s初始化,将进行初始化操作...");
                             }
                             // TODO hideDialog
-                            startSdkInit(activity, callback);
+                            startSdkInit(activity);
                         }
                     });
                 }
             }).start();
         } else {
             YYLog.i("加载设备信息成功,开始初始化...");
-            startSdkInit(activity, callback);
+            startSdkInit(activity);
         }
     }
 
@@ -288,37 +318,40 @@ public class SdkManager {
         }
     }
 
-    private void startSdkInit(Activity activity, final InitCallback callback) {
+    private void startSdkInit(final Activity activity) {
         SdkRequest.initSdk(activity, new IRequestCallback() {
             @Override
             public void onResponse(ResultInfo resultInfo) {
                 if (resultInfo.code == 1) {
                     // 初始化成功
                     initBean = InitBean.toBean(resultInfo.data);
-                    YYLog.d("bean: " + initBean.toString());
-                    initSdkOperation();
-                    callback.onInitSuccess("sdk初始化成功");
+                    initSdkOperation(activity);
+                    sdkCallback.onInitCallback(true, "sdk初始化成功");
                 } else {
                     if (TextUtils.isEmpty(resultInfo.msg)) {
-                        callback.onInitFailed("sdk初始化失败");
+                        sdkCallback.onInitCallback(false, "sdk初始化失败");
                     } else {
-                        callback.onInitFailed(resultInfo.msg);
+                        sdkCallback.onInitCallback(false, resultInfo.msg);
                     }
                 }
             }
         });
     }
 
-    private void initSdkOperation() {
+    private void initSdkOperation(Activity activity) {
         if (initBean.sdkLogin == 1 && !channelTag.equals("YYRHSDK")) {
             this.operation = new ChannelSdkOperation();
         } else {
             this.operation = new YyrhSdkOperation();
+            FloatCenterServiceManager.getInstance().init(activity);
         }
     }
 
-    public void login(Activity activity) {
+    public void login(Activity activity, LoginCallback callback) {
+        this.loginCallback = callback;
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            callback.onLoginFailed("登录失败,SDK未初始化或初始化失败");
             return;
         }
         if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
@@ -331,6 +364,7 @@ public class SdkManager {
 
     public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
         operation.uploadRoleInfo(type, activity, roleInfo);
@@ -339,6 +373,7 @@ public class SdkManager {
 
     public void reportAdEvent(String event, JSONObject json) {
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
         operation.reportAdEvent(event, json);
@@ -346,6 +381,7 @@ public class SdkManager {
 
     public void pay(Activity activity, HashMap<String, Object> map) {
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
         operation.pay(activity, map);
@@ -366,7 +402,8 @@ public class SdkManager {
         });
     }
 
-    public void exit(Activity activity) {
+    public void exit(Activity activity, ExitCallback callback) {
+        this.exitCallback = callback;
         if (operation == null) {
             return;
         }
@@ -375,26 +412,29 @@ public class SdkManager {
 
     public void logOut() {
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
         operation.logOut();
     }
 
-    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
+    public void setSDKLogoutListener(Activity activity, LogoutCallback callback) {
+        this.logoutCallback = callback;
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
-        operation.getRealNameInfo(activity, realNameMsgCallback);
+        operation.setSDKLogoutListener(activity, sdkCallback);
     }
 
-    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback) {
+    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
         if (operation == null) {
+            YYLog.i("登录失败,SDK未初始化或初始化失败");
             return;
         }
-        operation.setSDKLogoutListener(ac, sdkCallback);
+        operation.getRealNameInfo(activity, realNameMsgCallback);
     }
 
-
     /**
      * 生命周期
      */

+ 41 - 7
library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java

@@ -4,14 +4,17 @@ import android.app.Activity;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.view.View;
 
-import com.dolin.zap.Zap;
 import com.yyrh.constant.RoleInfo;
+import com.yyrh.core.entity.SdkBackLoginInfo;
+import com.yyrh.core.impl.floatball.FloatCenterServiceManager;
 import com.yyrh.core.impl.login.LoginActivity;
 import com.yyrh.core.internal.IImplCallback;
 import com.yyrh.sdk.SDKEntry;
 import com.yyrh.sdk.YyrhSdkManager;
 import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yyrh.ui.dialog.TipsDialog;
 import com.yythird.base.ChannelSdkCallback;
 
 import org.json.JSONObject;
@@ -20,10 +23,11 @@ import java.util.HashMap;
 
 public class YyrhSdkOperation implements ISdkOperation {
 
+    private TipsDialog exitDialog = null;
+
     public YyrhSdkOperation() {
     }
 
-
     @Override
     public void login(Activity activity) {
         LoginActivity.start(activity, true, SdkManager.defaultManager().isLandscape, new IImplCallback() {
@@ -56,12 +60,38 @@ public class YyrhSdkOperation implements ISdkOperation {
 
     @Override
     public void exit(Activity activity) {
-        YyrhSdkManager.defaultManager().yyrhExitGame(activity);
+        if (exitDialog != null) {
+            if (exitDialog.isShowing()) {
+                exitDialog.dismiss();
+            }
+            exitDialog = null;
+        }
+        exitDialog = new TipsDialog(activity, true);
+        exitDialog.getTextView().setText("您确认立即退出游戏吗?");
+        exitDialog.getLeftButton().setText("下次再见");
+        exitDialog.getLeftButton().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                SdkManager.defaultManager().sdkCallback.onExiGameCallback(true, "退出游戏");
+                exitDialog.dismiss();
+            }
+        });
+        exitDialog.getRightButton().setText("再玩一下");
+        exitDialog.getRightButton().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                SdkManager.defaultManager().sdkCallback.onExiGameCallback(false, "继续游戏");
+                exitDialog.dismiss();
+            }
+        });
+        exitDialog.show();
     }
 
     @Override
     public void logOut() {
-        YyrhSdkManager.defaultManager().yyrhLogout();
+        FloatCenterServiceManager.getInstance().detach();
+        SdkBackLoginInfo.getInstance().reset();
+        SdkManager.defaultManager().sdkCallback.onLogOutCallback("用户退出");
     }
 
     @Override
@@ -85,16 +115,19 @@ public class YyrhSdkOperation implements ISdkOperation {
     }
 
     @Override
-    public void sdkOnPause(Activity activity) {
+    public void sdkOnRestart(Activity activity) {
+
     }
 
     @Override
     public void sdkOnResume(Activity activity) {
+        FloatCenterServiceManager.getInstance().attach();
     }
 
-    @Override
-    public void sdkOnRestart(Activity activity) {
 
+    @Override
+    public void sdkOnPause(Activity activity) {
+        FloatCenterServiceManager.getInstance().detach();
     }
 
 
@@ -105,6 +138,7 @@ public class YyrhSdkOperation implements ISdkOperation {
 
     @Override
     public void sdkOnDestroy(Activity activity) {
+        FloatCenterServiceManager.getInstance().release();
     }
 
     @Override

+ 8 - 10
library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java

@@ -104,8 +104,8 @@ public class SDKEntry {
         }
 
         @Override
-        public void onDestory(Activity activity) {
-            AdvertiseManager.defaultManager(activity).onDestory(activity);
+        public void onDestroy(Activity activity) {
+            AdvertiseManager.defaultManager(activity).onDestroy(activity);
 
         }
 
@@ -357,7 +357,7 @@ public class SDKEntry {
 
     public void login(Activity activity, LoginCallback callback) {
         this.loginCall = callback;
-        SdkManager.defaultManager().login(activity);
+        SdkManager.defaultManager().login(activity, callback);
     }
 
     public void pay(final HashMap<String, Object> map, final PayCallback callback, final Activity activity) {
@@ -399,9 +399,9 @@ public class SDKEntry {
 
 
     public void setSDKLogoutListener(Activity activity, final LogoutCallback callback) {
-        YYLog.i("SDKLogoutListener");
+        YYLog.i("setSDKLogoutListener");
         logoutCall = callback;
-        SdkManager.defaultManager().setSDKLogoutListener(activity, sdkCallback);
+        SdkManager.defaultManager().setSDKLogoutListener(activity, callback);
     }
 
     public void logout() {
@@ -409,12 +409,10 @@ public class SDKEntry {
         SdkManager.defaultManager().logOut();
     }
 
-    public void exitGame(Activity activity, final ExitCallback callback) {
+    public void exitGame(Activity activity, ExitCallback callback) {
         YYLog.i("exitGame");
         this.exitCall = callback;
-        SdkManager.defaultManager().exit(activity);
-
-
+        SdkManager.defaultManager().exit(activity, callback);
     }
 
     public void upLoadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
@@ -522,7 +520,7 @@ public class SDKEntry {
 
     public void sdkOnDestroy(Activity activity) {
         YYLog.i("sdk OnDestroy");
-        SDKEntry.getSdkInstance().adSdkCallback.onDestory(activity);
+        SDKEntry.getSdkInstance().adSdkCallback.onDestroy(activity);
         SdkManager.defaultManager().sdkOnDestroy(activity);
 
 

+ 52 - 53
library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java

@@ -407,58 +407,58 @@ public class YyrhSdkManager {
 //            }
 //        });
 
-        NetRequestApi.init(activity, new InitCallback() {
-            @Override
-            public void onInitSuccess(String msg) {
-                SdkManager.defaultManager().onInitSuccess(activity);
-                ChannelSDK.getInstance().SDKInitSuccess(msg);
-                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(true, msg);
-
-            }
-
-            @Override
-            public void onInitFailed(String msg) {
-                ChannelSDK.getInstance().SDKInitFail(msg);
-                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, msg);
-                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
-                builder.setPositiveButton(new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        System.exit(0);
-                    }
-                });
-                builder.Create(msg).show();
-            }
-
-            @Override
-            public void onInitError(String _strError) {
-
-                ChannelSDK.getInstance().SDKInitFail(_strError);
-                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, _strError);
-
-                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
-                builder.setPositiveButton(new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-
-                        System.exit(0);
-
-                    }
-                });
-                builder.Create(_strError).show();
-            }
-
-            @Override
-            public void onGetOaid(boolean isSuccess, String oaid) {
-
-            }
-
-            @Override
-            public void onShowGameExit() {
-
-            }
-
-        });
+//        NetRequestApi.init(activity, new InitCallback() {
+//            @Override
+//            public void onInitSuccess(String msg) {
+//                SdkManager.defaultManager().onInitSuccess(activity);
+//                ChannelSDK.getInstance().SDKInitSuccess(msg);
+//                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(true, msg);
+//
+//            }
+//
+//            @Override
+//            public void onInitFailed(String msg) {
+//                ChannelSDK.getInstance().SDKInitFail(msg);
+//                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, msg);
+//                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
+//                builder.setPositiveButton(new DialogInterface.OnClickListener() {
+//                    @Override
+//                    public void onClick(DialogInterface dialog, int which) {
+//                        System.exit(0);
+//                    }
+//                });
+//                builder.Create(msg).show();
+//            }
+//
+//            @Override
+//            public void onInitError(String _strError) {
+//
+//                ChannelSDK.getInstance().SDKInitFail(_strError);
+//                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, _strError);
+//
+//                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
+//                builder.setPositiveButton(new DialogInterface.OnClickListener() {
+//                    @Override
+//                    public void onClick(DialogInterface dialog, int which) {
+//
+//                        System.exit(0);
+//
+//                    }
+//                });
+//                builder.Create(_strError).show();
+//            }
+//
+//            @Override
+//            public void onGetOaid(boolean isSuccess, String oaid) {
+//
+//            }
+//
+//            @Override
+//            public void onShowGameExit() {
+//
+//            }
+//
+//        });
 
         SDKSettings.isSimulator = InspectSimulator.isSimulator(activity);
         Log.i("idSimu:", SDKSettings.isSimulator);
@@ -710,7 +710,6 @@ public class YyrhSdkManager {
         } else {
             msgCallback.onLoadRealNameMsg(true, SDKSettings.loginData.rn_bd);
         }
-
     }
 
     private void operateFloatViewInUIThread(final Activity gameAct, final int status) {

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/sdk/callback/ExitCallback.java

@@ -1,5 +1,5 @@
 package com.yyrh.sdk.callback;
 
 public interface ExitCallback {
-    public void onExit(boolean needExit);
+    void onExit(boolean needExit);
 }

+ 5 - 3
library_xinrui/src/main/java/com/yyrh/sdk/callback/LoginCallback.java

@@ -1,7 +1,9 @@
 package com.yyrh.sdk.callback;
 
 public interface LoginCallback {
-    public void onLoginSuccess(String token);
-    public void onLoginFailed(String msg);
-    public void onLoginError(String msg);
+    void onLoginSuccess(String token);
+
+    void onLoginFailed(String msg);
+
+    void onLoginError(String msg);
 }

+ 4 - 2
library_xinrui/src/main/java/com/yyrh/sdk/callback/LogoutCallback.java

@@ -1,6 +1,8 @@
 package com.yyrh.sdk.callback;
 
 public interface LogoutCallback {
- public void onLogoutSuccess();
- public void onLogoutFailed();
+
+ void onLogoutSuccess();
+
+ void onLogoutFailed();
 }

+ 3 - 2
library_xinrui/src/main/java/com/yyrh/sdk/callback/PayCallback.java

@@ -1,6 +1,7 @@
 package com.yyrh.sdk.callback;
 
 public interface PayCallback {
- public void onPaySuccess(String msg);
- public void onPayFailed(String msg);
+ void onPaySuccess(String msg);
+
+ void onPayFailed(String msg);
 }

+ 2 - 2
library_xinrui/src/main/java/com/yyrh/sdk/callback/PayOrderCallback.java

@@ -4,8 +4,8 @@ import java.util.HashMap;
 
 public interface PayOrderCallback {
 
-    public void onPaySuccess(HashMap<String, Object> map);
-    public void onPayFailed(String msg);
+    void onPaySuccess(HashMap<String, Object> map);
 
+    void onPayFailed(String msg);
 
 }

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/sdk/callback/RealNameMsgCallback.java

@@ -1,5 +1,5 @@
 package com.yyrh.sdk.callback;
 
 public interface RealNameMsgCallback {
-    public void onLoadRealNameMsg(boolean isRealName,String birthday);
+     void onLoadRealNameMsg(boolean isRealName, String birthday);
 }

+ 2 - 2
library_xinrui/src/main/java/com/yyrh/sdk/callback/RegisterCallback.java

@@ -1,6 +1,6 @@
 package com.yyrh.sdk.callback;
 
 public interface RegisterCallback {
-    public void onRegisterSuccess(String token);
-    public void onRegisterFailed(String msg);
+    void onRegisterSuccess(String token);
+    void onRegisterFailed(String msg);
 }

+ 3 - 3
library_xinrui/src/main/java/com/yyrh/sdk/callback/ShowPolicyCallback.java

@@ -2,7 +2,7 @@ package com.yyrh.sdk.callback;
 
 public interface ShowPolicyCallback {
 
-    public void onShow(String agreement_url);
-    public void onHide();
-    public void onError();
+    void onShow(String agreement_url);
+    void onHide();
+    void onError();
 }

+ 7 - 4
library_xinrui/src/main/java/com/yyrh/sdk/callback/UserPolicyCallback.java

@@ -2,9 +2,12 @@ package com.yyrh.sdk.callback;
 
 public interface UserPolicyCallback {
 
-    public void onAgree();
-    public void onDisagree();
-    public void onHide();
-    public void onError();
+    void onAgree();
+
+    void onDisagree();
+
+    void onHide();
+
+    void onError();
 
 }

+ 0 - 2
library_xinrui/src/main/java/com/yyrh/ui/PageJsInteraction.java

@@ -10,9 +10,7 @@ public class PageJsInteraction {
 
     private BaseDialog baseDialog;
     public PageJsInteraction(BaseDialog baseDialog) {
-
         this.baseDialog =baseDialog;
-
     }
 
 

+ 2 - 0
library_xinrui/src/main/java/com/yyrh/ui/dialog/AutoLauncherDialog.java

@@ -50,6 +50,8 @@ public class AutoLauncherDialog extends Dialog implements DialogInterface.OnKeyL
         rotateAnimation = AnimationUtils.loadAnimation(context, ResUtils.getResId(context, "hnyy_rotate_anim", "anim"));
         ivLoading.startAnimation(rotateAnimation);
 
+        btnCancel = findViewById(ResUtils.getResId(context, "hnyy_btn_cancel", "id"));
+
         setOnKeyListener(this);
     }
 

+ 79 - 0
library_xinrui/src/main/java/com/yyrh/ui/dialog/TipsDialog.java

@@ -0,0 +1,79 @@
+package com.yyrh.ui.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.TextView;
+
+import cn.yyxx.support.DensityUtils;
+import cn.yyxx.support.ResUtils;
+
+/**
+ * 提示框dialog
+ * 样式如下:
+ * -------------------------
+ * |                       |
+ * |                       |
+ * |         内容          |
+ * |                      |
+ * -------------------------
+ * |    取消    |   确定   |
+ * -------------------------
+ *
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class TipsDialog extends Dialog {
+
+    private TextView textView;
+    private Button leftButton;
+    private Button rightButton;
+
+    public TipsDialog(Context context, boolean doubleButton) {
+        super(context);
+        setCanceledOnTouchOutside(false);
+        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        initView(context, doubleButton);
+    }
+
+    private void initView(Context context, boolean doubleButton) {
+        View view = LayoutInflater.from(context).inflate(ResUtils.getResId(context, "hnyy_tips_dialog", "layout"), null);
+        setContentView(view);
+
+        WindowManager.LayoutParams attr = getWindow().getAttributes();
+        attr.gravity = Gravity.CENTER;
+        attr.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+        attr.width = DensityUtils.dip2px(context, 300f);
+
+        textView = view.findViewById(ResUtils.getResId(context, "hnyy_tv_content", "id"));
+
+        leftButton = view.findViewById(ResUtils.getResId(context, "hnyy_btn_left", "id"));
+        rightButton = view.findViewById(ResUtils.getResId(context, "hnyy_btn_right", "id"));
+        if (doubleButton) {
+            rightButton.setVisibility(View.VISIBLE);
+        } else {
+            rightButton.setVisibility(View.GONE);
+        }
+    }
+
+    public TextView getTextView() {
+        return textView;
+    }
+
+    public Button getLeftButton() {
+        return leftButton;
+    }
+
+    public Button getRightButton() {
+        return rightButton;
+    }
+}

+ 1 - 2
library_xinrui/src/main/java/com/yyrh/ui/dialog/TipsToast.java

@@ -23,8 +23,7 @@ public class TipsToast {
     public TipsToast(Context context, String message, boolean error) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
-        View view = inflater.inflate(ResourceUtil.getLayoutId(context, "hnyy_tips_dialog"), null);
-
+        View view = inflater.inflate(ResourceUtil.getLayoutId(context, "hnyy_tips_toast"), null);
 
         TextView mTextView = view.findViewById(ResUtils.getResId(context, "hnyy_tv_desc", "id"));
         mTextView.setText(message);

+ 370 - 0
library_xinrui/src/main/java/com/yyrh/ui/floatview/FloatingBall.java

@@ -0,0 +1,370 @@
+package com.yyrh.ui.floatview;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
+
+import cn.yyxx.support.DensityUtils;
+import cn.yyxx.support.scheduler.ScheduledWorker;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class FloatingBall extends FrameLayout implements View.OnTouchListener {
+
+    private Activity activity;
+    private boolean isLandscape = false;
+    private IFloatingBallCallback callback;
+    private WindowManager wm;
+    private WindowManager.LayoutParams wlp;
+    private LinearLayout rootLinearLayout;
+    private FrameLayout frameLayout;
+    private ImageView ballView;
+    private FloatingBallMenu ballMenu;
+    private PopupWindow menu;
+
+    // 浮标是否移动
+    private boolean isMove = false;
+
+    // 手按下时坐标
+    private float mTouchStartX = 0f;
+    private float mTouchStartY = 0f;
+
+    // 是否展开
+    private boolean hasShowContent = false;
+
+    // 当前贴边状态
+    private boolean isHide = false;
+
+    // 默认吸附在左边
+    private boolean isLeftLocation = true;
+
+    // 菜单menu的长度
+    private int mSize = 0;
+
+    private boolean hasStatusBar;
+
+    private ScheduledWorker displayWorker = null;
+
+    private Handler timeHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            if (msg.what == 1000) {
+//                invokeBallFullOrHalt(true);
+                callback.onUpdateBallView(ballView, isLeftLocation, true);
+                // 把worker取消掉防止一直在执行
+                if (displayWorker != null) {
+                    displayWorker.cancel();
+                }
+            }
+        }
+    };
+
+    public FloatingBall(Activity activity, boolean isLandscape, IFloatingBallCallback callback) {
+        super(activity);
+        this.activity = activity;
+        this.isLandscape = isLandscape;
+        this.callback = callback;
+        this.hasStatusBar = (activity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != WindowManager.LayoutParams.FLAG_FULLSCREEN;
+        createWM();
+        createView();
+        addView(rootLinearLayout);
+        wm.addView(this, wlp);
+        displayWorker = new ScheduledWorker(1);
+        invokeDisplayTimerWork();
+    }
+
+    @SuppressLint("WrongConstant")
+    private void createWM() {
+        this.wm = activity.getWindowManager();
+        wlp = new WindowManager.LayoutParams();
+        wlp.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
+        wlp.format = PixelFormat.RGBA_8888;
+        wlp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        wlp.gravity = Gravity.TOP | Gravity.LEFT;
+        wlp.x = 0;
+        wlp.y = DensityUtils.getHeigthAndWidth(activity)[1] / 2;
+        wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
+        wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+    }
+
+    private void createView() {
+        rootLinearLayout = new LinearLayout(activity);
+        rootLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 45f), DensityUtils.dip2px(activity, 45f)));
+
+        frameLayout = new FrameLayout(activity);
+        frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+
+        ballView = new ImageView(activity);
+        ballView.setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 45f), DensityUtils.dip2px(activity, 45f)));
+        callback.onUpdateBallView(ballView, isLeftLocation, false);
+        ballView.setScaleType(ImageView.ScaleType.FIT_XY);
+        ballView.setOnTouchListener(this);
+        frameLayout.addView(ballView);
+
+        ballMenu = new FloatingBallMenu(activity, new FloatingBallMenu.IFloatingBallMenuCallback() {
+            @Override
+            public ArrayList<FloatingBallMenu.Item> onInitMenuData() {
+                mSize = callback.onInitMenuData().size();
+                return callback.onInitMenuData();
+            }
+
+            @Override
+            public void onDismissMenu() {
+                callback.onDismissMenu();
+            }
+
+            @Override
+            public void onMenuItemCLick(FloatingBallMenu.Item item, int pos) {
+                callback.onMenuItemClick(item, pos);
+            }
+        });
+
+        menu = new PopupWindow(activity);
+        menu.setContentView(ballMenu.contentView);
+        menu.setWidth(DensityUtils.dip2px(activity, 45f + mSize * 45f));
+        menu.setHeight(DensityUtils.dip2px(activity, 45f));
+        menu.setFocusable(true);
+        menu.setBackgroundDrawable(new ColorDrawable());
+        menu.setOutsideTouchable(true);
+        menu.setOnDismissListener(new PopupWindow.OnDismissListener() {
+            @Override
+            public void onDismiss() {
+                hasShowContent = false;
+                invokeDisplayTimerWork();
+            }
+        });
+
+        if (isLandscape) {
+            handleFullScreenModel();
+        }
+        rootLinearLayout.addView(frameLayout);
+    }
+
+    public void dismissMenu() {
+        hasShowContent = false;
+        menu.dismiss();
+        callback.onUpdateBallView(ballView, isLeftLocation, false);
+    }
+
+    private void invokeBallFullOrHalt(boolean isHalf) {
+        if (hasShowContent && !isHide) {
+            return;
+        }
+        this.isHide = isHalf;
+        if (isHalf) {
+            rootLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 22.5f), DensityUtils.dip2px(activity, 45f)));
+            setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 22.5f), DensityUtils.dip2px(activity, 45f)));
+        } else {
+            rootLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 45f), DensityUtils.dip2px(activity, 45f)));
+            setLayoutParams(new ViewGroup.LayoutParams(DensityUtils.dip2px(activity, 45f), DensityUtils.dip2px(activity, 45f)));
+        }
+        frameLayout.updateViewLayout(ballView, getLayoutParams());
+    }
+
+    private void invokeMenuShowOrDismiss() {
+        if (hasShowContent) {
+            hasShowContent = false;
+            menu.dismiss();
+        } else {
+            hasShowContent = true;
+            callback.onExpandMenu(false);
+            ballMenu.updateLayout(isLeftLocation);
+            if (hasStatusBar) {
+                menu.showAtLocation(ballMenu.contentView, Gravity.NO_GRAVITY, wlp.x + 10, wlp.y + getStatusBarHeight(activity));
+            } else {
+                if (isNotch()) {
+                    menu.showAtLocation(ballMenu.contentView, Gravity.NO_GRAVITY, wlp.x + 10, wlp.y + getStatusBarHeight(activity));
+                } else if (isDisplayCutout(activity)) {
+                    menu.showAtLocation(ballMenu.contentView, Gravity.NO_GRAVITY, wlp.x + 10, wlp.y + getStatusBarHeight(activity));
+                } else {
+                    menu.showAtLocation(ballMenu.contentView, Gravity.NO_GRAVITY, wlp.x + 10, wlp.y);
+                }
+            }
+        }
+    }
+
+    private void invokeDisplayTimerWork() {
+        if (displayWorker != null) {
+            displayWorker.invokeAtFixedRate(new Runnable() {
+                @Override
+                public void run() {
+                    timeHandler.sendEmptyMessage(1000);
+                }
+            }, 10, 10, TimeUnit.SECONDS);
+        }
+    }
+
+    public void attach() {
+        if (getVisibility() == GONE) {
+            invokeDisplayTimerWork();
+            ballView.setVisibility(VISIBLE);
+            frameLayout.setVisibility(VISIBLE);
+            rootLinearLayout.setVisibility(VISIBLE);
+            setVisibility(VISIBLE);
+        }
+    }
+
+    public void detach() {
+        if (getVisibility() == VISIBLE) {
+            if (hasShowContent) {
+                hasShowContent = false;
+                menu.dismiss();
+            }
+
+            if (displayWorker != null) {
+                displayWorker.cancel();
+            }
+            ballView.setVisibility(GONE);
+            frameLayout.setVisibility(GONE);
+            rootLinearLayout.setVisibility(GONE);
+            setVisibility(GONE);
+        }
+    }
+
+    public void release() {
+        if (displayWorker != null) {
+            displayWorker.cancel();
+            displayWorker = null;
+        }
+
+        frameLayout.removeAllViews();
+        rootLinearLayout.removeAllViews();
+        removeAllViews();
+        wm.removeView(this);
+    }
+
+    private void handleFullScreenModel() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            try {
+                Field mLayoutInScreen = PopupWindow.class.getDeclaredField("mLayoutInScreen");
+                mLayoutInScreen.setAccessible(true);
+                mLayoutInScreen.set(menu, true);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private int getStatusBarHeight(Context context) {
+        int id = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+        return context.getResources().getDimensionPixelSize(id);
+    }
+
+    /**
+     * 适配小米Android O设备 判断是否是刘海屏
+     */
+    private boolean isNotch() {
+        try {
+            Method method = Class.forName("android.os.SystemProperties").getMethod("getInt", String.class, Integer.class);
+            return ((int) method.invoke(null, "ro.miui.notch", 0)) == 1;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 判断是否为挖孔屏幕
+     */
+    private boolean isDisplayCutout(Activity activity) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            try {
+                return activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout() != null;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        if (displayWorker != null) {
+            displayWorker.cancel();
+        }
+        float x = event.getRawX();
+        float y = event.getRawY();
+
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                isMove = false;
+                mTouchStartX = event.getX();
+                mTouchStartY = event.getY();
+                break;
+            case MotionEvent.ACTION_MOVE:
+                float moveStartX = event.getX();
+                float moveStartY = event.getY();
+                // 移动量大于3才判定移动
+                if (Math.abs(mTouchStartX - moveStartX) > 3 && Math.abs(mTouchStartY - moveStartY) > 3) {
+                    wlp.x = (int) (x - mTouchStartX);
+                    wlp.y = (int) (y - mTouchStartY);
+                    // 移动时收起菜单
+                    wm.updateViewLayout(this, wlp);
+                    isMove = true;
+                    if (menu.isShowing()) {
+                        menu.dismiss();
+                        hasShowContent = false;
+                    }
+                    return false;
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                // 大于屏幕宽度一半是吸附在那一边
+                v.performClick();
+                if (wlp.x <= DensityUtils.getHeigthAndWidth(activity)[0] / 2) {
+                    wlp.x = 0;
+                    isLeftLocation = true;
+                } else {
+                    wlp.x = DensityUtils.getHeigthAndWidth(activity)[0];
+                    isLeftLocation = false;
+                }
+                wm.updateViewLayout(this, wlp);
+                if (isMove) {
+                    invokeDisplayTimerWork();
+                } else {
+                    invokeMenuShowOrDismiss();
+                }
+                // 还原贴边的浮球
+//                invokeBallFullOrHalt(false);
+                callback.onUpdateBallView(ballView, isLeftLocation, false);
+                break;
+        }
+        return true;
+    }
+
+    public interface IFloatingBallCallback {
+
+        void onUpdateBallView(ImageView ballView, boolean isLeftLocation, boolean isHide);
+
+        ArrayList<FloatingBallMenu.Item> onInitMenuData();
+
+        void onMenuItemClick(FloatingBallMenu.Item item, int pos);
+
+        void onExpandMenu(boolean hasRedDot);
+
+        void onDismissMenu();
+    }
+}

+ 135 - 0
library_xinrui/src/main/java/com/yyrh/ui/floatview/FloatingBallMenu.java

@@ -0,0 +1,135 @@
+package com.yyrh.ui.floatview;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import java.util.ArrayList;
+
+import cn.yyxx.support.DensityUtils;
+import cn.yyxx.support.ResUtils;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/21
+ */
+public class FloatingBallMenu {
+
+    private IFloatingBallMenuCallback callback;
+    public View contentView;
+    private LinearLayout containerLayout;
+    private GridView menuView;
+    private ArrayList<Item> items = new ArrayList<>();
+
+    public FloatingBallMenu(Context context, IFloatingBallMenuCallback callback) {
+        this.callback = callback;
+        contentView = LayoutInflater.from(context).inflate(ResUtils.getResId(context, "hnyy_floating_ball_menu", "layout"), null);
+
+        containerLayout = contentView.findViewById(ResUtils.getResId(context, "hnyy_ll_container", "id"));
+        containerLayout.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
+
+        menuView = contentView.findViewById(ResUtils.getResId(context, "hnyy_gv_menu", "id"));
+
+        // 重新设置menuView宽高
+        int menuWidth = DensityUtils.dip2px(context, callback.onInitMenuData().size() * 45f);
+        LinearLayout.LayoutParams menuParams = new LinearLayout.LayoutParams(menuWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
+        menuParams.setMargins(0, 0, DensityUtils.dip2px(context, 5f), 0);
+        menuView.setLayoutParams(menuParams);
+
+        items = callback.onInitMenuData();
+        menuView.setNumColumns(items.size());
+        menuView.setAdapter(new FloatingBallMenuAdapter(context, items));
+    }
+
+    public void updateLayout(boolean isLeftLocation) {
+        menuView.bringToFront();
+        if (isLeftLocation) {
+            containerLayout.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
+        } else {
+            containerLayout.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
+        }
+    }
+
+
+    public interface IFloatingBallMenuCallback {
+
+        ArrayList<Item> onInitMenuData();
+
+        void onDismissMenu();
+
+        void onMenuItemCLick(Item item, int pos);
+    }
+
+    public static class Item {
+        public FloatFeature feature;
+        public String url;
+
+        public Item(FloatFeature feature, String url) {
+            this.feature = feature;
+            this.url = url;
+        }
+    }
+
+    public class FloatingBallMenuAdapter extends BaseAdapter {
+        private Context context;
+        private ArrayList<Item> items;
+
+        public FloatingBallMenuAdapter(Context context, ArrayList<Item> items) {
+            this.context = context;
+            this.items = items;
+        }
+
+        @Override
+        public int getCount() {
+            return items.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return items.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(final int position, View convertView, ViewGroup parent) {
+            final Item item = items.get(position);
+            View view = View.inflate(context, ResUtils.getResId(context, "hnyy_floating_ball_menu_item", "layout"), null);
+            ImageView ivIcon = view.findViewById(ResUtils.getResId(context, "hnyy_iv_icon", "id"));
+            switch (item.feature) {
+                case ACCOUNT_CENTER:
+                    ivIcon.setBackgroundResource(ResUtils.getResId(context, "hnyy_account_center_img", "drawable"));
+                    break;
+                case SWITCH_ACCOUNT:
+                    ivIcon.setBackgroundResource(ResUtils.getResId(context, "hnyy_switch_account_img", "drawable"));
+                    break;
+                case MENU_DISMISS:
+                    ivIcon.setBackgroundResource(ResUtils.getResId(context, "hnyy_menu_dismiss_img", "drawable"));
+                    break;
+            }
+            view.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    callback.onMenuItemCLick(item, position);
+                }
+            });
+
+            return view;
+        }
+    }
+
+    public enum FloatFeature {
+        ACCOUNT_CENTER,
+        SWITCH_ACCOUNT,
+        MENU_DISMISS
+    }
+}

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/utils/TimeDownUtils.java

@@ -72,7 +72,7 @@ public class TimeDownUtils {
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
-                    e.printStackTrace();
+                    // ignore
                 }
                 if (isCancel) {
                     YYLog.d("TimeDownUtils 线程已退出");

二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_account_center_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_delete_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_floating_ball_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_menu_dismiss_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_pick_down_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_pick_up_img.png


二進制
library_xinrui/src/main/res/drawable-xhdpi/hnyy_switch_account_img.png


+ 10 - 0
library_xinrui/src/main/res/drawable/hnyy_account_list_bg.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners
+        android:bottomLeftRadius="20dp"
+        android:bottomRightRadius="20dp" />
+    <stroke
+        android:width="1dp"
+        android:color="@color/hnyy_color_gray_30" />
+    <solid android:color="@color/hnyy_color_white" />
+</shape>

+ 5 - 0
library_xinrui/src/main/res/drawable/hnyy_btn_light_purple_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="16dp" />
+    <solid android:color="@color/hnyy_color_light_purple" />
+</shape>

+ 1 - 1
library_xinrui/src/main/res/drawable/hnyy_btn_purple_bg.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners android:radius="20dp" />
+    <corners android:radius="16dp" />
     <gradient
         android:angle="0"
         android:endColor="@color/hnyy_color_deep_purple"

+ 1 - 1
library_xinrui/src/main/res/drawable/hnyy_btn_white_bg.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners android:radius="20dp" />
+    <corners android:radius="16dp" />
     <stroke
         android:width="1dp"
         android:color="@color/hnyy_color_purple" />

+ 1 - 1
library_xinrui/src/main/res/drawable/hnyy_container_white_bg.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners android:radius="20dp" />
+    <corners android:radius="16dp" />
     <solid android:color="@color/hnyy_color_white" />
 </shape>

+ 1 - 1
library_xinrui/src/main/res/drawable/hnyy_et_frame_focused_bg.xml

@@ -2,7 +2,7 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
 
     <solid android:color="@color/hnyy_color_white" />
-    <corners android:radius="20dp" />
+    <corners android:radius="16dp" />
     <stroke
         android:width="1dp"
         android:color="@color/hnyy_color_gray" />

+ 1 - 1
library_xinrui/src/main/res/drawable/hnyy_et_frame_normal_bg.xml

@@ -2,7 +2,7 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
 
     <solid android:color="@color/hnyy_color_white" />
-    <corners android:radius="20dp" />
+    <corners android:radius="16dp" />
     <stroke
         android:width="1dp"
         android:color="@color/hnyy_color_gray_30" />

+ 5 - 0
library_xinrui/src/main/res/drawable/hnyy_floating_ball_menu_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="85dp" />
+    <solid android:color="@color/hnyy_color_purple" />
+</shape>

+ 27 - 0
library_xinrui/src/main/res/layout/hnyy_account_list_item.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/hnyy_ll_item"
+    android:layout_width="match_parent"
+    android:layout_height="35dp"
+    android:gravity="center"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/hnyy_tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="30dp"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="账号"
+        android:textColor="@color/hnyy_color_gray"
+        android:textSize="14sp" />
+
+    <ImageView
+        android:id="@+id/hnyy_iv_delete"
+        android:layout_width="18dp"
+        android:layout_height="18dp"
+        android:layout_marginRight="15dp"
+        android:src="@drawable/hnyy_delete_img" />
+
+</LinearLayout>

+ 17 - 0
library_xinrui/src/main/res/layout/hnyy_floating_ball_menu.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/hnyy_ll_container"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/hnyy_floating_ball_menu_bg"
+    android:orientation="horizontal">
+
+    <GridView
+        android:id="@+id/hnyy_gv_menu"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:cacheColorHint="@android:color/transparent"
+        android:fadingEdge="none"
+        android:listSelector="@android:color/transparent"
+        android:padding="5dp" />
+</LinearLayout>

+ 15 - 0
library_xinrui/src/main/res/layout/hnyy_floating_ball_menu_item.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@android:color/transparent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/hnyy_iv_icon"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:background="@drawable/hnyy_menu_dismiss_img" />
+
+</LinearLayout>

+ 0 - 29
library_xinrui/src/main/res/layout/hnyy_iab_activity.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/hnyy_iab_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-
-        <ImageView
-            android:layout_width="16dp"
-            android:layout_height="16dp"
-            android:src="@drawable/hnyy_return_img" />
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginRight="20dp"
-            android:gravity="center_horizontal"
-            android:text="@string/hnyy_login_account_panel_title"
-            android:textColor="@color/hnyy_color_purple"
-            android:textSize="20sp"
-            android:textStyle="bold" />
-    </LinearLayout>
-</FrameLayout>

+ 39 - 2
library_xinrui/src/main/res/layout/hnyy_login_account_launcher.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_gravity="center"
@@ -10,6 +10,7 @@
 
 
     <TextView
+        android:id="@+id/hnyy_tv_title"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginLeft="20dp"
@@ -21,7 +22,9 @@
         android:textSize="20sp"
         android:textStyle="bold" />
 
+
     <com.yyrh.ui.widget.EventEditText
+        android:layout_below="@id/hnyy_tv_title"
         android:id="@+id/hnyy_eet_account"
         android:layout_width="match_parent"
         android:layout_height="35dp"
@@ -29,7 +32,9 @@
         android:layout_marginTop="10dp"
         android:layout_marginRight="20dp" />
 
+
     <com.yyrh.ui.widget.EventEditText
+        android:layout_below="@id/hnyy_eet_account"
         android:id="@+id/hnyy_eet_pwd"
         android:layout_width="match_parent"
         android:layout_height="35dp"
@@ -38,6 +43,7 @@
         android:layout_marginRight="20dp" />
 
     <Button
+        android:layout_below="@id/hnyy_eet_pwd"
         android:id="@+id/hnyy_btn_launcher"
         style="?android:attr/borderlessButtonStyle"
         android:layout_width="match_parent"
@@ -51,6 +57,7 @@
         android:textSize="16sp" />
 
     <Button
+        android:layout_below="@id/hnyy_btn_launcher"
         android:id="@+id/hnyy_btn_quick_register"
         style="?android:attr/borderlessButtonStyle"
         android:layout_width="match_parent"
@@ -64,6 +71,7 @@
         android:textSize="16sp" />
 
     <LinearLayout
+        android:layout_below="@id/hnyy_btn_quick_register"
         android:layout_width="match_parent"
         android:layout_height="20dp"
         android:layout_marginLeft="20dp"
@@ -119,4 +127,33 @@
             android:textColor="@color/hnyy_color_red"
             android:textSize="11sp" />
     </LinearLayout>
-</LinearLayout>
+
+    <RelativeLayout
+        android:id="@+id/hnyy_rl_account_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/hnyy_eet_account"
+        android:layout_marginLeft="25dp"
+        android:layout_marginTop="-5dp"
+        android:layout_marginRight="25dp"
+        android:background="@drawable/hnyy_account_list_bg"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp">
+
+        <ScrollView
+            android:id="@+id/hnyy_sv_account_list"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentTop="true"
+            android:scrollbars="none"
+            android:visibility="visible">
+
+            <LinearLayout
+                android:id="@+id/hnyy_ll_account_list"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical" />
+        </ScrollView>
+    </RelativeLayout>
+
+</RelativeLayout>

+ 45 - 21
library_xinrui/src/main/res/layout/hnyy_tips_dialog.xml

@@ -1,31 +1,55 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
+    android:layout_width="360dp"
     android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:layout_marginLeft="20dp"
+    android:layout_marginRight="20dp"
     android:background="@drawable/hnyy_container_white_bg"
-    android:gravity="center"
-    android:orientation="horizontal">
-
-
-    <ImageView
-        android:id="@+id/hnyy_iv_desc"
-        android:layout_width="18dp"
-        android:layout_height="18dp"
-        android:layout_gravity="center"
-        android:layout_marginLeft="60dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="10dp" />
+    android:orientation="vertical">
 
     <TextView
-        android:id="@+id/hnyy_tv_desc"
+        android:id="@+id/hnyy_tv_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
-        android:layout_marginLeft="10dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginRight="60dp"
-        android:layout_marginBottom="10dp"
-        android:singleLine="true"
+        android:layout_marginTop="40dp"
+        android:layout_marginBottom="20dp"
+        android:gravity="center_horizontal"
+        android:text="abc123"
         android:textColor="@color/hnyy_color_gray"
-        android:textSize="14sp" />
-</LinearLayout>
+        android:textSize="18sp" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_marginBottom="20dp"
+        android:gravity="center">
+
+        <Button
+            android:id="@+id/hnyy_btn_left"
+            android:layout_width="0dp"
+            android:layout_height="35dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_weight="1"
+            android:background="@drawable/hnyy_btn_white_bg"
+            android:textAllCaps="false"
+            android:textColor="@color/hnyy_color_purple"
+            android:textSize="12sp" />
+
+
+        <Button
+            android:id="@+id/hnyy_btn_right"
+            android:layout_width="0dp"
+            android:layout_height="35dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_weight="1"
+            android:background="@drawable/hnyy_btn_purple_bg"
+            android:gravity="center"
+            android:textAllCaps="false"
+            android:textColor="@color/hnyy_color_white"
+            android:textSize="12sp" />
+    </LinearLayout>
+</LinearLayout>

+ 31 - 0
library_xinrui/src/main/res/layout/hnyy_tips_toast.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/hnyy_container_white_bg"
+    android:gravity="center"
+    android:orientation="horizontal">
+
+
+    <ImageView
+        android:id="@+id/hnyy_iv_desc"
+        android:layout_width="18dp"
+        android:layout_height="18dp"
+        android:layout_gravity="center"
+        android:layout_marginLeft="60dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp" />
+
+    <TextView
+        android:id="@+id/hnyy_tv_desc"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_marginLeft="10dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="60dp"
+        android:layout_marginBottom="10dp"
+        android:singleLine="true"
+        android:textColor="@color/hnyy_color_gray"
+        android:textSize="14sp" />
+</LinearLayout>

+ 1 - 0
library_xinrui/src/main/res/values/colors.xml

@@ -2,6 +2,7 @@
 <resources>
     <color name="hnyy_color_white">#FFFFFF</color>
     <color name="hnyy_color_red">#FB4A4A</color>
+    <color name="hnyy_color_light_purple">#B99CFF</color>
     <color name="hnyy_color_purple">#8A61F0</color>
     <color name="hnyy_color_deep_purple">#673AB7</color>
     <color name="hnyy_color_gray">#505050</color>