package tv.emby.embyatv.validation; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.text.InputFilter; import android.text.InputType; import android.text.TextUtils; import android.util.Patterns; import android.view.View; import android.widget.Button; import android.widget.EditText; import mediabrowser.apiinteraction.EmptyResponse; import mediabrowser.apiinteraction.QueryStringDictionary; import mediabrowser.apiinteraction.Response; import mediabrowser.apiinteraction.http.HttpHeaders; import mediabrowser.apiinteraction.http.HttpRequest; import mediabrowser.model.connect.ConnectUser; import mediabrowser.model.registration.AppstoreRegRequest; import mediabrowser.model.registration.RegistrationInfo; import tv.emby.embyatv.R; import tv.emby.embyatv.TvApp; import tv.emby.embyatv.base.BaseActivity; import tv.emby.embyatv.util.DelayedMessage; import tv.emby.embyatv.util.Utils; import tv.emby.iap.ErrorSeverity; import tv.emby.iap.ErrorType; import tv.emby.iap.IResultHandler; import tv.emby.iap.IabValidator; import tv.emby.iap.InAppProduct; import tv.emby.iap.PurchaseActivity; import tv.emby.iap.ResultType; public class UnlockActivity extends BaseActivity { InAppProduct currentProduct; IabValidator validator; String email; static String mbAdminUrl = "https://mb3admin.com/test/admin/service/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Confirm compatibility if (TvApp.getApplication().getCurrentSystemInfo() == null || !Utils.versionGreaterThanOrEqual(TvApp.getApplication().getCurrentSystemInfo().getVersion(), "3.0.5768.7")) { new AlertDialog.Builder(this) .setTitle("Incompatible Server Version") .setMessage("Please update your Emby Server to be compatible with this app.") .setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setCancelable(false) .show(); } else { setContentView(R.layout.activity_unlock); final Activity activity = this; validator = new IabValidator(this, AppValidator.getKey()); validator.validateProductsAsync(new IResultHandler<ResultType>() { @Override public void onResult(ResultType resultType) { Button next = (Button) findViewById(R.id.buttonNext); if (TvApp.getApplication().isPaid()) { next.setVisibility(View.GONE); } else { next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(activity) .setTitle(activity.getString(R.string.lbl_unlock)) .setMessage(activity.getString(R.string.msg_just_unlock_confirm)) .setNegativeButton(activity.getString(R.string.lbl_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Do nothing. } }).setPositiveButton(activity.getString(R.string.lbl_unlock_app), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { purchase(validator.getUnlockProduct()); } }).show(); } }); } Button monthly = (Button) findViewById(R.id.buttonMonthly); final InAppProduct monthlyProduct = validator.getPremiereMonthly(); monthly.setText(getText(R.string.btn_monthly_prefix)+" "+monthlyProduct.getPrice()+getText(R.string.btn_monthly_suffix)); monthly.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // get email getEmailAddress(getString(R.string.msg_email_entry1), new Response<String>() { @Override public void onResponse(String response) { if (!TextUtils.isEmpty(response)) { final String save = response; // confirm it getEmailAddress(getString(R.string.msg_email_entry2), new Response<String>() { @Override public void onResponse(String response) { if (response.equals(save)) { // all good - save and purchase email = response; purchase(monthlyProduct); } else { Utils.showToast(activity, getString(R.string.msg_entries_not_match)); } } @Override public void onError(Exception exception) { Utils.showToast(activity, getString(R.string.msg_invalid_email)); } }); } } @Override public void onError(Exception exception) { Utils.showToast(activity, getString(R.string.msg_invalid_email)); } }); } }); monthly.requestFocus(); } @Override public void onError(ErrorSeverity errorSeverity, ErrorType errorType, String s) { Utils.showToast(activity, s); } }); Button cancel = (Button) findViewById(R.id.buttonCancel); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } } private void getEmailAddress(String msg, final Response<String> response) { // response.onResponse("ebr@ebrsoft.com"); final EditText email = new EditText(this); email.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); new AlertDialog.Builder(this) .setTitle("Email Address") .setMessage(msg) .setView(email) .setPositiveButton(getString(R.string.btn_done), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String text = email.getText().toString(); if (text.contains("@") && text.contains(".")) response.onResponse(text); else response.onError(new Exception("Invalid Email Address")); } }) .show(); } private void purchase(InAppProduct product) { TvApp.getApplication().getLogger().Info("Starting purchase of "+product.getTitle()); currentProduct = product; Intent purchase = new Intent(this, PurchaseActivity.class); purchase.putExtra("sku", currentProduct.getSku()); purchase.putExtra("googleKey", AppValidator.getKey()); startActivityForResult(purchase, 1000); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case RESULT_OK: TvApp.getApplication().getLogger().Info("Purchase of " +currentProduct.getTitle() + " successful"); if (data != null) TvApp.getApplication().getLogger().Info("Purchase token: " + data.getStringExtra("storeToken")); if (currentProduct.getSku().equals(InAppProduct.getCurrentUnlockSku(TvApp.getApplication().getPackageName()))) { TvApp.getApplication().setPaid(true); finish(); } else { if (currentProduct.getEmbyFeatureCode() != null) { if (data == null) { handleRegError("No data returned from IAB library"); } else { // validate and register with the server final ProgressDialog processing = ProgressDialog.show(this, getString(R.string.lbl_please_wait), "Processing..."); AppstoreRegRequest request = new AppstoreRegRequest(); request.setStore(data.getStringExtra("store")); request.setApplication(TvApp.getApplication().getPackageName()); request.setProduct(currentProduct.getSku()); request.setFeature(currentProduct.getEmbyFeatureCode()); request.setType(currentProduct.getProductType().toString()); if (data.getStringExtra("storeId") != null) request.setStoreId(data.getStringExtra("storeId")); request.setStoreToken(data.getStringExtra("storeToken")); request.setEmail(email); request.setAmt(currentProduct.getPrice()); // TvApp.getApplication().getLogger().Debug("Parms: "+TvApp.getApplication().getSerializer().SerializeToString(request)); TvApp.getApplication().getApiClient().RegisterAppstoreSaleAsync(request, new EmptyResponse() { @Override public void onResponse() { TvApp.getApplication().getLogger().Info("Successfully purchased " + currentProduct.getTitle()); new AppValidator().validate(); processing.dismiss(); finish(); } @Override public void onError(Exception exception) { handleRegError(exception.getLocalizedMessage()); processing.dismiss(); } }); } } } break; case RESULT_CANCELED: TvApp.getApplication().getLogger().Info("Purchase cancelled."); if (data != null) TvApp.getApplication().getLogger().Error(data.getStringExtra("data")); break; } } protected void handleRegError(String msg) { new AlertDialog.Builder(this) .setTitle("Registration Error") .setMessage("There was an error registering with the Emby server. Please contact Emby support at http://emby.media/community. "+msg) .setPositiveButton(getString(R.string.btn_ok), null) .show(); } @Override protected void onDestroy() { super.onDestroy(); if (validator != null) validator.dispose(); } }