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-catalog
sign up в меню
sign up в диалоге авторизации
0.99:
DONE Доделать регистрацию
* Авторегистрация
* Пополнение счета через 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: механизм авторегистрации
пытаемся войти
если вошли -- ОК
@ -22,7 +30,6 @@ DONE litres: перенести диалог регистрации в плаг
"использовать другой e-mail или выслать пароль на этот?"
если нет такого пользователя -- пытаемся создать
если e-address already in use -- ?
** litres: отправка sms
** litres: механизм покупки книги
если уже logged in -- покупаем
если не хватает денег -- говорим, что надо пополнить счет и предлалагаем варианты:
@ -44,18 +51,3 @@ DONE litres: перенести диалог регистрации в плаг
если e-address already in use -- ?
ручная регистрация
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.SEND_SMS" />
<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>
<category android:name="android.intent.category.DEFAULT" />
<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_1" />
</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 android:name=".UserRegistrationActivity" android:configChanges="orientation|keyboardHidden" android:theme="@android:style/Theme.Dialog">
<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_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);
errorLabel.setVisibility(View.GONE);
errorLabel.setText("");

View file

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

View file

@ -55,7 +55,7 @@ class AuthenticationDialog extends NetworkDialog {
registerText.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
final NetworkAuthenticationManager mgr = myLink.authenticationManager();
if (mgr.registrationSupported()) {
if (Util.isRegistrationSupported(myActivity, myLink)) {
myActivity.dismissDialog(NetworkDialog.DIALOG_AUTHENTICATION);
Util.runRegistrationDialog(myActivity, myLink);
}
@ -126,7 +126,7 @@ class AuthenticationDialog extends NetworkDialog {
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);
dlgView.invalidate();

View file

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

View file

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

View file

@ -127,7 +127,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
}
@Override
public int getDefaultActionCode(NetworkTree tree) {
public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree;
final NetworkCatalogItem item = catalogTree.Item;
if (item.URLByType.get(NetworkCatalogItem.URL_CATALOG) != null) {
@ -168,7 +168,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
}
@Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) {
public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree;
final NetworkCatalogItem item = catalogTree.Item;
@ -200,7 +200,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
}
}
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, REFILL_ACCOUNT_ITEM_ID, refill);
return true;

View file

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

View file

@ -102,11 +102,11 @@ abstract class NetworkTreeActions {
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 boolean runAction(NetworkBaseActivity activity, NetworkTree tree, int actionCode);
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;
}
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) {
public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
if (!isInitialized()) {
return false;
}
final NetworkTreeActions actions = getActions(tree);
if (actions != null) {
return actions.prepareOptionsMenu(menu, tree);
return actions.prepareOptionsMenu(activity, menu, tree);
}
return false;
}

View file

@ -22,6 +22,7 @@ package org.geometerplus.android.fbreader.network;
import android.view.Menu;
import android.view.ContextMenu;
import org.geometerplus.fbreader.network.INetworkLink;
import org.geometerplus.fbreader.network.NetworkTree;
import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager;
@ -40,13 +41,28 @@ class RefillAccountActions extends NetworkTreeActions {
public void buildContextMenu(NetworkBaseActivity activity, ContextMenu menu, NetworkTree tree) {
menu.setHeaderTitle(getTitleValue("refillTitle"));
final INetworkLink link = ((RefillAccountTree)tree).Link;
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
public int getDefaultActionCode(NetworkTree tree) {
public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
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
@ -60,7 +76,7 @@ class RefillAccountActions extends NetworkTreeActions {
}
@Override
public boolean prepareOptionsMenu(Menu menu, NetworkTree tree) {
public boolean prepareOptionsMenu(NetworkBaseActivity activity, Menu menu, NetworkTree tree) {
return false;
}

View file

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

View file

@ -30,10 +30,35 @@ import org.geometerplus.fbreader.network.INetworkLink;
import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager;
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) {
try {
activity.startActivityForResult(new Intent(
"android.fbreader.action.NETWORK_LIBRARY_REGISTER",
REGISTRATION_ACTION,
Uri.parse(link.getLink(INetworkLink.URL_SIGN_UP))
), USER_REGISTRATION_REQUEST_CODE);
} 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
*/
public boolean refillAccountSupported() {
return false;
}
public String refillAccountLink() {
return null;
}
/*
* new User Registration
*/
public boolean registrationSupported() {
return false;
}
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
public String refillAccountLink() {
final String sid;
@ -401,28 +396,6 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager {
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
public boolean passwordRecoverySupported() {
return true;