diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/AppSettings.java b/app/src/main/java/org/nuclearfog/twidda/activity/AppSettings.java index 04b513f2..3e508204 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/AppSettings.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/AppSettings.java @@ -21,7 +21,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -37,6 +36,8 @@ import org.nuclearfog.twidda.backend.LocationListLoader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.engine.TwitterEngine; import org.nuclearfog.twidda.backend.items.TrendLocation; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.DatabaseAdapter; @@ -45,15 +46,17 @@ import org.nuclearfog.twidda.database.GlobalSettings; import java.util.List; import java.util.regex.Matcher; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.RUNNING; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static org.nuclearfog.twidda.activity.MainActivity.RETURN_APP_LOGOUT; import static org.nuclearfog.twidda.activity.MainActivity.RETURN_DB_CLEARED; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DEL_DATABASE; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.LOGOUT_APP; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.WRONG_PROXY; public class AppSettings extends AppCompatActivity implements OnClickListener, OnDismissListener, - OnCheckedChangeListener, OnItemSelectedListener, DialogInterface.OnClickListener, OnColorChangedListener { + OnCheckedChangeListener, OnItemSelectedListener, OnDialogClick, OnColorChangedListener { private static final int INVERTCOLOR = 0xffffff; private static final String[] PICKER_SELECT = {"10", "20", "30", "40", "50", "60", "70", "80", "90", "100"}; @@ -150,6 +153,10 @@ public class AppSettings extends AppCompatActivity implements OnClickListener, O enableAuth.setChecked(settings.isProxyAuthSet()); setProxySetupVisibility(settings.isProxyEnabled(), settings.isProxyAuthSet()); + proxyDialog = DialogBuilder.create(this, WRONG_PROXY, this); + databaseDialog = DialogBuilder.create(this, DEL_DATABASE, this); + logoutDialog = DialogBuilder.create(this, LOGOUT_APP, this); + logout.setOnClickListener(this); load_popup.setOnClickListener(this); delButton.setOnClickListener(this); @@ -183,14 +190,6 @@ public class AppSettings extends AppCompatActivity implements OnClickListener, O TwitterEngine.resetTwitter(); super.onBackPressed(); } else { - if (proxyDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setTitle(R.string.info_error); - builder.setMessage(R.string.info_wrong_proxy_settings); - builder.setPositiveButton(R.string.confirm_discard_proxy_changes, this); - builder.setNegativeButton(android.R.string.cancel, null); - proxyDialog = builder.create(); - } if (!proxyDialog.isShowing()) { proxyDialog.show(); } @@ -229,23 +228,26 @@ public class AppSettings extends AppCompatActivity implements OnClickListener, O @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE) { - if (dialog == proxyDialog) { - // exit without saving proxy settings - AppSettings.super.onBackPressed(); - } else if (dialog == databaseDialog) { - DatabaseAdapter.deleteDatabase(getApplicationContext()); - setResult(RETURN_DB_CLEARED); - } else if (dialog == logoutDialog) { + public void onConfirm(DialogBuilder.DialogType type) { + switch (type) { + case LOGOUT_APP: settings.logout(); TwitterEngine.resetTwitter(); DatabaseAdapter.deleteDatabase(getApplicationContext()); setResult(RETURN_APP_LOGOUT); finish(); - } - } + break; + case DEL_DATABASE: + DatabaseAdapter.deleteDatabase(getApplicationContext()); + setResult(RETURN_DB_CLEARED); + break; + + case WRONG_PROXY: + // exit without saving proxy settings + finish(); + break; + } } @@ -253,26 +255,12 @@ public class AppSettings extends AppCompatActivity implements OnClickListener, O public void onClick(View v) { switch (v.getId()) { case R.id.delete_db: - if (databaseDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_delete_database); - builder.setNegativeButton(R.string.confirm_no, null); - builder.setPositiveButton(R.string.confirm_yes, this); - databaseDialog = builder.create(); - } if (!databaseDialog.isShowing()) { databaseDialog.show(); } break; case R.id.logout: - if (logoutDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_log_lout); - builder.setNegativeButton(R.string.confirm_no, null); - builder.setPositiveButton(R.string.confirm_yes, this); - logoutDialog = builder.create(); - } if (!logoutDialog.isShowing()) { logoutDialog.show(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java index d7b3a002..84da834d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java @@ -1,7 +1,6 @@ package org.nuclearfog.twidda.activity; import android.app.Dialog; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -13,18 +12,18 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.UserListUpdater; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.ListHolder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.RUNNING; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -34,11 +33,12 @@ import static org.nuclearfog.twidda.activity.ListDetail.KEY_LISTDETAIL_TITLE; import static org.nuclearfog.twidda.activity.ListDetail.KEY_LISTDETAIL_VISIB; import static org.nuclearfog.twidda.activity.ListDetail.RET_LIST_CHANGED; import static org.nuclearfog.twidda.activity.TwitterList.RET_LIST_CREATED; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.LISTPOPUP_LEAVE; /** * Popup activity for the list editor */ -public class ListPopup extends AppCompatActivity implements OnClickListener, DialogInterface.OnClickListener { +public class ListPopup extends AppCompatActivity implements OnClickListener, OnDialogClick { /** * Key for the list ID of the list if an existing list should be updated @@ -101,6 +101,7 @@ public class ListPopup extends AppCompatActivity implements OnClickListener, Dia popupTitle.setText(R.string.menu_edit_list); updateButton.setText(R.string.update_list); } + leaveDialog = DialogBuilder.create(this, LISTPOPUP_LEAVE, this); updateButton.setOnClickListener(this); } @@ -111,13 +112,7 @@ public class ListPopup extends AppCompatActivity implements OnClickListener, Dia && subTitleInput.getText().toString().equals(description)) { super.onBackPressed(); } else { - if (leaveDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_discard); - builder.setNegativeButton(R.string.confirm_no, null); - builder.setPositiveButton(R.string.confirm_yes, this); - leaveDialog = builder.show(); - } else if (!leaveDialog.isShowing()) { + if (!leaveDialog.isShowing()) { leaveDialog.show(); } } @@ -149,10 +144,8 @@ public class ListPopup extends AppCompatActivity implements OnClickListener, Dia @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE && dialog == leaveDialog) { - finish(); - } + public void onConfirm(DialogBuilder.DialogType type) { + finish(); } /** diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java index a161cf97..a2e1a4e8 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java @@ -17,13 +17,14 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.MessageUploader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.MessageHolder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; @@ -40,11 +41,12 @@ import static android.widget.Toast.LENGTH_SHORT; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_TYPE; import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_S; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.MSG_POPUP_LEAVE; /** * Direct message popup activity */ -public class MessagePopup extends AppCompatActivity implements OnClickListener, OnDismissListener { +public class MessagePopup extends AppCompatActivity implements OnClickListener, OnDismissListener, OnDialogClick { /** * key for the screen name if any @@ -61,7 +63,7 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener, private EditText receiver, message; private ImageButton media; - private Dialog loadingCircle; + private Dialog loadingCircle, leaveDialog; @Nullable private String mediaPath; @@ -90,6 +92,7 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener, root.setBackgroundColor(settings.getPopupColor()); FontTool.setViewFontAndColor(settings, root); + leaveDialog = DialogBuilder.create(this, MSG_POPUP_LEAVE, this); loadingCircle.requestWindowFeature(FEATURE_NO_TITLE); loadingCircle.setCanceledOnTouchOutside(false); loadingCircle.setContentView(load); @@ -106,17 +109,8 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener, public void onBackPressed() { if (receiver.getText().length() == 0 && message.getText().length() == 0 && mediaPath == null) { super.onBackPressed(); - } else { - Builder closeDialog = new Builder(this, R.style.ConfirmDialog); - closeDialog.setMessage(R.string.confirm_cancel_message); - closeDialog.setNegativeButton(R.string.confirm_no, null); - closeDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); - closeDialog.show(); + } else if (!leaveDialog.isShowing()) { + leaveDialog.show(); } } @@ -193,6 +187,13 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener, } } + @Override + public void onConfirm(DialogBuilder.DialogType type) { + if (type == MSG_POPUP_LEAVE) { + finish(); + } + } + /** * enable or disable loading dialog * diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java b/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java index f4e7cb3d..bc45eadb 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java @@ -23,7 +23,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -34,6 +33,8 @@ import org.nuclearfog.twidda.backend.ProfileUpdater; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.UserHolder; import org.nuclearfog.twidda.backend.items.TwitterUser; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; @@ -48,11 +49,12 @@ import static android.view.View.VISIBLE; import static android.view.Window.FEATURE_NO_TITLE; import static android.widget.Toast.LENGTH_SHORT; import static org.nuclearfog.twidda.activity.UserProfile.RETURN_PROFILE_CHANGED; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.PROFILE_EDIT_LEAVE; /** * Activity for Twitter profile editor */ -public class ProfileEditor extends AppCompatActivity implements OnClickListener, OnDismissListener { +public class ProfileEditor extends AppCompatActivity implements OnClickListener, OnDismissListener, OnDialogClick { private static final String[] PERM_READ = {READ_EXTERNAL_STORAGE}; private static final String[] MEDIA_MODE = {MediaStore.Images.Media.DATA}; @@ -77,7 +79,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, private ImageView profile_image, profile_banner; private EditText name, link, loc, bio; private Button add_banner_btn; - private Dialog loadingCircle; + private Dialog loadingCircle, closeDialog; private TwitterUser user; private String profileLink, bannerLink; @@ -113,6 +115,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, header.getLayoutParams().height = layoutHeight + buttonHeight; header.requestLayout(); + closeDialog = DialogBuilder.create(this, PROFILE_EDIT_LEAVE, this); loadingCircle.requestWindowFeature(FEATURE_NO_TITLE); loadingCircle.setCanceledOnTouchOutside(false); loadingCircle.setContentView(load); @@ -154,16 +157,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, && userLoc.equals(user.getLocation()) && userBio.equals(user.getBio()) && profileLink == null && bannerLink == null) { finish(); - } else { - Builder closeDialog = new Builder(this, R.style.ConfirmDialog); - closeDialog.setMessage(R.string.confirm_discard); - closeDialog.setNegativeButton(R.string.confirm_no, null); - closeDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); + } else if (!closeDialog.isShowing()) { closeDialog.show(); } } @@ -251,6 +245,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, } } + @Override public void onDismiss(DialogInterface dialog) { if (editorAsync != null && editorAsync.getStatus() == RUNNING) { @@ -258,6 +253,14 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, } } + + @Override + public void onConfirm(DialogBuilder.DialogType type) { + if (type == PROFILE_EDIT_LEAVE) { + finish(); + } + } + /** * enable or disable loading dialog * diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java b/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java index 2625d047..b55e789e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java @@ -3,7 +3,6 @@ package org.nuclearfog.twidda.activity; import android.app.Dialog; import android.content.ClipData; import android.content.ClipboardManager; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -20,7 +19,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.viewpager.widget.ViewPager; @@ -36,6 +34,8 @@ import org.nuclearfog.twidda.backend.TweetLoader; import org.nuclearfog.twidda.backend.TweetLoader.Action; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.items.Tweet; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; @@ -44,7 +44,6 @@ import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.regex.Pattern; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.RUNNING; import static android.view.View.GONE; import static android.view.View.VISIBLE; @@ -60,6 +59,7 @@ import static org.nuclearfog.twidda.activity.TweetPopup.KEY_TWEETPOPUP_TEXT; import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_ID; import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_MODE; import static org.nuclearfog.twidda.activity.UserDetail.USERLIST_RETWEETS; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DELETE_TWEET; import static org.nuclearfog.twidda.fragment.TweetFragment.INTENT_TWEET_REMOVED_ID; import static org.nuclearfog.twidda.fragment.TweetFragment.RETURN_TWEET_CHANGED; @@ -67,7 +67,7 @@ import static org.nuclearfog.twidda.fragment.TweetFragment.RETURN_TWEET_CHANGED; * Tweet Activity for tweet and user informations */ public class TweetActivity extends AppCompatActivity implements OnClickListener, - OnLongClickListener, OnTagClickListener, DialogInterface.OnClickListener { + OnLongClickListener, OnTagClickListener, OnDialogClick { /** * ID of the tweet to open. required @@ -135,6 +135,7 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, tweetText.setMovementMethod(LinkAndScrollMovement.getInstance()); tweetText.setLinkTextColor(settings.getHighlightColor()); root.setBackgroundColor(settings.getBackgroundColor()); + deleteDialog = DialogBuilder.create(this, DELETE_TWEET, this); replyName.setOnClickListener(this); ansButton.setOnClickListener(this); @@ -191,13 +192,6 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, if (statusAsync != null && tweet != null && statusAsync.getStatus() != RUNNING) { switch (item.getItemId()) { case R.id.delete_tweet: - if (deleteDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_delete_tweet); - builder.setPositiveButton(R.string.confirm_yes, this); - builder.setNegativeButton(R.string.confirm_no, null); - deleteDialog = builder.create(); - } if (!deleteDialog.isShowing()) { deleteDialog.show(); } @@ -231,15 +225,6 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, } - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE && dialog == deleteDialog && tweet != null) { - statusAsync = new TweetLoader(TweetActivity.this, Action.DELETE); - statusAsync.execute(tweet.getId()); - } - } - - @Override public void onClick(View v) { if (statusAsync != null && tweet != null && statusAsync.getStatus() != RUNNING) { @@ -333,6 +318,15 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, } + @Override + public void onConfirm(DialogBuilder.DialogType type) { + if (type == DELETE_TWEET && tweet != null) { + statusAsync = new TweetLoader(TweetActivity.this, Action.DELETE); + statusAsync.execute(tweet.getId()); + } + } + + @Override public void onTagClick(String tag) { Intent intent = new Intent(this, SearchPage.class); diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java index 1bdd327c..a2e5c4b6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java @@ -20,13 +20,13 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.TweetUploader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.TweetHolder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; @@ -36,7 +36,6 @@ import java.util.List; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.content.Intent.ACTION_PICK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.AsyncTask.Status.RUNNING; @@ -51,12 +50,14 @@ import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_TYPE; import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_S; import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_VIDEO; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.TWEETPOPUP_ERROR; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.TWEETPOPUP_LEAVE; /** * Activity to create a tweet */ public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener, - OnDismissListener, DialogInterface.OnClickListener { + OnDismissListener, DialogBuilder.OnDialogClick { /** * key for the replied tweet if any @@ -126,6 +127,8 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo tweetText.append(prefix); } + errorDialog = DialogBuilder.create(this, TWEETPOPUP_ERROR, this); + closingDialog = DialogBuilder.create(this, TWEETPOPUP_LEAVE, this); loadingCircle.requestWindowFeature(FEATURE_NO_TITLE); loadingCircle.setCanceledOnTouchOutside(false); loadingCircle.setContentView(load); @@ -329,14 +332,12 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE) { - if (dialog == errorDialog) { - uploaderAsync = new TweetUploader(this); - uploaderAsync.execute(tweet); - } else if (dialog == closingDialog) { - finish(); - } + public void onConfirm(DialogBuilder.DialogType type) { + if (type == TWEETPOPUP_ERROR) { + uploaderAsync = new TweetUploader(this); + uploaderAsync.execute(tweet); + } else if (type == TWEETPOPUP_LEAVE) { + finish(); } } @@ -366,13 +367,7 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo */ public void onError(EngineException error) { ErrorHandler.handleFailure(this, error); - if (errorDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setTitle(R.string.info_error).setMessage(R.string.error_sending_tweet); - builder.setPositiveButton(R.string.confirm_retry, this); - builder.setNegativeButton(android.R.string.cancel, null); - errorDialog = builder.show(); - } else if (!errorDialog.isShowing()) { + if (!errorDialog.isShowing()) { errorDialog.show(); } } @@ -383,13 +378,7 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo */ private void showClosingMsg() { if (!prefix.equals(tweetText.getText().toString()) || !mediaPath.isEmpty()) { - if (closingDialog == null) { - Builder builder = new Builder(this, R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_cancel_tweet); - builder.setNegativeButton(R.string.confirm_no, null); - builder.setPositiveButton(R.string.confirm_yes, this); - closingDialog = builder.show(); - } else if (!closingDialog.isShowing()) { + if (!closingDialog.isShowing()) { closingDialog.show(); } } else { diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java index a3980d09..270962bd 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java @@ -1,6 +1,6 @@ package org.nuclearfog.twidda.activity; -import android.content.DialogInterface; +import android.app.Dialog; import android.content.Intent; import android.graphics.Point; import android.net.Uri; @@ -18,7 +18,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.viewpager.widget.ViewPager; @@ -37,6 +36,8 @@ import org.nuclearfog.twidda.backend.ProfileLoader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.items.TwitterUser; import org.nuclearfog.twidda.backend.items.UserRelation; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; @@ -66,11 +67,15 @@ import static org.nuclearfog.twidda.activity.UserDetail.KEY_USERDETAIL_MODE; import static org.nuclearfog.twidda.activity.UserDetail.USERLIST_FOLLOWER; import static org.nuclearfog.twidda.activity.UserDetail.USERLIST_FRIENDS; import static org.nuclearfog.twidda.backend.ProfileLoader.Action.LDR_PROFILE; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.PROFILE_BLOCK; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.PROFILE_MUTE; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.PROFILE_UNFOLLOW; /** * Activity class for user profile page */ -public class UserProfile extends AppCompatActivity implements OnClickListener, OnTagClickListener, OnTabSelectedListener { +public class UserProfile extends AppCompatActivity implements OnClickListener, OnTagClickListener, + OnTabSelectedListener, OnDialogClick { /** * Key for the user ID @@ -107,6 +112,7 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O private View profile_head, profile_layer; private ViewPager pager; private TabLayout tabLayout; + private Dialog unfollowConfirm, blockConfirm, muteConfirm; private ProfileLoader profileAsync; private UserRelation relation; @@ -167,6 +173,9 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O pager.setAdapter(adapter); pager.setOffscreenPageLimit(2); tabLayout.setupWithViewPager(pager); + unfollowConfirm = DialogBuilder.create(this, PROFILE_UNFOLLOW, this); + blockConfirm = DialogBuilder.create(this, PROFILE_BLOCK, this); + muteConfirm = DialogBuilder.create(this, PROFILE_MUTE, this); tabLayout.addOnTabSelectedListener(this); following.setOnClickListener(this); @@ -301,34 +310,20 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O break; case R.id.profile_follow: - profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_FOLLOW); if (!relation.isFriend()) { + profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_FOLLOW); profileAsync.execute(user.getId()); - } else { - new Builder(this).setMessage(R.string.confirm_unfollow) - .setNegativeButton(R.string.confirm_no, null) - .setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - profileAsync.execute(user.getId()); - } - }).show(); + } else if (!unfollowConfirm.isShowing()) { + unfollowConfirm.show(); } break; case R.id.profile_mute: - profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_MUTE); if (relation.isMuted()) { + profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_MUTE); profileAsync.execute(user.getId()); - } else { - new Builder(this).setMessage(R.string.confirm_mute) - .setNegativeButton(R.string.confirm_no, null) - .setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - profileAsync.execute(user.getId()); - } - }).show(); + } else if (!muteConfirm.isShowing()) { + muteConfirm.show(); } break; @@ -336,15 +331,8 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_BLOCK); if (relation.isBlocked()) { profileAsync.execute(user.getId()); - } else { - new Builder(this).setMessage(R.string.confirm_block) - .setNegativeButton(R.string.confirm_no, null) - .setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - profileAsync.execute(user.getId()); - } - }).show(); + } else if (!blockConfirm.isShowing()) { + blockConfirm.show(); } break; @@ -466,6 +454,21 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O } + @Override + public void onConfirm(DialogBuilder.DialogType type) { + if (type == PROFILE_UNFOLLOW) { + profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_FOLLOW); + profileAsync.execute(user.getId()); + } else if (type == PROFILE_BLOCK) { + profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_BLOCK); + profileAsync.execute(user.getId()); + } else if (type == PROFILE_MUTE) { + profileAsync = new ProfileLoader(this, ProfileLoader.Action.ACTION_MUTE); + profileAsync.execute(user.getId()); + } + } + + @Override public void onTabSelected(Tab tab) { } diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java b/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java index 7497f331..5ae1e69f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/TweetAdapter.java @@ -225,12 +225,12 @@ public class TweetAdapter extends Adapter { TweetHolder vh = (TweetHolder) holder; TwitterUser user = tweet.getUser(); if (tweet.getEmbeddedTweet() != null) { - String retweeter = "RT " + user.getScreenname(); - vh.retweeter.setText(retweeter); + vh.retweeter.setText(user.getScreenname()); + vh.retweeter.setVisibility(VISIBLE); tweet = tweet.getEmbeddedTweet(); user = tweet.getUser(); } else { - vh.retweeter.setText(""); + vh.retweeter.setVisibility(INVISIBLE); } Spanned text = Tagger.makeTextWithLinks(tweet.getTweet(), settings.getHighlightColor()); vh.tweet.setText(text); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/DialogBuilder.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/DialogBuilder.java new file mode 100644 index 00000000..b3095926 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/DialogBuilder.java @@ -0,0 +1,153 @@ +package org.nuclearfog.twidda.backend.utils; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; + +import androidx.appcompat.app.AlertDialog; + +import org.nuclearfog.twidda.R; + +/** + * this class creates alert dialogs with a custom listener + */ +public final class DialogBuilder { + + /** + * types of dialogs, every dialog has its own message and title + */ + public enum DialogType { + DEL_MESSAGE, + WRONG_PROXY, + DEL_DATABASE, + LOGOUT_APP, + LISTPOPUP_LEAVE, + TWEETPOPUP_LEAVE, + TWEETPOPUP_ERROR, + MSG_POPUP_LEAVE, + PROFILE_EDIT_LEAVE, + DELETE_TWEET, + PROFILE_UNFOLLOW, + PROFILE_BLOCK, + PROFILE_MUTE, + DEL_USER_LIST, + LIST_UNFOLLOW, + LIST_DELETE + } + + private DialogBuilder() { + } + + /** + * creates an alert dialog + * + * @param context activity context + * @param type type of error dialog + * @param listener listener for positive button + * @return dialog instance + */ + public static Dialog create(Context context, final DialogType type, final OnDialogClick listener) { + int posButton = R.string.confirm_yes; + int negButton = R.string.confirm_no; + int title = 0; + int message = 0; + + switch (type) { + case DEL_MESSAGE: + message = R.string.confirm_delete_message; + break; + + case WRONG_PROXY: + title = R.string.info_error; + message = R.string.info_wrong_proxy_settings; + posButton = R.string.confirm_discard_proxy_changes; + negButton = android.R.string.cancel; + break; + + case DEL_DATABASE: + message = R.string.confirm_delete_database; + break; + + case LOGOUT_APP: + message = R.string.confirm_log_lout; + break; + + case LISTPOPUP_LEAVE: + case PROFILE_EDIT_LEAVE: + message = R.string.confirm_discard; + break; + + case TWEETPOPUP_LEAVE: + message = R.string.confirm_cancel_tweet; + break; + + case TWEETPOPUP_ERROR: + title = R.string.info_error; + message = R.string.error_sending_tweet; + posButton = R.string.confirm_retry; + negButton = android.R.string.cancel; + break; + + case MSG_POPUP_LEAVE: + message = R.string.confirm_cancel_message; + break; + + case DELETE_TWEET: + message = R.string.confirm_delete_tweet; + break; + + case PROFILE_UNFOLLOW: + message = R.string.confirm_unfollow; + break; + + case PROFILE_BLOCK: + message = R.string.confirm_block; + break; + + case PROFILE_MUTE: + message = R.string.confirm_mute; + break; + + case DEL_USER_LIST: + message = R.string.confirm_remove_user_from_list; + posButton = android.R.string.ok; + negButton = android.R.string.cancel; + break; + + case LIST_UNFOLLOW: + message = R.string.confirm_unfollow_list; + break; + + case LIST_DELETE: + message = R.string.confirm_delete_list; + break; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.ConfirmDialog); + if (title != 0) + builder.setTitle(title); + builder.setMessage(message); + builder.setNegativeButton(negButton, null); + builder.setPositiveButton(posButton, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + listener.onConfirm(type); + } + }); + return builder.create(); + } + + /** + * listener for dialog + */ + public interface OnDialogClick { + + /** + * called when the positive button was clicked + * + * @param type type of dialog + */ + void onConfirm(DialogType type); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java index 16dbb9e1..b1f46512 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java @@ -12,7 +12,10 @@ import org.nuclearfog.twidda.backend.engine.EngineException; * This class handles {@link EngineException} from {@link org.nuclearfog.twidda.backend.engine.TwitterEngine} * and prints Toast messages to current activity */ -public abstract class ErrorHandler { +public final class ErrorHandler { + + private ErrorHandler() { + } /** * show error messages and handle failures diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/FontTool.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/FontTool.java index 8c9fb309..ac0ed73c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/FontTool.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/FontTool.java @@ -9,7 +9,10 @@ import org.nuclearfog.twidda.database.GlobalSettings; /** * Class for converting all fonts in a view */ -public abstract class FontTool { +public final class FontTool { + + private FontTool() { + } /** * Set fonts type & color to all text elements in a view diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/TimeString.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/TimeString.java index 7ffce3b2..8554afd0 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/TimeString.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/TimeString.java @@ -3,9 +3,20 @@ package org.nuclearfog.twidda.backend.utils; import java.text.SimpleDateFormat; import java.util.Date; +/** + * this class creates time strings + */ +public final class TimeString { -public abstract class TimeString { + private TimeString() { + } + /** + * creates a time string from the difference between the current time and the given time + * + * @param time time value from which to create a difference + * @return time string showing the time difference + */ public static String getTimeString(long time) { long diff = new Date().getTime() - time; long seconds = diff / 1000; diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java index ca7f0f2d..e267d1d1 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java @@ -2,7 +2,6 @@ package org.nuclearfog.twidda.fragment; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; @@ -12,7 +11,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -30,10 +28,11 @@ import org.nuclearfog.twidda.backend.TwitterListLoader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.UserListList; import org.nuclearfog.twidda.backend.items.TwitterList; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.database.GlobalSettings; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.FINISHED; import static android.os.AsyncTask.Status.RUNNING; import static org.nuclearfog.twidda.activity.ListDetail.KEY_CURRENT_USER_OWNS; @@ -50,12 +49,14 @@ import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.FOLLOW; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD_MEMBERSHIPS; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD_USERLISTS; import static org.nuclearfog.twidda.backend.TwitterListLoader.NO_CURSOR; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.LIST_DELETE; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.LIST_UNFOLLOW; /** * Fragment class for user lists */ public class ListFragment extends Fragment implements OnRefreshListener, ListClickListener, - FragmentChangeObserver, DialogInterface.OnClickListener { + FragmentChangeObserver, OnDialogClick { /** * Key for the owner ID @@ -105,6 +106,8 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli list.setHasFixedSize(true); list.setAdapter(adapter); + followDialog = DialogBuilder.create(requireContext(), LIST_UNFOLLOW, this); + deleteDialog = DialogBuilder.create(requireContext(), LIST_DELETE, this); reloadLayout = new SwipeRefreshLayout(context); reloadLayout.setProgressBackgroundColorSchemeColor(settings.getHighlightColor()); reloadLayout.setOnRefreshListener(this); @@ -151,13 +154,6 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli case FOLLOW: if (listItem.isFollowing()) { - if (followDialog == null) { - Builder confirmDialog = new Builder(getContext(), R.style.ConfirmDialog); - confirmDialog.setMessage(R.string.confirm_unfollow_list); - confirmDialog.setNegativeButton(R.string.confirm_no, null); - confirmDialog.setPositiveButton(R.string.confirm_yes, this); - followDialog = confirmDialog.create(); - } if (!followDialog.isShowing()) { selectedList = listItem.getId(); followDialog.show(); @@ -187,13 +183,6 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli break; case DELETE: - if (deleteDialog == null) { - Builder confirmDialog = new Builder(requireContext(), R.style.ConfirmDialog); - confirmDialog.setMessage(R.string.confirm_delete_list); - confirmDialog.setNegativeButton(R.string.confirm_no, null); - confirmDialog.setPositiveButton(R.string.confirm_yes, this); - deleteDialog = confirmDialog.create(); - } if (!deleteDialog.isShowing()) { selectedList = listItem.getId(); deleteDialog.show(); @@ -204,23 +193,21 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli } - public void onFooterClick(long cursor) { - if (listTask != null && listTask.getStatus() != RUNNING) { - load(cursor); + @Override + public void onConfirm(DialogBuilder.DialogType type) { + if (type == LIST_UNFOLLOW) { + listTask = new TwitterListLoader(this, FOLLOW, selectedList, ""); + listTask.execute(); + } else if (type == LIST_DELETE) { + listTask = new TwitterListLoader(this, DELETE, selectedList, ""); + listTask.execute(); } } - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE) { - if (dialog == followDialog) { - listTask = new TwitterListLoader(this, FOLLOW, selectedList, ""); - listTask.execute(); - } else if (dialog == deleteDialog) { - listTask = new TwitterListLoader(this, DELETE, selectedList, ""); - listTask.execute(); - } + public void onFooterClick(long cursor) { + if (listTask != null && listTask.getStatus() != RUNNING) { + load(cursor); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java index d1704422..f63331bc 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java @@ -2,7 +2,6 @@ package org.nuclearfog.twidda.fragment; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -13,7 +12,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -31,12 +29,12 @@ import org.nuclearfog.twidda.backend.MessageListLoader; import org.nuclearfog.twidda.backend.TrendListLoader; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.items.Message; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.database.GlobalSettings; import java.util.List; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.FINISHED; import static android.os.AsyncTask.Status.RUNNING; import static android.widget.Toast.LENGTH_SHORT; @@ -46,11 +44,12 @@ import static org.nuclearfog.twidda.activity.TweetActivity.KEY_TWEET_ID; import static org.nuclearfog.twidda.activity.TweetActivity.KEY_TWEET_NAME; import static org.nuclearfog.twidda.activity.TweetActivity.LINK_PATTERN; import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DEL_MESSAGE; /** * Fragment class for direct message lists */ -public class MessageFragment extends Fragment implements OnRefreshListener, OnItemSelected, DialogInterface.OnClickListener { +public class MessageFragment extends Fragment implements OnRefreshListener, OnItemSelected, DialogBuilder.OnDialogClick { private MessageListLoader messageTask; private SwipeRefreshLayout reload; @@ -72,6 +71,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt list.setHasFixedSize(true); list.setAdapter(adapter); + deleteDialog = DialogBuilder.create(requireContext(), DEL_MESSAGE, this); reload = new SwipeRefreshLayout(context); reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor()); reload.setOnRefreshListener(this); @@ -155,13 +155,6 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt break; case DELETE: - if (deleteDialog == null) { - Builder builder = new Builder(getContext(), R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_delete_message); - builder.setNegativeButton(R.string.confirm_no, null); - builder.setPositiveButton(R.string.confirm_yes, this); - deleteDialog = builder.create(); - } if (!deleteDialog.isShowing()) { deleteDialog.show(); } @@ -177,13 +170,10 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt } } - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE && dialog == deleteDialog) { - messageTask = new MessageListLoader(MessageFragment.this, MessageListLoader.Action.DEL); - messageTask.execute(deleteId); - } + public void onConfirm(DialogBuilder.DialogType type) { + messageTask = new MessageListLoader(MessageFragment.this, MessageListLoader.Action.DEL); + messageTask.execute(deleteId); } /** diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java index 1444e1d5..f13a3592 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java @@ -2,7 +2,6 @@ package org.nuclearfog.twidda.fragment; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; @@ -12,7 +11,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -27,24 +25,27 @@ import org.nuclearfog.twidda.adapter.UserAdapter.UserClickListener; import org.nuclearfog.twidda.backend.UserListLoader; import org.nuclearfog.twidda.backend.UserListLoader.Action; import org.nuclearfog.twidda.backend.UserListManager; +import org.nuclearfog.twidda.backend.UserListManager.ListManagerCallback; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.holder.TwitterUserList; import org.nuclearfog.twidda.backend.items.TwitterUser; +import org.nuclearfog.twidda.backend.utils.DialogBuilder; +import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.database.GlobalSettings; -import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.FINISHED; import static android.os.AsyncTask.Status.RUNNING; import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID; import static org.nuclearfog.twidda.backend.UserListLoader.NO_CURSOR; import static org.nuclearfog.twidda.backend.UserListManager.Action.DEL_USER; +import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DEL_USER_LIST; /** * Fragment class for lists a list of users */ public class UserFragment extends Fragment implements OnRefreshListener, UserClickListener, - FragmentChangeObserver, DialogInterface.OnClickListener, UserListManager.ListManagerCallback { + FragmentChangeObserver, OnDialogClick, ListManagerCallback { /** * key to set the type of user list to show @@ -106,6 +107,7 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli search = param.getString(KEY_FRAG_USER_SEARCH, ""); delUser = param.getBoolean(KEY_FRAG_DEL_USER, false); } + deleteDialog = DialogBuilder.create(requireContext(), DEL_USER_LIST, this); reload = new SwipeRefreshLayout(context); reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor()); reload.setOnRefreshListener(this); @@ -159,13 +161,7 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli @Override public void onDelete(String name) { deleteUserName = name; - if (deleteDialog == null) { - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(), R.style.ConfirmDialog); - builder.setMessage(R.string.confirm_remove_user_from_list); - builder.setPositiveButton(android.R.string.ok, this); - builder.setNegativeButton(android.R.string.cancel, null); - deleteDialog = builder.show(); - } else if (!deleteDialog.isShowing()) { + if (!deleteDialog.isShowing()) { deleteDialog.show(); } } @@ -189,8 +185,8 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli @Override - public void onClick(DialogInterface dialog, int which) { - if (which == BUTTON_POSITIVE && dialog == deleteDialog) { + public void onConfirm(DialogBuilder.DialogType type) { + if (type == DEL_USER_LIST) { if (listTask == null || listTask.getStatus() != RUNNING) { listTask = new UserListManager(id, DEL_USER, requireContext(), this); listTask.execute(deleteUserName); diff --git a/app/src/main/res/layout/item_tweet.xml b/app/src/main/res/layout/item_tweet.xml index ecda1f55..28897fe7 100644 --- a/app/src/main/res/layout/item_tweet.xml +++ b/app/src/main/res/layout/item_tweet.xml @@ -1,5 +1,6 @@ @@ -94,8 +95,10 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:drawablePadding="@dimen/tweetitem_padding_drawable" android:singleLine="true" - android:textSize="@dimen/tweetitem_textsize_button" /> + android:textSize="@dimen/tweetitem_textsize_button" + app:drawableStartCompat="@drawable/retweet" /> + android:text="@string/settings_button_popup" />