Search code examples
androiddialogbuilder

android call same dialog two times


I'm developing an app and I'm blocked in one simple thing.

In my Activity, I show a dialog (AlertDialog.Builder) that ask a mail address and an activation. These two fields are checked with a Rest API.

If the activation code is wrong I restart the activity (with an Intent) and I show again the dialog.

I don't understand why, if I'm wrong the activation code the first time, the second time appears the dialog correctly, but when I click "submit", the app doesn't run the Rest call and return always "Invalid credentials", like if it would remind the old "state".

Instead, if I run the app and I put the correct credentials, all is ok.

Any idea?

Source code:

 public class PinActivity extends Activity {

String mail;
String verification;
JSONObject responseServer;
BluetoothSocket bsocket;
ConnectedThreadBT cdbt;
SharedPreferences sharedPref;
SharedPreferences.Editor editor;
EditText mail_add;
EditText verification_code;

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_check);
    setup();

    dialogActivation();

}

@Override
public void onDestroy() {
    super.onDestroy();
}

private void setup(){
    RestClientManager.initialize(getApplicationContext()).enableDebugLog(true);
    bsocket = BluetoothApplication.getBSocket();
    //salvo codice attivazione sul pacchetto
    cdbt=new ConnectedThreadBT(bsocket,mHandler, "PinActivity");
    cdbt.start();



}


private void dialogActivation(){


    android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.custom_dialog_verification, null);
    mail_add = (EditText) view.findViewById(R.id.mailAddress);
    verification_code = (EditText) view.findViewById(R.id.verification_code);

    builder.setView(view).
            setPositiveButton(getApplicationContext().getResources().getString(R.string.submit), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {


                    //prendo e salvo credenziali
                    mail = mail_add.getText().toString();

                    verification = verification_code.getText().toString();
                    //invio dati al server
                    activatePPS();


                }

            });


    builder.setCancelable(false);
    builder.show();


}


private void activatePPS(){

    dialogCheck();

    String url = "....";

    RestClientManager.getInstance().makeJsonRequest(Request.Method.POST, url, new RequestHandler<>(new RequestCallbacks<JSONObject, Error>()
    {
        @Override
        public void onRequestSuccess(JSONObject response)
        {

            responseServer = response;

            int reply_code = 0;
            try {
                reply_code = response.getInt("reply_code");
                checkReplyCode(reply_code);

            } catch (JSONException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }

        @Override
        public void onRequestError(Error error)
        {

        }




    }, paramsList()));


}

private void dialogCheck(){



    android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.custom_dialog_load_check, null);
    builder.setView(view);
    builder.setCancelable(false);
    builder.show();




}

private void checkReplyCode(int reply_code) throws JSONException, IOException {



    switch(reply_code){

        case 0:

            successActivation();

            break;
        case 1001:
            //credenziali invalide
            Toast.makeText(getApplicationContext(), getResources().getString(R.string.wrong_credentials), Toast.LENGTH_LONG).show();         

               Intent intent = new Intent(PinActivity.this, PinActivity.class);
                    startActivity(intent);


            break;


    }


}

private void successActivation() throws JSONException {


    String access_token = responseServer.get("access_token").toString();
    String nickname = responseServer.get(".....



    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

            int value = sharedPref.getInt("step_conf",0);
            if(value==0){
                Intent intent = new Intent(getApplicationContext(), MethodCurveActivity.class);
                intent.putExtra("style", 0);
                startActivity(intent);
            }
            else{
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);

            }

        }
    },3000);



}

private ArrayMap<String, String> paramsList(){


    ArrayMap<String, String> parameters=new ArrayMap<>();
    parameters.put("user_mail", mail);
    parameters.put(.....

    return parameters;
}

private void resetMobileDevice(){


    String url = "....";



    RestClientManager.getInstance().makeJsonRequest(Request.Method.POST, url, new RequestHandler<>(new RequestCallbacks<JSONObject, Error>()
    {
        @Override
        public void onRequestSuccess(JSONObject response)
        {

            System.out.println("Risposta:"+response);
            responseServer = response;

            int reply_code = 0;
            try {
                reply_code = response.getInt("reply_code");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            try {
                checkReplyCode(reply_code);
            } catch (JSONException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }

        @Override
        public void onRequestError(Error error)
        {

        }

    }, paramsList()));

}

private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {



        }
    }
};

}

The important point is in the "case 1001", after error. I have tried finish() and all the method to delete the old instance of the Activity...


Solution

  • Create Application class in your project and initialize RestClientManager in its onCreate Method like this:

    public class MyApp extends Application {
        private final static String LOG_TAG = Application.class.getSimpleName();
    
        @Override
        public void onCreate() {
            Log.d(LOG_TAG, "Application.onCreate - Initializing application...");
            super.onCreate();
            initializeApplication();
            Log.d(LOG_TAG, "Application.onCreate - Application initialized OK");
        }
    
        private void initializeApplication() {
            RestClientManager.initialize(getApplicationContext()).enableDebugLog(true);    
        }
    }
    

    Add this line in your <Application> tag in androidmanifest.xml file:

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:name=".App"
            android:theme="@style/AppTheme">
    
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    </application>
    

    And Make sure your singleton structure should be something like this:

        private static RestClientManager instance;
    
        static void initInstance()
        {
            if (instance == null)
            {
                // Create the instance
                instance = new RestClientManager();
            }
        }
    
        public static RestClientManager getInstance()
        {
            // Return the instance
            return instance;
        }
    

    Remember to remove

    RestClientManager.initialize(getApplicationContext()).enableDebugLog(true);    
    

    from your main activity.

    Please give it a try and let me know.