001package com.gigya.android.sdk.providers.provider; 002 003import android.app.Activity; 004import android.content.Context; 005import android.content.Intent; 006import android.os.Bundle; 007import android.support.annotation.Nullable; 008import android.support.v7.app.AppCompatActivity; 009 010import com.gigya.android.sdk.GigyaLogger; 011import com.gigya.android.sdk.api.IBusinessApiService; 012import com.gigya.android.sdk.persistence.IPersistenceService; 013import com.gigya.android.sdk.ui.HostActivity; 014import com.gigya.android.sdk.utils.FileUtils; 015import com.tencent.mm.opensdk.modelbase.BaseResp; 016import com.tencent.mm.opensdk.modelmsg.SendAuth; 017import com.tencent.mm.opensdk.openapi.IWXAPI; 018import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; 019import com.tencent.mm.opensdk.openapi.WXAPIFactory; 020 021import org.json.JSONObject; 022 023import java.util.Map; 024 025import static com.gigya.android.sdk.GigyaDefinitions.Providers.WECHAT; 026 027public class WeChatProvider extends Provider { 028 029 private static final String LOG_TAG = "WeChatProvider"; 030 031 public WeChatProvider(Context context, 032 FileUtils fileUtils, 033 IPersistenceService persistenceService, 034 IBusinessApiService businessApiService, 035 ProviderCallback providerCallback) { 036 super(context, persistenceService, businessApiService, providerCallback); 037 _appId = fileUtils.stringFromMetaData("wechatAppID"); 038 _api = WXAPIFactory.createWXAPI(_context, _appId, true); 039 _api.registerApp(_appId); 040 } 041 042 private String _appId; 043 private IWXAPI _api; 044 private BaseResp _resp; 045 046 @Override 047 public String getName() { 048 return WECHAT; 049 } 050 051 public static boolean isAvailable(Context context, FileUtils fileUtils) { 052 try { 053 String appId = fileUtils.stringFromMetaData("wechatAppID"); 054 IWXAPI api = WXAPIFactory.createWXAPI(context, appId, false); 055 return (appId != null && api.isWXAppInstalled()); 056 } catch (Throwable t) { 057 return false; 058 } 059 } 060 061 @Override 062 public void login(final Map<String, Object> loginParams, String loginMode) { 063 if (_connecting) { 064 return; 065 } 066 _connecting = true; 067 _loginMode = loginMode; 068 HostActivity.present(_context, new HostActivity.HostActivityLifecycleCallbacks() { 069 @Override 070 public void onCreate(AppCompatActivity activity, @Nullable Bundle savedInstanceState) { 071 final SendAuth.Req req = new SendAuth.Req(); 072 req.scope = "snsapi_userinfo"; 073 req.state = ""; 074 _api.sendReq(req); 075 } 076 077 @Override 078 public void onResume(AppCompatActivity activity) { 079 if (_resp != null) { 080 handleResponse(loginParams, _resp, activity); 081 } 082 } 083 084 }); 085 } 086 087 @Override 088 public void logout() { 089 super.logout(); 090 if (_api != null) { 091 _api.detach(); 092 } 093 } 094 095 public void handleIntent(Intent intent, IWXAPIEventHandler eventHandler) { 096 if (_api != null && _api.isWXAppInstalled()) { 097 _api.handleIntent(intent, eventHandler); 098 } 099 } 100 101 public void onResponse(BaseResp resp) { 102 _resp = resp; 103 } 104 105 private void handleResponse(Map<String, Object> loginParams, BaseResp baseResp, Activity activity) { 106 switch (baseResp.errCode) { 107 case BaseResp.ErrCode.ERR_OK: 108 try { 109 SendAuth.Resp sendResp = (SendAuth.Resp) baseResp; 110 final String authCode = sendResp.code; 111 final String providerSessions = getProviderSessions(authCode, -1L, _appId); 112 onLoginSuccess(loginParams, providerSessions, _loginMode); 113 } catch (Exception e) { 114 e.printStackTrace(); 115 } 116 break; 117 case BaseResp.ErrCode.ERR_USER_CANCEL: 118 onCanceled(); 119 break; 120 case BaseResp.ErrCode.ERR_AUTH_DENIED: 121 onLoginFailed("authentication_denied"); 122 break; 123 } 124 if (activity != null) { 125 _resp = null; 126 activity.finish(); 127 } 128 } 129 130 @Override 131 public String getProviderSessions(String tokenOrCode, long expiration, String uid) { 132 // code is relevant 133 try { 134 final String json = new JSONObject() 135 .put(getName(), new JSONObject() 136 .put("code", tokenOrCode).put("providerUID", uid)).toString(); 137 GigyaLogger.debug(LOG_TAG, "Provider sessions: " + json); 138 return json; 139 } catch (Exception ex) { 140 _connecting = false; 141 ex.printStackTrace(); 142 } 143 return null; 144 } 145 146 @Override 147 public boolean supportsTokenTracking() { 148 return false; 149 } 150 151 @Override 152 public void trackTokenChange() { 153 // Stub. 154 } 155}