From 91d4b0c9adfa696c7f34880670d4e424973f6548 Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Sun, 11 Nov 2018 14:53:32 +0100 Subject: [PATCH 1/7] - Server selection stubs --- app/src/main/AndroidManifest.xml | 23 ++-- .../activity/SelectServerActivity.java | 43 ++++++ .../net/schueller/peertube/model/Server.java | 122 ++++++++++++++++++ .../schueller/peertube/model/ServerList.java | 16 +++ .../network/GetServerListDataService.java | 16 +++ .../res/layout/activity_select_server.xml | 9 ++ 6 files changed, 216 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java create mode 100644 app/src/main/java/net/schueller/peertube/model/Server.java create mode 100644 app/src/main/java/net/schueller/peertube/model/ServerList.java create mode 100644 app/src/main/java/net/schueller/peertube/network/GetServerListDataService.java create mode 100644 app/src/main/res/layout/activity_select_server.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aac212d..a4be24e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,28 +10,23 @@ - - + - + - - - - @@ -59,10 +53,13 @@ android:label="@string/title_activity_settings" /> - + + \ No newline at end of file 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/model/Server.java b/app/src/main/java/net/schueller/peertube/model/Server.java new file mode 100644 index 0000000..f8b1d21 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/model/Server.java @@ -0,0 +1,122 @@ +package net.schueller.peertube.model; + +public class Server { + + private Integer id; + private String host; + private String name; + private String shortDescription; + private String version; + private Boolean signupAllowed; + private Integer userVideoQuota; + private Integer totalUsers; + private Integer totalVideos; + private Integer totalLocalVideos; + private Integer totalInstanceFollowers; + private Integer totalInstanceFollowing; + private Integer health; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getShortDescription() { + return shortDescription; + } + + public void setShortDescription(String shortDescription) { + this.shortDescription = shortDescription; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Boolean getSignupAllowed() { + return signupAllowed; + } + + public void setSignupAllowed(Boolean signupAllowed) { + this.signupAllowed = signupAllowed; + } + + public Integer getUserVideoQuota() { + return userVideoQuota; + } + + public void setUserVideoQuota(Integer userVideoQuota) { + this.userVideoQuota = userVideoQuota; + } + + public Integer getTotalUsers() { + return totalUsers; + } + + public void setTotalUsers(Integer totalUsers) { + this.totalUsers = totalUsers; + } + + public Integer getTotalVideos() { + return totalVideos; + } + + public void setTotalVideos(Integer totalVideos) { + this.totalVideos = totalVideos; + } + + public Integer getTotalLocalVideos() { + return totalLocalVideos; + } + + public void setTotalLocalVideos(Integer totalLocalVideos) { + this.totalLocalVideos = totalLocalVideos; + } + + public Integer getTotalInstanceFollowers() { + return totalInstanceFollowers; + } + + public void setTotalInstanceFollowers(Integer totalInstanceFollowers) { + this.totalInstanceFollowers = totalInstanceFollowers; + } + + public Integer getTotalInstanceFollowing() { + return totalInstanceFollowing; + } + + public void setTotalInstanceFollowing(Integer totalInstanceFollowing) { + this.totalInstanceFollowing = totalInstanceFollowing; + } + + public Integer getHealth() { + return health; + } + + public void setHealth(Integer health) { + this.health = health; + } +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/model/ServerList.java b/app/src/main/java/net/schueller/peertube/model/ServerList.java new file mode 100644 index 0000000..709cdc2 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/model/ServerList.java @@ -0,0 +1,16 @@ +package net.schueller.peertube.model; + +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; + +public class ServerList { + + @SerializedName("data") + private ArrayList serverList; + + public ArrayList getServerArrayList() { + return serverList; + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/network/GetServerListDataService.java b/app/src/main/java/net/schueller/peertube/network/GetServerListDataService.java new file mode 100644 index 0000000..5962353 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/network/GetServerListDataService.java @@ -0,0 +1,16 @@ +package net.schueller.peertube.network; + +import net.schueller.peertube.model.ServerList; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GetServerListDataService { + @GET("instances/") + Call getInstancesData( + @Query("start") int start, + @Query("count") int count + ); + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_select_server.xml b/app/src/main/res/layout/activity_select_server.xml new file mode 100644 index 0000000..d3f16ec --- /dev/null +++ b/app/src/main/res/layout/activity_select_server.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file From f8cfd7ea8c45a9ee1829838d27dce815975d0ed3 Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Tue, 13 Nov 2018 21:04:06 +0100 Subject: [PATCH 2/7] - Cleanup - Removed play services --- app/build.gradle | 80 ++++++++++--------- .../activity/AppCompatPreferenceActivity.java | 6 +- .../peertube/activity/SearchActivity.java | 2 +- .../peertube/activity/SettingsActivity.java | 5 -- .../peertube/activity/VideoListActivity.java | 42 +++++----- .../peertube/activity/VideoPlayActivity.java | 1 - .../peertube/adapter/VideoAdapter.java | 2 - 7 files changed, 69 insertions(+), 69 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 15a2380..a30218b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,49 @@ android { versionCode 103 versionName "1.0.3" 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/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/SearchActivity.java b/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java index 9cc00c3..55876b6 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; 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..939ae1a 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; @@ -95,6 +94,9 @@ public class VideoListActivity extends AppCompatActivity { //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; @@ -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( @@ -278,19 +280,19 @@ 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() { 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..6c4adff 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; diff --git a/app/src/main/java/net/schueller/peertube/adapter/VideoAdapter.java b/app/src/main/java/net/schueller/peertube/adapter/VideoAdapter.java index dfe9c40..c9fb785 100644 --- a/app/src/main/java/net/schueller/peertube/adapter/VideoAdapter.java +++ b/app/src/main/java/net/schueller/peertube/adapter/VideoAdapter.java @@ -2,8 +2,6 @@ package net.schueller.peertube.adapter; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; From c0dd67167a90e35c7d1c1c1e2a59100509848542 Mon Sep 17 00:00:00 2001 From: Stefan Schueller Date: Tue, 13 Nov 2018 22:16:30 +0100 Subject: [PATCH 3/7] - URL cleanup - WIP: Login activity --- app/src/main/AndroidManifest.xml | 3 +- .../peertube/activity/LoginActivity.java | 327 +++++------------- .../peertube/activity/SearchActivity.java | 4 +- .../peertube/activity/VideoListActivity.java | 4 +- .../peertube/activity/VideoPlayActivity.java | 4 +- .../peertube/helper/APIUrlHelper.java | 4 + .../schueller/peertube/model/OauthClient.java | 23 ++ .../net/schueller/peertube/model/Token.java | 41 +++ .../network/AuthenticationService.java | 28 ++ app/src/main/res/layout/activity_login.xml | 16 - 10 files changed, 183 insertions(+), 271 deletions(-) create mode 100644 app/src/main/java/net/schueller/peertube/model/OauthClient.java create mode 100644 app/src/main/java/net/schueller/peertube/model/Token.java create mode 100644 app/src/main/java/net/schueller/peertube/network/AuthenticationService.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a4be24e..80cd260 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ android:enabled="true" android:exported="false" /> - + - \ No newline at end of file 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 55876b6..976d00f 100644 --- a/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/SearchActivity.java @@ -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/VideoListActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java index 939ae1a..31a09c1 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java @@ -242,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); 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 6c4adff..5d8f94e 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -92,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