added deep link for twitter search, bug fix

This commit is contained in:
NudeDude 2019-10-03 13:55:32 +02:00
parent 3a51617180
commit ce4ffa5d47
6 changed files with 73 additions and 31 deletions

View File

@ -30,7 +30,25 @@
<activity <activity
android:name=".window.SearchPage" android:name=".window.SearchPage"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme" /> android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="*.twitter.com"
android:pathPattern="\\/search"
android:scheme="https" />
<data
android:host="*.twitter.com"
android:pathPattern="\\/hashtag\\/..*"
android:scheme="https" />
</intent-filter>
</activity>
<activity <activity
android:name=".window.UserProfile" android:name=".window.UserProfile"

View File

@ -113,13 +113,6 @@ public class MediaViewer extends AppCompatActivity implements OnImageClickListen
break; break;
case VIDEO: case VIDEO:
videoWindow.setVisibility(VISIBLE);
video = Uri.parse(link[0]);
videoView.setMediaController(videoController);
videoView.setOnPreparedListener(this);
videoView.setVideoURI(video);
break;
case VIDEO_STORAGE: case VIDEO_STORAGE:
videoWindow.setVisibility(VISIBLE); videoWindow.setVisibility(VISIBLE);
video = Uri.parse(link[0]); video = Uri.parse(link[0]);

View File

@ -1,11 +1,14 @@
package org.nuclearfog.twidda.window; package org.nuclearfog.twidda.window;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
@ -15,11 +18,13 @@ import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener; import com.google.android.material.tabs.TabLayout.OnTabSelectedListener;
import org.nuclearfog.twidda.BuildConfig; import org.nuclearfog.twidda.BuildConfig;
import org.nuclearfog.twidda.MainActivity;
import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.adapter.FragmentAdapter; import org.nuclearfog.twidda.adapter.FragmentAdapter;
import org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType; import org.nuclearfog.twidda.adapter.FragmentAdapter.AdapterType;
import org.nuclearfog.twidda.database.GlobalSettings; import org.nuclearfog.twidda.database.GlobalSettings;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_ADDITION; import static org.nuclearfog.twidda.window.TweetPopup.KEY_TWEETPOPUP_ADDITION;
@ -30,7 +35,8 @@ public class SearchPage extends AppCompatActivity implements OnTabSelectedListen
private FragmentAdapter adapter; private FragmentAdapter adapter;
private ViewPager pager; private ViewPager pager;
private String search; private GlobalSettings settings;
private String search = "";
private int tabIndex = 0; private int tabIndex = 0;
@Override @Override
@ -48,12 +54,16 @@ public class SearchPage extends AppCompatActivity implements OnTabSelectedListen
getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayShowTitleEnabled(false);
Bundle param = getIntent().getExtras(); Bundle param = getIntent().getExtras();
Uri link = getIntent().getData();
settings = GlobalSettings.getInstance(this);
if (param != null && param.containsKey(KEY_SEARCH)) { if (param != null && param.containsKey(KEY_SEARCH)) {
search = param.getString(KEY_SEARCH); search = param.getString(KEY_SEARCH);
} else if (link != null) {
getSearchString(link);
} else if (BuildConfig.DEBUG) } else if (BuildConfig.DEBUG)
throw new AssertionError(); throw new AssertionError();
GlobalSettings settings = GlobalSettings.getInstance(this);
root.setBackgroundColor(settings.getBackgroundColor()); root.setBackgroundColor(settings.getBackgroundColor());
tab.setSelectedTabIndicatorColor(settings.getHighlightColor()); tab.setSelectedTabIndicatorColor(settings.getHighlightColor());
@ -132,4 +142,26 @@ public class SearchPage extends AppCompatActivity implements OnTabSelectedListen
@Override @Override
public void onTabReselected(TabLayout.Tab tab) { public void onTabReselected(TabLayout.Tab tab) {
} }
private void getSearchString(@NonNull Uri link) {
String path = link.getPath();
String query = link.getQuery();
if (path != null) {
if (path.startsWith("/hashtag/")) {
search = '#' + path.substring(9);
} else if (path.startsWith("/search")) {
if (query != null && query.length() > 2) {
search = query.substring(2).replace('+', ' ');
}
}
}
if (search.isEmpty() || !settings.getLogin()) {
Toast.makeText(this, R.string.failed_open_link, LENGTH_SHORT).show();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
} }

View File

@ -20,6 +20,7 @@ import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AlertDialog.Builder;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
@ -77,7 +78,7 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
tweetID = param.getLong(KEY_TWEET_ID); tweetID = param.getLong(KEY_TWEET_ID);
username = param.getString(KEY_TWEET_NAME); username = param.getString(KEY_TWEET_NAME);
} else if (link != null) { } else if (link != null) {
getTweet(link.getPath()); getTweet(link);
} else if (BuildConfig.DEBUG) { } else if (BuildConfig.DEBUG) {
throw new AssertionError(); throw new AssertionError();
} }
@ -262,29 +263,25 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener, O
} }
private void getTweet(String link) { private void getTweet(@NonNull Uri link) {
if (!settings.getLogin()) { String path = link.getPath() == null ? "" : link.getPath();
Pattern linkPattern = Pattern.compile("/@?[\\w_]+/status/\\d{1,20}");
Matcher linkMatch = linkPattern.matcher(path);
if (linkMatch.matches() && settings.getLogin()) {
if (path.startsWith("/@"))
path = path.substring(1);
else
path = '@' + path.substring(1);
int end = path.indexOf('/');
username = path.substring(0, end);
path = path.substring(end + 8);
tweetID = Long.parseLong(path);
} else {
Toast.makeText(this, R.string.failed_open_link, LENGTH_SHORT).show();
Intent intent = new Intent(this, MainActivity.class); Intent intent = new Intent(this, MainActivity.class);
startActivity(intent); startActivity(intent);
finish(); finish();
} else if (link != null) {
Pattern linkPattern = Pattern.compile("/@?[\\w_]+/status/\\d{1,20}");
Matcher linkMatch = linkPattern.matcher(link);
if (linkMatch.matches()) {
if (link.startsWith("/@"))
link = link.substring(1);
else
link = '@' + link.substring(1);
int end = link.indexOf('/');
username = link.substring(0, end);
link = link.substring(end + 8);
tweetID = Long.parseLong(link);
} else {
Toast.makeText(this, R.string.not_found, LENGTH_SHORT).show();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
} }
} }
} }

View File

@ -117,4 +117,5 @@
<string name="error_empty_port">Proxy port muss gesetzt werden!</string> <string name="error_empty_port">Proxy port muss gesetzt werden!</string>
<string name="error_empty_pass">Proxy Passort darf nicht leer sein!</string> <string name="error_empty_pass">Proxy Passort darf nicht leer sein!</string>
<string name="video_preview_button">Videovorschau Button</string> <string name="video_preview_button">Videovorschau Button</string>
<string name="failed_open_link">Fehler beim Öffnen des links!</string>
</resources> </resources>

View File

@ -117,4 +117,5 @@
<string name="proxy_authentication">Proxy login</string> <string name="proxy_authentication">Proxy login</string>
<string name="error_empty_port">Port must be set!</string> <string name="error_empty_port">Port must be set!</string>
<string name="error_empty_pass">Proxy password should not be empty!</string> <string name="error_empty_pass">Proxy password should not be empty!</string>
<string name="failed_open_link">Failed to open link!</string>
</resources> </resources>