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"