diff --git a/app/build.gradle b/app/build.gradle index 42b0c5ae..9c9e85c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,5 @@ plugins { id 'com.android.application' - id 'io.michaelrocks.paranoid' id 'ru.cleverpumpkin.proguard-dictionaries-generator' } @@ -13,8 +12,8 @@ android { applicationId 'org.nuclearfog.twidda' minSdkVersion 21 targetSdkVersion 33 - versionCode 79 - versionName '3.0.11' + versionCode 80 + versionName '3.1' resConfigs 'en', 'de-rDE', 'zh-rCN' } @@ -40,10 +39,6 @@ android { excludes += ['/META-INF/CHANGES', '/META-INF/DEPENDENCIES', '/META-INF/README.md', '/META-INF/androidx.*', '/META-INF/kotlin*', '/META-INF/com.*', '/META-INF/services/**', '/META-INF/com/**', '/kotlin/**', '/Debug*'] } } - - paranoid { - enabled true - } } proguardDictionaries { @@ -54,8 +49,11 @@ proguardDictionaries { } dependencies { - implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' + implementation 'com.google.android.exoplayer:exoplayer-ui:2.18.5' + implementation 'com.google.android.exoplayer:exoplayer-core:2.18.5' + implementation 'com.google.android.exoplayer:extension-okhttp:2.18.5' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.recyclerview:recyclerview:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.cardview:cardview:1.0.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ae6b7834..ace19a21 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,24 +40,6 @@ - -

Notices for libraries:

-
    -
  • paranoid
  • -
-
-            Copyright 2021 Michael Rozumyanskiy
-            Licensed under the Apache License,
-            Version 2.0 (the "License");
-            you may not use this file except
-            in compliance with the License.
-            You may obtain a copy of the License at
-            http://www.apache.org/licenses/LICENSE-2.0
-            Unless required by applicable law
-            or agreed to in writing,
-            software distributed under the License
-            is distributed on an "AS IS" BASIS,
-            WITHOUT WARRANTIES OR CONDITIONS
-            OF ANY KIND, either express or implied.
-            See the License for the specific
-            language governing permissions and
-            limitations under the License.
-        
- \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/Tokens.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/Tokens.java index 1c859179..a726ba78 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/Tokens.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/Tokens.java @@ -5,14 +5,11 @@ import android.content.Context; import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.model.Account; -import io.michaelrocks.paranoid.Obfuscate; - /** * this class manages Twitter oauth 1.0 keys (consumer token & token secret) for API V1.1 & V2 * * @author nuclearfog */ -@Obfuscate public class Tokens { /** diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java index f3223fdc..cfff3c7a 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java @@ -40,6 +40,7 @@ public class MediaV1 implements Media { private int type = NONE; private String url = ""; + private String previewUrl = ""; private String key; /** @@ -53,6 +54,7 @@ public class MediaV1 implements Media { String url = json.getString("media_url_https"); if (Patterns.WEB_URL.matcher(url).matches()) { this.url = url; + previewUrl = url; } else { throw new JSONException("invalid url: \"" + url + "\""); } @@ -62,6 +64,7 @@ public class MediaV1 implements Media { case TYPE_VIDEO: int maxBitrate = -1; JSONArray videoVariants = json.getJSONObject("video_info").getJSONArray("variants"); + previewUrl = json.optString("media_url_https", ""); for (int i = 0; i < videoVariants.length(); i++) { JSONObject variant = videoVariants.getJSONObject(i); int bitRate = variant.optInt("bitrate", 0); @@ -80,6 +83,7 @@ public class MediaV1 implements Media { case TYPE_GIF: JSONArray gifVariants = json.getJSONObject("video_info").getJSONArray("variants"); + previewUrl = json.optString("media_url_https", ""); for (int i = 0; i < gifVariants.length(); i++) { JSONObject gifVariant = gifVariants.getJSONObject(i); if (MIME_V_MP4.equals(gifVariant.getString("content_type"))) { @@ -118,7 +122,7 @@ public class MediaV1 implements Media { @Override public String getPreviewUrl() { - return url; + return previewUrl; } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/LinkLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/LinkLoader.java deleted file mode 100644 index 4848d273..00000000 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/LinkLoader.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.nuclearfog.twidda.backend.async; - -import android.app.Activity; -import android.content.Context; -import android.net.Uri; -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -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.model.User; -import org.nuclearfog.twidda.model.UserList; -import org.nuclearfog.twidda.ui.activities.MainActivity; -import org.nuclearfog.twidda.ui.activities.ProfileActivity; -import org.nuclearfog.twidda.ui.activities.SearchActivity; -import org.nuclearfog.twidda.ui.activities.StatusActivity; -import org.nuclearfog.twidda.ui.activities.StatusEditor; -import org.nuclearfog.twidda.ui.activities.UserlistActivity; -import org.nuclearfog.twidda.ui.activities.UserlistsActivity; - -import java.util.List; - -/** - * This class handles deep links and starts activities to show the content - * When the user clicks on a link (e.g. "twitter.com/Twitter/status/1480571976414543875") - * this class extracts information of the link and open an activity tp show the content - * When a link type isn't supported, the {@link MainActivity} will be opened instead - * - * @author nuclearfog - * @see MainActivity - */ -public class LinkLoader extends AsyncExecutor { - - private Connection connection; - - /** - * - */ - public LinkLoader(Context context) { - connection = ConnectionManager.getDefaultConnection(context); - } - - - @Override - protected LinkResult doInBackground(@NonNull Uri link) { - try { - List pathSeg = link.getPathSegments(); - Bundle data = new Bundle(); - if (!pathSeg.isEmpty()) { - // open home timeline tab - // e.g. twitter.com/home - if (pathSeg.get(0).equals("home")) { - data.putInt(MainActivity.KEY_TAB_PAGE, 0); - return new LinkResult(data, MainActivity.class); - } - // open trend tab - // e.g. twitter.com/trends , twitter.com/explore or twitter.com/i/trends - else if (pathSeg.get(0).equals("trends") || pathSeg.get(0).equals("explore") || - (pathSeg.size() == 2 && pathSeg.get(0).equals("i") && pathSeg.get(1).equals("trends"))) { - data.putInt(MainActivity.KEY_TAB_PAGE, 1); - return new LinkResult(data, MainActivity.class); - } - // open mentions timeline - // e.g. twitter.com/notifications - else if (pathSeg.get(0).equals("notifications")) { - data.putInt(MainActivity.KEY_TAB_PAGE, 2); - return new LinkResult(data, MainActivity.class); - } - // open directmessage page - // e.g. twitter.com/messages - else if (pathSeg.get(0).equals("messages")) { - data.putInt(MainActivity.KEY_TAB_PAGE, 3); - return new LinkResult(data, MainActivity.class); - } - // open twitter search - // e.g. twitter.com/search?q={search string} - else if (pathSeg.get(0).equals("search")) { - if (link.isHierarchical()) { - String search = link.getQueryParameter("q"); - if (search != null) { - data.putString(SearchActivity.KEY_SEARCH_QUERY, search); - return new LinkResult(data, SearchActivity.class); - } - } - } - // open status editor and add text - // e.g. twitter.com/share or twitter.com/intent/status - else if (pathSeg.get(0).equals("share") || - (pathSeg.size() == 2 && pathSeg.get(0).equals("intent") && pathSeg.get(1).equals("tweet"))) { - if (link.isHierarchical()) { - String status = ""; - String text = link.getQueryParameter("text"); - String url = link.getQueryParameter("url"); - String via = link.getQueryParameter("via"); - if (text != null) - status = text + " "; - if (url != null) - status += url + " "; - if (via != null) - status += "via @" + via; - data.putString(StatusEditor.KEY_STATUS_EDITOR_TEXT, status); - return new LinkResult(data, StatusEditor.class); - } - } - // open hashtag search - // e.g. twitter.com/hashtag/{hashtag name} - else if (pathSeg.size() == 2 && pathSeg.get(0).equals("hashtag")) { - String search = '#' + pathSeg.get(1); - data.putString(SearchActivity.KEY_SEARCH_QUERY, search); - return new LinkResult(data, SearchActivity.class); - } - // open an userlist - // e.g. twitter.com/i/lists/{list id} - else if (pathSeg.size() == 3 && pathSeg.get(0).equals("i") && pathSeg.get(1).equals("lists") && pathSeg.get(2).matches("\\d+")) { - long listId = Long.parseLong(pathSeg.get(2)); - UserList list = connection.getUserlist(listId); - data.putSerializable(UserlistActivity.KEY_LIST_DATA, list); - data.putBoolean(UserlistActivity.KEY_LIST_NO_UPDATE, true); - return new LinkResult(data, UserlistActivity.class); - } - // show status - // e.g. twitter.com/{screenname}/status/{tweet ID} - else if (pathSeg.size() == 3 && pathSeg.get(1).equals("status") && pathSeg.get(2).matches("\\d+")) { - String screenname = pathSeg.get(0); - long Id = Long.parseLong(pathSeg.get(2)); - data.putLong(StatusActivity.KEY_STATUS_ID, Id); - data.putString(StatusActivity.KEY_STATUS_NAME, screenname); - return new LinkResult(data, StatusActivity.class); - } - // show userlists - // e.g. twitter.com/{screenname}/lists - else if (pathSeg.size() == 2 && pathSeg.get(1).equals("lists")) { - String screenname = pathSeg.get(0); - User user = connection.showUser(screenname); - data.putLong(UserlistsActivity.KEY_USERLIST_OWNER_ID, user.getId()); - return new LinkResult(data, UserlistsActivity.class); - } - // show user profile - // e.g. twitter.com/{screenname} - else if (pathSeg.size() == 1 || (pathSeg.size() == 2 && - (pathSeg.get(1).equals("with_replies") || pathSeg.get(1).equals("media") || pathSeg.get(1).equals("likes")))) { - String screenname = pathSeg.get(0); - User user = connection.showUser(screenname); - data.putSerializable(ProfileActivity.KEY_PROFILE_USER, user); - return new LinkResult(data, ProfileActivity.class); - } - } - } catch (ConnectionException exception) { - return new LinkResult(null, null, exception); - } catch (Exception e) { - e.printStackTrace(); - } - return new LinkResult(null, null, null); - } - - /** - * Holder class for information to start an activity - */ - public static class LinkResult { - - @Nullable - public final Bundle data; - @Nullable - public final Class activity; - @Nullable - public final ConnectionException exception; - - LinkResult(@NonNull Bundle data, @Nullable Class activity) { - this(data, activity, null); - } - - LinkResult(@Nullable Bundle data, @Nullable Class activity, @Nullable ConnectionException exception) { - this.data = data; - this.activity = activity; - this.exception = exception; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/SeekbarUpdater.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/SeekbarUpdater.java deleted file mode 100644 index f5fb3b54..00000000 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/SeekbarUpdater.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.nuclearfog.twidda.backend.async; - -import org.nuclearfog.twidda.ui.activities.VideoViewer; - -import java.lang.ref.WeakReference; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * This class updates {@link VideoViewer}'s Seekbar while playing a video - * - * @author nuclearfog - */ -public class SeekbarUpdater implements Runnable { - - private ScheduledExecutorService updater; - private WeakReference weakRef; - - private Runnable seekUpdate = new Runnable() { - public void run() { - VideoViewer mediaViewer = weakRef.get(); - if (mediaViewer != null) { - mediaViewer.updateSeekBar(); - } - } - }; - - - public SeekbarUpdater(VideoViewer activity, int milliseconds) { - weakRef = new WeakReference<>(activity); - updater = Executors.newScheduledThreadPool(1); - updater.scheduleWithFixedDelay(this, milliseconds, milliseconds, TimeUnit.MILLISECONDS); - } - - - @Override - public void run() { - VideoViewer mediaViewer = weakRef.get(); - if (mediaViewer != null) { - mediaViewer.runOnUiThread(seekUpdate); - } - } - - /** - * shutdown updater - */ - public void shutdown() { - updater.shutdown(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/StringTools.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/StringTools.java index e9b94b33..7f29ca0a 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/StringTools.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/StringTools.java @@ -111,28 +111,6 @@ public class StringTools { return resources.getString(R.string.time_now); } - /** - * format media time to string - * - * @param time duration/current position in ms - * @return time string - */ - public static String formatMediaTime(int time) { - String result = ""; - int seconds = (time / 1000) % 60; - int minutes = (time / 60000) % 60; - - if (minutes < 10) - result += "0"; - result += minutes + ":"; - - if (seconds < 10) - result += "0"; - result += seconds; - - return result; - } - /** * un-escape html based text * diff --git a/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java b/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java index e953e875..447bef08 100644 --- a/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java +++ b/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java @@ -90,7 +90,6 @@ public class GlobalSettings { private static final String PROXY_PORT = "proxy_port"; private static final String PROXY_USER = "proxy_user"; private static final String PROXY_PASS = "proxy_pass"; - private static final String PROXY_IGNORE = "ignore_proxy_set"; private static final String TREND_LOC = "location"; private static final String TREND_ID = "world_id_long"; private static final String ENABLE_LIKE = "like_enable"; @@ -140,7 +139,6 @@ public class GlobalSettings { private boolean loggedIn; private boolean isProxyEnabled; private boolean isProxyAuthSet; - private boolean ignoreProxyWarning; private boolean toolbarOverlap; private boolean tweetIndicators; private boolean filterResults; @@ -860,27 +858,6 @@ public class GlobalSettings { return isProxyAuthSet; } - /** - * check if proxy warning should be ignored - * - * @return true if proxy warning should be ignored - */ - public boolean ignoreProxyWarning() { - return ignoreProxyWarning; - } - - /** - * enable/ignore proxy warning - * - * @param ignore true to ignore proxy warning - */ - public void setIgnoreProxyWarning(boolean ignore) { - ignoreProxyWarning = ignore; - Editor e = settings.edit(); - e.putBoolean(PROXY_IGNORE, ignore); - e.apply(); - } - /** * Check if current user is logged in * @@ -986,7 +963,6 @@ public class GlobalSettings { listSize = settings.getInt(LIST_SIZE, DEFAULT_LIST_SIZE); isProxyEnabled = settings.getBoolean(PROXY_SET, false); isProxyAuthSet = settings.getBoolean(AUTH_SET, false); - ignoreProxyWarning = settings.getBoolean(PROXY_IGNORE, false); loggedIn = settings.getBoolean(LOGGED_IN, false); loadImage = settings.getBoolean(IMAGE_LOAD, true); tweetIndicators = settings.getBoolean(TWEET_INDICATOR, true); 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 ba22c550..b4722a36 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 @@ -30,11 +30,7 @@ import com.google.android.material.tabs.TabLayout.OnTabSelectedListener; import com.google.android.material.tabs.TabLayout.Tab; import org.nuclearfog.twidda.R; -import org.nuclearfog.twidda.backend.async.AsyncExecutor.AsyncCallback; -import org.nuclearfog.twidda.backend.async.LinkLoader; -import org.nuclearfog.twidda.backend.async.LinkLoader.LinkResult; import org.nuclearfog.twidda.backend.utils.AppStyles; -import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.ui.adapter.FragmentAdapter; import org.nuclearfog.twidda.ui.dialogs.ProgressDialog; @@ -44,13 +40,7 @@ import org.nuclearfog.twidda.ui.dialogs.ProgressDialog; * * @author nuclearfog */ -public class MainActivity extends AppCompatActivity implements ActivityResultCallback, OnTabSelectedListener, OnQueryTextListener, AsyncCallback { - - /** - * key used to set the tab page - * vale type is Integer - */ - public static final String KEY_TAB_PAGE = "tab_pos"; +public class MainActivity extends AppCompatActivity implements ActivityResultCallback, OnTabSelectedListener, OnQueryTextListener { private ActivityResultLauncher activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this); @@ -106,12 +96,6 @@ public class MainActivity extends AppCompatActivity implements ActivityResultCal // initialize lists else if (adapter.isEmpty()) { setupAdapter(true); - // check if there is a Twitter link - if (getIntent().getData() != null) { - LinkLoader linkLoader = new LinkLoader(this); - linkLoader.execute(getIntent().getData(), this); - loadingCircle.show(); - } } } @@ -257,29 +241,6 @@ public class MainActivity extends AppCompatActivity implements ActivityResultCal adapter.scrollToTop(tab.getPosition()); } - - @Override - public void onResult(@NonNull LinkResult linkResult) { - loadingCircle.dismiss(); - if (linkResult.data != null && linkResult.activity != null) { - if (linkResult.activity == MainActivity.class) { - int page = linkResult.data.getInt(KEY_TAB_PAGE, 0); - pager.setCurrentItem(page); - } else { - Intent intent = new Intent(this, linkResult.activity); - intent.putExtras(linkResult.data); - startActivity(intent); - } - } else { - if (linkResult.exception != null) { - String message = ErrorHandler.getErrorMessage(this, linkResult.exception); - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(getApplicationContext(), R.string.error_open_link, Toast.LENGTH_SHORT).show(); - } - } - } - /** * initialize pager content */ 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 7e9134c6..59646f87 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 @@ -158,7 +158,7 @@ public class MessageEditor extends MediaActivity implements OnClickListener, OnC @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // retry sending message if (type == ConfirmDialog.MESSAGE_EDITOR_ERROR) { sendMessage(); 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 5df27b6c..5218d55c 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 @@ -587,7 +587,7 @@ public class ProfileActivity extends AppCompatActivity implements ActivityResult @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { if (user != null) { // confirmed unfollowing user if (type == ConfirmDialog.PROFILE_UNFOLLOW) { 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 9da7230d..ba679840 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 @@ -239,7 +239,7 @@ public class ProfileEditor extends MediaActivity implements OnClickListener, Asy @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // leave without settings if (type == ConfirmDialog.PROFILE_EDITOR_LEAVE) { finish(); 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 ea773d12..380dbf1c 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 @@ -308,7 +308,7 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // confirm log out if (type == ConfirmDialog.APP_LOG_OUT) { // remove account from database @@ -692,7 +692,6 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen } } else { settings.clearProxyServer(); - settings.setIgnoreProxyWarning(false); } return checkPassed; } 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 8ef2e190..f75e0347 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 @@ -668,35 +668,16 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener @Override - public void onConfirm(int type, boolean rememberChoice) { - switch (type) { - case ConfirmDialog.DELETE_STATUS: - if (status != null) { - long id = status.getId(); - if (status.getEmbeddedStatus() != null) { - id = status.getEmbeddedStatus().getId(); - } - StatusParam param = new StatusParam(StatusParam.DELETE, id); - statusLoader.execute(param, statusCallback); + public void onConfirm(int type) { + if (type == ConfirmDialog.DELETE_STATUS) { + if (status != null) { + long id = status.getId(); + if (status.getEmbeddedStatus() != null) { + id = status.getEmbeddedStatus().getId(); } - break; - - case ConfirmDialog.PROXY_CONFIRM: - if (status != null) { - settings.setIgnoreProxyWarning(rememberChoice); - Media[] mediaItems = status.getMedia(); - if (status.getEmbeddedStatus() != null) { - mediaItems = status.getEmbeddedStatus().getMedia(); - } - if (mediaItems.length > 0) { - Uri uri = Uri.parse(mediaItems[0].getUrl()); - Intent intent = new Intent(this, VideoViewer.class); - intent.putExtra(VideoViewer.VIDEO_URI, uri); - intent.putExtra(VideoViewer.ENABLE_VIDEO_CONTROLS, true); - startActivity(intent); - } - } - break; + StatusParam param = new StatusParam(StatusParam.DELETE, id); + statusLoader.execute(param, statusCallback); + } } } @@ -730,23 +711,15 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener mediaIntent.putExtra(ImageViewer.IMAGE_URI, uri); startActivity(mediaIntent); } else if (media.getMediaType() == Media.VIDEO) { - if (!settings.isProxyEnabled() || settings.ignoreProxyWarning()) { - Intent intent = new Intent(this, VideoViewer.class); - intent.putExtra(VideoViewer.VIDEO_URI, uri); - intent.putExtra(VideoViewer.ENABLE_VIDEO_CONTROLS, true); - startActivity(intent); - } else { - confirmDialog.show(ConfirmDialog.PROXY_CONFIRM); - } + Intent intent = new Intent(this, VideoViewer.class); + intent.putExtra(VideoViewer.VIDEO_URI, uri); + intent.putExtra(VideoViewer.ENABLE_VIDEO_CONTROLS, true); + startActivity(intent); } else if (media.getMediaType() == Media.GIF) { - if (!settings.isProxyEnabled() || settings.ignoreProxyWarning()) { - Intent intent = new Intent(this, VideoViewer.class); - intent.putExtra(VideoViewer.VIDEO_URI, uri); - intent.putExtra(VideoViewer.ENABLE_VIDEO_CONTROLS, false); - startActivity(intent); - } else { - confirmDialog.show(ConfirmDialog.PROXY_CONFIRM); - } + Intent intent = new Intent(this, VideoViewer.class); + intent.putExtra(VideoViewer.VIDEO_URI, uri); + intent.putExtra(VideoViewer.ENABLE_VIDEO_CONTROLS, false); + startActivity(intent); } } 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 a267db3f..c7f225db 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 @@ -288,7 +288,7 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // retry uploading status if (type == ConfirmDialog.STATUS_EDITOR_ERROR) { updateStatus(); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistActivity.java index 4ae21214..56acca99 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/UserlistActivity.java @@ -282,7 +282,7 @@ public class UserlistActivity extends AppCompatActivity implements ActivityResul @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // delete user list if (type == ConfirmDialog.LIST_DELETE && userList != null) { if (listLoaderAsync.isIdle()) { 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 bd69793b..7054d3bd 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 @@ -156,7 +156,7 @@ public class UserlistEditor extends AppCompatActivity implements OnClickListener @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { // retry updating list if (type == ConfirmDialog.LIST_EDITOR_ERROR) { updateList(); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/VideoViewer.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/VideoViewer.java index 25e951f2..a9a557d0 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/VideoViewer.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/VideoViewer.java @@ -1,65 +1,42 @@ package org.nuclearfog.twidda.ui.activities; -import static android.media.MediaPlayer.MEDIA_ERROR_UNKNOWN; -import static android.media.MediaPlayer.MEDIA_INFO_BUFFERING_END; -import static android.media.MediaPlayer.MEDIA_INFO_BUFFERING_START; -import static android.media.MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START; -import static android.media.MediaPlayer.OnCompletionListener; -import static android.media.MediaPlayer.OnErrorListener; -import static android.media.MediaPlayer.OnInfoListener; -import static android.media.MediaPlayer.OnPreparedListener; -import static android.view.MotionEvent.ACTION_DOWN; -import static android.view.MotionEvent.ACTION_UP; -import static android.view.View.GONE; -import static android.view.View.INVISIBLE; -import static android.view.View.OnClickListener; -import static android.view.View.OnTouchListener; -import static android.view.View.VISIBLE; -import static android.widget.Toast.LENGTH_SHORT; - import android.content.ActivityNotFoundException; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; import android.content.Intent; -import android.graphics.PixelFormat; -import android.location.Location; -import android.media.AudioManager; -import android.media.MediaPlayer; import android.net.Uri; -import android.os.Build; import android.os.Bundle; -import android.os.Parcelable; -import android.view.MotionEvent; -import android.view.View; +import android.view.Menu; +import android.view.MenuItem; import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.ProgressBar; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; -import android.widget.TextView; import android.widget.Toast; -import android.widget.VideoView; -import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.ui.StyledPlayerView; +import com.google.android.exoplayer2.upstream.DataSource; import org.nuclearfog.twidda.R; -import org.nuclearfog.twidda.backend.async.SeekbarUpdater; import org.nuclearfog.twidda.backend.utils.AppStyles; -import org.nuclearfog.twidda.backend.utils.StringTools; +import org.nuclearfog.twidda.backend.utils.ConnectionBuilder; import org.nuclearfog.twidda.config.GlobalSettings; -import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog; -import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog.OnConfirmListener; + +import okhttp3.Call; /** * video player activity to show local and online videos/animations * * @author nuclearfog */ -public class VideoViewer extends MediaActivity implements OnSeekBarChangeListener, OnCompletionListener, OnDismissListener, - OnPreparedListener, OnInfoListener, OnErrorListener, OnClickListener, OnTouchListener, OnConfirmListener { +public class VideoViewer extends AppCompatActivity { /** * key for an Uri array with local links @@ -73,58 +50,10 @@ public class VideoViewer extends MediaActivity implements OnSeekBarChangeListene */ public static final String ENABLE_VIDEO_CONTROLS = "enable_controls"; - /** - * playback status used if player is idle - */ - private static final int IDLE = -1; - - /** - * playback status used for "play" mode - */ - private static final int PLAY = 1; - - /** - * playback status used for "pause" mode - */ - private static final int PAUSE = 2; - - /** - * playback status used for "forward" mode - */ - private static final int FORWARD = 3; - - /** - * playback status used for "backward" mode - */ - private static final int BACKWARD = 4; - - /** - * refresh time for video progress update in milliseconds - */ - private static final int PROGRESS_UPDATE = 1000; - - /** - * speed ratio for "backward" and "forward" - */ - private static final int SPEED_FACTOR = 6; - - @Nullable - private SeekbarUpdater seekUpdate; private GlobalSettings settings; + private ExoPlayer player; - private ConfirmDialog confirmDialog; - - private TextView duration, position; - private ProgressBar loadingCircle; - private SeekBar video_progress; - private ImageButton playPause; - private VideoView videoView; - private ViewGroup controlPanel; - - private Uri link; - private boolean enableVideoExtras; - private int playStatus = IDLE; - + private Uri data; @Override protected void attachBaseContext(Context newBase) { @@ -136,318 +65,68 @@ public class VideoViewer extends MediaActivity implements OnSeekBarChangeListene protected void onCreate(@Nullable Bundle b) { super.onCreate(b); setContentView(R.layout.page_video); - ImageButton forward = findViewById(R.id.controller_forward); - ImageButton backward = findViewById(R.id.controller_backward); - ImageButton share = findViewById(R.id.controller_share); - loadingCircle = findViewById(R.id.media_progress); - controlPanel = findViewById(R.id.media_controlpanel); - videoView = findViewById(R.id.video_view); - video_progress = findViewById(R.id.controller_progress); - playPause = findViewById(R.id.controller_play); - duration = findViewById(R.id.controller_duration); - position = findViewById(R.id.controller_position); - confirmDialog = new ConfirmDialog(this); + ViewGroup root = findViewById(R.id.page_video_root); + StyledPlayerView playerView = findViewById(R.id.page_video_player); + Toolbar toolbar = findViewById(R.id.page_video_toolbar); + player = new ExoPlayer.Builder(this).build(); settings = GlobalSettings.getInstance(this); - AppStyles.setProgressColor(loadingCircle, settings.getHighlightColor()); - AppStyles.setTheme(controlPanel); - videoView.setZOrderMediaOverlay(true); // disable black background - videoView.getHolder().setFormat(PixelFormat.TRANSPARENT); - // get extras - enableVideoExtras = getIntent().getBooleanExtra(ENABLE_VIDEO_CONTROLS, false); - Parcelable data = getIntent().getParcelableExtra(VIDEO_URI); - - if (data instanceof Uri) { - link = (Uri) data; - // enable control bar if set - if (enableVideoExtras) { - controlPanel.setVisibility(VISIBLE); - if (link.getScheme().startsWith("http")) { - // attach link to share button - share.setTag(link); - } else { - share.setVisibility(GONE); - } - seekUpdate = new SeekbarUpdater(this, PROGRESS_UPDATE); - } - videoView.setVideoURI(link); + AppStyles.setTheme(root); + if (toolbar != null) { + setSupportActionBar(toolbar); + toolbar.setTitle(""); } - share.setOnClickListener(this); - playPause.setOnClickListener(this); - videoView.setOnTouchListener(this); - backward.setOnTouchListener(this); - forward.setOnTouchListener(this); - videoView.setOnPreparedListener(this); - videoView.setOnCompletionListener(this); - videoView.setOnErrorListener(this); - video_progress.setOnSeekBarChangeListener(this); - confirmDialog.setConfirmListener(this); - confirmDialog.setOnDismissListener(this); - } - - @Override - protected void onStop() { - super.onStop(); - if (enableVideoExtras) { - videoView.pause(); - setPlayPause(R.drawable.play); - playStatus = PAUSE; + data = getIntent().getParcelableExtra(VIDEO_URI); + boolean enableControls = getIntent().getBooleanExtra(ENABLE_VIDEO_CONTROLS, true); + if (!enableControls) { + playerView.setUseController(false); + player.setRepeatMode(Player.REPEAT_MODE_ONE); } + + MediaItem mediaItem = MediaItem.fromUri(data); + DataSource.Factory dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, 128000)); + MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem); + + player.setMediaSource(mediaSource); + playerView.setPlayer(player); + + player.prepare(); + player.play(); } @Override - protected void onDestroy() { - if (seekUpdate != null) - seekUpdate.shutdown(); - super.onDestroy(); + protected void onPause() { + super.onPause(); + player.pause(); } @Override - public void onClick(View v) { - // play/pause video - if (v.getId() == R.id.controller_play) { - if (playStatus == PAUSE) { - playStatus = PLAY; - if (!videoView.isPlaying()) - videoView.start(); - setPlayPause(R.drawable.pause); - } else if (playStatus == PLAY) { - playStatus = PAUSE; - if (videoView.isPlaying()) - videoView.pause(); - setPlayPause(R.drawable.play); - } - } - // open link with another app - else if (v.getId() == R.id.controller_share) { - if (v.getTag() instanceof Uri) { - Intent intent = new Intent(Intent.ACTION_VIEW, (Uri) v.getTag()); - try { - startActivity(intent); - } catch (ActivityNotFoundException err) { - Toast.makeText(getApplicationContext(), R.string.error_connection_failed, LENGTH_SHORT).show(); - } - } - } + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.video, menu); + AppStyles.setMenuIconColor(menu, settings.getIconColor()); + menu.findItem(R.id.menu_video_link).setVisible(data.getScheme().startsWith("http")); + return super.onCreateOptionsMenu(menu); } @Override - public boolean onTouch(View v, MotionEvent event) { - // fast backward - if (v.getId() == R.id.controller_backward) { - if (playStatus == PAUSE) - return false; - if (event.getAction() == ACTION_DOWN) { - playStatus = BACKWARD; - videoView.pause(); - return true; - } - if (event.getAction() == ACTION_UP) { - playStatus = PLAY; - videoView.start(); - return true; - } - } - // fast forward - else if (v.getId() == R.id.controller_forward) { - if (playStatus == PAUSE) - return false; - if (event.getAction() == ACTION_DOWN) { - playStatus = FORWARD; - videoView.pause(); - return true; - } - if (event.getAction() == ACTION_UP) { - playStatus = PLAY; - videoView.start(); - return true; - } - } - // show/hide control panel - else if (v.getId() == R.id.video_view) { - if (event.getAction() == ACTION_DOWN) { - if (enableVideoExtras) { - if (controlPanel.getVisibility() == VISIBLE) { - controlPanel.setVisibility(INVISIBLE); - } else { - controlPanel.setVisibility(VISIBLE); - } - return true; - } - } - } - return false; - } - - - @Override - protected void onAttachLocation(@Nullable Location location) { - } - - - @Override - protected void onMediaFetched(int resultType, @NonNull Uri uri) { - } - - - @Override - public void onPrepared(MediaPlayer mp) { - // enable controls for video - if (enableVideoExtras) { - switch (playStatus) { - case IDLE: - // initialize seekbar - playStatus = PLAY; - video_progress.setMax(mp.getDuration()); - duration.setText(StringTools.formatMediaTime(mp.getDuration())); - mp.setOnInfoListener(this); - // fall through - - case PLAY: - // set video pos and start playback - mp.seekTo(video_progress.getProgress()); - mp.start(); - break; - - case PAUSE: - // set only video pos - mp.seekTo(video_progress.getProgress()); - break; - } - } - // setup video looping for gif - else { - // disable audiofocus for gif - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ - videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE); - } - loadingCircle.setVisibility(INVISIBLE); - mp.setLooping(true); - mp.start(); - } - } - - - @Override - public boolean onInfo(MediaPlayer mp, int what, int extra) { - switch (what) { - case MEDIA_INFO_BUFFERING_END: - case MEDIA_INFO_VIDEO_RENDERING_START: - loadingCircle.setVisibility(INVISIBLE); - return true; - - case MEDIA_INFO_BUFFERING_START: - loadingCircle.setVisibility(VISIBLE); - return true; - } - return false; - } - - - @Override - public boolean onError(MediaPlayer mp, int what, int extra) { - if (what == MEDIA_ERROR_UNKNOWN) { - if (link.getScheme().startsWith("http")) { - confirmDialog.show(ConfirmDialog.VIDEO_ERROR); - } else { - Toast.makeText(getApplicationContext(), R.string.error_cant_load_video, LENGTH_SHORT).show(); - finish(); - } - return true; - } - return false; - } - - - @Override - public void onCompletion(MediaPlayer mp) { - setPlayPause(R.drawable.play); - video_progress.setProgress(0); - playStatus = PAUSE; - } - - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - videoView.pause(); - } - - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - position.setText(StringTools.formatMediaTime(progress)); - } - - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - videoView.seekTo(seekBar.getProgress()); - if (playStatus == PLAY) { - videoView.start(); - } - } - - - @Override - public void onConfirm(int type, boolean rememberChoice) { - if (type == ConfirmDialog.VIDEO_ERROR) { - if (link != null) { - // open link in a browser + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == R.id.menu_video_link) { + if (data != null) { Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(link); + intent.setData(data); try { startActivity(intent); } catch (ActivityNotFoundException err) { - Toast.makeText(getApplicationContext(), R.string.error_connection_failed, LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), R.string.error_connection_failed, Toast.LENGTH_SHORT).show(); } } } - } - - - @Override - public void onDismiss(DialogInterface dialog) { - finish(); - } - - /** - * updates controller panel SeekBar - */ - public void updateSeekBar() { - int videoPos = video_progress.getProgress(); - switch (playStatus) { - case PLAY: - video_progress.setProgress(videoView.getCurrentPosition()); - break; - - case FORWARD: - videoPos += 2 * PROGRESS_UPDATE * SPEED_FACTOR; - if (videoPos > videoView.getDuration()) - videoPos = videoView.getDuration(); - videoView.seekTo(videoPos); - video_progress.setProgress(videoPos); - break; - - case BACKWARD: - videoPos -= 2 * PROGRESS_UPDATE * SPEED_FACTOR; - if (videoPos < 0) - videoPos = 0; - videoView.seekTo(videoPos); - video_progress.setProgress(videoPos); - break; - } - } - - - private void setPlayPause(@DrawableRes int icon) { - playPause.setImageResource(icon); - AppStyles.setDrawableColor(playPause.getDrawable(), settings.getIconColor()); - AppStyles.setButtonColor(playPause, settings.getFontColor()); + return super.onOptionsItemSelected(item); } } \ No newline at end of file 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 7d938401..4feb4804 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 @@ -6,7 +6,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; -import android.widget.CompoundButton; import android.widget.TextView; import androidx.annotation.NonNull; @@ -139,8 +138,7 @@ public class ConfirmDialog extends Dialog implements OnClickListener { public static final int NOTIFICATION_DISMISS = 623; - private TextView title, message, confirmDescr; - private CompoundButton confirmCheck; + private TextView title, message; private Button confirm, cancel; private ViewGroup root; @@ -158,8 +156,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener { cancel = findViewById(R.id.confirm_no); title = findViewById(R.id.confirm_title); message = findViewById(R.id.confirm_message); - confirmDescr = findViewById(R.id.confirm_remember_descr); - confirmCheck = findViewById(R.id.confirm_remember); confirm.setOnClickListener(this); cancel.setOnClickListener(this); @@ -193,7 +189,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener { confirm.setTag(type); // default visibility values int titleVis = View.GONE; - int confirmVis = View.INVISIBLE; int cancelVis = View.VISIBLE; // default resource values int titleRes = R.string.info_error; @@ -288,7 +283,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener { break; case PROXY_CONFIRM: - confirmVis = View.VISIBLE; titleVis = View.VISIBLE; titleRes = R.string.dialog_confirm_warning; messageRes = R.string.dialog_warning_videoview; @@ -304,9 +298,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener { // setup confirm button confirm.setText(confirmRes); confirm.setCompoundDrawablesWithIntrinsicBounds(confirmIconRes, 0, 0, 0); - // setup remember choice checkbox - confirmCheck.setVisibility(confirmVis); - confirmDescr.setVisibility(confirmVis); // setup message if (messageTxt.isEmpty()) { message.setText(messageRes); @@ -324,8 +315,7 @@ public class ConfirmDialog extends Dialog implements OnClickListener { Object tag = v.getTag(); if (listener != null && tag instanceof Integer) { int type = (int) tag; - boolean remember = confirmCheck.getVisibility() == View.VISIBLE && confirmCheck.isChecked(); - listener.onConfirm(type, remember); + listener.onConfirm(type); } dismiss(); } else if (v.getId() == R.id.confirm_no) { @@ -348,9 +338,8 @@ public class ConfirmDialog extends Dialog implements OnClickListener { /** * called when the positive button was clicked * - * @param type type of dialog - * @param rememberChoice true if choice should be remembered + * @param type type of dialog */ - void onConfirm(int type, boolean rememberChoice); + void onConfirm(int type); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/AccountFragment.java b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/AccountFragment.java index 6da21c38..6469f356 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/AccountFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/AccountFragment.java @@ -105,7 +105,7 @@ public class AccountFragment extends ListFragment implements OnAccountClickListe @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { if (type == ConfirmDialog.REMOVE_ACCOUNT) { load(AccountParameter.DELETE); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/MessageFragment.java b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/MessageFragment.java index 96e8d950..39c76025 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/MessageFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/MessageFragment.java @@ -177,7 +177,7 @@ public class MessageFragment extends ListFragment implements OnMessageClickListe @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { if (type == ConfirmDialog.MESSAGE_DELETE) { MessageLoaderParam param = new MessageLoaderParam(MessageLoaderParam.DELETE, 0, selectedId, ""); messageLoader.execute(param, this); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java index 6e4a0bc3..e2d9ba8e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java @@ -152,7 +152,7 @@ public class NotificationFragment extends ListFragment implements OnNotification @Override - public void onConfirm(int type, boolean rememberChoice) { + public void onConfirm(int type) { if (type == ConfirmDialog.NOTIFICATION_DISMISS) { if (select != null) { NotificationActionParam param = new NotificationActionParam(NotificationActionParam.DISMISS, select.getId()); diff --git a/app/src/main/res/drawable/backward.xml b/app/src/main/res/drawable/backward.xml deleted file mode 100644 index 9db62410..00000000 --- a/app/src/main/res/drawable/backward.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/forward.xml b/app/src/main/res/drawable/forward.xml deleted file mode 100644 index 17ea6fb9..00000000 --- a/app/src/main/res/drawable/forward.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/pause.xml b/app/src/main/res/drawable/pause.xml deleted file mode 100644 index ca9772c3..00000000 --- a/app/src/main/res/drawable/pause.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout-land/page_video.xml b/app/src/main/res/layout-land/page_video.xml new file mode 100644 index 00000000..dc2447e0 --- /dev/null +++ b/app/src/main/res/layout-land/page_video.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_confirm.xml b/app/src/main/res/layout/dialog_confirm.xml index e0eb76d7..2160c67e 100644 --- a/app/src/main/res/layout/dialog_confirm.xml +++ b/app/src/main/res/layout/dialog_confirm.xml @@ -39,30 +39,8 @@ android:layout_width="0dp" android:layout_height="0dp" app:barrierDirection="top" - app:constraint_referenced_ids="confirm_no,confirm_yes,confirm_remember,confirm_remember_descr" /> - - - - + app:constraint_referenced_ids="confirm_no,confirm_yes" + tools:layout_editor_absoluteY="96dp" />