Search code examples
javaandroidandroid-studioinstagram-api

Session ends after switch activity || Need to login every time app get opens


Hi,

I'm making an app for Instagram using this library. I have two principal problems:

  • Need to login every time app get opens.
  • After login, session ends on switch activity.

And I can't solve this just saving login credentials, cuz Instagram doesn't allow this. I found this at Instagram Platform Policies:

"Don't store or cache Instagram login credentials."

Other people had the same problem and the lib creator answered this. The problem is that I don't understand nothing and he answered using Kotlin, I'm using Java. Here are my code:

Multiscreen.java:

public class Multiscreen {

private Instagram4Android instagram;
private Context mContext;

public Multiscreen(Context mContext) {
    this.mContext = mContext;
}

public Observable<InstagramLoginResult> loginToIg(final String username, final String password) {

    Observable<InstagramLoginResult> observable = Observable.create(observableEmitter -> {

        instagram = Instagram4Android.builder().username(username).password(password).build();
        instagram.setup();
        observableEmitter.onNext(instagram.login());

    });



    return observable;

}

public Observable<InstagramUser> userInfo() {

    Observable<InstagramUser> observable = Observable.create(observableEmitter -> {

        InstagramSearchUsernameResult result = instagram.sendRequest(new InstagramSearchUsernameRequest(instagram.getUsername()));
        observableEmitter.onNext(result.getUser());

    });

    return observable;
}

public void isLoggedIn(){

    if (instagram == null){

        Toast.makeText(mContext, "null", Toast.LENGTH_SHORT).show();
    }

    else {

        Toast.makeText(mContext, "not null", Toast.LENGTH_SHORT).show();
    }
}}

LoginActivity:

public class LoginActivity extends AppCompatActivity {

private Toolbar toolbar;

private EditText text_username, text_password;
private Button loginBtn;

private ProgressDialog dialog;

Instagram4Android instagram = Instagram4Android.builder().build();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    dialog = new ProgressDialog(LoginActivity.this);
    dialog.setTitle("Logging in...");

    toolbar = findViewById(R.id.loginToolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle("");

    text_username = findViewById(R.id.usernameInput);
    text_password = findViewById(R.id.passwordInput);
    loginBtn = findViewById(R.id.loginBtn);

    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (text_username.length() > 0 || text_password.length() > 0){

                String username = text_username.getText().toString();
                String password = text_password.getText().toString();

                dialog.show();

                instagram = Instagram4Android.builder().username(username).password(password).build();
                attemptToLogin(username, password);
            }

            else {

                Toast.makeText(LoginActivity.this, "All fields are required.", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

public void attemptToLogin(String username, String password){

    Multiscreen multiscreen = new Multiscreen(getApplicationContext());
    multiscreen.loginToIg(username, password)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(instagramLoginResult -> {

                if (instagramLoginResult.getStatus().equals("ok")){

                    dialog.dismiss();
                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                }

                else {

                    dialog.dismiss();
                }
            });
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home){
        onBackPressed();
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed(){

    super.onBackPressed();
}}

I don't know if anyone can help me, but I'm tired of this and I'm thinking about give up this project. If u can solve at least one of this problems, I will be grateful.


Solution

  • You are using instagram credential on every page ?

    Because what i think you can not store instagram credential but you can store one flag in prefrence is_login true and you can manage it on every activity and also when app opens every time

    and i think this can solve your problem because in all app we are checking user login or not is depend on prefrence which stored in app cache

    MyApp Class

            public class MyApp extends Application {
    
                private static MyApp app;
                public static Instagram instaObject;
    
                @Override
                public void onCreate() {
                    super.onCreate();
                    app = this;
    
    
                }
    
                public static MyApp getApp() {
                    return app;
                }
    
             public static void setInstagramObject(Instagram instaObject) {
                    this.instaObject = instaObject;
                }
    
         public static Instagram getInstagramObject() {
                    return instaObject;
                }
    
            }
    

    Define MyApp class in Android Manifest :-

    <application
            android:name=".MyApp"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            android:usesCleartextTraffic="true"
            tools:ignore="GoogleAppIndexingWarning"
            tools:targetApi="m">
    //all activities
    </application>    
    

    Login Activity

        public void attemptToLogin(String username, String password){
    
            Multiscreen multiscreen = new Multiscreen(getApplicationContext());
            multiscreen.loginToIg(username, password)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(instagramLoginResult -> {
    
                        if (instagramLoginResult.getStatus().equals("ok")){
    
                            dialog.dismiss();
                            MyApp.setInstagramObject(instagramLoginResult);
                            startActivity(new Intent(LoginActivity.this, MainActivity.class));
                        }
    
                        else {
    
                            dialog.dismiss();
                        }
                    });
        }
    

    In Which Acvitity you want to use :-

    Instagram instaObject = MyApp.getInstagramObject();