diff --git a/app/build.gradle b/app/build.gradle index b0447589..ff444c76 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId 'org.nuclearfog.twidda' minSdkVersion 21 targetSdkVersion 33 - versionCode 89 - versionName '3.2.2' + versionCode 90 + versionName '3.2.3' resConfigs 'en', 'es', 'de-rDE', 'zh-rCN' } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/Connection.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/Connection.java index 9da866da..47a3bc62 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/Connection.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/Connection.java @@ -1,10 +1,12 @@ package org.nuclearfog.twidda.backend.api; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.ConnectionResult; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.helper.MediaStatus; import org.nuclearfog.twidda.backend.helper.update.FilterUpdate; import org.nuclearfog.twidda.backend.helper.update.ProfileUpdate; import org.nuclearfog.twidda.backend.helper.update.PushUpdate; +import org.nuclearfog.twidda.backend.helper.update.ReportUpdate; import org.nuclearfog.twidda.backend.helper.update.StatusUpdate; import org.nuclearfog.twidda.backend.helper.update.UserListUpdate; import org.nuclearfog.twidda.model.Account; @@ -45,7 +47,7 @@ public interface Connection { * @param connection connection configuration * @return authorisation link to open in a browser */ - String getAuthorisationLink(ConnectionConfig connection) throws ConnectionException; + ConnectionResult getAuthorisationLink(ConnectionUpdate connection) throws ConnectionException; /** * login app and get login credentials @@ -54,7 +56,7 @@ public interface Connection { * @param code verification code to login * @return account information of the created login */ - Account loginApp(ConnectionConfig connection, String code) throws ConnectionException; + Account loginApp(ConnectionUpdate connection, String code) throws ConnectionException; /** * get information about the host server @@ -705,4 +707,11 @@ public interface Connection { * @return translation of the status */ Translation getStatusTranslation(long id) throws ConnectionException; + + /** + * report status/user + * + * @param update report contianing information about status/user + */ + void createReport(ReportUpdate update) throws ConnectionException; } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java index fbfeae53..4e4b2062 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java @@ -26,12 +26,14 @@ import org.nuclearfog.twidda.backend.api.mastodon.impl.MastodonStatus; import org.nuclearfog.twidda.backend.api.mastodon.impl.MastodonTranslation; import org.nuclearfog.twidda.backend.api.mastodon.impl.MastodonTrend; import org.nuclearfog.twidda.backend.api.mastodon.impl.MastodonUser; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.ConnectionResult; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.helper.MediaStatus; import org.nuclearfog.twidda.backend.helper.update.FilterUpdate; import org.nuclearfog.twidda.backend.helper.update.PollUpdate; import org.nuclearfog.twidda.backend.helper.update.ProfileUpdate; import org.nuclearfog.twidda.backend.helper.update.PushUpdate; +import org.nuclearfog.twidda.backend.helper.update.ReportUpdate; import org.nuclearfog.twidda.backend.helper.update.StatusUpdate; import org.nuclearfog.twidda.backend.helper.update.UserListUpdate; import org.nuclearfog.twidda.backend.utils.ConnectionBuilder; @@ -145,6 +147,7 @@ public class Mastodon implements Connection { private static final String ENDPOINT_DOMAIN_BLOCK = "/api/v1/domain_blocks"; private static final String ENDPOINT_PUSH_UPDATE = "/api/v1/push/subscription"; private static final String ENDPOINT_FILTER = "/api/v2/filters"; + private static final String ENDPOINT_REPORT = "/api/v1/reports"; private static final MediaType TYPE_TEXT = MediaType.parse("text/plain"); private static final MediaType TYPE_STREAM = MediaType.parse("application/octet-stream"); @@ -170,7 +173,7 @@ public class Mastodon implements Connection { @Override - public String getAuthorisationLink(ConnectionConfig connection) throws MastodonException { + public ConnectionResult getAuthorisationLink(ConnectionUpdate connection) throws MastodonException { List params = new ArrayList<>(); params.add("scopes=" + AUTH_SCOPES); params.add("redirect_uris=" + REDIRECT_URI); @@ -184,8 +187,8 @@ public class Mastodon implements Connection { JSONObject json = new JSONObject(body.string()); String client_id = json.getString("client_id"); String client_secret = json.getString("client_secret"); - connection.setOauthTokens(client_id, client_secret); - return hostname + ENDPOINT_AUTHORIZE_APP + "?scope=" + AUTH_SCOPES + "&response_type=code&redirect_uri=" + REDIRECT_URI + "&client_id=" + client_id; + String authLink = hostname + ENDPOINT_AUTHORIZE_APP + "?scope=" + AUTH_SCOPES + "&response_type=code&redirect_uri=" + REDIRECT_URI + "&client_id=" + client_id; + return new ConnectionResult(authLink, client_id, client_secret); } throw new MastodonException(response); } catch (IOException | JSONException e) { @@ -195,7 +198,7 @@ public class Mastodon implements Connection { @Override - public Account loginApp(ConnectionConfig connection, String pin) throws MastodonException { + public Account loginApp(ConnectionUpdate connection, String pin) throws MastodonException { List params = new ArrayList<>(); params.add("client_id=" + connection.getOauthConsumerToken()); params.add("client_secret=" + connection.getOauthTokenSecret()); @@ -1228,9 +1231,9 @@ public class Mastodon implements Connection { @Override public Translation getStatusTranslation(long id) throws ConnectionException { try { - List param = new ArrayList<>(); - param.add("lang=" + Locale.getDefault().getLanguage()); // set system language as destiny for translation - Response response = post(ENDPOINT_STATUS + id + "/translate", param); + List params = new ArrayList<>(); + params.add("lang=" + Locale.getDefault().getLanguage()); // set system language as destiny for translation + Response response = post(ENDPOINT_STATUS + id + "/translate", params); ResponseBody body = response.body(); if (response.code() == 200 && body != null) { JSONObject json = new JSONObject(body.string()); @@ -1242,6 +1245,35 @@ public class Mastodon implements Connection { } } + + @Override + public void createReport(ReportUpdate update) throws ConnectionException { + try { + List params = new ArrayList<>(); + params.add("account_id=" + update.getUserId()); + for (long statusId : update.getStatusIds()) + params.add("status_ids[]=" + statusId); + for (int ruleId : update.getRuleIds()) + params.add("rule_ids[]=" + ruleId); + if (!update.getComment().trim().isEmpty()) + params.add("comment=" + StringUtils.encode(update.getComment())); + if (update.getCategory() == ReportUpdate.CATEGORY_OTHER) + params.add("category=other"); + else if (update.getCategory() == ReportUpdate.CATEGORY_SPAM) + params.add("category=spam"); + else if (update.getCategory() == ReportUpdate.CATEGORY_VIOLATION) + params.add("category=violation"); + if (update.getForward()) + params.add("forward=true"); + Response response = post(ENDPOINT_REPORT, params); + if (response.code() != 200) { + throw new MastodonException(response); + } + } catch (IOException e) { + throw new MastodonException(e); + } + } + /** * get information about the current user * diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/TwitterV1.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/TwitterV1.java index e15b6acc..6cc3b17c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/TwitterV1.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/TwitterV1.java @@ -22,11 +22,13 @@ import org.nuclearfog.twidda.backend.api.twitter.v1.impl.TweetV1; import org.nuclearfog.twidda.backend.api.twitter.v1.impl.TwitterV1Instance; import org.nuclearfog.twidda.backend.api.twitter.v1.impl.UserListV1; import org.nuclearfog.twidda.backend.api.twitter.v1.impl.UserV1; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.ConnectionResult; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.helper.MediaStatus; import org.nuclearfog.twidda.backend.helper.update.FilterUpdate; import org.nuclearfog.twidda.backend.helper.update.ProfileUpdate; import org.nuclearfog.twidda.backend.helper.update.PushUpdate; +import org.nuclearfog.twidda.backend.helper.update.ReportUpdate; import org.nuclearfog.twidda.backend.helper.update.StatusUpdate; import org.nuclearfog.twidda.backend.helper.update.UserListUpdate; import org.nuclearfog.twidda.backend.utils.ConnectionBuilder; @@ -199,7 +201,7 @@ public class TwitterV1 implements Connection { @Override - public String getAuthorisationLink(ConnectionConfig connection) throws TwitterException { + public ConnectionResult getAuthorisationLink(ConnectionUpdate connection) throws TwitterException { try { Response response; if (connection.useTokens()) @@ -212,8 +214,8 @@ public class TwitterV1 implements Connection { // extract oauth_token from url Uri uri = Uri.parse(AUTHENTICATE + "?" + res); String tempOauthToken = uri.getQueryParameter("oauth_token"); - connection.setTempOauthToken(tempOauthToken); - return TwitterV1.AUTHENTICATE + "?oauth_token=" + tempOauthToken; + String authLink = TwitterV1.AUTHENTICATE + "?oauth_token=" + tempOauthToken; + return new ConnectionResult(authLink, tempOauthToken); } throw new TwitterException(response); } catch (IOException e) { @@ -223,7 +225,7 @@ public class TwitterV1 implements Connection { @Override - public Account loginApp(ConnectionConfig connection, String pin) throws TwitterException { + public Account loginApp(ConnectionUpdate connection, String pin) throws TwitterException { List params = new ArrayList<>(); params.add("oauth_verifier=" + pin); params.add("oauth_token=" + connection.getTempOauthToken()); @@ -1239,6 +1241,12 @@ public class TwitterV1 implements Connection { throw new TwitterException("not supported"); } + + @Override + public void createReport(ReportUpdate update) throws ConnectionException { + throw new TwitterException("not implemented"); + } + /** * get tweets using an endpoint * diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/TwitterV2.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/TwitterV2.java index 50eda789..43077024 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/TwitterV2.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/TwitterV2.java @@ -19,7 +19,7 @@ import org.nuclearfog.twidda.backend.api.twitter.v2.maps.LocationV2Map; import org.nuclearfog.twidda.backend.api.twitter.v2.maps.MediaV2Map; import org.nuclearfog.twidda.backend.api.twitter.v2.maps.PollV2Map; import org.nuclearfog.twidda.backend.api.twitter.v2.maps.UserV2Map; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.utils.StringUtils; import org.nuclearfog.twidda.model.Account; import org.nuclearfog.twidda.model.Instance; @@ -58,7 +58,7 @@ public class TwitterV2 extends TwitterV1 { @Override - public Account loginApp(ConnectionConfig connection, String pin) throws TwitterException { + public Account loginApp(ConnectionUpdate connection, String pin) throws TwitterException { Account account = super.loginApp(connection, pin); return new AccountV2(account); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java index 2d05a74d..bdfd795b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java @@ -9,7 +9,8 @@ import org.nuclearfog.twidda.BuildConfig; import org.nuclearfog.twidda.backend.api.Connection; import org.nuclearfog.twidda.backend.api.ConnectionException; import org.nuclearfog.twidda.backend.api.ConnectionManager; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.ConnectionResult; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.helper.update.PushUpdate; import org.nuclearfog.twidda.config.Configuration; import org.nuclearfog.twidda.config.GlobalSettings; @@ -53,8 +54,8 @@ public class LoginAction extends AsyncExecutor 0) { this.expires_at = expires_at; diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/helper/update/ReportUpdate.java b/app/src/main/java/org/nuclearfog/twidda/backend/helper/update/ReportUpdate.java new file mode 100644 index 00000000..99ac81cf --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/helper/update/ReportUpdate.java @@ -0,0 +1,140 @@ +package org.nuclearfog.twidda.backend.helper.update; + +import androidx.annotation.NonNull; + +import java.io.Serializable; +import java.util.Arrays; + +/** + * Updater class to create report of status/user + * + * @author nuclearfog + */ +public class ReportUpdate implements Serializable { + + private static final long serialVersionUID = 7643792374030657129L; + + public static final int CATEGORY_OTHER = 10; + public static final int CATEGORY_SPAM = 11; + public static final int CATEGORY_VIOLATION = 12; + + private long userId; + private long[] statusIds = {}; + private int[] ruleIds = {}; + private String comment = ""; + private int category = CATEGORY_OTHER; + private boolean forward = false; + + /** + * @param userId user ID to report + */ + public ReportUpdate(long userId) { + this.userId = userId; + } + + /** + * get user ID to report + * + * @return user ID + */ + public long getUserId() { + return userId; + } + + /** + * set status ID's related to user ID + * + * @param statusIds array of status IDs + */ + public void setStatusIds(long[] statusIds) { + this.statusIds = Arrays.copyOf(statusIds, statusIds.length); + } + + /** + * get status ID's related to user ID + * + * @return array of status IDs + */ + public long[] getStatusIds() { + return Arrays.copyOf(statusIds, statusIds.length); + } + + /** + * set rule IDs violated by user + * + * @param ruleIds array of rule IDs + */ + public void setRuleIds(int[] ruleIds) { + this.ruleIds = Arrays.copyOf(ruleIds, ruleIds.length); + } + + /** + * get rule IDs violated by user + * + * @return array of rule IDs + */ + public int[] getRuleIds() { + return Arrays.copyOf(ruleIds, ruleIds.length); + } + + /** + * add additional comment to violation + * + * @param comment comment attached to the report + */ + public void setComment(String comment) { + this.comment = comment; + } + + /** + * get additional comment to violation + * + * @return comment attached to the report + */ + public String getComment() { + return comment; + } + + /** + * set category of violation + * + * @param category violation category {@link #CATEGORY_VIOLATION ,#CATEGORY_SPAM,#CATEGORY_OTHER} + */ + public void setCategory(int category) { + this.category = category; + } + + /** + * get category of violation + * + * @return violation category {@link #CATEGORY_VIOLATION ,#CATEGORY_SPAM,#CATEGORY_OTHER} + */ + public int getCategory() { + return category; + } + + /** + * set report forwarding to source instance + * + * @return true to forward report to source instance + */ + public void setForward(boolean forward) { + this.forward = forward; + } + + /** + * should report be forwarded to source instance + * + * @return true to forward report to source instance + */ + public boolean getForward() { + return forward; + } + + + @NonNull + @Override + public String toString() { + return "userID=" + userId; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/LoginActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/LoginActivity.java index a91795fb..ca36f517 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/LoginActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/LoginActivity.java @@ -33,7 +33,8 @@ import org.nuclearfog.twidda.backend.async.AsyncExecutor.AsyncCallback; import org.nuclearfog.twidda.backend.async.LoginAction; import org.nuclearfog.twidda.backend.async.LoginAction.LoginParam; import org.nuclearfog.twidda.backend.async.LoginAction.LoginResult; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.ConnectionResult; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorUtils; import org.nuclearfog.twidda.config.Configuration; @@ -97,8 +98,8 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa private ViewGroup root; @Nullable - private String loginLink; - private ConnectionConfig connection = new ConnectionConfig(); + private ConnectionResult connectionResult; + private ConnectionUpdate connection = new ConnectionUpdate(); @Override @@ -132,8 +133,8 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa hostSelector.setAdapter(adapter); if (savedInstanceState != null) { Serializable data = savedInstanceState.getSerializable(KEY_SAVE); - if (data instanceof ConnectionConfig) { - connection = (ConnectionConfig) data; + if (data instanceof ConnectionUpdate) { + connection = (ConnectionUpdate) data; } } @@ -251,7 +252,7 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa else if (v.getId() == R.id.login_verifier) { String code = pinInput.getText().toString(); // check if user clicked on PIN button - if (loginLink == null) { + if (connectionResult == null) { Toast.makeText(getApplicationContext(), R.string.info_get_link, Toast.LENGTH_LONG).show(); } else if (code.isEmpty()) { pinInput.setError(getString(R.string.error_enter_code)); @@ -275,12 +276,14 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa } // open API settings dialog else if (v.getId() == R.id.login_network_settings) { - if (hostSelector.getSelectedItemPosition() == IDX_TWITTER) { - connectionDialog.show(connection); - } else if (hostSelector.getSelectedItemPosition() == IDX_MASTODON) { - connectionDialog.show(connection); + if (!connectionDialog.isShowing()) { + if (hostSelector.getSelectedItemPosition() == IDX_TWITTER) { + connectionDialog.show(connection); + } else if (hostSelector.getSelectedItemPosition() == IDX_MASTODON) { + connectionDialog.show(connection); + } + reset(); } - loginLink = null; } } @@ -299,7 +302,7 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa connection.setApiType(Configuration.TWITTER2); } } - loginLink = null; + reset(); } @@ -317,8 +320,11 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa break; case LoginResult.MODE_REQUEST: - loginLink = result.redirectUrl; - connect(); + connectionResult = result.connection; + if (connectionResult != null) { + connection.setConnection(connectionResult); + connect(connectionResult.getAuthorizationUrl()); + } break; case LoginResult.MODE_ERROR: @@ -330,7 +336,7 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa /** * open login page */ - private void connect() { + private void connect(String loginLink) { Intent loginIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(loginLink)); try { startActivity(loginIntent); @@ -338,4 +344,12 @@ public class LoginActivity extends AppCompatActivity implements ActivityResultCa Toast.makeText(getApplicationContext(), R.string.error_open_link, Toast.LENGTH_SHORT).show(); } } + + /** + * reset connection information + */ + private void reset() { + connection.setConnection(null); + connectionResult = null; + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java index 1e6a0ea5..55bb0a59 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java @@ -68,7 +68,7 @@ public class MainActivity extends AppCompatActivity implements ActivityResultCal viewPager = findViewById(R.id.home_pager); tabSelector = findViewById(R.id.home_tab); root = findViewById(R.id.main_layout); - loadingCircle = new ProgressDialog(this); + loadingCircle = new ProgressDialog(this, null); settings = GlobalSettings.get(this); tabSelector.addViewPager(viewPager); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MessageEditor.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MessageEditor.java index 43cc20b4..9bbc3909 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MessageEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MessageEditor.java @@ -87,7 +87,7 @@ public class MessageEditor extends MediaActivity implements OnClickListener, OnC messageUpdater = new MessageUpdater(this); instanceLoader = new InstanceLoader(this); - loadingCircle = new ProgressDialog(this); + loadingCircle = new ProgressDialog(this, this); confirmDialog = new ConfirmDialog(this, this); String prefix = getIntent().getStringExtra(KEY_MESSAGE_PREFIX); @@ -97,7 +97,6 @@ public class MessageEditor extends MediaActivity implements OnClickListener, OnC send.setOnClickListener(this); media.setOnClickListener(this); preview.setOnClickListener(this); - loadingCircle.addOnProgressStopListener(this); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java index 59e4c927..7960e778 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java @@ -736,8 +736,7 @@ public class ProfileActivity extends AppCompatActivity implements ActivityResult if (result.mode == DomainResult.MODE_BLOCK) { Toast.makeText(getApplicationContext(), R.string.info_domain_blocked, Toast.LENGTH_SHORT).show(); } else if (result.mode == DomainResult.ERROR) { - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileEditor.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileEditor.java index 6a805291..325acc9d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileEditor.java @@ -102,7 +102,7 @@ public class ProfileEditor extends MediaActivity implements OnClickListener, Asy profileLocation = findViewById(R.id.profile_edit_change_location); userDescription = findViewById(R.id.profile_edit_change_description); - loadingCircle = new ProgressDialog(this); + loadingCircle = new ProgressDialog(this, null); confirmDialog = new ConfirmDialog(this, this); editorAsync = new UserUpdater(this); settings = GlobalSettings.get(this); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java index c5a5d923..1b7460aa 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java @@ -256,8 +256,7 @@ public class SearchActivity extends AppCompatActivity implements OnTabSelectedLi break; case HashtagResult.ERROR: - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); break; } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java index d3454e7b..921fe8bd 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java @@ -266,6 +266,7 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen hideSensitive.setOnCheckedChangeListener(this); enable_proxy.setOnCheckedChangeListener(this); enable_auth.setOnCheckedChangeListener(this); + push_label.setOnClickListener(this); toolbarOverlap.setOnCheckedChangeListener(this); fontSelector.setOnItemSelectedListener(this); scaleSelector.setOnItemSelectedListener(this); @@ -328,6 +329,7 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen if (requestCode == REQUEST_PERMISSION_NOTIFICATION) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { PushSubscription.subscripe(getApplicationContext()); + pushDialog.show(); } else { enablePush.setChecked(false); } @@ -423,6 +425,10 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen color = settings.getFollowIconColor(); showColorPicker(color, false); } + // show push configuration dialog + else if (v.getId() == R.id.settings_enable_push_descr) { + pushDialog.show(); + } } @@ -677,8 +683,7 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen // set listener after modifying content to prevent listener call location_dropdown.setOnItemSelectedListener(this); } else { - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java index 6a929320..16e8b539 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java @@ -1019,8 +1019,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener break; case StatusResult.ERROR: - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); if (status == null) { finish(); } else if (result.exception != null && result.exception.getErrorCode() == ConnectionException.RESOURCE_NOT_FOUND) { @@ -1066,8 +1065,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener break; case NotificationActionResult.ERROR: - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); if (notification == null) { finish(); } else if (result.exception != null && result.exception.getErrorCode() == ConnectionException.RESOURCE_NOT_FOUND) { @@ -1101,8 +1099,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener break; case PollActionResult.ERROR: - String message = ErrorUtils.getErrorMessage(this, result.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + ErrorUtils.showErrorMessage(this, result.exception); break; } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java index 9bb5ced0..670d7cdc 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java @@ -135,7 +135,7 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr instanceLoader = new InstanceLoader(this); statusUpdater = new StatusUpdater(this); settings = GlobalSettings.get(this); - loadingCircle = new ProgressDialog(this); + loadingCircle = new ProgressDialog(this, this); confirmDialog = new ConfirmDialog(this, this); preferenceDialog = new StatusPreferenceDialog(this, statusUpdate); pollDialog = new PollDialog(this, this); @@ -190,7 +190,6 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr pollBtn.setOnClickListener(this); mediaBtn.setOnClickListener(this); locationBtn.setOnClickListener(this); - loadingCircle.addOnProgressStopListener(this); } @@ -212,6 +211,13 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr } + @Override + protected void onStop() { + audioDialog.dismiss(); + super.onStop(); + } + + @Override protected void onSaveInstanceState(@NonNull Bundle outState) { outState.putSerializable(KEY_SAVE, statusUpdate); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistEditor.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistEditor.java index 1fd1407a..6a6a8cfe 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistEditor.java @@ -90,7 +90,7 @@ public class UserlistEditor extends AppCompatActivity implements OnClickListener titleText = findViewById(R.id.list_edit_title); descriptionText = findViewById(R.id.list_edit_descr); - loadingCircle = new ProgressDialog(this); + loadingCircle = new ProgressDialog(this, this); confirmDialog = new ConfirmDialog(this, this); listUpdater = new UserlistUpdater(this); @@ -115,7 +115,6 @@ public class UserlistEditor extends AppCompatActivity implements OnClickListener visibilityLabel.setVisibility(View.INVISIBLE); } updateButton.setOnClickListener(this); - loadingCircle.addOnProgressStopListener(this); visibilitySwitch.setOnCheckedChangeListener(this); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/AudioPlayerDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/AudioPlayerDialog.java index 54e632a1..e67d5ea1 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/AudioPlayerDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/AudioPlayerDialog.java @@ -4,12 +4,14 @@ import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.net.Uri; +import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; @@ -49,20 +51,27 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea private ExoPlayer player; + @Nullable private Uri data; /** - * @inheritDoc + * */ public AudioPlayerDialog(Activity activity) { super(activity, R.style.AudioDialog); + player = new ExoPlayer.Builder(activity.getApplicationContext(), createRenderer(activity.getApplicationContext())).build(); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_audio_player); - controls = findViewById(R.id.dialog_audio_player_controls); mediaLink = findViewById(R.id.dialog_audio_player_share); + controls = findViewById(R.id.dialog_audio_player_controls); controls.setShowNextButton(false); controls.setShowPreviousButton(false); - player = new ExoPlayer.Builder(activity.getApplicationContext(), createRenderer(activity.getApplicationContext())).build(); controls.setPlayer(player); controls.setShowTimeoutMs(-1); @@ -70,6 +79,47 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea } + @Override + protected void onStart() { + super.onStart(); + // prevent re-initializing after resuming + if (data != null) { + DataSource.Factory dataSourceFactory; + MediaItem mediaItem = MediaItem.fromUri(data); + // initialize online source + if (data.getScheme().startsWith("http")) { + // configure with okhttp connection of the app + dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(getContext())); + mediaLink.setVisibility(View.VISIBLE); + } + // initialize local source + else { + mediaLink.setVisibility(View.GONE); + dataSourceFactory = new DataSource.Factory() { + @NonNull + @Override + public DataSource createDataSource() { + return new ContentDataSource(getContext()); + } + }; + } + MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem); + player.setMediaSource(mediaSource); + player.prepare(); + player.setPlayWhenReady(true); + // reset data source + data = null; + } + } + + + @Override + protected void onStop() { + super.onStop(); + player.pause(); + } + + @Override public void show() { // use show(Uri) instead @@ -90,16 +140,16 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea @Override public void onClick(View v) { if (v.getId() == R.id.dialog_audio_player_share) { - if (data != null) { - LinkUtils.openMediaLink(getContext(), data); - } + LinkUtils.openMediaLink(getContext(), data); } } @Override public void close() { // remove player to prevent memory leak - controls.setPlayer(null); + if (controls != null) { + controls.setPlayer(null); + } } /** @@ -108,35 +158,10 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea * @param data uri to the audio file */ public void show(Uri data) { - if (isShowing()) - return; - super.show(); - this.data = data; - - DataSource.Factory dataSourceFactory; - MediaItem mediaItem = MediaItem.fromUri(data); - - // initialize online source - if (data.getScheme().startsWith("http")) { - // configure with okhttp connection of the app - dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(getContext())); - mediaLink.setVisibility(View.VISIBLE); + if (!isShowing()) { + this.data = data; + super.show(); } - // initialize local source - else { - mediaLink.setVisibility(View.GONE); - dataSourceFactory = new DataSource.Factory() { - @NonNull - @Override - public DataSource createDataSource() { - return new ContentDataSource(getContext()); - } - }; - } - MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem); - player.setMediaSource(mediaSource); - player.prepare(); - player.setPlayWhenReady(true); } /** diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java index 770728fa..2f8e9f23 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -126,70 +127,59 @@ public class ConfirmDialog extends Dialog implements OnClickListener { */ public static final int NOTIFICATION_DISMISS = 623; + /** + * show notification when adding domain hostname to blocklist + */ public static final int DOMAIN_BLOCK_ADD = 624; + /** + * show notification when removing domain hostname to blocklist + */ public static final int DOMAIN_BLOCK_REMOVE = 625; + /** + * show notification when removing a filter from filterlist + */ public static final int FILTER_REMOVE = 626; private TextView title, message; private Button confirm, cancel; - private ViewGroup root; private OnConfirmListener listener; + private int type = 0; + private String messageStr = ""; + /** * */ public ConfirmDialog(Activity activity, OnConfirmListener listener) { super(activity, R.style.ConfirmDialog); this.listener = listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_confirm); - root = findViewById(R.id.confirm_rootview); + ViewGroup root = findViewById(R.id.confirm_rootview); confirm = findViewById(R.id.confirm_yes); cancel = findViewById(R.id.confirm_no); title = findViewById(R.id.confirm_title); message = findViewById(R.id.confirm_message); + AppStyles.setTheme(root); + confirm.setOnClickListener(this); cancel.setOnClickListener(this); } @Override - public void dismiss() { - if (isShowing()) { - super.dismiss(); - } - } - - - @Override - public void show() { - } - - /** - * creates an alert dialog - * - * @param type Type of dialog to show - */ - public void show(int type) { - show(type, null); - } - - /** - * creates an alert dialog - * - * @param type Type of dialog to show - * @param messageTxt override default message text - */ - public void show(int type, @Nullable String messageTxt) { - if (isShowing()) { - return; - } - // attach type to the view + protected void onStart() { + super.onStart(); confirm.setTag(type); // default visibility values int titleVis = View.GONE; @@ -301,13 +291,48 @@ public class ConfirmDialog extends Dialog implements OnClickListener { confirm.setText(confirmRes); confirm.setCompoundDrawablesWithIntrinsicBounds(confirmIconRes, 0, 0, 0); // setup message - if (messageTxt != null && !messageTxt.isEmpty()) { - message.setText(messageTxt); + if (messageStr != null && !messageStr.isEmpty()) { + message.setText(messageStr); } else { message.setText(messageRes); } - AppStyles.setTheme(root); - super.show(); + } + + + @Override + public void show() { + // using show(int) and show(int, String) instead + } + + + @Override + public void dismiss() { + if (isShowing()) { + super.dismiss(); + } + } + + /** + * creates an alert dialog + * + * @param type Type of dialog to show + */ + public void show(int type) { + show(type, null); + } + + /** + * creates an alert dialog + * + * @param type Type of dialog to show + * @param messageStr override default message text + */ + public void show(int type, @Nullable String messageStr) { + if (!isShowing()) { + this.type = type; + this.messageStr = messageStr; + super.show(); + } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConnectionDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConnectionDialog.java index 0a5096df..da092a57 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConnectionDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConnectionDialog.java @@ -2,11 +2,11 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.util.Patterns; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.view.Window; import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; @@ -17,7 +17,7 @@ import com.kyleduo.switchbutton.SwitchButton; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.api.twitter.v1.Tokens; -import org.nuclearfog.twidda.backend.helper.ConnectionConfig; +import org.nuclearfog.twidda.backend.helper.update.ConnectionUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.config.Configuration; @@ -32,13 +32,19 @@ public class ConnectionDialog extends Dialog implements OnCheckedChangeListener, private TextView apiLabel, v2Label, hostLabel; private EditText host, api1, api2; - private ConnectionConfig connection; - + private ConnectionUpdate connection; + /** + * + */ public ConnectionDialog(Activity activity) { super(activity, R.style.ConfirmDialog); - requestWindowFeature(Window.FEATURE_NO_TITLE); - setCanceledOnTouchOutside(false); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_connection); ViewGroup root = findViewById(R.id.dialog_connection_root); Button confirm = findViewById(R.id.dialog_connection_confirm); @@ -53,9 +59,8 @@ public class ConnectionDialog extends Dialog implements OnCheckedChangeListener, api1 = findViewById(R.id.dialog_connection_api1); api2 = findViewById(R.id.dialog_connection_api2); - int width = (int) (activity.getResources().getDisplayMetrics().widthPixels * 0.9f); - getWindow().setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT); AppStyles.setTheme(root); + enableApi.setOnCheckedChangeListener(this); enableHost.setOnCheckedChangeListener(this); confirm.setOnClickListener(this); @@ -63,6 +68,67 @@ public class ConnectionDialog extends Dialog implements OnCheckedChangeListener, } + @Override + protected void onStart() { + super.onStart(); + if (connection != null) { + switch (connection.getApiType()) { + case TWITTER2: + enableV2.setCheckedImmediately(true); + // fall through + + case TWITTER1: + if (connection.useTokens()) { + enableApi.setCheckedImmediately(true); + api1.setVisibility(View.VISIBLE); + api2.setVisibility(View.VISIBLE); + api1.setText(connection.getOauthConsumerToken()); + api2.setText(connection.getOauthTokenSecret()); + } else { + enableApi.setCheckedImmediately(false); + api1.setVisibility(View.INVISIBLE); + api2.setVisibility(View.INVISIBLE); + } + enableApi.setVisibility(View.VISIBLE); + apiLabel.setVisibility(View.VISIBLE); + hostLabel.setVisibility(View.GONE); + enableHost.setVisibility(View.GONE); + host.setVisibility(View.GONE); + break; + + case MASTODON: + if (connection.useHost()) { + enableHost.setCheckedImmediately(true); + host.setVisibility(View.VISIBLE); + host.setText(connection.getHostname()); + } else { + enableHost.setCheckedImmediately(false); + host.setVisibility(View.INVISIBLE); + } + hostLabel.setVisibility(View.VISIBLE); + enableHost.setVisibility(View.VISIBLE); + enableApi.setVisibility(View.GONE); + apiLabel.setVisibility(View.GONE); + enableV2.setVisibility(View.GONE); + v2Label.setVisibility(View.GONE); + api1.setVisibility(View.GONE); + api2.setVisibility(View.GONE); + break; + } + } + // reset all error messages + if (api1.getError() != null) { + api1.setError(null); + } + if (api2.getError() != null) { + api2.setError(null); + } + if (host.getError() != null) { + host.setError(null); + } + } + + @Override public void onClick(View v) { if (v.getId() == R.id.dialog_connection_confirm) { @@ -142,7 +208,7 @@ public class ConnectionDialog extends Dialog implements OnCheckedChangeListener, @Override public void show() { - // ignore method call, call instead show(int) + // using show(ConnectionConfig) instead } @@ -153,60 +219,13 @@ public class ConnectionDialog extends Dialog implements OnCheckedChangeListener, } } - - public void show(ConnectionConfig connection) { - switch (connection.getApiType()) { - case TWITTER2: - enableV2.setCheckedImmediately(true); - case TWITTER1: - if (connection.useTokens()) { - enableApi.setCheckedImmediately(true); - api1.setVisibility(View.VISIBLE); - api2.setVisibility(View.VISIBLE); - api1.setText(connection.getOauthConsumerToken()); - api2.setText(connection.getOauthTokenSecret()); - } else { - enableApi.setCheckedImmediately(false); - api1.setVisibility(View.INVISIBLE); - api2.setVisibility(View.INVISIBLE); - } - enableApi.setVisibility(View.VISIBLE); - apiLabel.setVisibility(View.VISIBLE); - hostLabel.setVisibility(View.GONE); - enableHost.setVisibility(View.GONE); - host.setVisibility(View.GONE); - break; - - case MASTODON: - if (connection.useHost()) { - enableHost.setCheckedImmediately(true); - host.setVisibility(View.VISIBLE); - host.setText(connection.getHostname()); - } else { - enableHost.setCheckedImmediately(false); - host.setVisibility(View.INVISIBLE); - } - hostLabel.setVisibility(View.VISIBLE); - enableHost.setVisibility(View.VISIBLE); - enableApi.setVisibility(View.GONE); - apiLabel.setVisibility(View.GONE); - enableV2.setVisibility(View.GONE); - v2Label.setVisibility(View.GONE); - api1.setVisibility(View.GONE); - api2.setVisibility(View.GONE); - break; - - default: - return; + /** + * + */ + public void show(ConnectionUpdate connection) { + if (!isShowing()) { + this.connection = connection; + super.show(); } - // erase all error messages - if (api1.getError() != null) - api1.setError(null); - if (api2.getError() != null) - api2.setError(null); - if (host.getError() != null) - host.setError(null); - this.connection = connection; - super.show(); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/EmojiPicker.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/EmojiPicker.java index 61be4a1d..4485d65c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/EmojiPicker.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/EmojiPicker.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.res.Resources; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -34,18 +35,24 @@ public class EmojiPicker extends BottomSheetDialog implements AsyncCallback mBehavior = BottomSheetBehavior.from((View) root.getParent()); mBehavior.setPeekHeight(height); - listView.setLayoutManager(new LinearLayoutManager(activity.getApplicationContext(), LinearLayoutManager.VERTICAL, false)); + listView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); listView.setAdapter(adapter); - EmojiLoader emojiLoader = new EmojiLoader(activity.getApplicationContext()); emojiLoader.execute(null, this); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java index 869db7dc..229e8808 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -39,9 +40,8 @@ public class FilterDialog extends Dialog implements OnClickListener, OnCheckedCh private TextView title; private StatusFilterAction filterAction; - private FilterDialogCallback callback; - private FilterUpdate update = new FilterUpdate(); + private FilterUpdate update; /** * @@ -49,8 +49,15 @@ public class FilterDialog extends Dialog implements OnClickListener, OnCheckedCh public FilterDialog(Activity activity, FilterDialogCallback callback) { super(activity, R.style.FilterDialog); this.callback = callback; - setContentView(R.layout.dialog_filter); + update = new FilterUpdate(); + filterAction = new StatusFilterAction(activity); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_filter); ViewGroup root = findViewById(R.id.dialog_filter_root); Button btn_create = findViewById(R.id.dialog_filter_create); sw_hide = findViewById(R.id.dialog_filter_switch_hide); @@ -63,7 +70,6 @@ public class FilterDialog extends Dialog implements OnClickListener, OnCheckedCh txt_title = findViewById(R.id.dialog_filter_name); txt_keywords = findViewById(R.id.dialog_filter_keywords); - filterAction = new StatusFilterAction(activity); AppStyles.setTheme(root); btn_create.setOnClickListener(this); @@ -76,15 +82,53 @@ public class FilterDialog extends Dialog implements OnClickListener, OnCheckedCh } + @Override + protected void onStart() { + super.onStart(); + if (update != null) { + // update an existing filter + if (update.getId() != 0L) { + title.setText(R.string.dialog_filter_update); + if (update.getKeywords().length > 0) { + StringBuilder keywordsStr = new StringBuilder(); + for (String keyword : update.getKeywords()) { + keywordsStr.append(keyword).append('\n'); + } + // delete last newline symbol + keywordsStr.deleteCharAt(keywordsStr.length() - 1); + txt_keywords.setText(keywordsStr); + } else { + txt_keywords.setText(""); + } + } + // create new filter + else { + title.setText(R.string.dialog_filter_create); + txt_keywords.setText(""); + } + sw_home.setCheckedImmediately(update.filterHomeSet()); + sw_notification.setCheckedImmediately(update.filterNotificationSet()); + sw_public.setCheckedImmediately(update.filterPublicSet()); + sw_user.setCheckedImmediately(update.filterUserSet()); + sw_thread.setCheckedImmediately(update.filterThreadSet()); + sw_hide.setCheckedImmediately(update.getFilterAction() == Filter.ACTION_HIDE); + txt_title.setText(update.getTitle()); + } + } + + @Override public void show() { + // using show(filter) instead } @Override public void dismiss() { - filterAction.cancel(); - super.dismiss(); + if (isShowing()) { + filterAction.cancel(); + super.dismiss(); + } } @@ -150,41 +194,12 @@ public class FilterDialog extends Dialog implements OnClickListener, OnCheckedCh */ public void show(@Nullable Filter filter) { if (!isShowing()) { - super.show(); - // update an existing filter if (filter != null) { update = new FilterUpdate(filter); - title.setText(R.string.dialog_filter_update); - - if (filter.getKeywords().length > 0) { - StringBuilder keywordsStr = new StringBuilder(); - for (Filter.Keyword keyword : filter.getKeywords()) { - if (keyword.isOneWord()) { - keywordsStr.append("\"").append(keyword.getKeyword()).append("\"\n"); - } else { - keywordsStr.append(keyword.getKeyword()).append('\n'); - } - } - // delete last newline symbol - keywordsStr.deleteCharAt(keywordsStr.length() - 1); - txt_keywords.setText(keywordsStr); - } else { - txt_keywords.setText(""); - } - } - // create new filter - else { + } else { update = new FilterUpdate(); - title.setText(R.string.dialog_filter_create); - txt_keywords.setText(""); } - sw_home.setCheckedImmediately(update.filterHomeSet()); - sw_notification.setCheckedImmediately(update.filterNotificationSet()); - sw_public.setCheckedImmediately(update.filterPublicSet()); - sw_user.setCheckedImmediately(update.filterUserSet()); - sw_thread.setCheckedImmediately(update.filterThreadSet()); - sw_hide.setCheckedImmediately(update.getFilterAction() == Filter.ACTION_HIDE); - txt_title.setText(update.getTitle()); + super.show(); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/InfoDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/InfoDialog.java index dddbf803..24550412 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/InfoDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/InfoDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.widget.TextView; import org.nuclearfog.twidda.BuildConfig; @@ -19,6 +20,12 @@ public class InfoDialog extends Dialog { */ public InfoDialog(Activity activity) { super(activity, R.style.AppInfoDialog); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_app_info); TextView appInfo = findViewById(R.id.settings_app_info); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/LicenseDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/LicenseDialog.java index 9c7c6da8..1d396873 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/LicenseDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/LicenseDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.webkit.WebView; import org.nuclearfog.twidda.R; @@ -13,13 +14,20 @@ import org.nuclearfog.twidda.R; */ public class LicenseDialog extends Dialog { - + /** + * + */ public LicenseDialog(Activity activity) { super(activity, R.style.LicenseDialog); - WebView htmlViewer = new WebView(activity.getApplicationContext()); - setContentView(htmlViewer); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + WebView htmlViewer = new WebView(getContext()); htmlViewer.loadUrl("file:///android_asset/licenses.html"); + setContentView(htmlViewer); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetricsDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetricsDialog.java index 192cf39f..f912c7f4 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetricsDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetricsDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -21,9 +22,19 @@ public class MetricsDialog extends Dialog { private TextView views, profileClicks, linkClicks, quotes, videoViews; private View linkIcon, quoteIcon, videoIcon; + private Metrics metrics; + /** + * + */ public MetricsDialog(Activity activity) { super(activity, R.style.MetricsDialog); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_metrics); ViewGroup root = findViewById(R.id.dialog_metrics_root); views = findViewById(R.id.dialog_metrics_views); @@ -39,24 +50,9 @@ public class MetricsDialog extends Dialog { @Override - public void show() { - } - - - @Override - public void dismiss() { - if (isShowing()) { - super.dismiss(); - } - } - - /** - * show dialog window - * - * @param metrics status metrics to show - */ - public void show(Metrics metrics) { - if (!isShowing()) { + protected void onStart() { + super.onStart(); + if (metrics != null) { views.setText(StringUtils.NUMBER_FORMAT.format(metrics.getViews())); profileClicks.setText(StringUtils.NUMBER_FORMAT.format(metrics.getProfileClicks())); if (metrics.getLinkClicks() > 0) { @@ -83,6 +79,31 @@ public class MetricsDialog extends Dialog { videoViews.setVisibility(View.GONE); videoIcon.setVisibility(View.GONE); } + } + } + + + @Override + public void show() { + // using show(Metrics) instead + } + + + @Override + public void dismiss() { + if (isShowing()) { + super.dismiss(); + } + } + + /** + * show dialog window + * + * @param metrics status metrics to show + */ + public void show(Metrics metrics) { + if (!isShowing()) { + this.metrics = metrics; super.show(); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java index 6d1c42d1..2d458396 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -32,14 +33,16 @@ import java.util.List; public class PollDialog extends Dialog implements OnClickListener { private EditOptionsAdapter optionAdapter; + private DropdownAdapter timeUnitAdapter; + private PollUpdateCallback callback; + private SwitchButton multiple_choice, hide_votes; private Spinner timeUnitSelector; private EditText durationInput; - private PollUpdateCallback callback; - private PollUpdate poll; @Nullable private Instance instance; + private PollUpdate poll; /** * @@ -47,6 +50,15 @@ public class PollDialog extends Dialog implements OnClickListener { public PollDialog(Activity activity, PollUpdateCallback callback) { super(activity, R.style.PollDialog); this.callback = callback; + optionAdapter = new EditOptionsAdapter(); + timeUnitAdapter = new DropdownAdapter(activity.getApplicationContext()); + timeUnitAdapter.setItems(R.array.timeunits); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.dialog_poll); ViewGroup root = findViewById(R.id.dialog_poll_root); RecyclerView optionsList = findViewById(R.id.dialog_poll_option_list); @@ -57,13 +69,9 @@ public class PollDialog extends Dialog implements OnClickListener { multiple_choice = findViewById(R.id.dialog_poll_mul_choice); hide_votes = findViewById(R.id.dialog_poll_hide_total); - DropdownAdapter adapter = new DropdownAdapter(activity.getApplicationContext()); - adapter.setItems(R.array.timeunits); - timeUnitSelector.setAdapter(adapter); - timeUnitSelector.setSelection(2); - - optionAdapter = new EditOptionsAdapter(); optionsList.setAdapter(optionAdapter); + timeUnitSelector.setAdapter(timeUnitAdapter); + timeUnitSelector.setSelection(2); AppStyles.setTheme(root); confirm.setOnClickListener(this); @@ -71,6 +79,25 @@ public class PollDialog extends Dialog implements OnClickListener { } + @Override + protected void onStart() { + super.onStart(); + optionAdapter.replaceItems(poll.getOptions()); + multiple_choice.setCheckedImmediately(poll.multipleChoiceEnabled()); + hide_votes.setCheckedImmediately(poll.hideTotalVotes()); + if (poll.getDuration() > 86400000L) { + durationInput.setText(Long.toString(Math.round(poll.getDuration() / 86400000d))); + timeUnitSelector.setSelection(2); + } else if (poll.getDuration() > 3600000L) { + durationInput.setText(Long.toString(Math.round(poll.getDuration() / 3600000d))); + timeUnitSelector.setSelection(1); + } else if (poll.getDuration() > 60000L) { + durationInput.setText(Long.toString(Math.round(poll.getDuration() / 60000d))); + timeUnitSelector.setSelection(0); + } + } + + @Override public void onClick(View v) { if (v.getId() == R.id.dialog_poll_create) { @@ -91,7 +118,7 @@ public class PollDialog extends Dialog implements OnClickListener { Toast.makeText(getContext(), R.string.error_duration_time_low, Toast.LENGTH_SHORT).show(); } else if (instance != null && duration > instance.getMaxPollDuration()) { Toast.makeText(getContext(), R.string.error_duration_time_high, Toast.LENGTH_SHORT).show(); - } else { + } else if (poll != null) { List options = optionAdapter.getItems(); for (String option : options) { if (option.trim().isEmpty()) { @@ -114,6 +141,7 @@ public class PollDialog extends Dialog implements OnClickListener { @Override public void show() { + // using show(PollUpdate) instead } @@ -132,19 +160,6 @@ public class PollDialog extends Dialog implements OnClickListener { public void show(@Nullable PollUpdate poll) { if (!isShowing()) { if (poll != null) { - optionAdapter.replaceItems(poll.getOptions()); - multiple_choice.setCheckedImmediately(poll.multipleChoiceEnabled()); - hide_votes.setCheckedImmediately(poll.hideTotalVotes()); - if (poll.getDuration() > 86400000L) { - durationInput.setText(Long.toString(Math.round(poll.getDuration() / 86400000d))); - timeUnitSelector.setSelection(2); - } else if (poll.getDuration() > 3600000L) { - durationInput.setText(Long.toString(Math.round(poll.getDuration() / 3600000d))); - timeUnitSelector.setSelection(1); - } else if (poll.getDuration() > 60000L) { - durationInput.setText(Long.toString(Math.round(poll.getDuration() / 60000d))); - timeUnitSelector.setSelection(0); - } this.poll = poll; } else { this.poll = new PollUpdate(); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ProgressDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ProgressDialog.java index 0dee111b..72696ab2 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ProgressDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ProgressDialog.java @@ -2,9 +2,9 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; -import android.view.Window; import android.widget.ImageView; import android.widget.ProgressBar; @@ -24,26 +24,30 @@ public class ProgressDialog extends Dialog implements OnClickListener { @Nullable private OnProgressStopListener listener; - private ImageView cancel; - /** * */ - public ProgressDialog(Activity activity) { + public ProgressDialog(Activity activity, @Nullable OnProgressStopListener listener) { super(activity, R.style.LoadingDialog); - // setup dialog - requestWindowFeature(Window.FEATURE_NO_TITLE); - setCanceledOnTouchOutside(false); - setCancelable(false); + this.listener = listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.item_load); - cancel = findViewById(R.id.kill_button); ProgressBar circle = findViewById(R.id.progress_item); + ImageView cancel = findViewById(R.id.kill_button); - GlobalSettings settings = GlobalSettings.get(activity); + GlobalSettings settings = GlobalSettings.get(getContext()); AppStyles.setProgressColor(circle, settings.getHighlightColor()); AppStyles.setDrawableColor(cancel, settings.getIconColor()); - + if (listener != null) { + cancel.setVisibility(View.VISIBLE); + } else { + cancel.setVisibility(View.GONE); + } cancel.setOnClickListener(this); } @@ -72,14 +76,6 @@ public class ProgressDialog extends Dialog implements OnClickListener { } } - /** - * enables cancel button and adds a listener - */ - public void addOnProgressStopListener(OnProgressStopListener listener) { - cancel.setVisibility(View.VISIBLE); - this.listener = listener; - } - /** * listener for progress */ diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java new file mode 100644 index 00000000..78d34714 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java @@ -0,0 +1,43 @@ +package org.nuclearfog.twidda.ui.dialogs; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.kyleduo.switchbutton.SwitchButton; + +import org.nuclearfog.twidda.R; +import org.nuclearfog.twidda.backend.utils.AppStyles; + +public class ReportDialog extends Dialog { + + private TextView textTitle; + private SwitchButton switchForward; + private EditText editDescription; + + /** + * + */ + public ReportDialog(Activity activity) { + super(activity, R.style.ReportDialog); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_report); + ViewGroup root = findViewById(R.id.dialog_report_root); + textTitle = findViewById(R.id.dialog_report_title); + switchForward = findViewById(R.id.dialog_report_switch_forward); + editDescription = findViewById(R.id.dialog_report_description); + AppStyles.setTheme(root); + } + + @Override + public void show() { + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java index 25484c4e..27b89e03 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -32,8 +33,8 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis private Spinner visibilitySelector; + private DropdownAdapter visibility_adapter, language_adapter; private StatusUpdate statusUpdate; - private String[] languageCodes; /** @@ -42,24 +43,8 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis public StatusPreferenceDialog(Activity activity, StatusUpdate statusUpdate) { super(activity, R.style.StatusDialog); this.statusUpdate = statusUpdate; - setContentView(R.layout.dialog_status); - ViewGroup rootView = findViewById(R.id.dialog_status_root); - SwitchButton sensitiveCheck = findViewById(R.id.dialog_status_sensitive); - SwitchButton spoilerCheck = findViewById(R.id.dialog_status_spoiler); - View statusVisibility = findViewById(R.id.dialog_status_visibility_container); - View statusSpoiler = findViewById(R.id.dialog_status_spoiler_container); - Spinner languageSelector = findViewById(R.id.dialog_status_language); - visibilitySelector = findViewById(R.id.dialog_status_visibility); - GlobalSettings settings = GlobalSettings.get(activity.getApplicationContext()); - AppStyles.setTheme(rootView); - - DropdownAdapter visibility_adapter = new DropdownAdapter(activity.getApplicationContext()); - DropdownAdapter language_adapter = new DropdownAdapter(activity.getApplicationContext()); - languageSelector.setAdapter(language_adapter); - languageSelector.setSelected(false); - visibilitySelector.setAdapter(visibility_adapter); - visibilitySelector.setSelection(0, false); - visibilitySelector.setSelected(false); + visibility_adapter = new DropdownAdapter(activity.getApplicationContext()); + language_adapter = new DropdownAdapter(activity.getApplicationContext()); // initialize language selector Map languages = new TreeMap<>(); @@ -69,8 +54,29 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis languages.put(locale.getDisplayLanguage(), locale.getLanguage()); } languageCodes = languages.values().toArray(new String[0]); - String[] languageNames = languages.keySet().toArray(new String[0]); - language_adapter.setItems(languageNames); + language_adapter.setItems(languages.keySet().toArray(new String[0])); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_status); + ViewGroup rootView = findViewById(R.id.dialog_status_root); + SwitchButton sensitiveCheck = findViewById(R.id.dialog_status_sensitive); + SwitchButton spoilerCheck = findViewById(R.id.dialog_status_spoiler); + View statusVisibility = findViewById(R.id.dialog_status_visibility_container); + View statusSpoiler = findViewById(R.id.dialog_status_spoiler_container); + Spinner languageSelector = findViewById(R.id.dialog_status_language); + visibilitySelector = findViewById(R.id.dialog_status_visibility); + GlobalSettings settings = GlobalSettings.get(getContext()); + AppStyles.setTheme(rootView); + + languageSelector.setAdapter(language_adapter); + languageSelector.setSelected(false); + visibilitySelector.setAdapter(visibility_adapter); + visibilitySelector.setSelection(0, false); + visibilitySelector.setSelected(false); // enable/disable functions if (!settings.getLogin().getConfiguration().statusVisibilitySupported()) { @@ -88,25 +94,25 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis @Override - public void show() { - switch (statusUpdate.getVisibility()) { - case Status.VISIBLE_PUBLIC: - visibilitySelector.setSelection(0, false); - break; - - case Status.VISIBLE_PRIVATE: - visibilitySelector.setSelection(1, false); - break; - - case Status.VISIBLE_DIRECT: - visibilitySelector.setSelection(2, false); - break; - - case Status.VISIBLE_UNLISTED: - visibilitySelector.setSelection(3, false); - break; + protected void onStart() { + super.onStart(); + if (statusUpdate.getVisibility() == Status.VISIBLE_PUBLIC) { + visibilitySelector.setSelection(0, false); + } else if (statusUpdate.getVisibility() == Status.VISIBLE_PRIVATE) { + visibilitySelector.setSelection(1, false); + } else if (statusUpdate.getVisibility() == Status.VISIBLE_DIRECT) { + visibilitySelector.setSelection(2, false); + } else if (statusUpdate.getVisibility() == Status.VISIBLE_UNLISTED) { + visibilitySelector.setSelection(3, false); + } + } + + + @Override + public void show() { + if (!isShowing()) { + super.show(); } - super.show(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java index 7fdfcd99..3ac9424e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -39,7 +40,8 @@ public class WebPushDialog extends Dialog implements OnCheckedChangeListener, On private Spinner policySelector; private GlobalSettings settings; - private PushUpdater updater; + private PushUpdater pushUpdater; + private DropdownAdapter adapter; private PushUpdate update; @@ -48,6 +50,16 @@ public class WebPushDialog extends Dialog implements OnCheckedChangeListener, On */ public WebPushDialog(Activity activity) { super(activity, R.style.WebPushDialog); + adapter = new DropdownAdapter(activity.getApplicationContext()); + settings = GlobalSettings.get(getContext()); + pushUpdater = new PushUpdater(getContext()); + update = new PushUpdate(settings.getWebPush()); + adapter.setItems(R.array.push_policy); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.dialog_push); ViewGroup root = findViewById(R.id.dialog_push_root); Button apply_changes = findViewById(R.id.dialog_push_apply); @@ -60,14 +72,10 @@ public class WebPushDialog extends Dialog implements OnCheckedChangeListener, On status_new = findViewById(R.id.dialog_push_new_status); status_edit = findViewById(R.id.dialog_push_edit_status); policySelector = findViewById(R.id.dialog_push_policy); - settings = GlobalSettings.get(activity.getApplicationContext()); - updater = new PushUpdater(activity.getApplicationContext()); - - DropdownAdapter adapter = new DropdownAdapter(activity.getApplicationContext()); - adapter.setItems(R.array.push_policy); - policySelector.setAdapter(adapter); AppStyles.setTheme(root); + policySelector.setAdapter(adapter); + mention.setOnCheckedChangeListener(this); repost.setOnCheckedChangeListener(this); favorite.setOnCheckedChangeListener(this); @@ -81,25 +89,30 @@ public class WebPushDialog extends Dialog implements OnCheckedChangeListener, On } + @Override + protected void onStart() { + super.onStart(); + mention.setCheckedImmediately(update.mentionsEnabled()); + repost.setCheckedImmediately(update.repostEnabled()); + favorite.setCheckedImmediately(update.favoriteEnabled()); + poll.setCheckedImmediately(update.pollEnabled()); + follow.setCheckedImmediately(update.followEnabled()); + request.setCheckedImmediately(update.followRequestEnabled()); + status_new.setCheckedImmediately(update.statusPostEnabled()); + status_edit.setCheckedImmediately(update.statusEditEnabled()); + if (update.getPolicy() == WebPush.POLICY_ALL) { + policySelector.setSelection(0); + } else if (update.getPolicy() == WebPush.POLICY_FOLLOWING) { + policySelector.setSelection(1); + } else if (update.getPolicy() == WebPush.POLICY_FOLLOWER) { + policySelector.setSelection(2); + } + } + + @Override public void show() { if (!isShowing()) { - update = new PushUpdate(settings.getWebPush()); - mention.setCheckedImmediately(update.mentionsEnabled()); - repost.setCheckedImmediately(update.repostEnabled()); - favorite.setCheckedImmediately(update.favoriteEnabled()); - poll.setCheckedImmediately(update.pollEnabled()); - follow.setCheckedImmediately(update.followEnabled()); - request.setCheckedImmediately(update.followRequestEnabled()); - status_new.setCheckedImmediately(update.statusPostEnabled()); - status_edit.setCheckedImmediately(update.statusEditEnabled()); - if (update.getPolicy() == WebPush.POLICY_ALL) { - policySelector.setSelection(0); - } else if (update.getPolicy() == WebPush.POLICY_FOLLOWING) { - policySelector.setSelection(1); - } else if (update.getPolicy() == WebPush.POLICY_FOLLOWER) { - policySelector.setSelection(2); - } super.show(); } } @@ -116,12 +129,13 @@ public class WebPushDialog extends Dialog implements OnCheckedChangeListener, On @Override public void onClick(View v) { if (v.getId() == R.id.dialog_push_apply) { - if (updater.isIdle()) { + if (pushUpdater.isIdle()) { // fix: setting host url if empty if (update.getHost().isEmpty()) { update.setHost(settings.getWebPush().getHost()); } - updater.execute(update, this); + pushUpdater.execute(update, this); + Toast.makeText(getContext(), R.string.info_webpush_update_progress, Toast.LENGTH_SHORT).show(); } } } diff --git a/app/src/main/res/layout/dialog_filter.xml b/app/src/main/res/layout/dialog_filter.xml index e9272c8e..e3b741db 100644 --- a/app/src/main/res/layout/dialog_filter.xml +++ b/app/src/main/res/layout/dialog_filter.xml @@ -198,6 +198,7 @@ android:layout_margin="@dimen/dialog_filter_margin_items_layout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/dialog_filter_keywords" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/dialog_filter_switch_thread_label" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 17424960..bd5d38db 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -347,4 +347,8 @@ 11sp 4dp + + 22sp + 12sp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0821550a..0e43e9f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - + Shitter SH1TT3R @@ -79,6 +79,7 @@ domain removed from the list hashtag followed domain blocked! + updating push configuration Push configuration updated Filter created Filter updated @@ -264,6 +265,10 @@ Consumer secret use custom hostname apply changes + Report post + Report 1$s + additional description + forward report to source instance mute user? Profile of the list owner Lists @@ -363,9 +368,9 @@ Public timeline filter enabled Thread filter enabled User timeline filter enabled - create a filter + create filter enter filter name - update a filter + update filter apply apply filter for Home timeline diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5acce945..0d877fb9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -27,6 +27,7 @@ @@ -74,6 +80,11 @@ false + +