Added some null checks & more defensive programming

This commit is contained in:
stefan-niedermann 2019-02-10 19:01:10 +01:00
parent c2aef80d9d
commit b9cd8c3592
9 changed files with 121 additions and 129 deletions

View file

@ -180,26 +180,20 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap
private void setupNotesList() {
initList();
// Pull to Refresh
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if (db.getNoteServerSyncHelper().isSyncPossible()) {
synchronize();
} else {
swipeRefreshLayout.setRefreshing(false);
Toast.makeText(getApplicationContext(), getString(R.string.error_sync, getString(NotesClientUtil.LoginStatus.NO_NETWORK.str)), Toast.LENGTH_LONG).show();
}
swipeRefreshLayout.setOnRefreshListener(() -> {
if (db.getNoteServerSyncHelper().isSyncPossible()) {
synchronize();
} else {
swipeRefreshLayout.setRefreshing(false);
Toast.makeText(getApplicationContext(), getString(R.string.error_sync, getString(NotesClientUtil.LoginStatus.NO_NETWORK.str)), Toast.LENGTH_LONG).show();
}
});
// Floating Action Button
fabCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent createIntent = new Intent(getApplicationContext(), EditNoteActivity.class);
createIntent.putExtra(EditNoteActivity.PARAM_CATEGORY, navigationSelection);
startActivityForResult(createIntent, create_note_cmd);
}
fabCreate.setOnClickListener((View view) -> {
Intent createIntent = new Intent(getApplicationContext(), EditNoteActivity.class);
createIntent.putExtra(EditNoteActivity.PARAM_CATEGORY, navigationSelection);
startActivityForResult(createIntent, create_note_cmd);
});
}
@ -373,12 +367,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap
this.updateUsernameInDrawer();
final NotesListViewActivity that = this;
this.account.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent settingsIntent = new Intent(that, SettingsActivity.class);
startActivityForResult(settingsIntent, server_settings);
}
this.account.setOnClickListener((View v) -> {
Intent settingsIntent = new Intent(that, SettingsActivity.class);
startActivityForResult(settingsIntent, server_settings);
});
adapterMenu.setItems(itemsMenu);
@ -424,14 +415,11 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap
refreshLists();
Log.v("Note", "Item deleted through swipe ----------------------------------------------");
Snackbar.make(swipeRefreshLayout, R.string.action_note_deleted, Snackbar.LENGTH_LONG)
.setAction(R.string.action_undo, new View.OnClickListener() {
@Override
public void onClick(View v) {
db.addNoteAndSync(dbNote);
refreshLists();
Snackbar.make(swipeRefreshLayout, R.string.action_note_restored, Snackbar.LENGTH_SHORT)
.show();
}
.setAction(R.string.action_undo, (View v) -> {
db.addNoteAndSync(dbNote);
refreshLists();
Snackbar.make(swipeRefreshLayout, R.string.action_note_restored, Snackbar.LENGTH_SHORT)
.show();
})
.show();
break;
@ -485,14 +473,11 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap
query = searchView.getQuery();
}
LoadNotesListTask.NotesLoadedListener callback = new LoadNotesListTask.NotesLoadedListener() {
@Override
public void onNotesLoaded(List<Item> notes, boolean showCategory) {
adapter.setShowCategory(showCategory);
adapter.setItemList(notes);
if (scrollToTop) {
listView.scrollToPosition(0);
}
LoadNotesListTask.NotesLoadedListener callback = (List<Item> notes, boolean showCategory) -> {
adapter.setShowCategory(showCategory);
adapter.setItemList(notes);
if (scrollToTop) {
listView.scrollToPosition(0);
}
};
new LoadNotesListTask(getApplicationContext(), callback, navigationSelection, query).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
@ -534,11 +519,8 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap
if (currentVisibility == View.VISIBLE) {
fabCreate.hide();
} else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
fabCreate.show();
}
new Handler().postDelayed(() -> {
fabCreate.show();
}, 150);
}

View file

@ -6,9 +6,6 @@ import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import com.google.android.material.textfield.TextInputLayout;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
@ -19,6 +16,10 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.textfield.TextInputLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import at.bitfire.cert4android.CustomCertManager;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -76,11 +77,8 @@ public class SettingsActivity extends AppCompatActivity {
}
}
field_url.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
new URLValidatorAsyncTask().execute(NotesClientUtil.formatURL(field_url.getText().toString()));
}
field_url.setOnFocusChangeListener((View v, boolean hasFocus) -> {
new URLValidatorAsyncTask().execute(NotesClientUtil.formatURL(field_url.getText().toString()));
});
field_url.addTextChangedListener(new TextWatcher() {
@ -128,27 +126,18 @@ public class SettingsActivity extends AppCompatActivity {
field_username.setText(preferences.getString(SETTINGS_USERNAME, DEFAULT_SETTINGS));
old_password = preferences.getString(SETTINGS_PASSWORD, DEFAULT_SETTINGS);
field_password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
login();
return true;
}
field_password.setOnEditorActionListener((TextView v, int actionId, KeyEvent event) -> {
login();
return true;
});
field_password.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
setPasswordHint(hasFocus);
}
field_password.setOnFocusChangeListener((View v, boolean hasFocus) -> {
setPasswordHint(hasFocus);
});
setPasswordHint(false);
btn_submit.setEnabled(false);
btn_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login();
}
btn_submit.setOnClickListener((View v) -> {
login();
});
}

View file

@ -9,6 +9,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.RemoteViews;
import it.niedermann.owncloud.notes.R;
@ -52,20 +53,20 @@ public class NoteListWidget extends AppWidgetProvider {
// Launch application when user taps the header icon or app title
Intent intent = new Intent("android.intent.action.MAIN");
intent.setComponent(new ComponentName(context.getPackageName(),
NotesListViewActivity.class.getName()));
NotesListViewActivity.class.getName()));
// Open the main app if the user taps the widget header
PendingIntent openAppI = PendingIntent.getActivity( context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent openAppI = PendingIntent.getActivity(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
// Launch create note activity if user taps "+" icon on header
PendingIntent newNoteI = PendingIntent.getActivity( context,0,
(new Intent(context, EditNoteActivity.class)),
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent newNoteI = PendingIntent.getActivity(context, 0,
(new Intent(context, EditNoteActivity.class)),
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent templatePI = PendingIntent.getActivity(context,0,
(new Intent(context, EditNoteActivity.class)),
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent templatePI = PendingIntent.getActivity(context, 0,
(new Intent(context, EditNoteActivity.class)),
PendingIntent.FLAG_UPDATE_CURRENT);
if (darkTheme) {
views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list_dark);
@ -104,12 +105,20 @@ public class NoteListWidget extends AppWidgetProvider {
super.onReceive(context, intent);
AppWidgetManager awm = AppWidgetManager.getInstance(context);
if (intent.getAction().equals(awm.ACTION_APPWIDGET_UPDATE)) {
if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
updateAppWidget(context, awm, new int[] { intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) });
} else {
updateAppWidget(context, awm, awm.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)));
if (intent.getAction() != null) {
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
if (intent.getExtras() != null) {
updateAppWidget(context, awm, new int[]{intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)});
} else {
Log.w(NoteListWidget.class.getSimpleName(), "intent.getExtras() is null");
}
} else {
updateAppWidget(context, awm, awm.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)));
}
}
} else {
Log.w(NoteListWidget.class.getSimpleName(), "intent.getAction() is null");
}
}
@ -129,10 +138,11 @@ public class NoteListWidget extends AppWidgetProvider {
}
private static String getWidgetTitle(Context context, int displayMode, String category) {
switch (displayMode)
{
case NoteListWidget.NLW_DISPLAY_ALL: return context.getString(R.string.app_name);
case NoteListWidget.NLW_DISPLAY_STARRED: return context.getString(R.string.label_favorites);
switch (displayMode) {
case NoteListWidget.NLW_DISPLAY_ALL:
return context.getString(R.string.app_name);
case NoteListWidget.NLW_DISPLAY_STARRED:
return context.getString(R.string.label_favorites);
case NoteListWidget.NLW_DISPLAY_CATEGORY:
if (category.equals("")) {
return context.getString(R.string.action_uncategorized);

View file

@ -8,7 +8,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
@ -17,6 +17,7 @@ import android.widget.Filter;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.R;
@ -68,7 +69,7 @@ public class CategoryDialogFragment extends DialogFragment {
public void onClick(DialogInterface dialog, int which) {
CategoryDialogListener listener;
Fragment target = getTargetFragment();
if (target != null && target instanceof CategoryDialogListener) {
if (target instanceof CategoryDialogListener) {
listener = (CategoryDialogListener) target;
} else {
listener = (CategoryDialogListener) getActivity();
@ -88,7 +89,11 @@ public class CategoryDialogFragment extends DialogFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
if (getDialog().getWindow() != null) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
} else {
Log.w(CategoryDialogFragment.class.getSimpleName(), "can not set SOFT_INPUT_STATE_ALWAYAS_VISIBLE because getWindow() == null");
}
}

View file

@ -109,43 +109,47 @@ public class NoteEditFragment extends BaseNoteFragment {
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ButterKnife.bind(this, getView());
if(getView() != null) {
ButterKnife.bind(this, getView());
setActiveTextView(editContent);
setActiveTextView(editContent);
if (note.getContent().isEmpty()) {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
if (note.getContent().isEmpty()) {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
// workaround for issue yydcdut/RxMarkdown#41
note.setContent(note.getContent().replace("\r\n", "\n"));
// workaround for issue yydcdut/RxMarkdown#41
note.setContent(note.getContent().replace("\r\n", "\n"));
editContent.setText(note.getContent());
editContent.setEnabled(true);
editContent.setText(note.getContent());
editContent.setEnabled(true);
RxMarkdown.live(editContent)
.config(MarkDownUtil.getMarkDownConfiguration(getActivity().getApplicationContext()).build())
.factory(EditFactory.create())
.intoObservable()
.subscribe(new Subscriber<CharSequence>() {
@Override
public void onCompleted() {
}
RxMarkdown.live(editContent)
.config(MarkDownUtil.getMarkDownConfiguration(getActivity().getApplicationContext()).build())
.factory(EditFactory.create())
.intoObservable()
.subscribe(new Subscriber<CharSequence>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(CharSequence charSequence) {
editContent.setText(charSequence, TextView.BufferType.SPANNABLE);
}
});
@Override
public void onNext(CharSequence charSequence) {
editContent.setText(charSequence, TextView.BufferType.SPANNABLE);
}
});
editContent.setCustomSelectionActionModeCallback(new StyleCallback(this.editContent));
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
if(sp.getBoolean("font", false)) {
editContent.setTypeface(Typeface.MONOSPACE);
editContent.setCustomSelectionActionModeCallback(new StyleCallback(this.editContent));
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
if (sp.getBoolean("font", false)) {
editContent.setTypeface(Typeface.MONOSPACE);
}
} else {
Log.e(NoteEditFragment.class.getSimpleName(), "getView() is null");
}
}

View file

@ -1,12 +1,13 @@
package it.niedermann.owncloud.notes.android.fragment.about;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.R;
@ -22,7 +23,7 @@ public class AboutFragmentContributingTab extends Fragment {
TextView aboutTranslate;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_about_contribution_tab, container, false);
ButterKnife.bind(this, v);
SupportUtil.setHtml(aboutSource, R.string.about_source, getString(R.string.url_source));

View file

@ -1,12 +1,13 @@
package it.niedermann.owncloud.notes.android.fragment.about;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.BuildConfig;
@ -23,7 +24,7 @@ public class AboutFragmentCreditsTab extends Fragment {
TextView aboutTranslators;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_about_credits_tab, container, false);
ButterKnife.bind(this, v);
SupportUtil.setHtml(aboutVersion, R.string.about_version, "v" + BuildConfig.VERSION_NAME);

View file

@ -3,13 +3,14 @@ package it.niedermann.owncloud.notes.android.fragment.about;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
@ -29,7 +30,7 @@ public class AboutFragmentLicenseTab extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_about_license_tab, container, false);
ButterKnife.bind(this, v);
SupportUtil.setHtml(iconsDisclaimer, R.string.about_icons_disclaimer, getString(R.string.about_app_icon_author));

View file

@ -6,9 +6,6 @@ import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import android.text.TextUtils;
import android.util.Log;
@ -18,6 +15,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import it.niedermann.owncloud.notes.android.appwidget.NoteListWidget;
import it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget;
import it.niedermann.owncloud.notes.model.CloudNote;
@ -49,14 +49,13 @@ public class NoteSQLiteOpenHelper extends SQLiteOpenHelper {
private static NoteSQLiteOpenHelper instance;
private NoteServerSyncHelper serverSyncHelper = null;
private Context context = null;
private NoteServerSyncHelper serverSyncHelper;
private Context context;
private NoteSQLiteOpenHelper(Context context) {
super(context, database_name, null, database_version);
this.context = context.getApplicationContext();
serverSyncHelper = NoteServerSyncHelper.getInstance(this);
//recreateDatabase(getWritableDatabase());
}
public static NoteSQLiteOpenHelper getInstance(Context context) {