diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f5a61ee..f8369a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,11 +71,20 @@ android:configChanges="orientation|screenSize" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysHidden" /> + + + android:windowSoftInputMode="stateAlwaysHidden"> + { - try { - String response = new HttpsConnection(LoginActivity.this).get("https://" + finalInstance + actionToken, 30, parameters, null); - JSONObject resobj; + + + if (Arrays.asList(Helper.openid).contains(host)) { + String finalInstance = instance; + new Thread(() -> { try { + actionToken = "/api/v1/oauth-clients/local"; + String response = new HttpsConnection(LoginActivity.this).get("https://" + finalInstance + actionToken, 30, null, null); + if (response == null) { + runOnUiThread(() -> { + connectionButton.setEnabled(true); + Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show(); + }); + return; + } + JSONObject resobj; resobj = new JSONObject(response); client_id = resobj.get(Helper.CLIENT_ID).toString(); client_secret = resobj.get(Helper.CLIENT_SECRET).toString(); @@ -266,72 +269,120 @@ public class LoginActivity extends AppCompatActivity implements OnRetrievePeertu parameters.clear(); parameters.put(Helper.CLIENT_ID, sharedpreferences.getString(Helper.CLIENT_ID, null)); parameters.put(Helper.CLIENT_SECRET, sharedpreferences.getString(Helper.CLIENT_SECRET, null)); - parameters.put("grant_type", "password"); - try { - parameters.put("username", URLEncoder.encode(login_uid.getText().toString().trim().toLowerCase(), "UTF-8")); - } catch (UnsupportedEncodingException e) { - parameters.put("username", login_uid.getText().toString().trim().toLowerCase()); - } - try { - parameters.put("password", URLEncoder.encode(login_passwd.getText().toString(), "UTF-8")); - } catch (UnsupportedEncodingException e) { - parameters.put("password", login_passwd.getText().toString()); - } - parameters.put("scope", "user"); - String oauthUrl = "/api/v1/users/token"; - try { - String responseLogin = new HttpsConnection(LoginActivity.this).post("https://" + finalInstance + oauthUrl, 30, parameters, null); - runOnUiThread(() -> { - JSONObject resobjLogin; - try { - resobjLogin = new JSONObject(responseLogin); - String token = resobjLogin.getString("access_token"); - String refresh_token = resobjLogin.getString("refresh_token"); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); - editor.putString(Helper.PREF_INSTANCE, host); - editor.apply(); - //Update the account with the token; - new UpdateAccountInfoAsyncTask(LoginActivity.this, token, client_id, client_secret, refresh_token, host).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } catch (JSONException e) { - e.printStackTrace(); - runOnUiThread(() -> connectionButton.setEnabled(true)); - } - }); - } catch (final Exception e) { - e.printStackTrace(); + Intent intent = new Intent(LoginActivity.this, WebviewConnectActivity.class); + Bundle b = new Bundle(); + b.putString("url", "https://" + Helper.getPeertubeUrl(host) + "/plugins/auth-openid-connect/0.0.1/auth/openid-connect"); + intent.putExtras(b); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + runOnUiThread(() -> { + connectionButton.setEnabled(true); + Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show(); + }); + } + + }).start(); + } else { + parameters.clear(); + parameters.put(Helper.CLIENT_NAME, Helper.CLIENT_NAME_VALUE); + parameters.put(Helper.REDIRECT_URIS, Helper.REDIRECT_CONTENT); + parameters.put(Helper.SCOPES, Helper.OAUTH_SCOPES_PEERTUBE); + parameters.put(Helper.WEBSITE, Helper.WEBSITE_VALUE); + String finalInstance = instance; + new Thread(() -> { + try { + actionToken = "/api/v1/oauth-clients/local"; + String response = new HttpsConnection(LoginActivity.this).get("https://" + finalInstance + actionToken, 30, parameters, null); + if (response == null) { runOnUiThread(() -> { connectionButton.setEnabled(true); - String message; - if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0) - message = e.getLocalizedMessage(); - else if (e.getMessage() != null && e.getMessage().trim().length() > 0) - message = e.getMessage(); - else - message = getString(R.string.client_error); - Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show(); + Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show(); }); + return; } + JSONObject resobj; + try { + resobj = new JSONObject(response); + client_id = resobj.get(Helper.CLIENT_ID).toString(); + client_secret = resobj.get(Helper.CLIENT_SECRET).toString(); + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.CLIENT_ID, client_id); + editor.putString(Helper.CLIENT_SECRET, client_secret); + editor.apply(); + parameters.clear(); + parameters.put(Helper.CLIENT_ID, sharedpreferences.getString(Helper.CLIENT_ID, null)); + parameters.put(Helper.CLIENT_SECRET, sharedpreferences.getString(Helper.CLIENT_SECRET, null)); + parameters.put("grant_type", "password"); + try { + parameters.put("username", URLEncoder.encode(login_uid.getText().toString().trim().toLowerCase(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + parameters.put("username", login_uid.getText().toString().trim().toLowerCase()); + } + try { + parameters.put("password", URLEncoder.encode(login_passwd.getText().toString(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + parameters.put("password", login_passwd.getText().toString()); + } + parameters.put("scope", "user"); + String oauthUrl = "/api/v1/users/token"; + try { + String responseLogin = new HttpsConnection(LoginActivity.this).post("https://" + finalInstance + oauthUrl, 30, parameters, null); + runOnUiThread(() -> { + JSONObject resobjLogin; + try { + resobjLogin = new JSONObject(responseLogin); + String token = resobjLogin.getString("access_token"); + String refresh_token = resobjLogin.getString("refresh_token"); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); + editor.putString(Helper.PREF_INSTANCE, host); + editor.apply(); + //Update the account with the token; + new UpdateAccountInfoAsyncTask(LoginActivity.this, token, client_id, client_secret, refresh_token, host).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } catch (JSONException e) { + e.printStackTrace(); + runOnUiThread(() -> connectionButton.setEnabled(true)); + } + }); + } catch (final Exception e) { + e.printStackTrace(); + runOnUiThread(() -> { + connectionButton.setEnabled(true); + String message; + if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0) + message = e.getLocalizedMessage(); + else if (e.getMessage() != null && e.getMessage().trim().length() > 0) + message = e.getMessage(); + else + message = getString(R.string.client_error); + Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show(); + }); + } - } catch (JSONException e) { + } catch (JSONException e) { + e.printStackTrace(); + e.printStackTrace(); + runOnUiThread(() -> connectionButton.setEnabled(true)); + } + } catch (final Exception e) { e.printStackTrace(); - e.printStackTrace(); - runOnUiThread(() -> connectionButton.setEnabled(true)); + runOnUiThread(() -> { + connectionButton.setEnabled(true); + String message = null; + if (e.getLocalizedMessage() != null) { + message = e.getMessage(); + } + if (message == null) { + message = getString(R.string.client_error); + } + Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show(); + }); } - } catch (final Exception e) { - e.printStackTrace(); - runOnUiThread(() -> { - connectionButton.setEnabled(true); - String message = null; - if (e.getLocalizedMessage() != null) { - message = e.getMessage(); - } - if (message == null) { - message = getString(R.string.client_error); - } - Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show(); - }); - } - }).start(); + }).start(); + } + }); } diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java index c13cc8e..dc47d13 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java @@ -149,7 +149,7 @@ public class MainActivity extends AppCompatActivity { AlertDialog.Builder alt_bld = new AlertDialog.Builder(this); alt_bld.setTitle(R.string.instance_choice); final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String acad = sharedpreferences.getString(Helper.PREF_INSTANCE, "tube.ac-lyon.fr"); + String acad = Helper.getLiveInstance(MainActivity.this); int i = 0; for (String item : academies) { if (item.compareTo(acad) == 0) { diff --git a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java index 5d6a315..7253c3e 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java @@ -177,7 +177,7 @@ public class PeertubeActivity extends AppCompatActivity implements OnRetrievePee SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(PeertubeActivity.this)); + String instance = Helper.getLiveInstance(PeertubeActivity.this); Account account = new AccountDAO(PeertubeActivity.this, db).getUniqAccount(userId, instance); Helper.loadGiF(PeertubeActivity.this, account, my_pp); Bundle b = getIntent().getExtras(); diff --git a/app/src/main/java/app/fedilab/fedilabtube/ShowAccountActivity.java b/app/src/main/java/app/fedilab/fedilabtube/ShowAccountActivity.java index 49d5df2..b5f822e 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/ShowAccountActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/ShowAccountActivity.java @@ -221,7 +221,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi PagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); - if( ischannel) { + if (ischannel) { ViewGroup.LayoutParams params = tabLayout.getLayoutParams(); params.height = 0; tabLayout.setLayoutParams(params); @@ -401,17 +401,17 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } doAction = action.UNFOLLOW; account_follow.setContentDescription(getString(R.string.action_unfollow)); - if(ischannel) { + if (ischannel) { account_follow.setVisibility(View.VISIBLE); - }else{ + } else { account_follow.setVisibility(View.GONE); } } else if (!relationship.isFollowing()) { account_follow.setImageResource(R.drawable.ic_user_plus); doAction = action.FOLLOW; - if(ischannel) { + if (ischannel) { account_follow.setVisibility(View.VISIBLE); - }else{ + } else { account_follow.setVisibility(View.GONE); } account_follow.setContentDescription(getString(R.string.action_follow)); diff --git a/app/src/main/java/app/fedilab/fedilabtube/WebviewConnectActivity.java b/app/src/main/java/app/fedilab/fedilabtube/WebviewConnectActivity.java new file mode 100644 index 0000000..5d54f4e --- /dev/null +++ b/app/src/main/java/app/fedilab/fedilabtube/WebviewConnectActivity.java @@ -0,0 +1,175 @@ +package app.fedilab.fedilabtube; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of TubeLab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with TubeLab; if not, + * see . */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ProgressBar; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import org.json.JSONObject; + +import java.net.URL; +import java.util.HashMap; +import java.util.regex.Matcher; + +import app.fedilab.fedilabtube.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.fedilabtube.client.HttpsConnection; +import app.fedilab.fedilabtube.helper.Helper; +import app.fedilab.fedilabtube.webview.CustomWebview; + + +public class WebviewConnectActivity extends AppCompatActivity { + + + private CustomWebview webView; + private AlertDialog alert; + private String clientId, clientSecret; + private String url; + + public static void clearCookies(Context context) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + CookieManager.getInstance().removeAllCookies(null); + CookieManager.getInstance().flush(); + } else { + CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context); + cookieSyncMngr.startSync(); + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.removeAllCookie(); + cookieManager.removeSessionCookie(); + cookieSyncMngr.stopSync(); + cookieSyncMngr.sync(); + } + } + + @SuppressLint("SetJavaScriptEnabled") + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + + setContentView(R.layout.activity_webview_connect); + Bundle b = getIntent().getExtras(); + if (b != null) { + url = b.getString("url"); + } + if (url == null) + finish(); + + String instance = Uri.parse(url).getHost(); + clientId = sharedpreferences.getString(Helper.CLIENT_ID, null); + clientSecret = sharedpreferences.getString(Helper.CLIENT_SECRET, null); + + webView = findViewById(R.id.webviewConnect); + clearCookies(WebviewConnectActivity.this); + webView.getSettings().setJavaScriptEnabled(true); + if (Build.VERSION.SDK_INT >= 21) { + CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true); + } else { + CookieManager.getInstance().setAcceptCookie(true); + } + + + final ProgressBar pbar = findViewById(R.id.progress_bar); + webView.setWebChromeClient(new WebChromeClient() { + @Override + public void onProgressChanged(WebView view, int progress) { + if (progress < 100 && pbar.getVisibility() == ProgressBar.GONE) { + pbar.setVisibility(ProgressBar.VISIBLE); + } + pbar.setProgress(progress); + if (progress == 100) { + pbar.setVisibility(ProgressBar.GONE); + } + } + }); + + webView.setWebViewClient(new WebViewClient() { + + + @Override + public void onPageFinished(WebView view, String url) { + Matcher matcher = Helper.redirectPattern.matcher(url); + if (matcher.find()) { + String externalAuthToken = matcher.group(1); + String username = matcher.group(2); + new Thread(() -> { + try { + String newUrl = "https://" + new URL(url).getHost() + "/api/v1/users/token"; + HashMap params = new HashMap<>(); + clientId = sharedpreferences.getString(Helper.CLIENT_ID, "null"); + clientSecret = sharedpreferences.getString(Helper.CLIENT_SECRET, "null"); + params.put("client_id", clientId); + params.put("client_secret", clientSecret); + params.put("username", username); + params.put("grant_type", "password"); + params.put("externalAuthToken", externalAuthToken); + String response = new HttpsConnection(WebviewConnectActivity.this).post(newUrl, 30, params, null); + JSONObject jsonObject = new JSONObject(response); + String token = jsonObject.getString("access_token"); + String refresh_token = jsonObject.getString("refresh_token"); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); + editor.putString(Helper.PREF_INSTANCE, new URL(url).getHost()); + editor.apply(); + new UpdateAccountInfoAsyncTask(WebviewConnectActivity.this, token, clientId, clientSecret, refresh_token, new URL(url).getHost()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + finish(); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + } + super.onPageFinished(view, url); + } + + + }); + webView.loadUrl(url); + + } + + @Override + public void onBackPressed() { + if (webView != null && webView.canGoBack()) { + webView.goBack(); + } else { + super.onBackPressed(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (alert != null) { + alert.dismiss(); + alert = null; + } + if (webView != null) { + webView.destroy(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/fedilabtube/asynctasks/ManagePlaylistsAsyncTask.java b/app/src/main/java/app/fedilab/fedilabtube/asynctasks/ManagePlaylistsAsyncTask.java index adbcd7e..f9b4394 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/asynctasks/ManagePlaylistsAsyncTask.java +++ b/app/src/main/java/app/fedilab/fedilabtube/asynctasks/ManagePlaylistsAsyncTask.java @@ -56,7 +56,7 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { protected Void doInBackground(Void... params) { SharedPreferences sharedpreferences = contextReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(contextReference.get())); + String instance = Helper.getLiveInstance(contextReference.get()); SQLiteDatabase db = Sqlite.getInstance(contextReference.get().getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); Account account = new AccountDAO(contextReference.get(), db).getUniqAccount(userId, instance); if (account == null) { diff --git a/app/src/main/java/app/fedilab/fedilabtube/asynctasks/RetrievePeertubeChannelsAsyncTask.java b/app/src/main/java/app/fedilab/fedilabtube/asynctasks/RetrievePeertubeChannelsAsyncTask.java index 3829d18..af9dfab 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/asynctasks/RetrievePeertubeChannelsAsyncTask.java +++ b/app/src/main/java/app/fedilab/fedilabtube/asynctasks/RetrievePeertubeChannelsAsyncTask.java @@ -49,7 +49,7 @@ public class RetrievePeertubeChannelsAsyncTask extends AsyncTask { if (this.contextReference == null) { return null; } - String instance = Helper.getPeertubeUrl(host); + String instance; + if (host.startsWith("tube")) { + instance = host; + } else { + instance = Helper.getPeertubeUrl(host); + } account = new PeertubeAPI(this.contextReference.get()).verifyCredentials(token, instance); if (account == null) return null; @@ -76,7 +81,9 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask { editor.putString(Helper.PREF_KEY_ID, account.getId()); editor.putBoolean(Helper.PREF_IS_MODERATOR, account.isModerator()); editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, account.isAdmin()); - editor.putString(Helper.PREF_INSTANCE, host); + if (!host.startsWith("tube")) { + editor.putString(Helper.PREF_INSTANCE, host); + } editor.apply(); if (userExists) new AccountDAO(this.contextReference.get(), db).updateAccountCredential(account); diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java index f2665ed..5a91c46 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java @@ -731,7 +731,6 @@ public class PeertubeAPI { } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { e.printStackTrace(); } catch (HttpsConnection.HttpsConnectionException e) { - if (e.getStatusCode() == 401 || e.getStatusCode() == 403) { SQLiteDatabase db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); Account targetedAccount = new AccountDAO(context, db).getAccountByToken(token); diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java index 66c7777..ed182cc 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java @@ -20,12 +20,9 @@ import android.app.DownloadManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.Resources; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Color; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -43,7 +40,6 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CenterCrop; @@ -81,15 +77,19 @@ public class Helper { public static final String SET_SHARE_DETAILS = "set_share_details"; public static final int DEFAULT_VIDEO_CACHE_MB = 100; public static final String TAG = "mastodon_etalab"; - public static final String CLIENT_NAME_VALUE = "Fedilab"; - public static final String OAUTH_SCOPES_PEERTUBE = "user"; + public static final String ID = "id"; + public static final String CLIENT_ID = "client_id"; + public static final String CLIENT_SECRET = "client_secret"; + public static final String SCOPES = "scopes"; + public static final String WEBSITE = "website"; + public static final String WEBSITE_VALUE = "https://fedilab.app"; + public static final String CLIENT_NAME_VALUE = "TubeLab"; + public static final String OAUTH_SCOPES_PEERTUBE = "openid profile"; public static final String PREF_KEY_OAUTH_TOKEN = "oauth_token"; - public static final Pattern urlPattern = Pattern.compile( - "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", + public static final String REDIRECT_URIS = "redirect_uris"; - Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); public static final Pattern hashtagPattern = Pattern.compile("(#[\\w_A-zÀ-ÿ]+)"); - public static final String LAST_NOTIFICATION_MAX_ID = "last_notification_max_id"; + public static final Pattern redirectPattern = Pattern.compile("externalAuthToken=(\\w+)&username=([\\w.-]+)"); public static final String SET_VIDEO_CACHE = "set_video_cache"; //Proxy public static final String SET_PROXY_ENABLED = "set_proxy_enabled"; @@ -109,13 +109,7 @@ public class Helper { public static final String VIDEO_ID = "video_id_update"; public static final String CLIENT_NAME = "client_name"; public static final String APP_PREFS = "app_prefs"; - public static final String ID = "id"; - public static final String CLIENT_ID = "client_id"; - public static final String CLIENT_SECRET = "client_secret"; - public static final String REDIRECT_URIS = "redirect_uris"; - public static final String SCOPES = "scopes"; - public static final String WEBSITE = "website"; - public static final String WEBSITE_VALUE = "https://fedilab.app"; + public static final int VIDEOS_PER_PAGE = 40; public static final String SET_VIDEO_NSFW = "set_video_nsfw"; public static final String SET_EMBEDDED_BROWSER = "set_embedded_browser"; @@ -125,6 +119,13 @@ public class Helper { public static final String SET_UNFOLLOW_VALIDATION = "set_unfollow_validation"; //List of available academies + + public static String[] openid = { + "ac-normandie.fr", + //TODO: remove this one used for tests + // "ac-orleans-tours.fr" + }; + public static String[] academies = { "ac-aix-marseille.fr", "ac-amiens.fr", @@ -214,6 +215,10 @@ public class Helper { acad = "outremer.fr"; } if (!acad.contains("ac-lyon.fr")) { + //TODO: remove hack for test with openid + /*if( acad.contains("orleans-tours.fr")) { + return "tube-normandie.beta.education.fr"; + }*/ return "tube-" + acad.replaceAll("ac-|\\.fr", "") + ".beta.education.fr"; } else { return "tube.ac-lyon.fr"; @@ -230,8 +235,11 @@ public class Helper { public static String getLiveInstance(Context context) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); String acad = sharedpreferences.getString(Helper.PREF_INSTANCE, "tube.ac-lyon.fr"); - return getPeertubeUrl(acad); - + if (acad.startsWith("tube-")) { + return acad; + } else { + return getPeertubeUrl(acad); + } } public static String instanceWithProtocol(Context context) { @@ -376,15 +384,6 @@ public class Helper { } - public static String dateDiffFull(Date dateToot) { - SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault()); - try { - return df.format(dateToot); - } catch (Exception e) { - return ""; - } - } - public static String withSuffix(long count) { if (count < 1000) return "" + count; int exp = (int) (Math.log(count) / Math.log(1000)); @@ -443,7 +442,6 @@ public class Helper { public static void loadGiF(final Context context, String url, final ImageView imageView) { - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if (url.startsWith("/")) { url = Helper.getLiveInstance(context) + url; @@ -632,33 +630,6 @@ public class Helper { return ContextCompat.getColor(context, typedValue.resourceId); } - /** - * change color of a drawable - * - * @param drawable int the drawable - * @param hexaColor example 0xffff00 - */ - public static Drawable changeDrawableColor(Context context, int drawable, int hexaColor) { - Drawable mDrawable = ContextCompat.getDrawable(context, drawable); - int color; - try { - color = Color.parseColor(context.getString(hexaColor)); - } catch (Resources.NotFoundException e) { - try { - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = context.getTheme(); - theme.resolveAttribute(hexaColor, typedValue, true); - color = typedValue.data; - } catch (Resources.NotFoundException ed) { - color = hexaColor; - } - } - assert mDrawable != null; - mDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - DrawableCompat.setTint(mDrawable, color); - return mDrawable; - } - /** * Returns boolean depending if the user is authenticated diff --git a/app/src/main/res/layout/activity_webview_connect.xml b/app/src/main/res/layout/activity_webview_connect.xml new file mode 100644 index 0000000..66a56b8 --- /dev/null +++ b/app/src/main/res/layout/activity_webview_connect.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ 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 5f645fd..d42610a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,4 +165,5 @@ %1$s a publié une nouvelle vidéo : %2$s]]> %1$s a été blacklisté]]> %1$s n’est plus blacklisté]]> + Une erreur s’est produite ! L’instance n’a retourné aucun code d\autorisation ! \ No newline at end of file