diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 3c5b9551..626d196f 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -16,11 +16,26 @@ + diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index f6fe2a95..9f603d1b 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 22d52437..64b76d98 100644 Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ diff --git a/app/build.gradle b/app/build.gradle index c7388dd5..9dbee2b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,6 +37,7 @@ dependencies { implementation 'com.google.android.material:material:1.1.0-alpha03' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.legacy:legacy-support-v13:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.2-alpha01' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.2-alpha01' @@ -74,4 +75,5 @@ dependencies { implementation "ru.noties:markwon-syntax-highlight:2.0.1" implementation "ru.noties:markwon-view:2.0.1" implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' + implementation 'com.github.Ferfalk:SimpleSearchView:0.1.3' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5d815b6d..0d43f71f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,21 +11,25 @@ android:maxSdkVersion="22" /> + + + android:theme="@style/AppTheme.NoActionBarWithTransparentStatusBar"> - @@ -47,11 +51,11 @@ + android:theme="@style/AppTheme.NoActionBarWithTranslucentWindow" /> + android:theme="@style/AppTheme.NoActionBarWithTranslucentWindow" /> \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index bbd6e60c..3aec9917 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -1,19 +1,11 @@ package ml.docilealligator.infinityforreddit; -import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; -import androidx.fragment.app.Fragment; -import androidx.core.view.GravityCompat; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.appcompat.app.ActionBarDrawerToggle; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -23,6 +15,7 @@ import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; +import com.ferfalk.simplesearchview.SimpleSearchView; import java.util.ArrayList; import java.util.List; @@ -41,6 +34,15 @@ import SubscribedUserDatabase.SubscribedUserDao; import SubscribedUserDatabase.SubscribedUserData; import SubscribedUserDatabase.SubscribedUserRoomDatabase; import SubscribedUserDatabase.SubscribedUserViewModel; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; import de.hdodenhof.circleimageview.CircleImageView; @@ -56,6 +58,8 @@ public class MainActivity extends AppCompatActivity { private static final String FETCH_USER_INFO_STATE = "FUIS"; private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS"; + @BindView(R.id.search_view_main_activity) SimpleSearchView simpleSearchView; + @BindView(R.id.transparent_overlay_main_activity) View transparentOverlay; @BindView(R.id.subscribed_subreddit_recycler_view_main_activity) RecyclerView subscribedSubredditRecyclerView; @BindView(R.id.subscriptions_label_main_activity) TextView subscriptionsLabelTextView; @BindView(R.id.subscribed_user_recycler_view_main_activity) RecyclerView subscribedUserRecyclerView; @@ -111,6 +115,52 @@ public class MainActivity extends AppCompatActivity { drawer.addDrawerListener(toggle); toggle.syncState(); + transparentOverlay.setOnClickListener(view -> simpleSearchView.onBackPressed()); + + simpleSearchView.setOnQueryTextListener(new SimpleSearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + Intent intent = new Intent(MainActivity.this, SearchActivity.class); + intent.putExtra(SearchActivity.QUERY_KEY, query); + startActivity(intent); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + return false; + } + + @Override + public boolean onQueryTextCleared() { + return false; + } + }); + + simpleSearchView.setOnSearchViewListener(new SimpleSearchView.SearchViewListener() { + @Override + public void onSearchViewShown() { + transparentOverlay.setVisibility(View.VISIBLE); + getWindow().setStatusBarColor(Color.GRAY); + } + + @Override + public void onSearchViewClosed() { + transparentOverlay.setVisibility(View.GONE); + getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark)); + } + + @Override + public void onSearchViewShownAnimation() { + + } + + @Override + public void onSearchViewClosedAnimation() { + + } + }); + String accessToken = getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); if (accessToken.equals("")) { Intent loginIntent = new Intent(this, LoginActivity.class); @@ -265,9 +315,21 @@ public class MainActivity extends AppCompatActivity { } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (simpleSearchView.onActivityResult(requestCode, resultCode, data)) { + return; + } + + super.onActivityResult(requestCode, resultCode, data); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity, menu); + + simpleSearchView.setMenuItem(menu.findItem(R.id.action_search_main_activity)); + return true; } @@ -292,6 +354,10 @@ public class MainActivity extends AppCompatActivity { if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { + if (simpleSearchView.onBackPressed()) { + return; + } + super.onBackPressed(); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index 39344b73..95d0f173 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -3,13 +3,11 @@ package ml.docilealligator.infinityforreddit; import java.util.Map; import retrofit2.Call; -import retrofit2.http.DELETE; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.HeaderMap; import retrofit2.http.POST; -import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; @@ -53,15 +51,21 @@ public interface RedditAPI { @POST("api/subscribe") Call subredditSubscription(@HeaderMap Map headers, @FieldMap Map params); - @PUT("api/v1/me/friends/username") - Call subscribeUser(@HeaderMap Map headers); - - @DELETE("api/v1/me/friends/username") - Call unsubscribeUser(@HeaderMap Map headers); - @GET("api/morechildren?api_type=json&raw_json=1") Call getMoreChildren(@Query("link_id") String linkId, @Query("children") String children); @GET("{subredditNamePrefixed}/api/info.json?raw_json=1") Call getInfo(@Path("subredditNamePrefixed") String subredditNamePrefixed, @Query("id") String id); + + @GET("subreddits/search.json?raw_json=1&include_over_18=on") + Call searchSubreddits(@Query("q") String subredditName, @Query("after") String after); + + @GET("/profiles/search.json?raw_json=1") + Call searchProfiles(@Query("q") String profileName, @Query("after") String after); + + @GET("/search.json?raw_json=1") + Call searchPosts(@Query("q") String query, @Query("after") String after); + + @GET("/r/{subredditName}/search.json?raw_json=1&restrict_sr=true") + Call searchPostsInSpecificSubreddit(@Query("q") String query, @Query("after") String after); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchActivity.java new file mode 100644 index 00000000..51099a9a --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchActivity.java @@ -0,0 +1,88 @@ +package ml.docilealligator.infinityforreddit; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import com.google.android.material.tabs.TabLayout; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +public class SearchActivity extends AppCompatActivity { + static final String QUERY_KEY = "QK"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_search); + + Toolbar toolbar = findViewById(R.id.toolbar_search_activity); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + ViewPager viewPager = findViewById(R.id.view_pager_search_activity); + PagerAdapter pagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(pagerAdapter); + TabLayout tabLayout = findViewById(R.id.tab_layout_search_activity); + tabLayout.setupWithViewPager(viewPager); + + // Get the intent, verify the action and get the query + Intent intent = getIntent(); + String query = intent.getExtras().getString(QUERY_KEY); + if(query != null) { + setTitle(query); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + public class SectionsPagerAdapter extends FragmentPagerAdapter { + + public SectionsPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + // getItem is called to instantiate the fragment for the given page. + // Return a PlaceholderFragment (defined as a static inner class below). + PostFragment mFragment = new PostFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(PostFragment.POST_TYPE_KEY, PostDataSource.TYPE_FRONT_PAGE); + mFragment.setArguments(bundle); + return mFragment; + } + + @Override + public int getCount() { + return 3; + } + + @Override + public CharSequence getPageTitle(int position) { + switch (position) { + case 0: + return "Posts"; + case 1: + return "Subreddits"; + case 2: + return "Users"; + } + return null; + } + } +} diff --git a/app/src/main/res/drawable/ic_search_white_24dp.xml b/app/src/main/res/drawable/ic_search_white_24dp.xml new file mode 100644 index 00000000..be5ad99c --- /dev/null +++ b/app/src/main/res/drawable/ic_search_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml new file mode 100644 index 00000000..bd440eac --- /dev/null +++ b/app/src/main/res/layout/activity_search.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index f8894bda..9c1dfa84 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -11,15 +11,37 @@ android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> - + android:layout_height="wrap_content"> + + + + + + + + diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml index 2be22f5f..2a4357aa 100644 --- a/app/src/main/res/menu/main_activity.xml +++ b/app/src/main/res/menu/main_activity.xml @@ -5,8 +5,15 @@ tools:context="ml.docilealligator.infinityforreddit.MainActivity"> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml new file mode 100644 index 00000000..afd34627 --- /dev/null +++ b/app/src/main/res/menu/menu_search.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 486fd853..a8058872 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Infinity Login + Search Open navigation drawer Close navigation drawer @@ -8,6 +9,7 @@ Settings Download Refresh + Search Error loading image. Tap to retry. Error loading posts.\nTap to retry. @@ -51,4 +53,12 @@ Subreddit Banner Image Error loading post + + Infinity + Search anything + Search + Hello World from section: %1$d + Tab 1 + Tab 2 + Tab 3 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1ea7c276..1b770151 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,10 +13,13 @@ + + - @@ -37,4 +40,11 @@ true + + diff --git a/app/src/main/res/xml/searchable.xml b/app/src/main/res/xml/searchable.xml new file mode 100644 index 00000000..9b87146c --- /dev/null +++ b/app/src/main/res/xml/searchable.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file