diff --git a/app/build.gradle b/app/build.gradle index 15a2380..8a0ce83 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,9 +6,52 @@ android { applicationId "net.schueller.peertube" minSdkVersion 23 targetSdkVersion 28 - versionCode 103 - versionName "1.0.3" + versionCode 104 + versionName "1.0.4" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + // Layouts and design + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' + implementation 'de.hdodenhof:circleimageview:2.2.0' + implementation 'com.android.support:support-v13:28.0.0' + + // font awesome + implementation 'com.blackboardtheory:android-iconify-fontawesome:3.0.1-SNAPSHOT' + + // BottomNavigationViewEx -> https://github.com/ittianyu/BottomNavigationViewEx + implementation 'com.github.ittianyu:BottomNavigationViewEx:2.0.2' + + // http client / REST + implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + + // image downloading and caching library + implementation 'com.squareup.picasso:picasso:2.5.2' + + // json decoder/encoder + implementation 'com.google.code.gson:gson:2.8.2' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + + // Torrents and WebRTC + implementation 'com.github.TorrentStream:TorrentStream-Android:2.5.0' +// implementation "com.github.TorrentStream:TorrentStreamServer-Android:1.0.1" +// implementation 'org.webrtc:google-webrtc:1.0.+' + + // video player + implementation 'com.google.android.exoplayer:exoplayer:2.8.1' +// implementation 'com.devbrackets.android:exomedia:4.1.0' + + // testing + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + } } buildTypes { release { @@ -26,40 +69,3 @@ android { } } -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support:cardview-v7:28.0.0' - implementation 'com.android.support:recyclerview-v7:28.0.0' - - implementation 'com.google.android.gms:play-services-auth:16.0.1' - - implementation 'com.squareup.okhttp3:okhttp:3.10.0' - implementation 'com.squareup.retrofit2:retrofit:2.3.0' - implementation 'com.squareup.retrofit2:converter-gson:2.3.0' - implementation 'com.squareup.picasso:picasso:2.5.2' - - implementation 'com.google.code.gson:gson:2.8.2' - -// implementation 'org.webrtc:google-webrtc:1.0.+' - implementation 'com.android.support:design:28.0.0' - - // BottomNavigationViewEx -> https://github.com/ittianyu/BottomNavigationViewEx - implementation 'com.github.ittianyu:BottomNavigationViewEx:2.0.2' - - - implementation 'com.blackboardtheory:android-iconify-fontawesome:3.0.1-SNAPSHOT' - - implementation 'com.github.TorrentStream:TorrentStream-Android:2.5.0' - implementation 'com.google.android.exoplayer:exoplayer:2.8.1' -// implementation "com.github.TorrentStream:TorrentStreamServer-Android:1.0.1" -// implementation 'com.devbrackets.android:exomedia:4.1.0' - - implementation 'de.hdodenhof:circleimageview:2.2.0' - - implementation 'com.android.support:support-v4:28.0.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aac212d..80cd260 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,28 +10,23 @@ - - + - + - - - - @@ -59,10 +53,12 @@ android:label="@string/title_activity_settings" /> - - + + \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/activity/AppCompatPreferenceActivity.java b/app/src/main/java/net/schueller/peertube/activity/AppCompatPreferenceActivity.java index 1ea9f48..8675d18 100644 --- a/app/src/main/java/net/schueller/peertube/activity/AppCompatPreferenceActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/AppCompatPreferenceActivity.java @@ -37,9 +37,9 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity { return getDelegate().getSupportActionBar(); } - public void setSupportActionBar(@Nullable Toolbar toolbar) { - getDelegate().setSupportActionBar(toolbar); - } +// public void setSupportActionBar(@Nullable Toolbar toolbar) { +// getDelegate().setSupportActionBar(toolbar); +// } @Override public MenuInflater getMenuInflater() { diff --git a/app/src/main/java/net/schueller/peertube/activity/LoginActivity.java b/app/src/main/java/net/schueller/peertube/activity/LoginActivity.java index 9a2fe32..5118071 100644 --- a/app/src/main/java/net/schueller/peertube/activity/LoginActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/LoginActivity.java @@ -1,57 +1,43 @@ package net.schueller.peertube.activity; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.annotation.TargetApi; -import android.content.pm.PackageManager; +import android.os.StrictMode; import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; -import android.app.LoaderManager.LoaderCallbacks; - -import android.content.CursorLoader; -import android.content.Loader; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; - -import android.os.Build; import android.os.Bundle; -import android.provider.ContactsContract; -import android.text.TextUtils; -import android.view.KeyEvent; +import android.util.Log; import android.view.View; -import android.view.View.OnClickListener; -import android.view.inputmethod.EditorInfo; -import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; +import android.widget.Toast; import net.schueller.peertube.R; +import net.schueller.peertube.helper.APIUrlHelper; +import net.schueller.peertube.model.OauthClient; +import net.schueller.peertube.model.Token; +import net.schueller.peertube.model.VideoList; +import net.schueller.peertube.network.AuthenticationService; +import net.schueller.peertube.network.GetVideoDataService; +import net.schueller.peertube.network.RetrofitInstance; -import static android.Manifest.permission.READ_CONTACTS; +import java.io.IOException; -/** - * A login screen that offers login via email/password. - */ -public class LoginActivity extends AppCompatActivity implements LoaderCallbacks { +import okhttp3.FormBody; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import retrofit2.Call; +import retrofit2.Callback; + +public class LoginActivity extends AppCompatActivity { + + OkHttpClient client = new OkHttpClient(); + public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + + private String TAG = "LoginActivity"; - /** - * A dummy authentication store containing known user names and passwords. - * TODO: remove after connecting to a real authentication system. - */ - private static final String[] DUMMY_CREDENTIALS = new String[]{ - "foo@example.com:hello", "bar@example.com:world" - }; - /** - * Keep track of the login task to ensure we can cancel it if requested. - */ - private UserLoginTask mAuthTask = null; // UI references. private AutoCompleteTextView mEmailView; @@ -63,43 +49,25 @@ public class LoginActivity extends AppCompatActivity implements LoaderCallbacks< protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - // Set up the login form. - mEmailView = (AutoCompleteTextView) findViewById(R.id.email); - mPasswordView = (EditText) findViewById(R.id.password); - mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { - if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { - attemptLogin(); - return true; - } - return false; - } - }); + // bind button click + Button mEmailSignInButton = findViewById(R.id.email_sign_in_button); + mEmailSignInButton.setOnClickListener(view -> attemptLogin()); - Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); - mEmailSignInButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - attemptLogin(); - } - }); + mEmailView = findViewById(R.id.email); + mPasswordView = findViewById(R.id.password); + +// if (android.os.Build.VERSION.SDK_INT > 9) { +// StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); +// StrictMode.setThreadPolicy(policy); +// } - mLoginFormView = findViewById(R.id.login_form); - mProgressView = findViewById(R.id.login_progress); } - /** - * Attempts to sign in or register the account specified by the login form. - * If there are form errors (invalid email, missing fields, etc.), the - * errors are presented and no actual login attempt is made. - */ + private void attemptLogin() { - if (mAuthTask != null) { - return; - } + // Reset errors. mEmailView.setError(null); @@ -109,195 +77,60 @@ public class LoginActivity extends AppCompatActivity implements LoaderCallbacks< String email = mEmailView.getText().toString(); String password = mPasswordView.getText().toString(); - boolean cancel = false; - View focusView = null; + // make http call to login and save access tokens - // Check for a valid password, if the user entered one. - if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { - mPasswordView.setError(getString(R.string.error_invalid_password)); - focusView = mPasswordView; - cancel = true; - } + String apiBaseURL = APIUrlHelper.getUrlWithVersion(this); - // Check for a valid email address. - if (TextUtils.isEmpty(email)) { - mEmailView.setError(getString(R.string.error_field_required)); - focusView = mEmailView; - cancel = true; - } else if (!isEmailValid(email)) { - mEmailView.setError(getString(R.string.error_invalid_email)); - focusView = mEmailView; - cancel = true; - } + AuthenticationService service = RetrofitInstance.getRetrofitInstance(apiBaseURL).create(AuthenticationService.class); - if (cancel) { - // There was an error; don't attempt login and focus the first - // form field with an error. - focusView.requestFocus(); - } else { - // Show a progress spinner, and kick off a background task to - // perform the user login attempt. - showProgress(true); - mAuthTask = new UserLoginTask(email, password); - mAuthTask.execute((Void) null); - } - } + Call call = service.getOauthClientLocal(); + call.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - private boolean isEmailValid(String email) { - //TODO: Replace this with your own logic - return email.contains("@"); - } + if (response.body() != null) { - private boolean isPasswordValid(String password) { - //TODO: Replace this with your own logic - return password.length() > 4; - } + Call call2 = service.getAuthenticationToken( + response.body().getClientId(), + response.body().getClientSecret(), + "code", + "password", + "upload", + email, + password + ); + call2.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call2, @NonNull retrofit2.Response response2) { - /** - * Shows the progress UI and hides the login form. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) - private void showProgress(final boolean show) { - // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow - // for very easy animations. If available, use these APIs to fade-in - // the progress spinner. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { - int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); + if (response2.body() != null) { + Log.wtf(TAG, response2.body().getAccessToken()); + Log.wtf(TAG, response2.body().getExpiresIn()); + Log.wtf(TAG, response2.body().getRefreshToken()); + Log.wtf(TAG, response2.body().getTokenType()); + } else { + Log.wtf(TAG, response2.toString()); + } + } - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - mLoginFormView.animate().setDuration(shortAnimTime).alpha( - show ? 0 : 1).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - }); + @Override + public void onFailure(@NonNull Call call2, @NonNull Throwable t2) { + Log.wtf("err", t2.fillInStackTrace()); + } + }); - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mProgressView.animate().setDuration(shortAnimTime).alpha( - show ? 1 : 0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - } - }); - } else { - // The ViewPropertyAnimator APIs are not available, so simply show - // and hide the relevant UI components. - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - } - - @Override - public Loader onCreateLoader(int i, Bundle bundle) { - return new CursorLoader(this, - // Retrieve data rows for the device user's 'profile' contact. - Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, - ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, - - // Select only email addresses. - ContactsContract.Contacts.Data.MIMETYPE + - " = ?", new String[]{ContactsContract.CommonDataKinds.Email - .CONTENT_ITEM_TYPE}, - - // Show primary email addresses first. Note that there won't be - // a primary email address if the user hasn't specified one. - ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); - } - - @Override - public void onLoadFinished(Loader cursorLoader, Cursor cursor) { - List emails = new ArrayList<>(); - cursor.moveToFirst(); - while (!cursor.isAfterLast()) { - emails.add(cursor.getString(ProfileQuery.ADDRESS)); - cursor.moveToNext(); - } - - addEmailsToAutoComplete(emails); - } - - @Override - public void onLoaderReset(Loader cursorLoader) { - - } - - private void addEmailsToAutoComplete(List emailAddressCollection) { - //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. - ArrayAdapter adapter = - new ArrayAdapter<>(LoginActivity.this, - android.R.layout.simple_dropdown_item_1line, emailAddressCollection); - - mEmailView.setAdapter(adapter); - } - - - private interface ProfileQuery { - String[] PROJECTION = { - ContactsContract.CommonDataKinds.Email.ADDRESS, - ContactsContract.CommonDataKinds.Email.IS_PRIMARY, - }; - - int ADDRESS = 0; - int IS_PRIMARY = 1; - } - - /** - * Represents an asynchronous login/registration task used to authenticate - * the user. - */ - public class UserLoginTask extends AsyncTask { - - private final String mEmail; - private final String mPassword; - - UserLoginTask(String email, String password) { - mEmail = email; - mPassword = password; - } - - @Override - protected Boolean doInBackground(Void... params) { - // TODO: attempt authentication against a network service. - - try { - // Simulate network access. - Thread.sleep(2000); - } catch (InterruptedException e) { - return false; - } - - for (String credential : DUMMY_CREDENTIALS) { - String[] pieces = credential.split(":"); - if (pieces[0].equals(mEmail)) { - // Account exists, return true if the password matches. - return pieces[1].equals(mPassword); + } else { + Log.wtf(TAG, response.toString()); } } - // TODO: register the new account here. - return true; - } - - @Override - protected void onPostExecute(final Boolean success) { - mAuthTask = null; - showProgress(false); - - if (success) { - finish(); - } else { - mPasswordView.setError(getString(R.string.error_incorrect_password)); - mPasswordView.requestFocus(); + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.wtf("err", t.fillInStackTrace()); } - } - - @Override - protected void onCancelled() { - mAuthTask = null; - showProgress(false); - } + }); } + + } diff --git a/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java b/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java index 9cc00c3..976d00f 100644 --- a/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java @@ -11,10 +11,10 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; import android.util.Log; import android.widget.Toast; + import net.schueller.peertube.R; import net.schueller.peertube.adapter.VideoAdapter; import net.schueller.peertube.helper.APIUrlHelper; @@ -117,9 +117,9 @@ public class SearchActivity extends AppCompatActivity { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); String nsfw = sharedPref.getBoolean("pref_show_nsfw", false) ? "both" : "false"; - String apiBaseURL = APIUrlHelper.getUrl(this); + String apiBaseURL = APIUrlHelper.getUrlWithVersion(this); - GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL + "/api/v1/").create(GetVideoDataService.class); + GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL).create(GetVideoDataService.class); Call call = service.searchVideosData(start, count, sort, nsfw, search); diff --git a/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java b/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java new file mode 100644 index 0000000..9c06c8d --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java @@ -0,0 +1,43 @@ +package net.schueller.peertube.activity; + +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import net.schueller.peertube.R; +import net.schueller.peertube.model.ServerList; +import net.schueller.peertube.network.GetServerListDataService; +import net.schueller.peertube.network.RetrofitInstance; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class SelectServerActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_select_server); + + // get list of peertube servers + + // TODO: Get here via settings, get data from API, add to adapter and show in recycle view, upon selection fill settings field + + GetServerListDataService service = RetrofitInstance.getRetrofitInstance("https://instances.joinpeertube.org/api/v1/").create(GetServerListDataService.class); + Call call = service.getInstancesData(0, 500); + call.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + // response.body().getVideoArrayList(); + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + } + }); + + + } +} diff --git a/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java b/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java index c35773f..33755b3 100644 --- a/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java @@ -4,19 +4,14 @@ import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; - import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.support.v7.app.ActionBar; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; - import android.view.MenuItem; - - import net.schueller.peertube.R; - import java.util.List; diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java index 75312b7..6a921bc 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java @@ -8,7 +8,6 @@ import android.content.pm.PackageManager; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; @@ -22,10 +21,10 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; -import com.google.android.gms.common.GooglePlayServicesNotAvailableException; -import com.google.android.gms.common.GooglePlayServicesRepairableException; -import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.gms.security.ProviderInstaller; +//import com.google.android.gms.common.GooglePlayServicesNotAvailableException; +//import com.google.android.gms.common.GooglePlayServicesRepairableException; +//import com.google.android.gms.common.GooglePlayServicesUtil; +//import com.google.android.gms.security.ProviderInstaller; import com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx; import com.joanzapata.iconify.IconDrawable; import com.joanzapata.iconify.Iconify; @@ -64,41 +63,44 @@ public class VideoListActivity extends AppCompatActivity { private BottomNavigationViewEx.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = item -> { - switch (item.getItemId()) { - case R.id.navigation_home: - //Log.v(TAG, "navigation_home"); + switch (item.getItemId()) { + case R.id.navigation_home: + //Log.v(TAG, "navigation_home"); - if (!isLoading) { - sort = "-createdAt"; - currentStart = 0; - loadVideos(currentStart, count, sort, filter); - } - - return true; - case R.id.navigation_trending: - //Log.v(TAG, "navigation_trending"); - - if (!isLoading) { - sort = "-trending"; - currentStart = 0; - loadVideos(currentStart, count, sort, filter); - } - - return true; - case R.id.navigation_subscriptions: - //Log.v(TAG, "navigation_subscriptions"); - Toast.makeText(VideoListActivity.this, "Subscriptions Not Implemented", Toast.LENGTH_SHORT).show(); - - return false; - - case R.id.navigation_account: - //Log.v(TAG, "navigation_account"); - Toast.makeText(VideoListActivity.this, "Account Not Implemented", Toast.LENGTH_SHORT).show(); - - return false; + if (!isLoading) { + sort = "-createdAt"; + currentStart = 0; + loadVideos(currentStart, count, sort, filter); } + + return true; + case R.id.navigation_trending: + //Log.v(TAG, "navigation_trending"); + + if (!isLoading) { + sort = "-trending"; + currentStart = 0; + loadVideos(currentStart, count, sort, filter); + } + + return true; + case R.id.navigation_subscriptions: + //Log.v(TAG, "navigation_subscriptions"); + Toast.makeText(VideoListActivity.this, "Subscriptions Not Implemented", Toast.LENGTH_SHORT).show(); + return false; - }; + + case R.id.navigation_account: + //Log.v(TAG, "navigation_account"); + Toast.makeText(VideoListActivity.this, "Account Not Implemented", Toast.LENGTH_SHORT).show(); + +// Intent intent = new Intent(this, LoginActivity.class); +// this.startActivity(intent); + + return false; + } + return false; + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -116,14 +118,14 @@ public class VideoListActivity extends AppCompatActivity { setSupportActionBar(toolbar); // fix android trying to use SSLv3 for handshake - updateAndroidSecurityProvider(this); +// updateAndroidSecurityProvider(this); // Bottom Navigation BottomNavigationViewEx navigation = findViewById(R.id.navigation); navigation.enableAnimation(false); - navigation.enableShiftingMode(false); - navigation.enableItemShiftingMode(false); + navigation.setLabelVisibilityMode(1); // enableShiftingMode + navigation.setItemHorizontalTranslationEnabled(false); // enableItemShiftingMode Menu navMenu = navigation.getMenu(); navMenu.findItem(R.id.navigation_home).setIcon( @@ -212,7 +214,7 @@ public class VideoListActivity extends AppCompatActivity { if (dy > 0) { // is at end of list? - if(!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)){ + if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { if (!isLoading) { currentStart = currentStart + count; loadVideos(currentStart, count, sort, filter); @@ -240,9 +242,9 @@ public class VideoListActivity extends AppCompatActivity { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); String nsfw = sharedPref.getBoolean("pref_show_nsfw", false) ? "both" : "false"; - String apiBaseURL = APIUrlHelper.getUrl(this); + String apiBaseURL = APIUrlHelper.getUrlWithVersion(this); - GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL + "/api/v1/").create(GetVideoDataService.class); + GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL).create(GetVideoDataService.class); Call call = service.getVideosData(start, count, sort, nsfw); @@ -277,26 +279,27 @@ public class VideoListActivity extends AppCompatActivity { /** * Force android to not use SSLv3 - * - * @param callingActivity Activity + *

+ * // * @param callingActivity Activity */ - private void updateAndroidSecurityProvider(Activity callingActivity) { - try { - ProviderInstaller.installIfNeeded(this); - } catch (GooglePlayServicesRepairableException e) { - // Thrown when Google Play Services is not installed, up-to-date, or enabled - // Show dialog to allow users to install, update, or otherwise enable Google Play services. - GooglePlayServicesUtil.getErrorDialog(e.getConnectionStatusCode(), callingActivity, 0); - } catch (GooglePlayServicesNotAvailableException e) { - Log.e("SecurityException", "Google Play Services not available."); - } - } - +// private void updateAndroidSecurityProvider(Activity callingActivity) { +// try { +// ProviderInstaller.installIfNeeded(this); +// } catch (GooglePlayServicesRepairableException e) { +// // Thrown when Google Play Services is not installed, up-to-date, or enabled +// // Show dialog to allow users to install, update, or otherwise enable Google Play services. +// GooglePlayServicesUtil.getErrorDialog(e.getConnectionStatusCode(), callingActivity, 0); +// } catch (GooglePlayServicesNotAvailableException e) { +// Log.e("SecurityException", "Google Play Services not available."); +// } +// } @Override protected void onResume() { super.onResume(); - - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + // only check when we actually need the permission + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && + sharedPref.getBoolean("pref_torrent_player", false)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } } diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java index 46e58e5..5d8f94e 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -15,7 +15,6 @@ import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; @@ -93,8 +92,8 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere simpleExoPlayerView.setPlayer(player); // get video details from api - String apiBaseURL = APIUrlHelper.getUrl(this); - GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL + "/api/v1/").create(GetVideoDataService.class); + String apiBaseURL = APIUrlHelper.getUrlWithVersion(this); + GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL).create(GetVideoDataService.class); Call