Fixed intermittent null pointer exceptions and disabled the light theme temporarily. This closes #21, closes #22, and closes #17.

This commit is contained in:
Vavassor 2017-03-13 20:49:12 -04:00
parent 64da1329b9
commit b937a7bc9e
14 changed files with 128 additions and 64 deletions

View File

@ -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
}
]

View File

@ -160,7 +160,11 @@ public class AccountActivity extends BaseActivity {
mastodonAPI.account(accountId).enqueue(new Callback<Account>() {
@Override
public void onResponse(Call<Account> call, retrofit2.Response<Account> 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<List<Relationship>>() {
@Override
public void onResponse(Call<List<Relationship>> call, retrofit2.Response<List<Relationship>> 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<Relationship> cb = new Callback<Relationship>() {
@Override
public void onResponse(Call<Relationship> call, retrofit2.Response<Relationship> 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<Relationship> cb = new Callback<Relationship>() {
@Override
public void onResponse(Call<Relationship> call, retrofit2.Response<Relationship> 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<Relationship> cb = new Callback<Relationship>() {
@Override
public void onResponse(Call<Relationship> call, Response<Relationship> response) {
muting = response.body().muting;
updateButtons();
if (response.isSuccessful()) {
muting = response.body().muting;
updateButtons();
} else {
onMuteFailure(id);
}
}
@Override

View File

@ -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

View File

@ -653,7 +653,7 @@ public class ComposeActivity extends BaseActivity {
private void sendStatus(String content, String visibility, boolean sensitive,
String spoilerText) {
ArrayList<String> mediaIds = new ArrayList<String>();
ArrayList<String> 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<Status>() {
@Override
public void onResponse(Call<Status> call, retrofit2.Response<Status> response) {
onSendSuccess();
if (response.isSuccessful()) {
onSendSuccess();
} else {
onSendFailure();
}
}
@Override
@ -970,8 +974,13 @@ public class ComposeActivity extends BaseActivity {
item.uploadRequest.enqueue(new Callback<Media>() {
@Override
public void onResponse(Call<Media> call, retrofit2.Response<Media> 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

View File

@ -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<AppCredentials> callback = new Callback<AppCredentials>() {
@Override
public void onResponse(Call<AppCredentials> call, Response<AppCredentials> 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<AccessToken> callback = new Callback<AccessToken>() {
@Override
public void onResponse(Call<AccessToken> call, Response<AccessToken> response) {
onLoginSuccess(response.body().accessToken);
if (response.isSuccessful()) {
onLoginSuccess(response.body().accessToken);
} else {
editText.setError(response.message());
}
}
@Override

View File

@ -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<Integer> pageHistory = new Stack<Integer>();
Stack<Integer> 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<List<Account>>() {
@Override
public void onResponse(Call<List<Account>> call, Response<List<Account>> 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<Account>() {
@Override
public void onResponse(Call<Account> call, retrofit2.Response<Account> response) {
if (!response.isSuccessful()) {
onFetchUserInfoFailure(new Exception(response.message()));
return;
}
Account me = response.body();
ImageView background = headerResult.getHeaderBackgroundView();

View File

@ -56,7 +56,9 @@ public class MyFirebaseMessagingService extends FirebaseMessagingService {
mastodonAPI.notification(notificationId).enqueue(new Callback<Notification>() {
@Override
public void onResponse(Call<Notification> call, Response<Notification> response) {
buildNotification(response.body());
if (response.isSuccessful()) {
buildNotification(response.body());
}
}
@Override

View File

@ -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<List<Notification>>() {
@Override
public void onResponse(Call<List<Notification>> call, retrofit2.Response<List<Notification>> response) {
onFetchNotificationsSuccess(response.body(), fromId);
if (response.isSuccessful()) {
onFetchNotificationsSuccess(response.body(), fromId);
} else {
onFetchNotificationsFailure(new Exception(response.message()));
}
}
@Override

View File

@ -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<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> 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<List<Status>>() {
@Override
public void onResponse(Call<List<Status>> call, retrofit2.Response<List<Status>> response) {
if (!response.isSuccessful()) {
onFetchStatusesFailure(new Exception(response.message()));
return;
}
List<Status> statusList = response.body();
List<ReportAdapter.ReportStatus> itemList = new ArrayList<>();
for (Status status : statusList) {

View File

@ -83,8 +83,10 @@ public class SFragment extends Fragment {
Callback<Status> cb = new Callback<Status>() {
@Override
public void onResponse(Call<Status> call, retrofit2.Response<Status> 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<Status> cb = new Callback<Status>() {
@Override
public void onResponse(Call<Status> call, retrofit2.Response<Status> response) {
status.favourited = favourite;
adapter.notifyItemChanged(position);
if (response.isSuccessful()) {
status.favourited = favourite;
adapter.notifyItemChanged(position);
}
}
@Override

View File

@ -86,8 +86,10 @@ class TimelineAdapter extends RecyclerView.Adapter implements AdapterItemRemover
int update(List<Status> 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));

View File

@ -168,7 +168,11 @@ public class TimelineFragment extends SFragment implements
Callback<List<Status>> cb = new Callback<List<Status>>() {
@Override
public void onResponse(Call<List<Status>> call, retrofit2.Response<List<Status>> response) {
onFetchTimelineSuccess(response.body(), fromId);
if (response.isSuccessful()) {
onFetchTimelineSuccess(response.body(), fromId);
} else {
onFetchTimelineFailure(new Exception(response.message()));
}
}
@Override

View File

@ -82,8 +82,12 @@ public class ViewThreadFragment extends SFragment implements StatusActionListene
api.status(id).enqueue(new Callback<Status>() {
@Override
public void onResponse(Call<Status> call, retrofit2.Response<Status> 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<StatusContext>() {
@Override
public void onResponse(Call<StatusContext> call, retrofit2.Response<StatusContext> 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

View File

@ -20,13 +20,4 @@
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_appearance_settings">
<CheckBoxPreference
android:key="lightTheme"
android:title="@string/pref_title_light_theme"
android:defaultValue="false" />
</PreferenceCategory>
</PreferenceScreen>