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:
parent
98470c95ae
commit
329a4eb0c1
16 changed files with 118 additions and 102 deletions
42
TODO.plugins
42
TODO.plugins
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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("");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue