diff --git a/res/layout/in_app.xml b/res/layout/in_app.xml index 7eaa23c8b..69b6562b7 100644 --- a/res/layout/in_app.xml +++ b/res/layout/in_app.xml @@ -15,6 +15,7 @@ diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 2c8a608da..09452bf69 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -1,80 +1,82 @@ - - - sip.linphone.org - stun.linphone.org + + sip.linphone.org org.linphone vnd.android.cursor.item/org.linphone.profile - - false - true - false false false - false false - false - true + true - https://sip3.linphone.org:444/inapp.php + + https://sip3.linphone.org:444/inapp.php + false + false + false + false + false + true + false + false + false + false + false + true + false + + false + false + false + true + + + true + true + 28 + true true 622464153529 - false - false - - false - false - false - - false - false - false - false - true - false - true - false - - true - - true + false true true false + true + false + false - true - - false - false - false + false false false - linphone-android@belledonne-communications.com + true + stun.linphone.org + false + + false + false + false linphone-android-photo-temp linphone-android-photo-%s - false - false - + false false - + false + false false false - true - - false + + linphone-android@belledonne-communications.com true true diff --git a/res/values/strings.xml b/res/values/strings.xml index 62bd17bb9..5edc40d99 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -17,6 +17,8 @@ linphone contacts EEE, d MMM yyyy/MM/dd - HH:mm - + yyyy/MM/dd + dd dd/MM, HH:mm dd/MM HH:mm @@ -118,7 +120,9 @@ Unsupported transport - in-app + In-app + In-app purchase + The trail period expires on %s Enter a number or an address diff --git a/src/org/linphone/AccountPreferencesFragment.java b/src/org/linphone/AccountPreferencesFragment.java index 9e6c98417..5d52619d1 100644 --- a/src/org/linphone/AccountPreferencesFragment.java +++ b/src/org/linphone/AccountPreferencesFragment.java @@ -369,7 +369,7 @@ public class AccountPreferencesFragment extends PreferencesListFragment { CheckBoxPreference friendlistSubscribe = (CheckBoxPreference) advanced.getPreference(8); friendlistSubscribe.setOnPreferenceChangeListener(friendlistSubscribeListener); if(!isNewAccount){ - escape.setChecked(mPrefs.getReplacePlusByZeroZero(n)); + friendlistSubscribe.setChecked(mPrefs.isFriendlistsubscriptionEnabled()); } PreferenceCategory manage = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_manage_key)); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 21386ed85..d27e8670e 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -49,7 +49,6 @@ import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.Reason; import org.linphone.mediastream.Log; import org.linphone.purchase.InAppPurchaseActivity; -import org.linphone.purchase.InAppPurchaseHelper; import org.linphone.ui.AddressText; import org.linphone.xmlrpc.XmlRpcHelper; import org.linphone.xmlrpc.XmlRpcListenerBase; @@ -162,7 +161,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta return; } - boolean useFirstLoginActivity = getResources().getBoolean(R.bool.display_account_wizard_at_first_start); + boolean useFirstLoginActivity = getResources().getBoolean(R.bool.display_account_assistant_at_first_start); if (LinphonePreferences.instance().isProvisioningLoginViewEnabled()) { Intent wizard = new Intent(); wizard.setClass(this, RemoteProvisioningLoginActivity.class); @@ -202,9 +201,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta initButtons(); initSideMenu(); - //ifINAP - getTrialAccount(); - getExpirationAccount(); + if(getResources().getBoolean(R.bool.enabled_in_app_purchase)){ + isTrialAccount(); + } currentFragment = FragmentsAvailable.EMPTY; if (savedInstanceState == null) { @@ -629,6 +628,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta } public void displayInapp() { + checkAndRequestInappPermission(); startActivity(new Intent(LinphoneActivity.this, InAppPurchaseActivity.class)); } @@ -1179,6 +1179,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta public void checkAndRequestReadContactsPermission() { checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_CONTACTS); } + + public void checkAndRequestInappPermission() { + checkAndRequestPermission(Manifest.permission.GET_ACCOUNTS, PERMISSIONS_REQUEST_CONTACTS); + } private boolean willContactsPermissionBeAsked() { return LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.READ_CONTACTS) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS); @@ -1206,6 +1210,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta int readExternalStorage = getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, getPackageName()); Log.i("[Permission] Read external storage permission is " + (readExternalStorage == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); int camera = getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()); + int accounts = getPackageManager().checkPermission(Manifest.permission.GET_ACCOUNTS, getPackageName()); Log.i("[Permission] Camera permission is " + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); if (readExternalStorage != PackageManager.PERMISSION_GRANTED) { @@ -1394,6 +1399,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta String sipUri = extras.getString("ChatContactSipUri"); doNotGoToCallActivity = true; displayChat(sipUri); + } else if (extras != null && extras.getBoolean("GoToInapp", false)) { + LinphoneService.instance().removeMessageNotification(); + doNotGoToCallActivity = true; + displayInapp(); } else if (extras != null && extras.getBoolean("Notification", false)) { if (LinphoneManager.getLc().getCallsNb() > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; @@ -1461,7 +1470,11 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta public void initSideMenu() { sideMenu = (DrawerLayout) findViewById(R.id.side_menu); - sideMenuItems = new String[]{getResources().getString(R.string.menu_assistant),getResources().getString(R.string.menu_settings),getResources().getString(R.string.menu_about),"Inapp"}; + if(getResources().getBoolean(R.bool.in_app_purchase_in_settings)){ + sideMenuItems = new String[]{getResources().getString(R.string.menu_assistant),getResources().getString(R.string.menu_settings),getResources().getString(R.string.menu_about), getResources().getString(R.string.inapp)}; + } else { + sideMenuItems = new String[]{getResources().getString(R.string.menu_assistant),getResources().getString(R.string.menu_settings),getResources().getString(R.string.menu_about)}; + } sideMenuContent = (RelativeLayout) findViewById(R.id.side_menu_content); sideMenuItemList = (ListView)findViewById(R.id.item_list); menu = (ImageView) findViewById(R.id.side_menu_button); @@ -1479,8 +1492,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta if (sideMenuItemList.getAdapter().getItem(i).toString().equals(getString(R.string.menu_assistant))) { LinphoneActivity.instance().displayAssistant(); } - if (sideMenuItemList.getAdapter().getItem(i).toString().equals("Inapp")) { - LinphoneActivity.instance().displayInapp(); + if(getResources().getBoolean(R.bool.in_app_purchase_in_settings)){ + if (sideMenuItemList.getAdapter().getItem(i).toString().equals(getString(R.string.inapp))) { + LinphoneActivity.instance().displayInapp(); + } } openOrCloseSideMenu(false); } @@ -1657,17 +1672,17 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta } //Inapp Purchase - private void getTrialAccount() { + private void isTrialAccount() { if(LinphoneManager.getLc().getDefaultProxyConfig() != null) { XmlRpcHelper helper = new XmlRpcHelper(); helper.isTrialAccountAsync(new XmlRpcListenerBase() { @Override public void onTrialAccountFetched(boolean isTrial) { - if(isTrial){ - displayInappDialog(); + if (isTrial) { + getExpirationAccount(); } } - }, LinphonePreferences.instance().getAccountUsername(0), LinphonePreferences.instance().getAccountHa1(0)); + }, LinphonePreferences.instance().getAccountUsername(LinphonePreferences.instance().getDefaultAccountIndex()), LinphonePreferences.instance().getAccountHa1(LinphonePreferences.instance().getDefaultAccountIndex())); } } @@ -1677,44 +1692,47 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta helper.getAccountExpireAsync(new XmlRpcListenerBase() { @Override public void onAccountExpireFetched(String result) { - Log.w("RESULT " + result); + if (result != null) { + long timestamp = Long.parseLong(result); + + Calendar calresult = Calendar.getInstance(); + calresult.setTimeInMillis(timestamp); + + int diff = getDiffDays(calresult, Calendar.getInstance()); + if (diff != -1 && diff <= getResources().getInteger(R.integer.number_days_reminder)) { + displayInappNotification(timestampToHumanDate(calresult)); + } + } + } - }, LinphonePreferences.instance().getAccountUsername(0), LinphonePreferences.instance().getAccountHa1(0)); + }, LinphonePreferences.instance().getAccountUsername(LinphonePreferences.instance().getDefaultAccountIndex()), LinphonePreferences.instance().getAccountHa1(LinphonePreferences.instance().getDefaultAccountIndex())); } } - public Dialog displayInappDialog(){ - final Dialog dialog = new Dialog(this); - dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC)); - d.setAlpha(200); - dialog.setContentView(R.layout.input_dialog); - dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); - dialog.getWindow().setBackgroundDrawable(d); - - TextView customText = (TextView) dialog.findViewById(R.id.customText); - customText.setText(getString(R.string.error_bad_credentials)); - - Button retry = (Button) dialog.findViewById(R.id.retry); - Button cancel = (Button) dialog.findViewById(R.id.cancel); - - retry.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - - } - }); - - cancel.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - } - }); - - return dialog; + public void displayInappNotification(String date) { + if (LinphonePreferences.instance().getLastDateNotificationShown() != null && timestampToHumanDate(Calendar.getInstance()).equals(LinphonePreferences.instance().getLastDateNotificationShown())) { + return; + } else { + LinphonePreferences.instance().setLastDateNotificationShown(timestampToHumanDate(Calendar.getInstance())); + } + LinphoneService.instance().displayInappNotification(String.format(getString(R.string.inapp_notification_content), date)); } + private String timestampToHumanDate(Calendar cal) { + SimpleDateFormat dateFormat; + dateFormat = new SimpleDateFormat(getResources().getString(R.string.inapp_popup_date_format)); + return dateFormat.format(cal.getTime()); + } + + private int getDiffDays(Calendar cal1, Calendar cal2) { + if (cal1 == null || cal2 == null) { + return -1; + } + if(cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)){ + return cal1.get(Calendar.DAY_OF_YEAR) - cal2.get(Calendar.DAY_OF_YEAR); + } + return -1; + } } interface ContactPicked { diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index 3c9fb3718..23e0b1b87 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -1311,6 +1311,14 @@ public class LinphonePreferences { return purchasables; } + public String getLastDateNotificationShown(){ + return getConfig().getString("app", "notification_date", null); + } + + public void setLastDateNotificationShown(String date){ + getConfig().setString("app", "notification_date", date); + } + public String getXmlRpcServerUrl() { return getConfig().getString("app", "server_url", null); } diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 813df0236..878b0be18 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -455,6 +455,16 @@ public final class LinphoneService extends Service { notifyWrapper(MESSAGE_NOTIF_ID, mMsgNotif); } + + public void displayInappNotification(String message) { + Intent notifIntent = new Intent(this, LinphoneActivity.class); + notifIntent.putExtra("GoToInapp", true); + + PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); + mNotif = Compatibility.createSimpleNotification(getApplicationContext(), getString(R.string.inapp_notification_title), message, notifContentIntent); + + notifyWrapper(NOTIF_ID, mNotif); + } public void removeMessageNotification() { mNM.cancel(MESSAGE_NOTIF_ID); diff --git a/src/org/linphone/assistant/AssistantActivity.java b/src/org/linphone/assistant/AssistantActivity.java index 921b1db61..46c9e84c7 100644 --- a/src/org/linphone/assistant/AssistantActivity.java +++ b/src/org/linphone/assistant/AssistantActivity.java @@ -25,8 +25,6 @@ import org.linphone.LinphoneUtils; import org.linphone.LinphonePreferences.AccountBuilder; import org.linphone.R; import org.linphone.StatusFragment; -import org.linphone.core.LinphoneAccountCreator; -import org.linphone.core.LinphoneAccountCreatorImpl; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneCore; @@ -82,7 +80,6 @@ private static AssistantActivity instance; private boolean remoteProvisioningInProgress; private boolean echoCancellerAlreadyDone; private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 201; - private static final int PERMISSIONS_READ_PHONE_STATE = 202; public CountryListFragment.Country country; public String phone_number; @@ -196,10 +193,6 @@ private static AssistantActivity instance; transaction.commitAllowingStateLoss(); } - public AssistantFragmentsEnum getCurrentFragment() { - return currentFragment; - } - @Override public void onClick(View v) { int id = v.getId(); @@ -207,7 +200,7 @@ private static AssistantActivity instance; if (id == R.id.assistant_cancel) { hideKeyboard(); LinphonePreferences.instance().firstLaunchSuccessful(); - if (getResources().getBoolean(R.bool.setup_cancel_move_to_back)) { + if (getResources().getBoolean(R.bool.assistant_cancel_move_to_back)) { moveTaskToBack(true); } else { LinphonePreferences.instance().firstLaunchSuccessful(); @@ -224,7 +217,7 @@ private static AssistantActivity instance; public void onBackPressed() { if (currentFragment == firstFragment) { LinphonePreferences.instance().firstLaunchSuccessful(); - if (getResources().getBoolean(R.bool.setup_cancel_move_to_back)) { + if (getResources().getBoolean(R.bool.assistant_cancel_move_to_back)) { moveTaskToBack(true); } else { LinphonePreferences.instance().firstLaunchSuccessful(); @@ -254,10 +247,6 @@ private static AssistantActivity instance; } } - public void checkAndRequestReadPhoneState() { - checkAndRequestPermission(Manifest.permission.READ_PHONE_STATE, 0); - } - public void checkAndRequestAudioPermission() { checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, 0); } @@ -393,11 +382,6 @@ private static AssistantActivity instance; saveCreatedAccount(username, password, displayName, null, domain, transport); } - public void loadLinphoneConfig(){ - //LinphoneManager.getInstance().loadConfig(); - //LinphoneManager.getInstance().restartLinphoneCore(); - } - private void launchDownloadCodec() { OpenH264DownloadHelper downloadHelper = LinphoneCoreFactory.instance().createOpenH264DownloadHelper(); if (Version.getCpuAbis().contains("armeabi-v7a") && !Version.getCpuAbis().contains("x86") && !downloadHelper.isCodecFound()) { diff --git a/src/org/linphone/assistant/CreateAccountCodeActivationFragment.java b/src/org/linphone/assistant/CreateAccountCodeActivationFragment.java index f874afc7b..77df0e82d 100644 --- a/src/org/linphone/assistant/CreateAccountCodeActivationFragment.java +++ b/src/org/linphone/assistant/CreateAccountCodeActivationFragment.java @@ -1,6 +1,6 @@ package org.linphone.assistant; /* -CreateAccountActivationFragment.java +CreateAccountCodeActivationFragment.java Copyright (C) 2015 Belledonne Communications, Grenoble, France This program is free software; you can redistribute it and/or @@ -42,9 +42,6 @@ import org.linphone.core.LinphoneXmlRpcSession; import org.linphone.core.LinphoneXmlRpcSessionImpl; import org.linphone.mediastream.Log; -/** - * @author Sylvain Berfini - */ public class CreateAccountCodeActivationFragment extends Fragment { private String username, phone, ha1; private EditText code; diff --git a/src/org/linphone/assistant/CreateAccountFragment.java b/src/org/linphone/assistant/CreateAccountFragment.java index a2df9e686..c17cb2d21 100644 --- a/src/org/linphone/assistant/CreateAccountFragment.java +++ b/src/org/linphone/assistant/CreateAccountFragment.java @@ -32,7 +32,6 @@ import org.linphone.core.LinphoneXmlRpcRequestImpl; import org.linphone.core.LinphoneXmlRpcSession; import org.linphone.core.LinphoneXmlRpcSessionImpl; import org.linphone.xmlrpc.XmlRpcHelper; -import org.linphone.mediastream.Log; import android.Manifest; import android.accounts.Account; @@ -83,8 +82,11 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On private LinphoneAccountCreator accountCreator; private String getUsername() { - String username = usernameEdit.getText().toString(); - return username.toLowerCase(Locale.getDefault()); + if(usernameEdit != null) { + String username = usernameEdit.getText().toString(); + return username.toLowerCase(Locale.getDefault()); + } + return null; } private String getPhoneNumber(){ @@ -134,27 +136,8 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On usernameError = (TextView) view.findViewById(R.id.username_error); usernameEdit = (EditText) view.findViewById(R.id.username); - usernameEdit.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - /*if(useUsername.isChecked() && usernameEdit.getText().length() > 0) { - sipUri.setText("Sip uri is sip:" + s.toString() + "@sip.linphone.org"); - } else { - if(phoneNumberEdit.getText().length() > 0){ - sipUri.setText("Sip uri is sip:" + phoneNumberEdit.getText().toString()+ "@sip.linphone.org"); - } else { - sipUri.setText(""); - } - }*/ - } - - @Override - public void afterTextChanged(Editable s) {} - }); usernameLayout = (LinearLayout) view.findViewById(R.id.username_layout); + addUsernameHandler(usernameEdit, null); } @@ -177,7 +160,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On addXMLRPCConfirmPasswordHandler(passwordEdit, passwordConfirmEdit, null); addXMLRPCEmailHandler(emailEdit, null); - if (getResources().getBoolean(R.bool.pre_fill_email_in_wizard)) { + if (getResources().getBoolean(R.bool.pre_fill_email_in_assistant)) { Account[] accounts = AccountManager.get(getActivity()).getAccountsByType("com.google"); for (Account account: accounts) { @@ -199,7 +182,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On updateApplyButton(); createAccount = (Button) view.findViewById(R.id.assistant_create); - createAccount.setEnabled(true); + createAccount.setEnabled(false); createAccount.setOnClickListener(new OnClickListener() { public void onClick(View v) { if(getResources().getBoolean(R.bool.isTablet)) { @@ -207,7 +190,11 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On createAccountWithEmail(getUsername(), passwordEdit.getText().toString(), emailEdit.getText().toString(), false); } } else { - createAccountWithPhoneNumber(getUsername(), "", getPhoneNumber(), false); + if(getResources().getBoolean(R.bool.assistant_allow_username)){ + createAccountWithPhoneNumber(getUsername(), "", getPhoneNumber(), false); + } else { + createAccountWithPhoneNumber(getPhoneNumber(), "", getPhoneNumber(), false); + } } } }); @@ -292,7 +279,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On } private boolean isUsernameCorrect(String username) { - if (getResources().getBoolean(R.bool.allow_only_phone_numbers_in_wizard)) { + if (getResources().getBoolean(R.bool.allow_only_phone_numbers_in_assistant)) { LinphoneProxyConfig lpc = LinphoneManager.getLc().createProxyConfig(); return lpc.isPhoneNumber(username); } else { @@ -439,7 +426,6 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On public void afterTextChanged(Editable s) { if (s.length() > 0) { phoneNumberOk = false; - String phoneNumber = getPhoneNumber(); String countryCode = dialCode.getText().toString(); if(countryCode != null && countryCode.startsWith("+")) { countryCode = countryCode.substring(1); @@ -639,7 +625,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On @Override public void onAccountCreatorIsAccountUsed(LinphoneAccountCreator accountCreator, final Status status) { - if(useUsername.isChecked()){ + if(getResources().getBoolean(R.bool.assistant_allow_username) && useUsername.isChecked()){ if (status.equals(Status.AccountNotExist)) { usernameOk = true; displayError(usernameOk, usernameError, usernameEdit, errorForStatus(status)); @@ -679,4 +665,9 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On @Override public void onAccountCreatorIsAccountActivated(LinphoneAccountCreator accountCreator, Status status) { } + + @Override + public void onAccountCreatorPhoneAccountRecovered(LinphoneAccountCreator accountCreator, Status status) { + + } } diff --git a/src/org/linphone/assistant/LinphoneLoginFragment.java b/src/org/linphone/assistant/LinphoneLoginFragment.java index e889336b1..88bd0161e 100644 --- a/src/org/linphone/assistant/LinphoneLoginFragment.java +++ b/src/org/linphone/assistant/LinphoneLoginFragment.java @@ -69,7 +69,7 @@ public class LinphoneLoginFragment extends Fragment implements OnClickListener, return; } - AssistantActivity.instance().linphoneLogIn(login.getText().toString(), password.getText().toString(), displayName.getText().toString(), getResources().getBoolean(R.bool.setup_account_validation_mandatory)); + AssistantActivity.instance().linphoneLogIn(login.getText().toString(), password.getText().toString(), displayName.getText().toString(), getResources().getBoolean(R.bool.assistant_account_validation_mandatory)); } @Override diff --git a/src/org/linphone/assistant/WelcomeFragment.java b/src/org/linphone/assistant/WelcomeFragment.java index d0a767451..b85120800 100644 --- a/src/org/linphone/assistant/WelcomeFragment.java +++ b/src/org/linphone/assistant/WelcomeFragment.java @@ -42,21 +42,21 @@ public class WelcomeFragment extends Fragment implements OnClickListener { createAccount.setOnClickListener(this); logLinphoneAccount = (Button) view.findViewById(R.id.login_linphone); - if (getResources().getBoolean(R.bool.hide_linphone_accounts_wizard)) { + if (getResources().getBoolean(R.bool.hide_linphone_accounts_in_assistant)) { logLinphoneAccount.setVisibility(View.GONE); } else { logLinphoneAccount.setOnClickListener(this); } logGenericAccount = (Button) view.findViewById(R.id.login_generic); - if (getResources().getBoolean(R.bool.hide_generic_accounts_wizard)) { + if (getResources().getBoolean(R.bool.hide_generic_accounts_in_assistant)) { logGenericAccount.setVisibility(View.GONE); } else { logGenericAccount.setOnClickListener(this); } remoteProvisioning = (Button) view.findViewById(R.id.remote_provisioning); - if (getResources().getBoolean(R.bool.hide_remote_provisioning_in_wizard)) { + if (getResources().getBoolean(R.bool.hide_remote_provisioning_in_assistant)) { remoteProvisioning.setVisibility(View.GONE); } else { remoteProvisioning.setOnClickListener(this); diff --git a/src/org/linphone/purchase/InAppPurchaseActivity.java b/src/org/linphone/purchase/InAppPurchaseActivity.java index bd84033d0..44e7af4ff 100644 --- a/src/org/linphone/purchase/InAppPurchaseActivity.java +++ b/src/org/linphone/purchase/InAppPurchaseActivity.java @@ -36,6 +36,7 @@ import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.Toast; /** @@ -45,6 +46,7 @@ public class InAppPurchaseActivity extends Activity implements InAppPurchaseList private static InAppPurchaseActivity instance; private InAppPurchaseHelper inAppPurchaseHelper; private ImageView cancel, back; + private ProgressBar inProgress; private List purchasedItems; private Fragment fragment; @@ -57,6 +59,9 @@ public class InAppPurchaseActivity extends Activity implements InAppPurchaseList inAppPurchaseHelper = new InAppPurchaseHelper(this, this); setContentView(R.layout.in_app); + inProgress = (ProgressBar) findViewById(R.id.purchaseItemsFetchInProgress); + inProgress.setVisibility(View.VISIBLE); + back = (ImageView) findViewById(R.id.back); back.setOnClickListener(this); back.setVisibility(View.INVISIBLE); @@ -77,7 +82,7 @@ public class InAppPurchaseActivity extends Activity implements InAppPurchaseList changeFragment(fragment); } - public void displayStore(Purchasable item) { + public void displayPurchase(Purchasable item) { Bundle extra = new Bundle(); extra.putString("item_id",item.getId()); fragment = new InAppPurchaseFragment(); @@ -136,7 +141,7 @@ public class InAppPurchaseActivity extends Activity implements InAppPurchaseList @Override public void onAvailableItemsForPurchaseQueryFinished(ArrayList items) { //purchasableItemsLayout.removeAllViews(); - + inProgress.setVisibility(View.GONE); purchasedItems = new ArrayList(); for (Purchasable item : items) { purchasedItems.add(item); @@ -200,6 +205,7 @@ public class InAppPurchaseActivity extends Activity implements InAppPurchaseList mHandler.post(new Runnable() { @Override public void run() { + inProgress.setVisibility(View.GONE); Toast.makeText(InAppPurchaseActivity.this, error, Toast.LENGTH_LONG).show(); } }); diff --git a/src/org/linphone/purchase/InAppPurchaseFragment.java b/src/org/linphone/purchase/InAppPurchaseFragment.java index 4657a2ed8..21dcff4d2 100644 --- a/src/org/linphone/purchase/InAppPurchaseFragment.java +++ b/src/org/linphone/purchase/InAppPurchaseFragment.java @@ -23,11 +23,13 @@ import android.os.Bundle; import android.os.Handler; import android.text.Editable; import android.text.TextWatcher; +import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.TextView; import org.linphone.LinphoneManager; @@ -39,15 +41,17 @@ import org.linphone.xmlrpc.XmlRpcHelper; import org.linphone.xmlrpc.XmlRpcListenerBase; import java.util.Locale; +import java.util.regex.Pattern; public class InAppPurchaseFragment extends Fragment implements View.OnClickListener { - + private LinearLayout usernameLayout; private EditText username, email; private TextView errorMessage; - private boolean usernameOk = false; + private boolean usernameOk = false, emailOk = false; private Handler mHandler = new Handler(); + private String defaultUsername, defaultEmail; private Button buyItemButton, recoverAccountButton; @Override @@ -61,19 +65,36 @@ public class InAppPurchaseFragment extends Fragment implements View.OnClickListe String id = getArguments().getString("item_id"); Purchasable item = InAppPurchaseActivity.instance().getPurchasedItem(id); - - Log.w("Item store " + item.getDescription()); - buyItemButton = (Button) view.findViewById(R.id.inapp_button); displayBuySubscriptionButton(item); + defaultEmail = InAppPurchaseActivity.instance().getGmailAccount(); + defaultUsername = LinphonePreferences.instance().getAccountUsername(LinphonePreferences.instance().getDefaultAccountIndex()); + + usernameLayout = (LinearLayout) view.findViewById(R.id.username_layout); username = (EditText) view.findViewById(R.id.username); - username.setText(LinphonePreferences.instance().getAccountUsername(0)); + if(!getResources().getBoolean(R.bool.hide_username_in_inapp)){ + usernameLayout.setVisibility(View.VISIBLE); + username.setText(LinphonePreferences.instance().getAccountUsername(LinphonePreferences.instance().getDefaultAccountIndex())); + + addUsernameHandler(username, errorMessage); + } else { + if(defaultUsername != null){ + usernameLayout.setVisibility(View.GONE); + usernameOk = true; + } + } + email = (EditText) view.findViewById(R.id.email); - email.setText(InAppPurchaseActivity.instance().getGmailAccount()); + if(defaultEmail != null){ + email.setText(defaultEmail); + emailOk = true; + } + + buyItemButton.setEnabled(emailOk && usernameOk); errorMessage = (TextView) view.findViewById(R.id.username_error); - addUsernameHandler(username, errorMessage); + return view; } @@ -102,6 +123,36 @@ public class InAppPurchaseFragment extends Fragment implements View.OnClickListe }); } + private void addEmailHandler(final EditText field, final TextView errorMessage) { + field.addTextChangedListener(new TextWatcher() { + public void afterTextChanged(Editable s) { + + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + public void onTextChanged(CharSequence s, int start, int count, int after) { + emailOk = false; + String email = s.toString(); + if (isEmailCorrect(email)) { + emailOk = true; + errorMessage.setText(""); + } else { + errorMessage.setText(R.string.wizard_email_incorrect); + } + if (buyItemButton != null) buyItemButton.setEnabled(emailOk && usernameOk); + if (recoverAccountButton != null) recoverAccountButton.setEnabled(emailOk && usernameOk); + } + }); + } + + private boolean isEmailCorrect(String email) { + Pattern emailPattern = Patterns.EMAIL_ADDRESS; + return emailPattern.matcher(email).matches(); + } + private boolean isUsernameCorrect(String username) { LinphoneProxyConfig lpc = LinphoneManager.getLc().createProxyConfig(); @@ -109,33 +160,17 @@ public class InAppPurchaseFragment extends Fragment implements View.OnClickListe } private void displayBuySubscriptionButton(Purchasable item) { - //View layout = LayoutInflater.from(this).inflate(R.layout.in_app_purchasable, purchasableItemsLayout); - //Button button = (Button) layout.findViewById(R.id.inapp_button); buyItemButton.setText("Buy account (" + item.getPrice() + ")"); buyItemButton.setTag(item); buyItemButton.setOnClickListener(this); - /*XmlRpcHelper xmlRpcHelper = new XmlRpcHelper(); - xmlRpcHelper.createAccountAsync(new XmlRpcListenerBase() { - @Override - public void onAccountCreated(String result) { - //TODO - } - }, getUsername(), email.getText().toString(), null);*/ - - buyItemButton.setEnabled(usernameOk); + buyItemButton.setEnabled(usernameOk && emailOk); } @Override public void onClick(View v) { Purchasable item = (Purchasable) v.getTag(); if (v.equals(recoverAccountButton)) { - //XmlRpcHelper xmlRpcHelper = new XmlRpcHelper(); - /*xmlRpcHelper.createAccountAsync(new XmlRpcListenerBase() { - @Override - public void onAccountCreated(String result) { - //TODO - } - }, getUsername(), email.getText().toString(), null);*/ + //TODO } else { InAppPurchaseActivity.instance().buyInapp(getUsername(), item); } diff --git a/src/org/linphone/purchase/InAppPurchaseListFragment.java b/src/org/linphone/purchase/InAppPurchaseListFragment.java index 2acf64ec2..bc8b031b5 100644 --- a/src/org/linphone/purchase/InAppPurchaseListFragment.java +++ b/src/org/linphone/purchase/InAppPurchaseListFragment.java @@ -95,6 +95,6 @@ public class InAppPurchaseListFragment extends Fragment implements AdapterView.O @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Purchasable item = (Purchasable) view.getTag(); - InAppPurchaseActivity.instance().displayStore(item); + InAppPurchaseActivity.instance().displayPurchase(item); } }