Browse Source

Add GraphQl error handling

renovate/org.robolectric-robolectric-4.x
Ammar Githam 4 years ago
parent
commit
07f41a8a8c
  1. 8
      app/src/main/java/awais/instagrabber/activities/MainActivity.java
  2. 8
      app/src/main/java/awais/instagrabber/webservices/NewsService.java
  3. 19
      app/src/main/java/awais/instagrabber/webservices/SearchService.java
  4. 23
      app/src/main/java/awais/instagrabber/webservices/interceptors/IgErrorsInterceptor.java
  5. 2
      app/src/main/res/values/strings.xml

8
app/src/main/java/awais/instagrabber/activities/MainActivity.java

@ -142,8 +142,8 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
@Override @Override
protected void onCreate(@Nullable final Bundle savedInstanceState) { protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RetrofitFactory.setup(this); RetrofitFactory.setup(this);
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater()); binding = ActivityMainBinding.inflate(getLayoutInflater());
final String cookie = settingsHelper.getString(Constants.COOKIE); final String cookie = settingsHelper.getString(Constants.COOKIE);
CookieUtils.setupCookies(cookie); CookieUtils.setupCookies(cookie);
@ -253,7 +253,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
Log.e(TAG, "onDestroy: ", e); Log.e(TAG, "onDestroy: ", e);
} }
unbindActivityCheckerService(); unbindActivityCheckerService();
RetrofitFactory.getInstance().destroy();
RetrofitFactory.getInstance().destroy();
} }
@Override @Override
@ -853,4 +853,8 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
public Toolbar getToolbar() { public Toolbar getToolbar() {
return binding.toolbar; return binding.toolbar;
} }
public View getRootView() {
return binding.getRoot();
}
} }

8
app/src/main/java/awais/instagrabber/webservices/NewsService.java

@ -13,15 +13,11 @@ import awais.instagrabber.repositories.NewsRepository;
import awais.instagrabber.repositories.responses.AymlResponse; import awais.instagrabber.repositories.responses.AymlResponse;
import awais.instagrabber.repositories.responses.AymlUser; import awais.instagrabber.repositories.responses.AymlUser;
import awais.instagrabber.repositories.responses.NewsInboxResponse; import awais.instagrabber.repositories.responses.NewsInboxResponse;
import awais.instagrabber.repositories.responses.Notification;
import awais.instagrabber.repositories.responses.NotificationArgs;
import awais.instagrabber.repositories.responses.NotificationCounts;
import awais.instagrabber.repositories.responses.NewsInboxResponse;
import awais.instagrabber.repositories.responses.User;
import awais.instagrabber.repositories.responses.UserSearchResponse;
import awais.instagrabber.repositories.responses.notification.Notification; import awais.instagrabber.repositories.responses.notification.Notification;
import awais.instagrabber.repositories.responses.notification.NotificationArgs; import awais.instagrabber.repositories.responses.notification.NotificationArgs;
import awais.instagrabber.repositories.responses.notification.NotificationCounts; import awais.instagrabber.repositories.responses.notification.NotificationCounts;
import awais.instagrabber.repositories.responses.User;
import awais.instagrabber.repositories.responses.UserSearchResponse;
import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.Constants;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;

19
app/src/main/java/awais/instagrabber/webservices/SearchService.java

@ -1,16 +1,10 @@
package awais.instagrabber.webservices; package awais.instagrabber.webservices;
import androidx.annotation.NonNull;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import awais.instagrabber.repositories.SearchRepository; import awais.instagrabber.repositories.SearchRepository;
import awais.instagrabber.repositories.responses.search.SearchResponse; import awais.instagrabber.repositories.responses.search.SearchResponse;
import awais.instagrabber.utils.TextUtils;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class SearchService extends BaseService { public class SearchService extends BaseService {
private static final String TAG = "LocationService"; private static final String TAG = "LocationService";
@ -20,10 +14,9 @@ public class SearchService extends BaseService {
private static SearchService instance; private static SearchService instance;
private SearchService() { private SearchService() {
final Retrofit retrofit = getRetrofitBuilder()
.baseUrl("https://www.instagram.com")
.build();
repository = retrofit.create(SearchRepository.class);
repository = RetrofitFactory.getInstance()
.getRetrofitWeb()
.create(SearchRepository.class);
} }
public static SearchService getInstance() { public static SearchService getInstance() {
@ -43,8 +36,8 @@ public class SearchService extends BaseService {
builder.put("context", context); builder.put("context", context);
builder.put("count", "50"); builder.put("count", "50");
return repository.search(isLoggedIn return repository.search(isLoggedIn
? "https://i.instagram.com/api/v1/fbsearch/topsearch_flat/"
: "https://www.instagram.com/web/search/topsearch/",
builder.build());
? "https://i.instagram.com/api/v1/fbsearch/topsearch_flat/"
: "https://www.instagram.com/web/search/topsearch/",
builder.build());
} }
} }

23
app/src/main/java/awais/instagrabber/webservices/interceptors/IgErrorsInterceptor.java

@ -1,10 +1,13 @@
package awais.instagrabber.webservices.interceptors; package awais.instagrabber.webservices.interceptors;
import android.util.Log; import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import com.google.android.material.snackbar.Snackbar;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
@ -51,6 +54,16 @@ public class IgErrorsInterceptor implements Interceptor {
// show dialog? // show dialog?
Log.e(TAG, "Network error: " + getMessage(errorCode, "The request start-line and/or headers are too large to process.")); Log.e(TAG, "Network error: " + getMessage(errorCode, "The request start-line and/or headers are too large to process."));
return; return;
case 404:
showErrorDialog(R.string.not_found);
return;
case 302: // redirect
final String location = response.header("location");
if (location.equals("https://www.instagram.com/accounts/login/")) {
// rate limited
showErrorDialog(R.string.rate_limit);
}
return;
} }
final ResponseBody body = response.body(); final ResponseBody body = response.body();
if (body == null) return; if (body == null) return;
@ -67,9 +80,13 @@ public class IgErrorsInterceptor implements Interceptor {
case "login_required": case "login_required":
showErrorDialog(R.string.login_required); showErrorDialog(R.string.login_required);
return; return;
case "execution failure":
showSnackbar(message);
return;
case "not authorized to view user": // Do we handle this in profile view fragment? case "not authorized to view user": // Do we handle this in profile view fragment?
case "challenge_required": // Since we make users login using browser, we should not be getting this error in api requests case "challenge_required": // Since we make users login using browser, we should not be getting this error in api requests
default: default:
showSnackbar(message);
Log.e(TAG, "checkError: " + bodyString); Log.e(TAG, "checkError: " + bodyString);
return; return;
} }
@ -88,6 +105,12 @@ public class IgErrorsInterceptor implements Interceptor {
} }
} }
private void showSnackbar(final String message) {
final View view = mainActivity.getRootView();
if (view == null) return;
Snackbar.make(view, message, Snackbar.LENGTH_LONG).show();
}
@NonNull @NonNull
private String getMessage(final int errorCode, final String message) { private String getMessage(final int errorCode, final String message) {
return String.format("code: %s, internalMessage: %s", errorCode, message); return String.format("code: %s, internalMessage: %s", errorCode, message);

2
app/src/main/res/values/strings.xml

@ -481,4 +481,6 @@
<string name="inactive_user">User is inactive!</string> <string name="inactive_user">User is inactive!</string>
<string name="crash_report_subject">Barinsta Crash Report</string> <string name="crash_report_subject">Barinsta Crash Report</string>
<string name="crash_report_title">Select an email app to send crash logs</string> <string name="crash_report_title">Select an email app to send crash logs</string>
<string name="not_found">Not found!</string>
<string name="rate_limit">Your IP has been rate limited by Instagram. Wait for an hour and try again.</string>
</resources> </resources>
Loading…
Cancel
Save