Objects.requireNonNull problem with my dialogflow chatbot app

Issue

That’s the error:

enter image description here

The application is an interface with a dialogflow chatbot. The application is crushing when i set some text and i try to send it. Probably its because there is some depracated code, but i cant find a solution on the internet.

BTW that’s the MainActivity.java:

public class MainActivity extends AppCompatActivity implements BotReply {

RecyclerView chatView;
ChatAdapter chatAdapter;
ArrayList<Message> messageList  new ArrayList<>();
EditText editMessage;
Button btnSend;

//dialogFlow
private SessionsClient sessionsClient;
private SessionName sessionName;
private final String uuid  UUID.randomUUID().toString();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    chatView  findViewById(R.id.rv_message);
    editMessage  findViewById(R.id.et_message);
    btnSend  findViewById(R.id.btn_mic);

    chatAdapter  new ChatAdapter(messageList, this);
    chatView.setAdapter(chatAdapter);

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) {
            String message  editMessage.getText().toString();
            if (!message.isEmpty()) {
                messageList.add(new Message(message, false));
                editMessage.setText("");
                sendMessageToBot(message);
                Objects.requireNonNull(chatView.getAdapter()).notifyDataSetChanged();
                Objects.requireNonNull(chatView.getLayoutManager())
                        .scrollToPosition(messageList.size() - 1);
            } else {
                Toast.makeText(MainActivity.this, "Please enter text!", Toast.LENGTH_SHORT).show();
            }
        }
    });

    setUpBot();
}

private void setUpBot() {
    String TAG  "mainactivity";
    try {
        InputStream stream  this.getResources().openRawResource(R.raw.credentials);
        GoogleCredentials credentials  GoogleCredentials.fromStream(stream)
                .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
        String projectId  ((ServiceAccountCredentials) credentials).getProjectId();

        SessionsSettings.Builder settingsBuilder  SessionsSettings.newBuilder();
        SessionsSettings sessionsSettings  settingsBuilder.setCredentialsProvider(
                FixedCredentialsProvider.create(credentials)).build();
        sessionsClient  SessionsClient.create(sessionsSettings);
        sessionName  SessionName.of(projectId, uuid);

        Log.d(TAG, "projectId : " + projectId);
    } catch (Exception e) {
        Log.d(TAG, "setUpBot: " + e.getMessage());
    }
}



private void sendMessageToBot(String message) {
    QueryInput input  QueryInput.newBuilder()
            .setText(TextInput.newBuilder().setText(message).setLanguageCode("en-US")).build();
    new SendMessageInBg(this, sessionName, sessionsClient, input).execute();
}



@Override
public void callback(DetectIntentResponse returnResponse) {
    if(returnResponse!null) {
        String botReply  returnResponse.getQueryResult().getFulfillmentText();
        if(!botReply.isEmpty()){
            messageList.add(new Message(botReply, true));
            chatAdapter.notifyDataSetChanged();
            Objects.requireNonNull(chatView.getLayoutManager()).scrollToPosition(messageList.size() - 1);
        }else {
            Toast.makeText(this, "something went wrong", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(this, "failed to connect!", Toast.LENGTH_SHORT).show();
    }
}

}

I think the problem is here:

Objects.requireNonNull(chatView.getAdapter()).notifyDataSetChanged();
Objects.requireNonNull(chatView.getLayoutManager()).scrollToPosition(messageList.size() - 1);

If you need something else ask! Thanks

Solution

If the messageList is empty by default (and looks like it is) you have an empty recycler view and thus there are no non-fatal errors in the logs informing you that the recycler view is missing a layout manager. Set the layout manager to your chatView recycler view and it should be enough.

...
chatAdapter  new ChatAdapter(messageList, this);
chatView.setAdapter(chatAdapter);

// Add these two lines
LinearLayoutManager layoutManager  new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
chatView.setLayoutManager(layoutManager);

btnSend.setOnClickListener(new View.OnClickListener() {
...

Answered By – Jenea Vranceanu

Leave a Comment