From b937a7bc9e833ce5da5f432974e1813e6a303957 Mon Sep 17 00:00:00 2001 From: Vavassor Date: Mon, 13 Mar 2017 20:49:12 -0400 Subject: [PATCH] Fixed intermittent null pointer exceptions and disabled the light theme temporarily. This closes #21, closes #22, and closes #17. --- app/google-services.json | 20 +++++----- .../keylesspalace/tusky/AccountActivity.java | 40 ++++++++++++++----- .../com/keylesspalace/tusky/BaseActivity.java | 3 ++ .../keylesspalace/tusky/ComposeActivity.java | 17 ++++++-- .../keylesspalace/tusky/LoginActivity.java | 16 ++++++-- .../com/keylesspalace/tusky/MainActivity.java | 22 +++++----- .../tusky/MyFirebaseMessagingService.java | 4 +- .../tusky/NotificationsFragment.java | 7 +++- .../keylesspalace/tusky/ReportActivity.java | 12 ++++-- .../com/keylesspalace/tusky/SFragment.java | 12 ++++-- .../keylesspalace/tusky/TimelineAdapter.java | 6 ++- .../keylesspalace/tusky/TimelineFragment.java | 6 ++- .../tusky/ViewThreadFragment.java | 18 ++++++--- app/src/main/res/xml/preferences.xml | 9 ----- 14 files changed, 128 insertions(+), 64 deletions(-) diff --git a/app/google-services.json b/app/google-services.json index 7c08109cb..9eea9a547 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,35 +1,35 @@ { "project_info": { - "project_number": "1050186150447", - "firebase_url": "https://tusky-fc880.firebaseio.com", - "project_id": "tusky-fc880", - "storage_bucket": "tusky-fc880.appspot.com" + "project_number": "268851337880", + "firebase_url": "https://tusky-62772.firebaseio.com", + "project_id": "tusky-62772", + "storage_bucket": "tusky-62772.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:1050186150447:android:fc4111b1d145a00e", + "mobilesdk_app_id": "1:268851337880:android:fc4111b1d145a00e", "android_client_info": { "package_name": "com.keylesspalace.tusky" } }, "oauth_client": [ { - "client_id": "1050186150447-fg4nj4vlekpa9bcl8q8290hqln1s048e.apps.googleusercontent.com", + "client_id": "268851337880-eie2ssto2d21bfihn9d1qupcrke8oebf.apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "com.keylesspalace.tusky", - "certificate_hash": "a3bb387437e149dd7763107e8da83ad6b421264f" + "certificate_hash": "18d196307d6e928e99c2e0bb9818c01c38aff2f9" } }, { - "client_id": "1050186150447-4u9m96ub04cuppmnkfdk7ua51o9r7pf3.apps.googleusercontent.com", + "client_id": "268851337880-n19d05m282nirs1fc9kdd5n4of6je4fk.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyBTWsu3Z5EjCnm3nUoWamuMLmGvM0nGq7o" + "current_key": "AIzaSyD6erhkj_KOB7WrhdunV1uN29QOoLJHTaQ" } ], "services": { @@ -40,7 +40,7 @@ "status": 2, "other_platform_oauth_client": [ { - "client_id": "1050186150447-4u9m96ub04cuppmnkfdk7ua51o9r7pf3.apps.googleusercontent.com", + "client_id": "268851337880-n19d05m282nirs1fc9kdd5n4of6je4fk.apps.googleusercontent.com", "client_type": 3 } ] diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.java b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.java index 0a217c9f5..a5ce6ab4e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.java @@ -160,7 +160,11 @@ public class AccountActivity extends BaseActivity { mastodonAPI.account(accountId).enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - onObtainAccountSuccess(response.body()); + if (response.isSuccessful()) { + onObtainAccountSuccess(response.body()); + } else { + onObtainAccountFailure(); + } } @Override @@ -238,8 +242,12 @@ public class AccountActivity extends BaseActivity { mastodonAPI.relationships(ids).enqueue(new Callback>() { @Override public void onResponse(Call> call, retrofit2.Response> response) { - Relationship relationship = response.body().get(0); - onObtainRelationshipsSuccess(relationship.following, relationship.blocking, relationship.muting); + if (response.isSuccessful()) { + Relationship relationship = response.body().get(0); + onObtainRelationshipsSuccess(relationship.following, relationship.blocking, relationship.muting); + } else { + onObtainRelationshipsFailure(new Exception(response.message())); + } } @Override @@ -326,9 +334,13 @@ public class AccountActivity extends BaseActivity { Callback cb = new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - following = response.body().following; - // TODO: display message/indicator when "requested" is true (i.e. when the follow is awaiting approval) - updateButtons(); + if (response.isSuccessful()) { + following = response.body().following; + // TODO: display message/indicator when "requested" is true (i.e. when the follow is awaiting approval) + updateButtons(); + } else { + onFollowFailure(id); + } } @Override @@ -366,8 +378,12 @@ public class AccountActivity extends BaseActivity { Callback cb = new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - blocking = response.body().blocking; - updateButtons(); + if (response.isSuccessful()) { + blocking = response.body().blocking; + updateButtons(); + } else { + onBlockFailure(id); + } } @Override @@ -405,8 +421,12 @@ public class AccountActivity extends BaseActivity { Callback cb = new Callback() { @Override public void onResponse(Call call, Response response) { - muting = response.body().muting; - updateButtons(); + if (response.isSuccessful()) { + muting = response.body().muting; + updateButtons(); + } else { + onMuteFailure(id); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java index 689df0dcd..d79421b56 100644 --- a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java @@ -56,9 +56,12 @@ public class BaseActivity extends AppCompatActivity { createMastodonAPI(); createTuskyAPI(); + /* Note from Andrew March 13, 2017: Keep this and restore it when the light theme is no + longer bugged. if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("lightTheme", false)) { setTheme(R.style.AppTheme_Light); } + */ } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java index 356c0cb09..3fd55a93a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java @@ -653,7 +653,7 @@ public class ComposeActivity extends BaseActivity { private void sendStatus(String content, String visibility, boolean sensitive, String spoilerText) { - ArrayList mediaIds = new ArrayList(); + ArrayList mediaIds = new ArrayList<>(); for (QueuedMedia item : mediaQueued) { mediaIds.add(item.id); @@ -662,7 +662,11 @@ public class ComposeActivity extends BaseActivity { mastodonAPI.createStatus(content, inReplyToId, spoilerText, visibility, sensitive, mediaIds).enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - onSendSuccess(); + if (response.isSuccessful()) { + onSendSuccess(); + } else { + onSendFailure(); + } } @Override @@ -970,8 +974,13 @@ public class ComposeActivity extends BaseActivity { item.uploadRequest.enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - item.id = response.body().id; - waitForMediaLatch.countDown(); + if (response.isSuccessful()) { + item.id = response.body().id; + waitForMediaLatch.countDown(); + } else { + Log.d(TAG, "Upload request failed. " + response.message()); + onUploadFailure(item); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java index 07758956a..2b473783b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java @@ -31,9 +31,7 @@ import android.widget.TextView; import com.keylesspalace.tusky.entity.AccessToken; import com.keylesspalace.tusky.entity.AppCredentials; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import retrofit2.Call; @@ -43,6 +41,7 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class LoginActivity extends BaseActivity { + private static final String TAG = "LoginActivity"; // logging tag private static String OAUTH_SCOPES = "read write follow"; private SharedPreferences preferences; @@ -126,6 +125,13 @@ public class LoginActivity extends BaseActivity { Callback callback = new Callback() { @Override public void onResponse(Call call, Response response) { + if (!response.isSuccessful()) { + editText.setError( + "This app could not obtain authentication from that server " + + "instance."); + Log.e(TAG, "App authentication failed. " + response.message()); + return; + } AppCredentials credentials = response.body(); clientId = credentials.clientId; clientSecret = credentials.clientSecret; @@ -246,7 +252,11 @@ public class LoginActivity extends BaseActivity { Callback callback = new Callback() { @Override public void onResponse(Call call, Response response) { - onLoginSuccess(response.body().accessToken); + if (response.isSuccessful()) { + onLoginSuccess(response.body().accessToken); + } else { + editText.setError(response.message()); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java index cb1504ef5..fa72166a2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java @@ -15,8 +15,6 @@ package com.keylesspalace.tusky; -import android.app.AlarmManager; -import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -24,15 +22,11 @@ import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.SystemClock; -import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.os.Bundle; -import android.support.v7.widget.Toolbar; -import android.text.Html; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -55,7 +49,6 @@ import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.ProfileDrawerItem; import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; -import com.mikepenz.materialdrawer.model.interfaces.IProfile; import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader; import com.mikepenz.materialdrawer.util.DrawerImageLoader; import com.squareup.picasso.Picasso; @@ -75,7 +68,7 @@ public class MainActivity extends BaseActivity { private String loggedInAccountId; private String loggedInAccountUsername; - Stack pageHistory = new Stack(); + Stack pageHistory = new Stack<>(); private AccountHeader headerResult; private Drawer drawer; @@ -296,8 +289,12 @@ public class MainActivity extends BaseActivity { mastodonAPI.searchAccounts(newQuery, false, 5).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { - searchView.swapSuggestions(response.body()); - searchView.hideProgress(); + if (response.isSuccessful()) { + searchView.swapSuggestions(response.body()); + searchView.hideProgress(); + } else { + searchView.hideProgress(); + } } @Override @@ -359,6 +356,11 @@ public class MainActivity extends BaseActivity { mastodonAPI.accountVerifyCredentials().enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { + if (!response.isSuccessful()) { + onFetchUserInfoFailure(new Exception(response.message())); + return; + } + Account me = response.body(); ImageView background = headerResult.getHeaderBackgroundView(); diff --git a/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java b/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java index 785f02e0c..5d1f1e92a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java +++ b/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java @@ -56,7 +56,9 @@ public class MyFirebaseMessagingService extends FirebaseMessagingService { mastodonAPI.notification(notificationId).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - buildNotification(response.body()); + if (response.isSuccessful()) { + buildNotification(response.body()); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/NotificationsFragment.java b/app/src/main/java/com/keylesspalace/tusky/NotificationsFragment.java index 60798f953..dacebb1e8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/NotificationsFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/NotificationsFragment.java @@ -15,7 +15,6 @@ package com.keylesspalace.tusky; -import android.app.NotificationManager; import android.content.Context; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; @@ -141,7 +140,11 @@ public class NotificationsFragment extends SFragment implements api.notifications(fromId, uptoId, null).enqueue(new Callback>() { @Override public void onResponse(Call> call, retrofit2.Response> response) { - onFetchNotificationsSuccess(response.body(), fromId); + if (response.isSuccessful()) { + onFetchNotificationsSuccess(response.body(), fromId); + } else { + onFetchNotificationsFailure(new Exception(response.message())); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/ReportActivity.java b/app/src/main/java/com/keylesspalace/tusky/ReportActivity.java index 3f4b5c0b9..b17255d41 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ReportActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/ReportActivity.java @@ -17,7 +17,6 @@ package com.keylesspalace.tusky; import android.content.Intent; import android.graphics.drawable.Drawable; -import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; @@ -29,7 +28,6 @@ import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.widget.Button; import android.widget.EditText; import com.keylesspalace.tusky.entity.Status; @@ -122,7 +120,11 @@ public class ReportActivity extends BaseActivity { mastodonAPI.report(accountId, Arrays.asList(statusIds), comment).enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - onSendSuccess(); + if (response.isSuccessful()) { + onSendSuccess(); + } else { + onSendFailure(accountId, statusIds, comment); + } } @Override @@ -155,6 +157,10 @@ public class ReportActivity extends BaseActivity { mastodonAPI.accountStatuses(accountId, null, null, null).enqueue(new Callback>() { @Override public void onResponse(Call> call, retrofit2.Response> response) { + if (!response.isSuccessful()) { + onFetchStatusesFailure(new Exception(response.message())); + return; + } List statusList = response.body(); List itemList = new ArrayList<>(); for (Status status : statusList) { diff --git a/app/src/main/java/com/keylesspalace/tusky/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/SFragment.java index 862e598cf..10e5864d4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/SFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/SFragment.java @@ -83,8 +83,10 @@ public class SFragment extends Fragment { Callback cb = new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - status.reblogged = reblog; - adapter.notifyItemChanged(position); + if (response.isSuccessful()) { + status.reblogged = reblog; + adapter.notifyItemChanged(position); + } } @Override @@ -107,8 +109,10 @@ public class SFragment extends Fragment { Callback cb = new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - status.favourited = favourite; - adapter.notifyItemChanged(position); + if (response.isSuccessful()) { + status.favourited = favourite; + adapter.notifyItemChanged(position); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/TimelineAdapter.java b/app/src/main/java/com/keylesspalace/tusky/TimelineAdapter.java index 877c8545f..41dfeab70 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TimelineAdapter.java +++ b/app/src/main/java/com/keylesspalace/tusky/TimelineAdapter.java @@ -86,8 +86,10 @@ class TimelineAdapter extends RecyclerView.Adapter implements AdapterItemRemover int update(List newStatuses) { int scrollToPosition; - if (statuses == null || statuses.isEmpty()) { - statuses = newStatuses; + if (statuses.isEmpty()) { + if (newStatuses != null) { + statuses = newStatuses; + } scrollToPosition = 0; } else { int index = newStatuses.indexOf(statuses.get(0)); diff --git a/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java b/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java index 76579307a..4037dbc46 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java @@ -168,7 +168,11 @@ public class TimelineFragment extends SFragment implements Callback> cb = new Callback>() { @Override public void onResponse(Call> call, retrofit2.Response> response) { - onFetchTimelineSuccess(response.body(), fromId); + if (response.isSuccessful()) { + onFetchTimelineSuccess(response.body(), fromId); + } else { + onFetchTimelineFailure(new Exception(response.message())); + } } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/ViewThreadFragment.java b/app/src/main/java/com/keylesspalace/tusky/ViewThreadFragment.java index de535035b..1dfaad1d9 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ViewThreadFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/ViewThreadFragment.java @@ -82,8 +82,12 @@ public class ViewThreadFragment extends SFragment implements StatusActionListene api.status(id).enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - int position = adapter.insertStatus(response.body()); - recyclerView.scrollToPosition(position); + if (response.isSuccessful()) { + int position = adapter.insertStatus(response.body()); + recyclerView.scrollToPosition(position); + } else { + onThreadRequestFailure(id); + } } @Override @@ -99,10 +103,14 @@ public class ViewThreadFragment extends SFragment implements StatusActionListene api.statusContext(id).enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { - StatusContext context = response.body(); + if (response.isSuccessful()) { + StatusContext context = response.body(); - adapter.addAncestors(context.ancestors); - adapter.addDescendants(context.descendants); + adapter.addAncestors(context.ancestors); + adapter.addDescendants(context.descendants); + } else { + onThreadRequestFailure(id); + } } @Override diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 9ace1a1ef..ecd57b22a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -20,13 +20,4 @@ - - - - - -