diff --git a/.gitignore b/.gitignore index 9111f42..6fa1027 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,5 @@ fastlane/readme.md .idea/dictionaries build/ -/easyaccount local.properties diff --git a/.idea/modules.xml b/.idea/modules.xml index 8bfb195..eb56bc7 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index b3944f5..6f90b63 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,4 +20,5 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' + implementation project(':easyaccount') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7ff349f..160ac50 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/card/gmail/accountmanager/SS.java b/app/src/main/java/com/mousavi/card/gmail/accountmanager/SS.java index ffcf76c..927c7eb 100644 --- a/app/src/main/java/com/mousavi/card/gmail/accountmanager/SS.java +++ b/app/src/main/java/com/mousavi/card/gmail/accountmanager/SS.java @@ -4,18 +4,18 @@ import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; -//import com.mousavi.card.gmail.easyaccount.EasyAccountService; +import com.mousavi.card.gmail.easyaccount.EasyAccountService; public class SS extends Service { + @Nullable @Override public IBinder onBind(Intent ibinderIntent) { -// EasyAccountService easyAccount= EasyAccountService.newBuilder(this) -// .accountType("com.mousavi.card.gmail.accountmanager") -// .destinationClass(MainActivity.class) -// .enableLogger(true) -// .build(); -// return easyAccount.getIBinder(); - return null;} - + EasyAccountService easyAccount = EasyAccountService.newBuilder(this) + .accountType("com.mousavi.card.gmail.accountmanager") + .destinationClass(MainActivity.class) + .enableLogger(true) + .build(); + return easyAccount.getIBinder(); + } } diff --git a/build.gradle b/build.gradle index 1a3d812..3ca954e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,10 +5,11 @@ buildscript { repositories { google() jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' - + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/easyaccount/build.gradle b/easyaccount/build.gradle new file mode 100644 index 0000000..d3ee6d2 --- /dev/null +++ b/easyaccount/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' +group='com.github.KouroshMsv' +android { + compileSdkVersion 27 + defaultConfig { + minSdkVersion 19 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/easyaccount/proguard-rules.pro b/easyaccount/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/easyaccount/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/easyaccount/src/main/AndroidManifest.xml b/easyaccount/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d935170 --- /dev/null +++ b/easyaccount/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/AbstractEasyAccountAuthenticator.java b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/AbstractEasyAccountAuthenticator.java new file mode 100644 index 0000000..caa3dd7 --- /dev/null +++ b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/AbstractEasyAccountAuthenticator.java @@ -0,0 +1,52 @@ +package com.mousavi.card.gmail.easyaccount; + +import android.accounts.AbstractAccountAuthenticator; +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.AccountManager; +import android.accounts.NetworkErrorException; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +abstract class AbstractEasyAccountAuthenticator extends AbstractAccountAuthenticator { + + + + AbstractEasyAccountAuthenticator(Context context) { + super(context); + } + + + @Override + public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { + return null; + } + + + @Override + public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) + throws NetworkErrorException { + return null; + } + + @Override + public String getAuthTokenLabel(String authTokenType) { + return null; + } + + @Override + public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) + throws NetworkErrorException { + return null; + } + + @Override + public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) + throws NetworkErrorException { + return null; + } + +} diff --git a/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountAuthenticator.java b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountAuthenticator.java new file mode 100644 index 0000000..1808898 --- /dev/null +++ b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountAuthenticator.java @@ -0,0 +1,154 @@ +package com.mousavi.card.gmail.easyaccount; + +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.AccountManager; +import android.app.Activity; +import android.app.Service; +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcelable; +import android.text.TextUtils; +import java.util.Arrays; + +final class EasyAccountAuthenticator extends AbstractEasyAccountAuthenticator { + + private String authTokenType; + private String accountType; + private Class loginClass; + private L l; + private Intent tokenIntent; + private Service service; + + EasyAccountAuthenticator(Service service, Class loginClass, L l, Intent tokenIntent) { + super(service); + this.loginClass = loginClass; + this.l = l; + this.tokenIntent = tokenIntent; + this.service = service; + } + + @Override + public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, + String[] requiredFeatures, Bundle options) { + if (loginClass != null) { + final Intent intent = new Intent(service, loginClass); + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); + l.d("addAccount", intentToString(intent)); + final Bundle bundle = new Bundle(); + bundle.putParcelable(AccountManager.KEY_INTENT, intent); + return bundle; + } + return null; + } + + @Override + public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) { + Bundle bundle = new Bundle(); + if (this.authTokenType.equals(authTokenType)) { + AccountManager am = AccountManager.get(service); + String authToken = am.peekAuthToken(account, authTokenType); + if (authToken != null) { + l.d("authToken", authToken); + } + if (TextUtils.isEmpty(authToken)) { + l.d("auth token is empty"); + final Intent intent = new Intent(service, loginClass); + am.setAuthToken(account, this.authTokenType, null); + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); + intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name); + if (tokenIntent != null) { + intent.putExtras(tokenIntent); + } + l.d("startActivity(" + loginClass.getSimpleName() + ")", "intent : " + intentToString(intent)); + bundle.putParcelable(AccountManager.KEY_INTENT, intent); + return bundle; + } + bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); + bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); + bundle.putString(AccountManager.KEY_AUTHTOKEN, authToken); + + l.d("sent token", "intent : " + bundleToString(bundle)); + return bundle; + } + l.d("invalid authTokenType\n" + + "1: " + authTokenType + "\n" + + "2: " + this.authTokenType); + bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "invalid authTokenType"); + return bundle; + } + + public void setAuthTokenType(String authTokenType) { + this.authTokenType = authTokenType; + } + + public String getAuthTokenType() { + return authTokenType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } + + public String getAccountType() { + return accountType; + } + + private String intentToString(Intent intent) { + if (intent == null) { + return null; + } + + return intent.toString() + " " + bundleToString(intent.getExtras()); + } + + private String bundleToString(Bundle bundle) { + StringBuilder out = new StringBuilder("Bundle["); + + if (bundle == null) { + out.append("null"); + } else { + boolean first = true; + for (String key : bundle.keySet()) { + if (!first) { + out.append(", "); + } + + out.append(key).append('='); + + Object value = bundle.get(key); + + if (value instanceof int[]) { + out.append(Arrays.toString((int[]) value)); + } else if (value instanceof byte[]) { + out.append(Arrays.toString((byte[]) value)); + } else if (value instanceof boolean[]) { + out.append(Arrays.toString((boolean[]) value)); + } else if (value instanceof short[]) { + out.append(Arrays.toString((short[]) value)); + } else if (value instanceof long[]) { + out.append(Arrays.toString((long[]) value)); + } else if (value instanceof float[]) { + out.append(Arrays.toString((float[]) value)); + } else if (value instanceof double[]) { + out.append(Arrays.toString((double[]) value)); + } else if (value instanceof String[]) { + out.append(Arrays.toString((String[]) value)); + } else if (value instanceof CharSequence[]) { + out.append(Arrays.toString((CharSequence[]) value)); + } else if (value instanceof Parcelable[]) { + out.append(Arrays.toString((Parcelable[]) value)); + } else if (value instanceof Bundle) { + out.append(bundleToString((Bundle) value)); + } else { + out.append(value); + } + + first = false; + } + } + + out.append("]"); + return out.toString(); + } +} diff --git a/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountService.java b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountService.java new file mode 100644 index 0000000..a790857 --- /dev/null +++ b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/EasyAccountService.java @@ -0,0 +1,96 @@ +package com.mousavi.card.gmail.easyaccount; + +import android.accounts.AccountManager; +import android.app.Activity; +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +public class EasyAccountService { + + private final EasyAccountAuthenticator authenticator; + private static String accountType; + private static String authTokenType; + private static AccountManager accountManager; + + private EasyAccountService(Builder builder) { + accountType = builder.accountType; + authTokenType = builder.authTokenType; + Class loginClass = builder.loginClass; + L l = new L(builder.enable); + Intent tokenIntent = builder.tokenIntent; + Service service = builder.service; + authenticator = new EasyAccountAuthenticator(service, loginClass, l, tokenIntent); + authenticator.setAccountType(accountType); + authenticator.setAuthTokenType(authTokenType); + } + + public IBinder getIBinder() { + return authenticator.getIBinder(); + } + + public static Builder newBuilder(Service service) { + if (service == null) { + throw new NullPointerException("service is null"); + } + return new Builder(service); + } + + public static final class Builder { + + private String accountType = "com.mousavi.card.gmail.account"; + private String authTokenType = "FullAccess"; + private Class loginClass; + private boolean enable; + private Intent tokenIntent; + private Service service; + + private Builder(Service service) { + this.service = service; + accountManager=AccountManager.get(service); + } + + public Builder accountType(String accountType) { + this.accountType = accountType; + return this; + } + + public Builder destinationClass(Class loginClass) { + this.loginClass = loginClass; + return this; + } + + public Builder enableLogger(boolean enable) { + this.enable = enable; + return this; + } + + public Builder tokenIntent(Intent tokenIntent) { + this.tokenIntent = tokenIntent; + return this; + } + + public EasyAccountService build() { + return new EasyAccountService(this); + } + } + + public static String getAccountType() { + return accountType; + } + + public static String getAuthTokenType() { + return authTokenType; + + } + + public static AccountManager getAccountManager(){ + if (accountManager==null){ + throw new NullPointerException("don't use easyAccount builder in Service"); + }else{ + return accountManager; + } + + } + +} diff --git a/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/L.java b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/L.java new file mode 100644 index 0000000..4240a33 --- /dev/null +++ b/easyaccount/src/main/java/com/mousavi/card/gmail/easyaccount/L.java @@ -0,0 +1,20 @@ +package com.mousavi.card.gmail.easyaccount; + +import android.util.Log; + +class L { + + boolean logEnable; + + public L(boolean logEnable) { + this.logEnable = logEnable; + } + + void d(String message){ + Log.d("EasyAccountService ----> ",message); + } + void d(String tag,String message){ + Log.d("EasyAccountService ----> "," "+tag+" :"+message); + } + +} diff --git a/easyaccount/src/main/res/values/strings.xml b/easyaccount/src/main/res/values/strings.xml new file mode 100644 index 0000000..a5eacbc --- /dev/null +++ b/easyaccount/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + easyAccount + diff --git a/settings.gradle b/settings.gradle index e7b4def..5f8e896 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' +include ':app',":easyaccount"