1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-06 12:00:17 +02:00

SMS account refilling (in progress); updated TODO

This commit is contained in:
Nikolay Pultsin 2010-12-23 06:53:55 +00:00
parent 98470c95ae
commit 329a4eb0c1
16 changed files with 118 additions and 102 deletions

View file

@ -1,20 +1,28 @@
LITRES: LITRES:
* Проверить, что происходит в отсутствие плагина 0.99:
ТОЧКИ ВХОДА:
вход в litres-catalog
sign up в меню
sign up в диалоге авторизации
DONE Доделать регистрацию
* Авторегистрация * Авторегистрация
* Пополнение счета через sms * Пополнение счета через sms
* Автопокупка * Автопокупка
* 'Refill account' item should be visible iff user is logged in
* What happens if user has no enough money to buy a book?
* SMS account refilling
* не задавать вопрос об установке плагина слишком часто (<= раза в неделю?)
* возможность ручной установки плагина
* если загрузка из маркета невозможна (запуск маркета не состоялся) -- пытаться ставить с data.fbreader.org
* добавить permission на установку пакетов?
* что делать, если оттуда нельзя поставить, потому что запрещена установка из "Unknown sources"?
* как дать возможность ставить из других магазинов?
* plugin для TTS
0.8.0: After 0.99:
* 'My Basket' item
* 'Order all the books in basket' action
* Auto-calculation of SMS set for given sum
FLOWS:
DONE litres: перенести диалог регистрации в плагин
убрать GET_ACCOUNTS из основной версии
** litres: механизм авторегистрации ** litres: механизм авторегистрации
пытаемся войти пытаемся войти
если вошли -- ОК если вошли -- ОК
@ -22,7 +30,6 @@ DONE litres: перенести диалог регистрации в плаг
"использовать другой e-mail или выслать пароль на этот?" "использовать другой e-mail или выслать пароль на этот?"
если нет такого пользователя -- пытаемся создать если нет такого пользователя -- пытаемся создать
если e-address already in use -- ? если e-address already in use -- ?
** litres: отправка sms
** litres: механизм покупки книги ** litres: механизм покупки книги
если уже logged in -- покупаем если уже logged in -- покупаем
если не хватает денег -- говорим, что надо пополнить счет и предлалагаем варианты: если не хватает денег -- говорим, что надо пополнить счет и предлалагаем варианты:
@ -44,18 +51,3 @@ DONE litres: перенести диалог регистрации в плаг
если e-address already in use -- ? если e-address already in use -- ?
ручная регистрация ручная регистрация
cancel cancel
** вызов плагина из программы (с предварительной проверкой, установлен ли)
** вопрос об установке плагина (диалог)
** не задавать вопрос слишком часто (<= раза в неделю?)
** если загрузка из маркета невозможна (запуск маркета не состоялся) -- пытаться ставить с data.fbreader.org
** добавить permission на установку пакетов?
** что делать, если оттуда нельзя поставить, потому что запрещена установка из "Unknown sources"?
** как дать возможность ставить из других магазинов?
** проверка номера версии и запрос апдейта, если надо
** plugin для TTS
DONE сделать другую иконку для fbreader_plugin

View file

@ -7,13 +7,23 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
<application android:label="FBReader LitRes plugin" android:icon="@drawable/fbreader_plugin"> <application android:label="FBReader LitRes plugin" android:icon="@drawable/fbreader_plugin">
<activity android:name=".TestActivity"> <activity android:name=".TestActivity" android:theme="@android:style/Theme.NoDisplay">
<intent-filter> <intent-filter>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<action android:name="android.fbreader.action.TEST" /> <action android:name="android.fbreader.action.TEST" />
<data android:scheme="http" android:host="data.fbreader.org" android:path="/packages/org.geometerplus.fbreader.plugin.network.litres.apk" /> <data android:scheme="http" android:host="data.fbreader.org" android:path="/packages/org.geometerplus.fbreader.plugin.network.litres.apk" />
<data android:scheme="http" android:host="data.fbreader.org" android:path="/packages/org.geometerplus.fbreader.plugin.network.litres.apk_1" /> <data android:scheme="http" android:host="data.fbreader.org" android:path="/packages/org.geometerplus.fbreader.plugin.network.litres.apk_1" />
</intent-filter> </intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.fbreader.action.NETWORK_LIBRARY_REGISTER_TEST" />
<data android:scheme="https" android:host="robot.litres.ru" />
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.fbreader.action.NETWORK_LIBRARY_SMS_REFILLING_TEST" />
<data android:scheme="http" android:host="data.fbreader.org" android:path="/catalogs/litres/index.php"/>
</intent-filter>
</activity> </activity>
<activity android:name=".UserRegistrationActivity" android:configChanges="orientation|keyboardHidden" android:theme="@android:style/Theme.Dialog"> <activity android:name=".UserRegistrationActivity" android:configChanges="orientation|keyboardHidden" android:theme="@android:style/Theme.Dialog">
<intent-filter> <intent-filter>

View file

@ -90,10 +90,6 @@ public class UserRegistrationActivity extends Activity implements UserRegistrati
setViewTextFromResource(R.id.user_registration_confirm_password_text, "confirmPassword"); setViewTextFromResource(R.id.user_registration_confirm_password_text, "confirmPassword");
setViewTextFromResource(R.id.user_registration_email_text, "email"); setViewTextFromResource(R.id.user_registration_email_text, "email");
setViewText(R.id.user_registration_login, "q");
setViewText(R.id.user_registration_password, "q");
setViewText(R.id.user_registration_confirm_password, "q");
final TextView errorLabel = findTextView(R.id.user_registration_error); final TextView errorLabel = findTextView(R.id.user_registration_error);
errorLabel.setVisibility(View.GONE); errorLabel.setVisibility(View.GONE);
errorLabel.setText(""); errorLabel.setText("");

View file

@ -40,7 +40,7 @@ class AddCustomCatalogItemActions extends NetworkTreeActions {
} }
@Override @Override
public int getDefaultActionCode(NetworkTree tree) { public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
return RUN_ITEM_ID; return RUN_ITEM_ID;
} }
@ -55,7 +55,7 @@ class AddCustomCatalogItemActions extends NetworkTreeActions {
} }
@Override @Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
return false; return false;
} }

View file

@ -55,7 +55,7 @@ class AuthenticationDialog extends NetworkDialog {
registerText.setOnClickListener(new View.OnClickListener() { registerText.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { public void onClick(View view) {
final NetworkAuthenticationManager mgr = myLink.authenticationManager(); final NetworkAuthenticationManager mgr = myLink.authenticationManager();
if (mgr.registrationSupported()) { if (Util.isRegistrationSupported(myActivity, myLink)) {
myActivity.dismissDialog(NetworkDialog.DIALOG_AUTHENTICATION); myActivity.dismissDialog(NetworkDialog.DIALOG_AUTHENTICATION);
Util.runRegistrationDialog(myActivity, myLink); Util.runRegistrationDialog(myActivity, myLink);
} }
@ -126,7 +126,7 @@ class AuthenticationDialog extends NetworkDialog {
error.setText(myErrorMessage); error.setText(myErrorMessage);
} }
dialog.findViewById(R.id.network_authentication_register).setVisibility(mgr.registrationSupported() ? View.VISIBLE : View.GONE); dialog.findViewById(R.id.network_authentication_register).setVisibility(Util.isRegistrationSupported(myActivity, myLink) ? View.VISIBLE : View.GONE);
View dlgView = dialog.findViewById(R.id.network_authentication_dialog); View dlgView = dialog.findViewById(R.id.network_authentication_dialog);
dlgView.invalidate(); dlgView.invalidate();

View file

@ -208,7 +208,7 @@ abstract class NetworkBaseActivity extends ListActivity
if (actions == null) { if (actions == null) {
return; return;
} }
final int actionCode = actions.getDefaultActionCode(networkTree); final int actionCode = actions.getDefaultActionCode(this, networkTree);
final String confirm = actions.getConfirmText(networkTree, actionCode); final String confirm = actions.getConfirmText(networkTree, actionCode);
if (actionCode == NetworkTreeActions.TREE_SHOW_CONTEXT_MENU) { if (actionCode == NetworkTreeActions.TREE_SHOW_CONTEXT_MENU) {
listView.showContextMenuForChild(view); listView.showContextMenuForChild(view);

View file

@ -189,7 +189,7 @@ class NetworkBookActions extends NetworkTreeActions {
} }
@Override @Override
public int getDefaultActionCode(NetworkTree tree) { public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
if (tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) { if (tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) {
return SHOW_BOOKS_ITEM_ID; return SHOW_BOOKS_ITEM_ID;
} }
@ -207,7 +207,7 @@ class NetworkBookActions extends NetworkTreeActions {
} }
@Override @Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
return false; return false;
} }

View file

@ -127,7 +127,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
} }
@Override @Override
public int getDefaultActionCode(NetworkTree tree) { public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree; final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree;
final NetworkCatalogItem item = catalogTree.Item; final NetworkCatalogItem item = catalogTree.Item;
if (item.URLByType.get(NetworkCatalogItem.URL_CATALOG) != null) { if (item.URLByType.get(NetworkCatalogItem.URL_CATALOG) != null) {
@ -168,7 +168,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
} }
@Override @Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree; final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree;
final NetworkCatalogItem item = catalogTree.Item; final NetworkCatalogItem item = catalogTree.Item;
@ -200,7 +200,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
} }
} }
prepareOptionsItem(menu, SIGNIN_ITEM_ID, signIn); prepareOptionsItem(menu, SIGNIN_ITEM_ID, signIn);
prepareOptionsItem(menu, SIGNUP_ITEM_ID, signIn); prepareOptionsItem(menu, SIGNUP_ITEM_ID, signIn & Util.isRegistrationSupported(activity, item.Link));
prepareOptionsItem(menu, SIGNOUT_ITEM_ID, signOut, "signOut", userName); prepareOptionsItem(menu, SIGNOUT_ITEM_ID, signOut, "signOut", userName);
prepareOptionsItem(menu, REFILL_ACCOUNT_ITEM_ID, refill); prepareOptionsItem(menu, REFILL_ACCOUNT_ITEM_ID, refill);
return true; return true;

View file

@ -147,17 +147,14 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
public CatalogAdapter() { public CatalogAdapter() {
if (myTree instanceof NetworkCatalogRootTree) { if (myTree instanceof NetworkCatalogRootTree) {
NetworkCatalogTree tree = (NetworkCatalogTree) myTree; NetworkCatalogTree tree = (NetworkCatalogTree) myTree;
NetworkAuthenticationManager mgr = tree.Item.Link.authenticationManager(); mySpecialItems = new ArrayList<NetworkTree>();
if (mgr != null) { if (Util.isAccountRefillingSupported(NetworkCatalogActivity.this, tree.Item.Link)) {
mySpecialItems = new ArrayList<NetworkTree>(); mySpecialItems.add(new RefillAccountTree(tree));
if (mgr.refillAccountSupported()) { }
mySpecialItems.add(new RefillAccountTree(tree)); if (mySpecialItems.size() > 0) {
} mySpecialItems.trimToSize();
if (mySpecialItems.size() > 0) { } else {
mySpecialItems.trimToSize(); mySpecialItems = null;
} else {
mySpecialItems = null;
}
} }
} }
} }
@ -248,7 +245,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu); super.onPrepareOptionsMenu(menu);
return NetworkView.Instance().prepareOptionsMenu(menu, myTree); return NetworkView.Instance().prepareOptionsMenu(this, menu, myTree);
} }
@Override @Override

View file

@ -102,11 +102,11 @@ abstract class NetworkTreeActions {
public abstract void buildContextMenu(NetworkBaseActivity activity, ContextMenu menu, NetworkTree tree); public abstract void buildContextMenu(NetworkBaseActivity activity, ContextMenu menu, NetworkTree tree);
public abstract int getDefaultActionCode(NetworkTree tree); public abstract int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree);
public abstract String getConfirmText(NetworkTree tree, int actionCode); public abstract String getConfirmText(NetworkTree tree, int actionCode);
public abstract boolean runAction(NetworkBaseActivity activity, NetworkTree tree, int actionCode); public abstract boolean runAction(NetworkBaseActivity activity, NetworkTree tree, int actionCode);
public abstract boolean createOptionsMenu(Menu menu, NetworkTree tree); public abstract boolean createOptionsMenu(Menu menu, NetworkTree tree);
public abstract boolean prepareOptionsMenu(Menu menu, NetworkTree tree); public abstract boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree);
} }

View file

@ -115,13 +115,13 @@ class NetworkView {
return false; return false;
} }
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
if (!isInitialized()) { if (!isInitialized()) {
return false; return false;
} }
final NetworkTreeActions actions = getActions(tree); final NetworkTreeActions actions = getActions(tree);
if (actions != null) { if (actions != null) {
return actions.prepareOptionsMenu(menu, tree); return actions.prepareOptionsMenu(activity, menu, tree);
} }
return false; return false;
} }

View file

@ -22,6 +22,7 @@ package org.geometerplus.android.fbreader.network;
import android.view.Menu; import android.view.Menu;
import android.view.ContextMenu; import android.view.ContextMenu;
import org.geometerplus.fbreader.network.INetworkLink;
import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.NetworkTree;
import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager;
@ -40,13 +41,28 @@ class RefillAccountActions extends NetworkTreeActions {
public void buildContextMenu(NetworkBaseActivity activity, ContextMenu menu, NetworkTree tree) { public void buildContextMenu(NetworkBaseActivity activity, ContextMenu menu, NetworkTree tree) {
menu.setHeaderTitle(getTitleValue("refillTitle")); menu.setHeaderTitle(getTitleValue("refillTitle"));
addMenuItem(menu, REFILL_VIA_SMS_ITEM_ID, "refillViaSms"); final INetworkLink link = ((RefillAccountTree)tree).Link;
addMenuItem(menu, REFILL_VIA_BROWSER_ITEM_ID, "refillViaBrowser"); if (Util.isSmsAccountRefillingSupported(activity, link)) {
addMenuItem(menu, REFILL_VIA_SMS_ITEM_ID, "refillViaSms");
}
if (Util.isBrowserAccountRefillingSupported(activity, link)) {
addMenuItem(menu, REFILL_VIA_BROWSER_ITEM_ID, "refillViaBrowser");
}
} }
@Override @Override
public int getDefaultActionCode(NetworkTree tree) { public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
return TREE_SHOW_CONTEXT_MENU; final INetworkLink link = ((RefillAccountTree)tree).Link;
final boolean sms = Util.isSmsAccountRefillingSupported(activity, link);
final boolean browser = Util.isBrowserAccountRefillingSupported(activity, link);
if (sms && browser) {
return TREE_SHOW_CONTEXT_MENU;
} else if (sms) {
return REFILL_VIA_SMS_ITEM_ID;
} else /* if (browser) */ {
return REFILL_VIA_BROWSER_ITEM_ID;
}
} }
@Override @Override
@ -60,7 +76,7 @@ class RefillAccountActions extends NetworkTreeActions {
} }
@Override @Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
return false; return false;
} }

View file

@ -59,7 +59,7 @@ class SearchItemActions extends NetworkTreeActions {
} }
@Override @Override
public int getDefaultActionCode(NetworkTree tree) { public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY); final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY);
if (!isLoading) { if (!isLoading) {
return RUN_SEARCH_ITEM_ID; return RUN_SEARCH_ITEM_ID;
@ -78,7 +78,7 @@ class SearchItemActions extends NetworkTreeActions {
} }
@Override @Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) { public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
return false; return false;
} }

View file

@ -30,10 +30,35 @@ import org.geometerplus.fbreader.network.INetworkLink;
import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager;
abstract class Util implements UserRegistrationConstants { abstract class Util implements UserRegistrationConstants {
private static final String REGISTRATION_ACTION =
"android.fbreader.action.NETWORK_LIBRARY_REGISTER";
private static final String SMS_REFILLING_ACTION =
"android.fbreader.action.NETWORK_LIBRARY_SMS_REFILLING";
private static boolean testService(Activity activity, String action, String url) {
if (url == null) {
return false;
}
try {
activity.startActivity(new Intent(action + "_TEST", Uri.parse(url)));
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
static boolean isRegistrationSupported(Activity activity, INetworkLink link) {
return testService(
activity,
REGISTRATION_ACTION,
link.getLink(INetworkLink.URL_SIGN_UP)
);
}
static void runRegistrationDialog(Activity activity, INetworkLink link) { static void runRegistrationDialog(Activity activity, INetworkLink link) {
try { try {
activity.startActivityForResult(new Intent( activity.startActivityForResult(new Intent(
"android.fbreader.action.NETWORK_LIBRARY_REGISTER", REGISTRATION_ACTION,
Uri.parse(link.getLink(INetworkLink.URL_SIGN_UP)) Uri.parse(link.getLink(INetworkLink.URL_SIGN_UP))
), USER_REGISTRATION_REQUEST_CODE); ), USER_REGISTRATION_REQUEST_CODE);
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
@ -53,4 +78,22 @@ abstract class Util implements UserRegistrationConstants {
} }
} }
} }
static boolean isAccountRefillingSupported(Activity activity, INetworkLink link) {
return
isBrowserAccountRefillingSupported(activity, link) ||
isSmsAccountRefillingSupported(activity, link);
}
static boolean isSmsAccountRefillingSupported(Activity activity, INetworkLink link) {
return testService(
activity,
SMS_REFILLING_ACTION,
link.getLink(INetworkLink.URL_MAIN)
);
}
static boolean isBrowserAccountRefillingSupported(Activity activity, INetworkLink link) {
return link.getLink(INetworkLink.URL_REFILL_ACCOUNT) != null;
}
} }

View file

@ -106,21 +106,10 @@ public abstract class NetworkAuthenticationManager {
* refill account * refill account
*/ */
public boolean refillAccountSupported() {
return false;
}
public String refillAccountLink() { public String refillAccountLink() {
return null; return null;
} }
/*
* new User Registration
*/
public boolean registrationSupported() {
return false;
}
public abstract void initUser(String userName, String sid); public abstract void initUser(String userName, String sid);
/* /*

View file

@ -230,11 +230,6 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager {
} }
} }
@Override
public boolean refillAccountSupported() {
return true;
}
@Override @Override
public String refillAccountLink() { public String refillAccountLink() {
final String sid; final String sid;
@ -401,28 +396,6 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager {
myAccount = BuyBookReference.price(reader.Account, "RUB"); myAccount = BuyBookReference.price(reader.Account, "RUB");
} }
@Override
public boolean registrationSupported() {
return true;
}
/*
@Override
public void registerUser(String login, String password, String email) throws ZLNetworkException {
synchronized (this) {
mySidChecked = true;
if (exception != null) {
mySidUserNameOption.setValue("");
mySidOption.setValue("");
throw exception;
}
mySidOption.setValue(xmlReader.Sid);
mySidUserNameOption.setValue(login);
}
}
*/
@Override @Override
public boolean passwordRecoverySupported() { public boolean passwordRecoverySupported() {
return true; return true;