diff --git a/AndroidManifest.xml b/AndroidManifest.xml index cda59efc6..23dc52e7a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -166,7 +166,7 @@ - + diff --git a/AndroidManifest.xml.pattern b/AndroidManifest.xml.pattern index c31f442c7..d94a26ef1 100644 --- a/AndroidManifest.xml.pattern +++ b/AndroidManifest.xml.pattern @@ -166,7 +166,7 @@ - + diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationActivity.java b/src/org/geometerplus/android/fbreader/network/AuthenticationActivity.java index 11539da3b..49e020071 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationActivity.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationActivity.java @@ -246,11 +246,10 @@ public class AuthenticationActivity extends Activity { private void runCustomAuthentication(final String username, final String password) { final NetworkAuthenticationManager mgr = myLink.authenticationManager(); - mgr.UserNameOption.setValue(username); final Runnable runnable = new Runnable() { public void run() { try { - mgr.authorise(password); + mgr.authorise(username, password); if (mgr.needsInitialization()) { mgr.initialize(); } diff --git a/src/org/geometerplus/android/fbreader/network/AccountMenuActivity.java b/src/org/geometerplus/android/fbreader/network/AuthorizationMenuActivity.java similarity index 88% rename from src/org/geometerplus/android/fbreader/network/AccountMenuActivity.java rename to src/org/geometerplus/android/fbreader/network/AuthorizationMenuActivity.java index a6b52c649..8a82af51e 100644 --- a/src/org/geometerplus/android/fbreader/network/AccountMenuActivity.java +++ b/src/org/geometerplus/android/fbreader/network/AuthorizationMenuActivity.java @@ -35,10 +35,10 @@ import org.geometerplus.android.util.PackageUtil; import org.geometerplus.android.fbreader.api.PluginApi; -public class AccountMenuActivity extends MenuActivity { +public class AuthorizationMenuActivity extends MenuActivity { public static void runMenu(Context context, INetworkLink link) { context.startActivity( - Util.intentByLink(new Intent(context, AccountMenuActivity.class), link) + Util.intentByLink(new Intent(context, AuthorizationMenuActivity.class), link) ); } @@ -69,10 +69,10 @@ public class AccountMenuActivity extends MenuActivity { try { final NetworkAuthenticationManager mgr = myLink.authenticationManager(); if (info.getId().toString().endsWith("/signIn")) { - Util.runAuthenticationDialog(AccountMenuActivity.this, myLink, null); + Util.runAuthenticationDialog(AuthorizationMenuActivity.this, myLink, null); } else { final Intent intent = Util.authorizationIntent(myLink, info.getId()); - if (PackageUtil.canBeStarted(AccountMenuActivity.this, intent, true)) { + if (PackageUtil.canBeStarted(AuthorizationMenuActivity.this, intent, true)) { startActivity(intent); } } diff --git a/src/org/geometerplus/android/fbreader/network/BuyBooksActivity.java b/src/org/geometerplus/android/fbreader/network/BuyBooksActivity.java index d11ad477c..0f6d62497 100644 --- a/src/org/geometerplus/android/fbreader/network/BuyBooksActivity.java +++ b/src/org/geometerplus/android/fbreader/network/BuyBooksActivity.java @@ -86,7 +86,7 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL finish(); return; } - myBooks = new ArrayList(keys.size()); + myBooks = new ArrayList(keys.size()); for (NetworkTree.Key k : keys) { final NetworkTree tree = myLibrary.getTreeByKey(k); if (tree instanceof NetworkBookTree) { @@ -106,7 +106,7 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL try { if (!mgr.isAuthorised(true)) { - AccountMenuActivity.runMenu(this, myLink); + AuthorizationMenuActivity.runMenu(this, myLink); } } catch (ZLNetworkException e) { } @@ -122,10 +122,17 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL myAccount = mgr.currentAccount(); - setupUI(true); + setupUI(AuthorizationState.Authorized); + + NetworkLibrary.Instance().addChangeListener(this); } - private void setupUI(boolean authorized) { + private static enum AuthorizationState { + Authorized, + NotAuthorized + }; + + private void setupUI(AuthorizationState state) { final ZLResource dialogResource = ZLResource.resource("dialog"); final ZLResource buttonResource = dialogResource.getResource("button"); @@ -142,101 +149,100 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL setTitle(resource.getResource("title").getValue()); } - if (!authorized) { - textArea.setText(resource.getResource("notAuthorized").getValue()); - okButton.setText(buttonResource.getResource("authorize").getValue()); - cancelButton.setText(buttonResource.getResource("cancel").getValue()); - okButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - AccountMenuActivity.runMenu(BuyBooksActivity.this, myLink); - } - }); - cancelButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - finish(); - } - }); - } else if (myAccount == null) { - textArea.setText(resource.getResource("noAccountInformation").getValue()); - okButton.setText(buttonResource.getResource("refresh").getValue()); - cancelButton.setText(buttonResource.getResource("cancel").getValue()); - okButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - refreshAccountInformation(); - } - }); - cancelButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - finish(); - } - }); - } else if (myCost.compareTo(myAccount) > 0) { - if (Money.ZERO.equals(myAccount)) { - textArea.setText( - resource.getResource("zeroFunds").getValue() - .replace("%0", myCost.toString()) - ); - } else { - textArea.setText( - resource.getResource("unsufficientFunds").getValue() - .replace("%0", myCost.toString()) - .replace("%1", myAccount.toString()) - ); - } - okButton.setText(buttonResource.getResource("pay").getValue()); - cancelButton.setText(buttonResource.getResource("refresh").getValue()); - okButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - TopupMenuActivity.runMenu(BuyBooksActivity.this, myLink, myCost.subtract(myAccount)); - } - }); - cancelButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - refreshAccountInformation(); - } - }); - } else { - okButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - UIUtil.wait("purchaseBook", buyRunnable(), BuyBooksActivity.this); - } - }); - cancelButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - finish(); - } - }); - if (myBooks.size() > 1) { - textArea.setText( - resource.getResource("confirmSeveralBooks").getValue() - .replace("%s", String.valueOf(myBooks.size())) - ); - okButton.setText(buttonResource.getResource("buy").getValue()); + switch (state) { + case NotAuthorized: + textArea.setText(resource.getResource("notAuthorized").getValue()); + okButton.setText(buttonResource.getResource("authorize").getValue()); cancelButton.setText(buttonResource.getResource("cancel").getValue()); - } else if (myBooks.get(0).getStatus() == NetworkBookItem.Status.CanBePurchased) { - textArea.setText( - resource.getResource("confirm").getValue().replace("%s", myBooks.get(0).Title) - ); - okButton.setText(buttonResource.getResource("buy").getValue()); - cancelButton.setText(buttonResource.getResource("cancel").getValue()); - } else { - textArea.setText(resource.getResource("alreadyBought").getValue()); - cancelButton.setText(buttonResource.getResource("ok").getValue()); - okButton.setVisibility(View.GONE); - } + okButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + AuthorizationMenuActivity.runMenu(BuyBooksActivity.this, myLink); + } + }); + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + break; + case Authorized: + if (myAccount == null) { + textArea.setText(resource.getResource("noAccountInformation").getValue()); + okButton.setText(buttonResource.getResource("refresh").getValue()); + cancelButton.setText(buttonResource.getResource("cancel").getValue()); + okButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + refreshAccountInformation(); + } + }); + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + } else if (myCost.compareTo(myAccount) > 0) { + if (Money.ZERO.equals(myAccount)) { + textArea.setText( + resource.getResource("zeroFunds").getValue() + .replace("%0", myCost.toString()) + ); + } else { + textArea.setText( + resource.getResource("unsufficientFunds").getValue() + .replace("%0", myCost.toString()) + .replace("%1", myAccount.toString()) + ); + } + okButton.setText(buttonResource.getResource("pay").getValue()); + cancelButton.setText(buttonResource.getResource("refresh").getValue()); + okButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + TopupMenuActivity.runMenu(BuyBooksActivity.this, myLink, myCost.subtract(myAccount)); + } + }); + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + refreshAccountInformation(); + } + }); + } else { + okButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + UIUtil.wait("purchaseBook", buyRunnable(), BuyBooksActivity.this); + } + }); + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + if (myBooks.size() > 1) { + textArea.setText( + resource.getResource("confirmSeveralBooks").getValue() + .replace("%s", String.valueOf(myBooks.size())) + ); + okButton.setText(buttonResource.getResource("buy").getValue()); + cancelButton.setText(buttonResource.getResource("cancel").getValue()); + } else if (myBooks.get(0).getStatus() == NetworkBookItem.Status.CanBePurchased) { + textArea.setText( + resource.getResource("confirm").getValue().replace("%s", myBooks.get(0).Title) + ); + okButton.setText(buttonResource.getResource("buy").getValue()); + cancelButton.setText(buttonResource.getResource("cancel").getValue()); + } else { + textArea.setText(resource.getResource("alreadyBought").getValue()); + cancelButton.setText(buttonResource.getResource("ok").getValue()); + okButton.setVisibility(View.GONE); + } + } + break; } } @Override - protected void onStart() { - super.onStart(); - NetworkLibrary.Instance().addChangeListener(this); - } - - @Override - protected void onStop() { + protected void onDestroy() { NetworkLibrary.Instance().removeChangeListener(this); - super.onStop(); + super.onDestroy(); } @Override @@ -285,7 +291,7 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL if (updated) { runOnUiThread(new Runnable() { public void run() { - setupUI(true); + setupUI(AuthorizationState.Authorized); } }); } @@ -342,23 +348,29 @@ public class BuyBooksActivity extends Activity implements NetworkLibrary.ChangeL // method from NetworkLibrary.ChangeListener public void onLibraryChanged(final NetworkLibrary.ChangeListener.Code code, final Object[] params) { - switch (code) { - case SignedIn: - updateAuthorizationState(); - break; - } + runOnUiThread(new Runnable() { + public void run() { + switch (code) { + case SignedIn: + updateAuthorizationState(); + break; + } + } + }); } private void updateAuthorizationState() { final NetworkAuthenticationManager mgr = myLink.authenticationManager(); try { if (mgr.isAuthorised(true)) { + setupUI(AuthorizationState.Authorized); refreshAccountInformation(); } else { - setupUI(false); + setupUI(AuthorizationState.NotAuthorized); } } catch (ZLNetworkException e) { - setupUI(false); + e.printStackTrace(); + setupUI(AuthorizationState.NotAuthorized); } } } diff --git a/src/org/geometerplus/android/fbreader/network/ListenerCallback.java b/src/org/geometerplus/android/fbreader/network/ListenerCallback.java index 6942b45bb..204ef8b42 100644 --- a/src/org/geometerplus/android/fbreader/network/ListenerCallback.java +++ b/src/org/geometerplus/android/fbreader/network/ListenerCallback.java @@ -42,7 +42,6 @@ public class ListenerCallback extends BroadcastReceiver implements UserRegistrat if (mgr instanceof LitResAuthenticationManager) { try { processSignup((LitResAuthenticationManager)mgr, intent); - library.fireModelChangedEvent(NetworkLibrary.ChangeListener.Code.SignedIn); } catch (ZLNetworkException e) { e.printStackTrace(); } @@ -64,7 +63,10 @@ public class ListenerCallback extends BroadcastReceiver implements UserRegistrat // throw new ZLNetworkException(NetworkException.ERROR_AUTHENTICATION_FAILED); //} try { - mgr.authorise(data.getStringExtra(USER_REGISTRATION_PASSWORD)); + mgr.authorise( + data.getStringExtra(USER_REGISTRATION_USERNAME), + data.getStringExtra(USER_REGISTRATION_PASSWORD) + ); mgr.initialize(); } catch (ZLNetworkException e) { mgr.logOut(); diff --git a/src/org/geometerplus/android/fbreader/network/Util.java b/src/org/geometerplus/android/fbreader/network/Util.java index 17adf11b4..7a3d6243b 100644 --- a/src/org/geometerplus/android/fbreader/network/Util.java +++ b/src/org/geometerplus/android/fbreader/network/Util.java @@ -95,7 +95,7 @@ public abstract class Util implements UserRegistrationConstants { final Intent intent = intentByLink(new Intent(activity, AuthenticationActivity.class), link); AuthenticationActivity.registerRunnable(intent, onSuccess); - intent.putExtra(AuthenticationActivity.USERNAME_KEY, mgr.UserNameOption.getValue()); + intent.putExtra(AuthenticationActivity.USERNAME_KEY, mgr.getUserName()); intent.putExtra(AuthenticationActivity.SCHEME_KEY, "https"); intent.putExtra(AuthenticationActivity.CUSTOM_AUTH_KEY, true); activity.startActivity(intent); diff --git a/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java b/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java index e35f67804..e103f0a42 100644 --- a/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java +++ b/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java @@ -67,7 +67,7 @@ public class SignOutAction extends Action { public String getOptionsLabel(NetworkTree tree) { final NetworkAuthenticationManager mgr = tree.getLink().authenticationManager(); final String userName = - mgr != null && mgr.mayBeAuthorised(false) ? mgr.UserNameOption.getValue() : ""; + mgr != null && mgr.mayBeAuthorised(false) ? mgr.getVisibleUserName() : ""; return super.getOptionsLabel(tree).replace("%s", userName); } @@ -75,7 +75,7 @@ public class SignOutAction extends Action { public String getContextLabel(NetworkTree tree) { final NetworkAuthenticationManager mgr = tree.getLink().authenticationManager(); final String userName = - mgr != null && mgr.mayBeAuthorised(false) ? mgr.UserNameOption.getValue() : ""; + mgr != null && mgr.mayBeAuthorised(false) ? mgr.getVisibleUserName() : ""; return super.getContextLabel(tree).replace("%s", userName); } } diff --git a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java index f162aecde..f85cd783a 100644 --- a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java @@ -48,18 +48,27 @@ public abstract class NetworkAuthenticationManager { public final INetworkLink Link; - public final ZLStringOption UserNameOption; + protected final ZLStringOption UserNameOption; protected NetworkAuthenticationManager(INetworkLink link) { Link = link; UserNameOption = new ZLStringOption(link.getSiteName(), "userName", ""); } + public String getUserName() { + return UserNameOption.getValue(); + } + + public String getVisibleUserName() { + final String username = getUserName(); + return username.startsWith("fbreader-auto-") ? "auto" : username; + } + /* * Common manager methods */ public abstract boolean isAuthorised(boolean useNetwork /* = true */) throws ZLNetworkException; - public abstract void authorise(String password) throws ZLNetworkException; + public abstract void authorise(String username, String password) throws ZLNetworkException; public abstract void logOut(); public abstract BookUrlInfo downloadReference(NetworkBookItem book); public abstract void refreshAccountInformation() throws ZLNetworkException; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index 223ec81c1..b139021a1 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -81,12 +81,16 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { myCanRebillOption = new ZLBooleanOption(link.getSiteName(), "canRebill", false); } - public synchronized void initUser(String userName, String sid, String userId, boolean canRebill) { - UserNameOption.setValue(userName); + public synchronized void initUser(String username, String sid, String userId, boolean canRebill) { + if (username == null) { + username = UserNameOption.getValue(); + } else { + UserNameOption.setValue(username); + } mySidOption.setValue(sid); myUserIdOption.setValue(userId); myCanRebillOption.setValue(canRebill); - myFullyInitialized = !"".equals(userName) && !"".equals(sid) && !"".equals(userId); + myFullyInitialized = !"".equals(username) && !"".equals(sid) && !"".equals(userId); } @Override @@ -95,13 +99,17 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private synchronized void logOut(boolean full) { + if ("".equals(mySidOption.getValue())) { + return; + } if (full) { - initUser(UserNameOption.getValue(), "", "", false); + initUser(null, "", "", false); } else { myFullyInitialized = false; } myInitializedDataSid = null; myPurchasedBooks.clear(); + NetworkLibrary.Instance().fireModelChangedEvent(NetworkLibrary.ChangeListener.Code.SignedIn); } @Override @@ -136,7 +144,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } request.addPostParameter("sid", sid); ZLNetworkManager.Instance().perform(request); - initUser(UserNameOption.getValue(), xmlReader.Sid, xmlReader.UserId, xmlReader.CanRebill); + initUser(null, xmlReader.Sid, xmlReader.UserId, xmlReader.CanRebill); return true; } catch (ZLNetworkException e) { if (NetworkException.ERROR_AUTHENTICATION_FAILED.equals(e.getCode())) { @@ -148,38 +156,30 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } @Override - public void authorise(String password) throws ZLNetworkException { + public void authorise(String username, String password) throws ZLNetworkException { final Map params = new HashMap(); final String url = parseUrl(Link.getUrl(UrlInfo.Type.SignIn), params); if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } - final String login; synchronized (this) { - login = UserNameOption.getValue(); + UserNameOption.setValue(username); } - final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); - - ZLNetworkException exception = null; try { + final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); final LitResNetworkRequest request = new LitResNetworkRequest(url, xmlReader); for (Map.Entry entry : params.entrySet()) { request.addPostParameter(entry.getKey(), entry.getValue()); } - request.addPostParameter("login", login); + request.addPostParameter("login", username); request.addPostParameter("pwd", password); ZLNetworkManager.Instance().perform(request); + NetworkLibrary.Instance().fireModelChangedEvent(NetworkLibrary.ChangeListener.Code.SignedIn); + initUser(null, xmlReader.Sid, xmlReader.UserId, xmlReader.CanRebill); } catch (ZLNetworkException e) { - exception = e; - } - - synchronized (this) { - if (exception != null) { - logOut(false); - throw exception; - } - initUser(UserNameOption.getValue(), xmlReader.Sid, xmlReader.UserId, xmlReader.CanRebill); + logOut(false); + throw e; } }