I am trying to implement JS interface in my WebView. I created a separate class with a method which calls listener, subsequently the string caught by listener should be put in the intent (in MainActivity) and intent finishes.
MainActivity.kt:
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
import sbs.pros.app.databinding.ActivityMainBinding
typealias IDListener = (qr: String) -> Unit
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val answerIntent = Intent()
#SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPayBinding.inflate(layoutInflater)
val WebView = binding.webView
val webSettings: WebSettings = WebView.settings
WebView.settings.javaScriptEnabled = true
WebView.settings.javaScriptCanOpenWindowsAutomatically = true
webSettings.builtInZoomControls = false
WebView.webViewClient = WebViewClient()
WebView.webChromeClient = WebChromeClient()
WebView.addJavascriptInterface(WebAppInterface(this
) { id ->
answerIntent.putExtra("pay", id)
setResult(RESULT_OK)
finish()
}, "AndroidInterface")
WebView.setInitialScale(160)
WebView.loadUrl("https://pros.sbs/payment/create_payment.php?apicall=one_address")
setContentView(binding.root)
}
}
class WebAppInterface internal constructor(c: Context, listener: IDListener) {
var mContext: Context = c
fun WebAppInterface(context: Context) {
this.mContext = context
}
#JavascriptInterface
#SuppressWarnings("unused")
fun getID(id: String?, listener: IDListener) {
if (id != null) {
listener(id)
}
}
}
create_payment.php:
<script src="javascript.js">
function giveID(id) {
AndroidInterface.getID(id);
}
</script>
<?php
if(null !==filter_input(INPUT_GET, 'apicall')){
switch(filter_input(INPUT_GET, 'apicall')){
case 'one_address':
?>
<script src="javascript.js">
giveID('some_id');
</script>
<?php
break;
}
}
The intent then should finish, showing a result (String) in a separate TextView. Unfortunately, that does not happen and the result returned is null. Please help me to find the problem with the interface.
Related
I have created an application where it scans bar codes and QR codes on the phone and send an email of the collected data to my personal email which is a gmail. However, recently it stopped sending emails and prompted me an error as shown below:
javax.mail.authenticationfailedexception: [EOF]
NOTE: I am relatively new at this
I have been told to change it from SMTP to SSL but I cant seem to fix the issue.
package com.example.createexcelsample;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import java.nio.charset.Charset;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import static android.content.ContentValues.TAG;
public class SendMail extends AsyncTask<Void, Void, Void> {
private Context context;
private Session session;
private String email;
private String subject;
private String message;
private String fileName;
private MyWebServiceResult listener;
public String SendError = "";
private ProgressDialog progressDialog;
private String email_uid = "EMAIL";//Email written here
private String email_pwd = "123456";
/*URL url = new URL("https://office365.com");
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
//copyInputStreamToOutputStream(in, System.out);*/
public interface MyWebServiceResult {
public void onSendIsComplete();
public void onSendError(String Error);
}
public void setWebServiceResult(MyWebServiceResult listener) {
this.listener = listener;
}
public SendMail(Context context, String email, String subject, String message,String fileName,String email_uid, String email_pwd){
//this.email_uid = email_uid;
//this.email_pwd = email_pwd;
this.context = context;
this.email = email;
this.subject = subject;
this.message = message;
this.fileName = fileName;
this.listener = null;
}
#Override
protected void onPreExecute() {
}
#Override
protected Void doInBackground(Void... params) {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
//props.put("mail.smtp.host", "smtp.gmail.com");
/* props.put("mail.smtp.host", "212.12.184.20");
props.put("mail.smtp.port", "110");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");*/
//props.put("mail.smtp.ssl.trust", "212.12.184.20");
session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(email_uid, email_pwd);
}
});
try {
MimeMessage mm = new MimeMessage(session);
mm.setFrom(new InternetAddress(email_uid));
mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
mm.setSubject(subject);
mm.setText("body");
MimeBodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileName);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
mm.setContent(multipart);
SendError = "";
Transport.send(mm);
}
catch (MessagingException e) {
SendError = e.toString().toString();
}
return null;
}
#Override
protected void onPostExecute(Void result) {
// progressDialog.dismiss();
if (SendError.toString().isEmpty()){
listener.onSendIsComplete();
} else {
listener.onSendError(SendError);
}
}
/* public void hideSoftKeyboard(AutoProgramingValid activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
AutoProgramingValid.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(), 0);
}*/
}
Afternoon! For starters, I'm using Kotlin to build a tinder-like app with cards and a swiping function inside Android Studio.
I'm trying to populate these cards with an image and 2 text-fields with data from Firebase.. And I can't seem to do it. My difficulty with it seems trivial but it's tripping me up pretty bad.
It looks to me like the app is correctly reading the only 2 datasets currently in the database, evident by only showing 2 cards - but I can't get it to read and display the name, location and image of each of the datasets.
I've attached the CardAdapter.kt file where the values aren't getting read / updated here:
package com.sit708.coupledApp.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.bumptech.glide.Glide
import com.sit708.coupledApp.R
import com.sit708.coupledApp.util.Dates
import com.sit708.coupledApp.activities.UserInfoActivity
class CardsAdapter(context: Context?, resourceId: Int, dates: List<Dates>): ArrayAdapter<Dates>(
context!!, resourceId, dates) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val date = getItem(position)
val finalView = convertView ?: LayoutInflater.from(context).inflate(R.layout.item, parent, false)
val name = finalView.findViewById<TextView>(R.id.nameTV)
val userInfo = finalView.findViewById<LinearLayout>(R.id.userInfoLayout)
val image = finalView.findViewById<ImageView>(R.id.photoIV)
/*THESE VALUES AREN'T GETTING READ, UPDATED OR DISPLAYED*/
name.text = "${date?.dateName}, ${date?.dateLocation}"
Glide.with(context)
.load(date?.dateImg)
.into(image)
userInfo.setOnClickListener {
finalView.context.startActivity(UserInfoActivity.newIntent(finalView.context, date?.dateID))
}
return finalView
}
}
Here you can see that the comma is being displayed but not the name or location
Here is my SwipeFragment.kt just in case this proves useful:
package com.sit708.coupledApp.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.ValueEventListener
import com.lorentzos.flingswipe.SwipeFlingAdapterView
import com.sit708.coupledApp.R
import com.sit708.coupledApp.util.Dates
import com.sit708.coupledApp.activities.TinderCallback
import com.sit708.coupledApp.adapters.CardsAdapter
import com.sit708.coupledApp.databinding.FragmentSwipeBinding
import com.sit708.coupledApp.util.*
class SwipeFragment : Fragment() {
private var _binding: FragmentSwipeBinding? = null
private val binding get() = _binding!!
private var callback: TinderCallback? = null
private lateinit var dateId: String
private lateinit var dateDatabase: DatabaseReference
private lateinit var chatDatabase: DatabaseReference
private lateinit var userDatabase: DatabaseReference
private var cardsAdapter: ArrayAdapter<Dates>? = null
private var rowItems = ArrayList<Dates>()
private var dateName: String? = null
private var dateImg: String? = null
private var dateLocation: String? = null
fun setCallback(callback: TinderCallback) {
this.callback = callback
dateId = callback.onGetUserId()
userDatabase = callback.getUserDatabase()
chatDatabase = callback.getChatDatabase()
dateDatabase = callback.getDateDatabase()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentSwipeBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
dateDatabase.child(dateId).addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
val date = p0.getValue(Dates::class.java)
dateName = date?.dateName
dateImg = date?.dateImg
dateLocation = date?.dateLocation
populateItems()
}
})
cardsAdapter = CardsAdapter(context, R.layout.item, rowItems)
binding.frame.adapter = cardsAdapter
binding.frame.setFlingListener(object : SwipeFlingAdapterView.onFlingListener {
override fun removeFirstObjectInAdapter() {
rowItems.removeAt(0)
cardsAdapter?.notifyDataSetChanged()
}
override fun onLeftCardExit(p0: Any?) {
var date = p0 as Dates
dateDatabase.child(date.dateID.toString()).child(DATA_SWIPES_LEFT).child(dateId).setValue(true)
}
override fun onRightCardExit(p0: Any?) {
val selectedDates = p0 as Dates
val selectedDateId = selectedDates.dateID
if (!selectedDateId.isNullOrEmpty()) {
dateDatabase.child(dateId).child(DATA_SWIPES_RIGHT)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.hasChild(selectedDateId)) {
Toast.makeText(context, "Match!", Toast.LENGTH_SHORT).show()
val chatKey = chatDatabase.push().key
if (chatKey != null) {
dateDatabase.child(dateId).child(DATA_SWIPES_RIGHT).child(selectedDateId)
.removeValue()
dateDatabase.child(dateId).child(DATA_MATCHES).child(selectedDateId)
.setValue(chatKey)
dateDatabase.child(selectedDateId).child(DATA_MATCHES).child(dateId)
.setValue(chatKey)
chatDatabase.child(chatKey).child(dateId).child(DATA_DATE_NAME).setValue(dateName)
chatDatabase.child(chatKey).child(dateId).child(DATA_DATE_IMAGE)
.setValue(dateImg)
chatDatabase.child(chatKey).child(selectedDateId).child(DATA_NAME)
.setValue(selectedDates.dateName)
}
} else {
dateDatabase.child(selectedDateId).child(DATA_SWIPES_RIGHT).child(dateId)
.setValue(true)
}
}
})
}
}
override fun onAdapterAboutToEmpty(p0: Int) {
}
override fun onScroll(p0: Float) {
}
})
binding.likeButton.setOnClickListener {
if (rowItems.isNotEmpty()) {
binding.frame.topCardListener.selectRight()
}
}
binding.dislikeButton.setOnClickListener {
if (rowItems.isNotEmpty()) {
binding.frame.topCardListener.selectLeft()
}
}
}
fun populateItems() {
binding.noUsersLayout.visibility = View.GONE
binding.progressLayout.visibility = View.VISIBLE
val cardsQuery = dateDatabase
cardsQuery.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
p0.children.forEach { child ->
val date = child.getValue(Dates::class.java)
if (date != null) {
var showDate = true
if (child.child(DATA_SWIPES_LEFT).hasChild(dateId) ||
child.child(DATA_SWIPES_RIGHT).hasChild(dateId) ||
child.child(DATA_MATCHES).hasChild(dateId)
) {
showDate = false
}
if (showDate) {
rowItems.add(Dates())
cardsAdapter?.notifyDataSetChanged()
}
}
}
binding.progressLayout.visibility = View.GONE
if (rowItems.isEmpty()) {
binding.noUsersLayout.visibility = View.VISIBLE
}
}
})
}
}
Here is a screenshot of my database with only 2 sets of data that I'd like it to read from
If you need anymore info let me know and but any guidance would be greatly appreciated!
Small screenshot of my Data.kt file
I'm developing a social networking app that uses subscribing and building a user profile through FareBas.
Unfortunately, the program works and when the user presses the register button, an error appears and the information does not go into real-time.
!I would be very grateful for the help.
Registration page:
package com.example.myapplicationfire;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Patterns;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
public class reg extends AppCompatActivity implements View.OnClickListener
{
EditText name, pass, email, bio;
FirebaseAuth firebaseAuth;
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
Button b,b1;
ProgressDialog p;
DatabaseReference myref = firebaseDatabase.getReference("Users");
ImageView pic;
Uri uri;
StorageReference storageReference;
String picName;
SharedPreferences sp;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reg);
name = findViewById(R.id.et1);
pass = findViewById(R.id.et2);
email = findViewById(R.id.et3);
bio = findViewById(R.id.et5);
b = findViewById(R.id.b1);
b.setOnClickListener(this);
b1 = findViewById(R.id.b2);
b1.setOnClickListener(this);
pic =findViewById(R.id.pic1);
pic.setImageResource(R.drawable.person);
pic.setOnClickListener(this);
sp=getSharedPreferences("details",0);
firebaseAuth = FirebaseAuth.getInstance();
}
public void createUser() {
p = new ProgressDialog(this);
p.setMessage("Registration...");
p.show();
if (isValidate())
firebaseAuth.createUserWithEmailAndPassword(email.getText().toString
(), pass.getText().toString()).addOnCompleteListener(this,
new OnCompleteListener<AuthResult>() {
#Override
public void onComplete(#NonNull
Task<AuthResult> task) {
if (task.isSuccessful()) {
storageReference =
FirebaseStorage.getInstance().getReference("Image/Users/"+email.getText().toString().replace('.',' '));
storageReference = storageReference.child(picName);
storageReference.putFile(uri).addOnSuccessListener(new OnSuccessListener <UploadTask.TaskSnapshot>() {
#Override
public void
onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(reg.this, "תמונה הועלתה", Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(reg.this, "" +
e.getMessage(), Toast.LENGTH_LONG).show(); }
});
myref=firebaseDatabase.getReference("users").push();
User u = new
User(name.getText().toString(), pass.getText().toString(),
email.getText().toString(), myref.getKey(),picName,bio.getText().toString());
myref.setValue(u);
p.dismiss();
Toast.makeText(reg.this, "ההרשמה הצליחה!", Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(reg.this,
"" + e.getMessage(), Toast.LENGTH_LONG).show();
p.dismiss();
}
});
}
public boolean isValidate() {
if (!
Patterns.EMAIL_ADDRESS.matcher(email.getText().toString()).matches()) {
email.setError("Invalid email");
email.setFocusable(true);
return false;
} else if (pass.getText().toString().length() < 6) {
pass.setError("password length at least 6 characters");
pass.setFocusable(true);
return false;
}
else if (bio.getText().toString().length() < 10) {
bio.setError("bio length should be 10-100 characters");
bio.setFocusable(true);
return false;
}
return true;
}
#Override
public void onClick(View view) {
if (view == pic) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), 0);
}
if (view == b) {
createUser();
if(isValidate()){
sp=getSharedPreferences("details",0);
SharedPreferences.Editor editor=sp.edit();
editor.putBoolean("isChecked",true);
editor.putString("name",name.getText().toString());
editor.putString("bio",bio.getText().toString());
editor.putString("email",email.getText().toString());
editor.commit();
Intent intent = new Intent(reg.this, homepage.class);
intent.putExtra("email", email.getText().toString());
startActivity(intent);
}
}
if(view==b1){
Intent intent = new Intent(reg.this, login.class);
startActivity(intent);
finish();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null && requestCode == 0 && data.getData() != null) {
uri = data.getData();
if (uri != null) {
pic.setImageURI(uri);
picName = System.currentTimeMillis() + "." + getFileExtension(uri);
}
}
}
private String getFileExtension(Uri uri) {
ContentResolver cR = getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(cR.getType(uri));
}
public void ShowHidePass(View view) {
if (view.getId() == R.id.show_pass_btn) {
if (pass.getTransformationMethod().equals(PasswordTransformationMethod.getInstance())) {
((ImageView) (view)).setImageResource(R.drawable.showeye1);
//Show Password
pass.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
((ImageView) (view)).setImageResource(R.drawable.showeye);
//Hide Password
pass.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
}}
Error:
E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.firebase.internal.api.FirebaseNoSignedInUserException: Please sign in before trying to get a token.
I'm working with a specific API that returns a class as a string to me. I need to insert a string at a certain block of the string that is given to me. So basically a function that takes the whole string, and appends the string I want to add to it after a specific block.
The string passed to me is a java class, and I want to basically enter my own function at the end of it after all of the existing functions. Incase you are confused.. I don't have access to the java file, this is the only way to modify the file when you are using config plugins in expo react native.
I believe some sort of regex is supposed to be used to get this result ? but really I have no idea how to target the specific part of the string.
The string I want to add:
'#Override\nprotected List getPackages() {\nreturn Arrays.asList(\nnew MainReactPackage(), // <---- add comma\nnew RNFSPackage() // <---------- add package\n);\n}'
The string that is passed to me
import expo.modules.updates.UpdatesDevLauncherController;
import expo.modules.devlauncher.DevLauncherController;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import androidx.annotation.NonNull;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import expo.modules.ApplicationLifecycleDispatcher;
import expo.modules.ReactNativeHostWrapper;
import com.facebook.react.bridge.JSIModulePackage;
import com.swmansion.reanimated.ReanimatedJSIModulePackage;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper(
this,
new ReactNativeHost(this) {
#Override
public boolean getUseDeveloperSupport() {
return DevLauncherController.getInstance().getUseDeveloperSupport();
}
#Override
protected List<ReactPackage> getPackages() {
#SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages;
}
#Override
protected String getJSMainModuleName() {
return "index";
}
#Override
protected JSIModulePackage getJSIModulePackage() {
return new ReanimatedJSIModulePackage();
}
});
#Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
#Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
DevLauncherController.initialize(this, getReactNativeHost());
if (BuildConfig.DEBUG) {
DevLauncherController.getInstance().setUpdatesInterface(UpdatesDevLauncherController.initialize(this));
}
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
ApplicationLifecycleDispatcher.onApplicationCreate(this);
}
#Override
public void onConfigurationChanged(#NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig);
}
<--- I WANT TO INSERT MY STRING HERE
/**
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
*
* #param context
* #param reactInstanceManager
*/
private static void initializeFlipper(
Context context, ReactInstanceManager reactInstanceManager) {
if (BuildConfig.DEBUG) {
try {
/*
We use reflection here to pick up the class that initializes Flipper,
since Flipper library is not available in release mode
*/
Class<?> aClass = Class.forName("com.haibert.GitTest.ReactNativeFlipper");
aClass
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
.invoke(null, context, reactInstanceManager);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
const addToMainApp = (content) => {
const regexpPackagingOptions = /\s*?(?=\/\*\*\n \* Loads Flipper)/
const insertLocation = content.match(regexpPackagingOptions)
const newContent =
content.substring(0, insertLocation.index) +
'//INSERTED \n#Override\nprotected List<ReactPackage> getPackages() {\nreturn Arrays.<ReactPackage>asList(\nnew MainReactPackage(), // <---- add comma\nnew RNFSPackage() // <---------- add package\n);\n}' +
content.substring(insertLocation.index, content.length)
return newContent
}
Im trying to send notifications to a Titanium App from AeroGear. After getting the token, how can subscribe to the channel?
Obteining the token:
var CloudPush = require('ti.cloudpush');
var deviceToken = null;
CloudPush.retrieveDeviceToken({
success: deviceTokenSuccess,
error: deviceTokenError
});
function deviceTokenSuccess(e) {
deviceToken = e.deviceToken;
}
function deviceTokenError(e) {
alert('Failed to register for push notifications! ' + e.error);
}
CloudPush.addEventListener('callback', function (evt) {
alert("Notification received: " + evt.payload);
});
This is the example code for native Androiod:
package com.push.pushapplication;
import java.net.URI;
import java.net.URISyntaxException;
import org.jboss.aerogear.android.unifiedpush.PushConfig;
import org.jboss.aerogear.android.unifiedpush.PushRegistrar;
import org.jboss.aerogear.android.unifiedpush.Registrations;
import android.app.Application;
public class PushApplication extends Application {
private final String VARIANT_ID = "variant_id";
private final String SECRET = "secret";
private final String GCM_SENDER_ID = "1";
private final String UNIFIED_PUSH_URL = "URL";
private PushRegistrar registration;
#Override
public void onCreate() {
super.onCreate();
Registrations registrations = new Registrations();
try {
PushConfig config = new PushConfig(new URI(UNIFIED_PUSH_URL), GCM_SENDER_ID);
config.setVariantID(VARIANT_ID);
config.setSecret(SECRET);
config.setAlias(MY_ALIAS);
registration = registrations.push("unifiedpush", config);
registration.register(getApplicationContext(), new Callback() {
private static final long serialVersionUID = 1L;
#Override
public void onSuccess(Void ignore) {
Toast.makeText(MainActivity.this, "Registration Succeeded!",
Toast.LENGTH_LONG).show();
}
#Override
public void onFailure(Exception exception) {
Log.e("MainActivity", exception.getMessage(), exception);
}
});
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
Really lost here, any help would be appreciated!
You need to make wrapper around AeroGear native library as titanium module. However, it may be difficult if you didn't it before.
The titanium module that you need to get this working has been made by "Mads" and you can find it here: https://github.com/Napp/AeroGear-Push-Titanium