diff --git a/.gitignore b/.gitignore index 4f33ee1d..a9d1f4e7 100644 --- a/.gitignore +++ b/.gitignore @@ -43,7 +43,7 @@ local.properties #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. .gradle build/ -#*.iml +*.iml ## Windows detritus ############# diff --git a/Clover/app/build.gradle b/Clover/app/build.gradle index 22095414..1b32f719 100644 --- a/Clover/app/build.gradle +++ b/Clover/app/build.gradle @@ -67,10 +67,13 @@ android { } dependencies { + compile 'com.android.support:support-v13:21.0.0' + compile 'com.android.support:appcompat-v7:21.0.3' + compile 'com.android.support:support-v13:18.0.0' + compile 'org.jsoup:jsoup:1.8.1' compile 'com.j256.ormlite:ormlite-core:4.48' compile 'com.j256.ormlite:ormlite-android:4.48' - compile 'com.android.support:support-v13:18.0.0' compile 'com.koushikdutta.ion:ion:2.0.1' compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.0' diff --git a/Clover/app/src/main/AndroidManifest.xml b/Clover/app/src/main/AndroidManifest.xml index 87c921e0..fd559b3d 100644 --- a/Clover/app/src/main/AndroidManifest.xml +++ b/Clover/app/src/main/AndroidManifest.xml @@ -80,60 +80,30 @@ along with this program. If not, see . android:windowSoftInputMode="adjustResize" /> - - + android:label="@string/action_settings" /> - - + android:label="@string/preference_watch_settings" /> - - + android:label="@string/preference_pass_settings" /> - - + android:label="@string/preference_about" /> - - + android:label="@string/board_edit" /> + android:theme="@style/Chan.ImageView" /> - - + android:label="@string/settings_advanced_label" /> engines = new ArrayList<>(); public abstract int getId(); + public abstract String getName(); + public abstract String getUrl(String imageUrl); static { diff --git a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java b/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java index 4de9c150..f4e4bdb2 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java +++ b/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java @@ -69,6 +69,10 @@ public class ChanPreferences { return p().getBoolean("preference_image_save_original", false); } + public static boolean getImageShareUrl() { + return p().getBoolean("preference_image_share_url", false); + } + public static boolean getWatchEnabled() { return p().getBoolean("preference_watch_enabled", false); } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java b/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java index a59803b8..c2de1ca3 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java @@ -57,7 +57,7 @@ public class PostLinkable extends ClickableSpan { public void updateDrawState(TextPaint ds) { if (type == Type.QUOTE || type == Type.LINK || type == Type.THREAD) { if (type == Type.QUOTE) { - if (value instanceof Integer && post.getLinkableListener() != null && (Integer)value == post.getLinkableListener().getHighlightQuotesWithNo()) { + if (value instanceof Integer && post.getLinkableListener() != null && (Integer) value == post.getLinkableListener().getHighlightQuotesWithNo()) { ds.setColor(ThemeHelper.getInstance().getHighlightQuoteColor()); } else { ds.setColor(ThemeHelper.getInstance().getQuoteColor()); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/ThemeActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/ThemeActivity.java new file mode 100644 index 00000000..8f484b5e --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/ThemeActivity.java @@ -0,0 +1,48 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * 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. + * + * This program 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 this program. If not, see . + */ +package org.floens.chan.ui; + +import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; + +import org.floens.chan.R; +import org.floens.chan.utils.ThemeHelper; + +public class ThemeActivity extends ActionBarActivity { + private Toolbar toolbar; + + public void setTheme() { + setTheme(ThemeHelper.getInstance().getTheme().resValue); + } + + public void setToolbar() { + toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } else { + return super.onOptionsItemSelected(item); + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/AboutActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/AboutActivity.java index 454f7e89..10f4c897 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/AboutActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/AboutActivity.java @@ -17,18 +17,21 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; -import org.floens.chan.utils.ThemeHelper; +import org.floens.chan.R; +import org.floens.chan.ui.ThemeActivity; -public class AboutActivity extends Activity { +public class AboutActivity extends ThemeActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); WebView webView = new WebView(this); webView.loadUrl("file:///android_asset/html/licenses.html"); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java index a49c3dfd..8425f0b2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; @@ -26,19 +25,22 @@ import android.preference.PreferenceFragment; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; import org.floens.chan.core.ChanPreferences; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.fragment.FolderPickFragment; -import org.floens.chan.utils.ThemeHelper; import java.io.File; -public class AdvancedSettingsActivity extends Activity { +public class AdvancedSettingsActivity extends ThemeActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getFragmentManager().beginTransaction().replace(android.R.id.content, new AdvancedSettingsFragment()).commit(); + getFragmentManager().beginTransaction().replace(R.id.content, new AdvancedSettingsFragment()).commit(); } public static class AdvancedSettingsFragment extends PreferenceFragment { @@ -112,7 +114,7 @@ public class AdvancedSettingsActivity extends Activity { findPreference("preference_network_https").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - ChanUrls.loadScheme((Boolean)newValue); + ChanUrls.loadScheme((Boolean) newValue); return true; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java index 60284996..4abe6451 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java @@ -17,22 +17,21 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Bundle; -import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SlidingPaneLayout; import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.widget.ShareActionProvider; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; @@ -43,7 +42,6 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ListView; -import android.widget.ShareActionProvider; import org.floens.chan.ChanApplication; import org.floens.chan.R; @@ -52,16 +50,14 @@ import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; -import org.floens.chan.ui.BadgeDrawable; import org.floens.chan.ui.SwipeDismissListViewTouchListener; import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.adapter.PinnedAdapter; import org.floens.chan.utils.ThemeHelper; import org.floens.chan.utils.Utils; -import java.util.List; - -public abstract class BaseActivity extends Activity implements PanelSlideListener, WatchManager.PinListener { +public abstract class BaseActivity extends ThemeActivity implements PanelSlideListener, WatchManager.PinListener { public static boolean doRestartOnResume = false; private final static int ACTION_OPEN_URL = 1; @@ -99,11 +95,13 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); ThemeHelper.getInstance().reloadPostViewColors(this); setContentView(R.layout.activity_base); + setTheme(); + setToolbar(); + pinDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); initDrawer(); @@ -115,6 +113,15 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene updateIcon(); } + @Override + public void onBackPressed() { + if (pinDrawer.isDrawerOpen(pinDrawerView)) { + pinDrawer.closeDrawer(pinDrawerView); + } else { + super.onBackPressed(); + } + } + @Override protected void onDestroy() { super.onDestroy(); @@ -155,7 +162,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene pinDrawerView = (ListView) findViewById(R.id.left_drawer); - pinnedAdapter = new PinnedAdapter(getActionBar().getThemedContext(), pinDrawerView); // Get the dark theme, not the light one + pinnedAdapter = new PinnedAdapter(getSupportActionBar().getThemedContext(), pinDrawerView); // Get the dark theme, not the light one pinnedAdapter.reload(); pinDrawerView.setAdapter(pinnedAdapter); @@ -210,7 +217,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene } private void updateIcon() { - List list = ChanApplication.getWatchManager().getWatchingPins(); + /*List list = ChanApplication.getWatchManager().getWatchingPins(); if (list.size() > 0) { int count = 0; boolean color = false; @@ -223,13 +230,13 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene if (count > 0) { Drawable icon = BadgeDrawable.get(getResources(), R.drawable.ic_launcher, count, color); - getActionBar().setIcon(icon); + getSupportActionBar().setIcon(icon); } else { - getActionBar().setIcon(R.drawable.ic_launcher); + getSupportActionBar().setIcon(R.drawable.ic_launcher); } } else { - getActionBar().setIcon(R.drawable.ic_launcher); - } + getSupportActionBar().setIcon(R.drawable.ic_launcher); + }*/ } public void removePin(Pin pin) { @@ -295,11 +302,11 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.base, menu); - shareActionProvider = (ShareActionProvider) menu.findItem(R.id.action_share).getActionProvider(); + /*shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.action_share)); if (pendingShareActionProviderIntent != null) { shareActionProvider.setShareIntent(pendingShareActionProviderIntent); pendingShareActionProviderIntent = null; - } + }*/ return true; } @@ -366,12 +373,9 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene * @param url */ public void showUrlOpenPicker(String url) { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - - Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); - pickIntent.putExtra(Intent.EXTRA_INTENT, intent); - - startActivityForResult(pickIntent, ACTION_OPEN_URL); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + startActivity(intent); } /** diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java index 48e476b9..74543edf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -52,14 +51,14 @@ import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.model.Board; import org.floens.chan.ui.SwipeDismissListViewTouchListener; -import org.floens.chan.utils.ThemeHelper; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.utils.Utils; import java.util.ArrayList; import java.util.List; import java.util.Locale; -public class BoardEditor extends Activity { +public class BoardEditor extends ThemeActivity { private final BoardManager boardManager = ChanApplication.getBoardManager(); private List list; @@ -70,7 +69,10 @@ public class BoardEditor extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); list = boardManager.getSavedBoards(); @@ -150,7 +152,7 @@ public class BoardEditor extends Activity { } }); - setContentView(listView); + ((ViewGroup) findViewById(R.id.content)).addView(listView); } @Override @@ -186,6 +188,9 @@ public class BoardEditor extends Activity { ChanPreferences.setBoardEditorFillerEnabled(!ChanPreferences.getBoardEditorFillerEnabled()); item.setChecked(ChanPreferences.getBoardEditorFillerEnabled()); return true; + case android.R.id.home: + finish(); + return true; } return super.onOptionsItemSelected(item); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java index 190810b9..c0607835 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.ActionBar; import android.app.AlertDialog; import android.app.FragmentTransaction; import android.content.Context; @@ -26,7 +25,8 @@ import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; -import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarDrawerToggle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.Menu; @@ -89,9 +89,9 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele ft.replace(R.id.right_pane, threadFragment); ft.commitAllowingStateLoss(); - final ActionBar actionBar = getActionBar(); + final ActionBar actionBar = getSupportActionBar(); - boardSpinner = new Spinner(actionBar.getThemedContext()); + boardSpinner = new Spinner(this); spinnerAdapter = new BoardSpinnerAdapter(this, boardSpinner); boardSpinner.setAdapter(spinnerAdapter); boardSpinner.setOnItemSelectedListener(this); @@ -180,9 +180,7 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele @Override protected void initDrawer() { - pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer, R.drawable.ic_drawer, R.string.drawer_open, - R.string.drawer_close) { - }; + pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer, R.string.drawer_open, R.string.drawer_close); super.initDrawer(); } @@ -203,10 +201,14 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele @Override public void onBackPressed() { - if (threadPane.isOpen()) { - super.onBackPressed(); + if (pinDrawer.isDrawerOpen(pinDrawerView)) { + pinDrawer.closeDrawer(pinDrawerView); } else { - threadPane.openPane(); + if (threadPane.isOpen()) { + super.onBackPressed(); + } else { + threadPane.openPane(); + } } } @@ -241,6 +243,12 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele updateActionBarState(); } + @Override + public void removePin(Pin pin) { + super.removePin(pin); + updateActionBarState(); + } + @Override public void onNothingSelected(final AdapterView parent) { } @@ -360,7 +368,7 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele } private void updateActionBarStateCallback() { - final ActionBar actionBar = getActionBar(); + final ActionBar actionBar = getSupportActionBar(); if (threadPane.isSlideable()) { if (threadPane.isOpen()) { @@ -425,6 +433,16 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele setMenuItemEnabled(menu.findItem(R.id.action_search), slidable); setMenuItemEnabled(menu.findItem(R.id.action_search_tablet), !slidable); + boolean bookmarkedFilled = false; + if (threadLoadable.mode == Loadable.Mode.THREAD) { + Pin pin = ChanApplication.getWatchManager().findPinByLoadable(threadLoadable); + if (pin != null) { + bookmarkedFilled = true; + } + } + + menu.findItem(R.id.action_pin).setIcon(bookmarkedFilled ? R.drawable.ic_bookmark_filled : R.drawable.ic_bookmark); + return super.onPrepareOptionsMenu(menu); } @@ -469,8 +487,13 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele if (threadFragment.hasLoader()) { Loader loader = threadFragment.getLoader(); if (loader != null && loader.getLoadable().isThreadMode() && loader.getThread() != null) { - ChanApplication.getWatchManager().addPin(loader.getLoadable(), loader.getThread().op); - pinDrawer.openDrawer(pinDrawerView); + Pin pin = ChanApplication.getWatchManager().findPinByLoadable(threadLoadable); + if (pin != null) { + ChanApplication.getWatchManager().removePin(pin); + } else { + ChanApplication.getWatchManager().addPin(loader.getLoadable(), loader.getThread().op); + } + updateActionBarState(); } } @@ -712,14 +735,24 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele } } + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return createView(position, convertView, parent, true); + } + @Override public View getView(final int position, View convertView, final ViewGroup parent) { + return createView(position, convertView, parent, false); + } + + private View createView(int position, View convertView, ViewGroup parent, boolean dropDown) { if (position == getCount() - 1) { - TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.board_select_add, null); + TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.board_select_add, parent, false); textView.setText(getItem(position)); return textView; } else { - TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.board_select_spinner, null); + TextView textView = (TextView) LayoutInflater.from(context).inflate( + dropDown ? R.layout.board_select_spinner_dropdown : R.layout.board_select_spinner, parent, false); textView.setText(getItem(position)); return textView; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/DeveloperActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/DeveloperActivity.java index 22c802dd..39d6c15d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/DeveloperActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/DeveloperActivity.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; @@ -25,17 +24,21 @@ import android.widget.LinearLayout; import android.widget.TextView; import org.floens.chan.ChanApplication; +import org.floens.chan.R; import org.floens.chan.core.model.SavedReply; -import org.floens.chan.utils.ThemeHelper; +import org.floens.chan.ui.ThemeActivity; import java.util.Random; -public class DeveloperActivity extends Activity { +public class DeveloperActivity extends ThemeActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); LinearLayout wrapper = new LinearLayout(this); wrapper.setOrientation(LinearLayout.VERTICAL); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java index bc425855..79f233b4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; @@ -26,8 +25,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; -import android.view.Window; -import android.widget.FrameLayout; import android.widget.ProgressBar; import org.floens.chan.R; @@ -35,12 +32,12 @@ import org.floens.chan.chan.ImageSearch; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.manager.ThreadManager; import org.floens.chan.core.model.Post; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.adapter.ImageViewAdapter; import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.fragment.ImageViewFragment; import org.floens.chan.utils.ImageSaver; import org.floens.chan.utils.Logger; -import org.floens.chan.utils.ThemeHelper; import java.util.ArrayList; import java.util.List; @@ -49,15 +46,16 @@ import java.util.List; * An fragment pager that contains images. Call setPosts first, and then start * the activity with startActivity() */ -public class ImageViewActivity extends Activity implements ViewPager.OnPageChangeListener { +public class ImageViewActivity extends ThemeActivity implements ViewPager.OnPageChangeListener { private static final String TAG = "ImageViewActivity"; private static PostAdapter postAdapterStatic; - private static int selectedIdStatic = -1; + private static int selectedNoStatic = -1; private static ThreadManager threadManagerStatic; private PostAdapter postAdapter; private ThreadManager threadManager; + private int selectedNo; private ImageViewAdapter adapter; private ViewPager viewPager; @@ -72,7 +70,7 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang */ public static void launch(Activity activity, PostAdapter adapter, int selected, ThreadManager threadManager) { postAdapterStatic = adapter; - selectedIdStatic = selected; + selectedNoStatic = selected; threadManagerStatic = threadManager; Intent intent = new Intent(activity, ImageViewActivity.class); @@ -82,44 +80,36 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang @Override protected void onCreate(Bundle savedInstanceState) { - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - ActionBar actionBar = getActionBar(); - actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_HOME_AS_UP); - - super.onCreate(savedInstanceState); - if (postAdapterStatic == null || threadManagerStatic == null) { Logger.e(TAG, "postadapter or threadmanager null"); finish(); return; } + super.onCreate(savedInstanceState); + threadManager = threadManagerStatic; threadManagerStatic = null; postAdapter = postAdapterStatic; postAdapterStatic = null; - int selectedId = selectedIdStatic; - selectedIdStatic = -1; + selectedNo = selectedNoStatic; + selectedNoStatic = -1; - ThemeHelper.setTheme(this); + setContentView(R.layout.image_view); + setToolbar(); - progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); - progressBar.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); - progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_no_bg)); + initProgressBar(); + initPager(); + } + + private void initProgressBar() { + progressBar = (ProgressBar) findViewById(R.id.progress_bar); +// progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_no_bg)); progressBar.setIndeterminate(false); progressBar.setMax(1000000); + } - final FrameLayout decorView = (FrameLayout) getWindow().getDecorView(); - decorView.addView(progressBar); - - progressBar.post(new Runnable() { - @Override - public void run() { - View contentView = decorView.findViewById(android.R.id.content); - progressBar.setY(contentView.getY() - progressBar.getHeight() / 2); - } - }); - + private void initPager() { // Get the posts with images ArrayList imagePosts = new ArrayList<>(); for (Post post : postAdapter.getList()) { @@ -129,7 +119,6 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang } // Setup our pages and adapter - setContentView(R.layout.image_pager); viewPager = (ViewPager) findViewById(R.id.image_pager); adapter = new ImageViewAdapter(getFragmentManager(), this); adapter.setList(imagePosts); @@ -138,7 +127,7 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang // Select the right image for (int i = 0; i < imagePosts.size(); i++) { - if (imagePosts.get(i).no == selectedId) { + if (imagePosts.get(i).no == selectedNo) { viewPager.setCurrentItem(i); onPageSelected(i); break; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java index 37bd50fa..a7b1f0a2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentTransaction; @@ -25,16 +24,15 @@ import android.app.ProgressDialog; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; +import android.support.v7.widget.SwitchCompat; import android.text.TextUtils; import android.view.LayoutInflater; -import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.Switch; import android.widget.TextView; import org.floens.chan.ChanApplication; @@ -43,54 +41,47 @@ import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.ReplyManager.PassResponse; import org.floens.chan.core.model.Pass; -import org.floens.chan.utils.ThemeHelper; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.utils.Utils; -public class PassSettingsActivity extends Activity implements OnCheckedChangeListener { - private static PassSettingsActivity instance; - - private Switch enableSwitch; +public class PassSettingsActivity extends ThemeActivity implements OnCheckedChangeListener { + private SwitchCompat onSwitch; + private TextView toggleStatus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); - - instance = this; + setTheme(); + setContentView(R.layout.header_switch_layout); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - setFragment(ChanPreferences.getPassEnabled()); - } + findViewById(R.id.toggle_bar).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onSwitch.toggle(); + } + }); - @Override - protected void onDestroy() { - super.onDestroy(); + toggleStatus = (TextView) findViewById(R.id.toggle_status); + onSwitch = (SwitchCompat) findViewById(R.id.toggle); + onSwitch.setOnCheckedChangeListener(this); + setSwitch(ChanPreferences.getPassEnabled()); - instance = null; + setFragment(ChanPreferences.getPassEnabled()); } @Override - public void onBackPressed() { - super.onBackPressed(); + public void onPause() { + super.onPause(); if (TextUtils.isEmpty(ChanPreferences.getPassId())) { ChanPreferences.setPassEnabled(false); + setSwitch(false); } } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.action_bar_switch, menu); - - enableSwitch = (Switch) menu.findItem(R.id.action_bar_switch).getActionView(); - enableSwitch.setOnCheckedChangeListener(this); - enableSwitch.setPadding(0, 0, Utils.dp(14), 0); - - setSwitch(ChanPreferences.getPassEnabled()); - - return true; - } - @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { setFragment(isChecked); @@ -98,19 +89,21 @@ public class PassSettingsActivity extends Activity implements OnCheckedChangeLis } private void setSwitch(boolean enabled) { - enableSwitch.setChecked(enabled); + onSwitch.setChecked(enabled); + toggleStatus.setText(enabled ? R.string.on : R.string.off); + ChanPreferences.setPassEnabled(enabled); } private void setFragment(boolean enabled) { if (enabled) { FragmentTransaction t = getFragmentManager().beginTransaction(); - t.replace(android.R.id.content, new PassSettingsFragment()); + t.replace(R.id.content, new PassSettingsFragment()); t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); t.commit(); } else { FragmentTransaction t = getFragmentManager().beginTransaction(); - t.replace(android.R.id.content, new TextFragment()); + t.replace(R.id.content, new TextFragment()); t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); t.commit(); } @@ -144,10 +137,9 @@ public class PassSettingsActivity extends Activity implements OnCheckedChangeLis login.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - if (PassSettingsActivity.instance != null) { - Pass pass = new Pass(ChanPreferences.getPassToken(), ChanPreferences.getPassPin()); - onLoginClick(pass); - } + Pass pass = new Pass(ChanPreferences.getPassToken(), ChanPreferences.getPassPin()); + onLoginClick(pass); + return true; } }); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java index ca94e195..04d43ecf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java @@ -17,42 +17,44 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.MenuItem; +import org.floens.chan.R; import org.floens.chan.core.model.Loadable; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.fragment.ReplyFragment; import org.floens.chan.utils.Logger; -import org.floens.chan.utils.ThemeHelper; -public class ReplyActivity extends Activity { +public class ReplyActivity extends ThemeActivity { private static final String TAG = "ReplyActivity"; - private static Loadable loadable; + private static Loadable staticLoadable; public static void setLoadable(Loadable l) { - loadable = l; + staticLoadable = l; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + Loadable loadable = staticLoadable; + staticLoadable = null; if (loadable != null && savedInstanceState == null) { - getActionBar().setDisplayHomeAsUpEnabled(true); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, ReplyFragment.newInstance(loadable, false), "reply"); + ft.replace(R.id.content, ReplyFragment.newInstance(loadable, false), "reply"); ft.commitAllowingStateLoss(); - - loadable = null; } else if (savedInstanceState == null) { - Logger.e(TAG, "ThreadFragment was null, exiting!"); + Logger.e(TAG, "Loadable was null, exiting!"); finish(); } } @@ -60,7 +62,7 @@ public class ReplyActivity extends Activity { @Override public void onBackPressed() { Fragment f = getFragmentManager().findFragmentByTag("reply"); - if (f != null && ((ReplyFragment)f).onBackPressed()) { + if (f != null && ((ReplyFragment) f).onBackPressed()) { super.onBackPressed(); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java index f19ecafb..8dd80be0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java @@ -17,17 +17,17 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import org.floens.chan.R; +import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.fragment.SettingsFragment; import org.floens.chan.utils.ThemeHelper; -public class SettingsActivity extends Activity { +public class SettingsActivity extends ThemeActivity { private static boolean doingThemeRestart = false; private static ThemeHelper.Theme lastTheme; @@ -35,15 +35,18 @@ public class SettingsActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setTheme(); + setContentView(R.layout.toolbar_activity); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + if (!doingThemeRestart) { lastTheme = ThemeHelper.getInstance().getTheme(); } - ThemeHelper.setTheme(this); - SettingsFragment frag = new SettingsFragment(); frag.setArguments(getIntent().getExtras()); - getFragmentManager().beginTransaction().replace(android.R.id.content, frag).commit(); + getFragmentManager().beginTransaction().replace(R.id.content, frag).commit(); } public void restart(Intent intent) { @@ -77,6 +80,9 @@ public class SettingsActivity extends Activity { if (item.getItemId() == R.id.action_settings_advanced) { startActivity(new Intent(this, AdvancedSettingsActivity.class)); return true; + } else if (item.getItemId() == android.R.id.home) { + finish(); + return true; } else { return super.onOptionsItemSelected(item); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java index c18b7053..f308af37 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java @@ -17,56 +17,52 @@ */ package org.floens.chan.ui.activity; -import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; -import android.view.Gravity; +import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; -import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.LinearLayout; -import android.widget.Switch; import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.core.ChanPreferences; -import org.floens.chan.utils.ThemeHelper; -import org.floens.chan.utils.Utils; +import org.floens.chan.ui.ThemeActivity; -public class WatchSettingsActivity extends Activity implements OnCheckedChangeListener { - private Switch watchSwitch; +public class WatchSettingsActivity extends ThemeActivity implements OnCheckedChangeListener { + private SwitchCompat watchSwitch; + private TextView toggleStatus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this); + setTheme(); + setContentView(R.layout.header_switch_layout); + setToolbar(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - setFragment(ChanPreferences.getWatchEnabled()); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.action_bar_switch, menu); + findViewById(R.id.toggle_bar).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + watchSwitch.toggle(); + } + }); - watchSwitch = (Switch) menu.findItem(R.id.action_bar_switch).getActionView(); + toggleStatus = (TextView) findViewById(R.id.toggle_status); + watchSwitch = (SwitchCompat) findViewById(R.id.toggle); watchSwitch.setOnCheckedChangeListener(this); - watchSwitch.setPadding(0, 0, Utils.dp(14), 0); - setSwitch(ChanPreferences.getWatchEnabled()); - return true; + setFragment(ChanPreferences.getWatchEnabled()); } @Override @@ -77,30 +73,20 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi private void setSwitch(boolean enabled) { watchSwitch.setChecked(enabled); + toggleStatus.setText(enabled ? R.string.on : R.string.off); ChanPreferences.setWatchEnabled(enabled); - - watchSwitch.setEnabled(false); - new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { - @Override - public void run() { - watchSwitch.setEnabled(true); - } - }, 500); } private void setFragment(boolean enabled) { + FragmentTransaction t = getFragmentManager().beginTransaction(); if (enabled) { - FragmentTransaction t = getFragmentManager().beginTransaction(); - t.replace(android.R.id.content, new WatchSettingsFragment()); - t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); - t.commit(); + t.replace(R.id.content, new WatchSettingsFragment()); } else { - FragmentTransaction t = getFragmentManager().beginTransaction(); - t.replace(android.R.id.content, TextFragment.newInstance(R.string.watch_info_text)); - t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); - t.commit(); + t.replace(R.id.content, TextFragment.newInstance(R.string.watch_info_text)); } + t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); + t.commit(); } public static class TextFragment extends Fragment { @@ -114,18 +100,10 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi @Override public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstanceState) { - LinearLayout container = new LinearLayout(inflater.getContext()); - - int p = Utils.dp(14); - container.setPadding(p, p, p, p); + ViewGroup container = (ViewGroup) inflater.inflate(R.layout.watch_description, null); - TextView text = new TextView(inflater.getContext()); - text.setTextSize(20); + TextView text = (TextView) container.findViewById(R.id.text); text.setText(getArguments().getInt("text_resource")); - text.setGravity(Gravity.CENTER); - - container.setGravity(Gravity.CENTER); - container.addView(text); return container; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java index 1ff8fc4f..c509fcf1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -21,6 +21,7 @@ import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -82,7 +83,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal imageView = new ThumbnailImageView(context); imageView.setCallback(this); - int padding = Utils.dp(8); + int padding = getResources().getDimensionPixelSize(R.dimen.image_view_padding); imageView.setPadding(padding, padding, padding, padding); return imageView; @@ -177,10 +178,10 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal activity.setProgressBarIndeterminateVisibility(showProgressBar); String filename = post.filename + "." + post.ext; - activity.getActionBar().setTitle(filename); + activity.getSupportActionBar().setTitle(filename); String text = (position + 1) + "/" + adapter.getCount(); - activity.getActionBar().setSubtitle(text); + activity.getSupportActionBar().setSubtitle(text); activity.invalidateActionBar(); @@ -241,9 +242,13 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal break; case R.id.action_image_save: case R.id.action_share: - ImageSaver.getInstance().saveImage(context, post.imageUrl, - ChanPreferences.getImageSaveOriginalFilename() ? Long.toString(post.tim) : post.filename, post.ext, - item.getItemId() == R.id.action_share); + if (ChanPreferences.getImageShareUrl()) { + shareImageUrl(post.imageUrl); + } else { + ImageSaver.getInstance().saveImage(context, post.imageUrl, + ChanPreferences.getImageSaveOriginalFilename() ? Long.toString(post.tim) : post.filename, post.ext, + item.getItemId() == R.id.action_share); + } break; default: // Search if it was an ImageSearch item @@ -258,6 +263,13 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal } } + private void shareImageUrl(String url) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, url); + context.startActivity(Intent.createChooser(intent, context.getString(R.string.action_share))); + } + public void onVideoError(File video) { if (ChanPreferences.getVideoErrorIgnore()) { Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_SHORT).show(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java index 9a223eae..6a6da66a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java @@ -17,12 +17,12 @@ */ package org.floens.chan.ui.fragment; -import android.app.Activity; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.graphics.Bitmap; import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -106,7 +106,7 @@ public class ReplyFragment extends DialogFragment { private TextView commentCountView; private TextView fileStatusView; - private Activity context; + private ActionBarActivity context; public static ReplyFragment newInstance(Loadable loadable, boolean quickMode) { ReplyFragment reply = new ReplyFragment(); @@ -127,7 +127,7 @@ public class ReplyFragment extends DialogFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - context = getActivity(); + context = (ActionBarActivity) getActivity(); if (loadable == null && savedInstanceState != null) { loadable = new Loadable(); @@ -142,7 +142,7 @@ public class ReplyFragment extends DialogFragment { String title = (loadable.isThreadMode() ? context.getString(R.string.reply) : context.getString(R.string.reply_to_board)) + " " + loadable.title; if (dialog == null) { - context.getActionBar().setTitle(title); + context.getSupportActionBar().setTitle(title); } else { dialog.setTitle(title); // todo move elsewhere diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java index 00c7f01e..4c46e4a1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java @@ -19,7 +19,6 @@ package org.floens.chan.ui.fragment; import android.app.Fragment; import android.content.Context; -import android.content.res.TypedArray; import android.os.Bundle; import android.util.AttributeSet; import android.view.Gravity; @@ -327,13 +326,8 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana } else if (viewMode == ThreadManager.ViewMode.GRID) { GridView grid = new GridView(getActivity()); grid.setNumColumns(GridView.AUTO_FIT); - TypedArray ta = getActivity().obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0); - int postGridWidth = ta.getDimensionPixelSize(R.styleable.PostView_grid_width, 0); - int postGridSpacing = ta.getDimensionPixelSize(R.styleable.PostView_grid_spacing, 0); - ta.recycle(); + int postGridWidth = getActivity().getResources().getDimensionPixelSize(R.dimen.post_grid_width); grid.setColumnWidth(postGridWidth); - grid.setVerticalSpacing(postGridSpacing); - grid.setHorizontalSpacing(postGridSpacing); listView = grid; postAdapter = new PostAdapter(getActivity(), threadManager, listView, this); listView.setAdapter(postAdapter); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java index fd9945da..773b1141 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java @@ -125,7 +125,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener @Override public void onProgress(long downloaded, long total, boolean done) { if (done) { - callback.setLinearProgress(0, 0, true); +// callback.setLinearProgress(0, 0, true); thumbnailNeeded = false; } else { callback.setLinearProgress(downloaded, total, false); diff --git a/Clover/app/src/main/res/anim/fade_in.xml b/Clover/app/src/main/res/anim/fade_in.xml index 0cf24af2..11e35412 100644 --- a/Clover/app/src/main/res/anim/fade_in.xml +++ b/Clover/app/src/main/res/anim/fade_in.xml @@ -1,5 +1,4 @@ - - - - - + + diff --git a/Clover/app/src/main/res/drawable/pin_icon_gray.xml b/Clover/app/src/main/res/drawable/pin_icon_gray.xml index a48eb43a..11e275a6 100644 --- a/Clover/app/src/main/res/drawable/pin_icon_gray.xml +++ b/Clover/app/src/main/res/drawable/pin_icon_gray.xml @@ -1,5 +1,4 @@ - - - - - + + diff --git a/Clover/app/src/main/res/drawable/pin_icon_red.xml b/Clover/app/src/main/res/drawable/pin_icon_red.xml index eb1f09c4..0dcb2264 100644 --- a/Clover/app/src/main/res/drawable/pin_icon_red.xml +++ b/Clover/app/src/main/res/drawable/pin_icon_red.xml @@ -1,5 +1,4 @@ - - - - - + + diff --git a/Clover/app/src/main/res/layout/activity_base.xml b/Clover/app/src/main/res/layout/activity_base.xml index 807c7e20..ca9b9b24 100644 --- a/Clover/app/src/main/res/layout/activity_base.xml +++ b/Clover/app/src/main/res/layout/activity_base.xml @@ -1,5 +1,4 @@ - - - - - - - - - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + + + + + . android:background="#444" android:choiceMode="singleChoice" android:divider="#333" - android:dividerHeight="1dp"/> + android:dividerHeight="1dp" /> diff --git a/Clover/app/src/main/res/layout/board_edit_item.xml b/Clover/app/src/main/res/layout/board_edit_item.xml index ea8e2c3d..476ab90d 100644 --- a/Clover/app/src/main/res/layout/board_edit_item.xml +++ b/Clover/app/src/main/res/layout/board_edit_item.xml @@ -1,5 +1,4 @@ - - - @@ -30,7 +28,7 @@ along with this program. If not, see . android:paddingBottom="12dp" android:paddingLeft="16dp" android:paddingTop="12dp" - style="?attr/board_edit_item_style"/> + style="?attr/board_edit_item_style" /> . android:layout_marginLeft="36dp" android:gravity="center_vertical" android:minHeight="50sp" - android:textSize="24sp"/> + android:textSize="24sp" /> diff --git a/Clover/app/src/main/res/layout/board_select_add.xml b/Clover/app/src/main/res/layout/board_select_add.xml index 1b76c3aa..1a98c6f9 100644 --- a/Clover/app/src/main/res/layout/board_select_add.xml +++ b/Clover/app/src/main/res/layout/board_select_add.xml @@ -1,5 +1,4 @@ - - - + android:ellipsize="end" /> diff --git a/Clover/app/src/main/res/layout/board_select_spinner.xml b/Clover/app/src/main/res/layout/board_select_spinner.xml index 303ad9ae..7c5d7805 100644 --- a/Clover/app/src/main/res/layout/board_select_spinner.xml +++ b/Clover/app/src/main/res/layout/board_select_spinner.xml @@ -1,5 +1,4 @@ - - - + android:ellipsize="end" /> diff --git a/Clover/app/src/main/res/layout/board_select_spinner_dropdown.xml b/Clover/app/src/main/res/layout/board_select_spinner_dropdown.xml new file mode 100644 index 00000000..320a59b8 --- /dev/null +++ b/Clover/app/src/main/res/layout/board_select_spinner_dropdown.xml @@ -0,0 +1,29 @@ + + diff --git a/Clover/app/src/main/res/layout/folder_pick.xml b/Clover/app/src/main/res/layout/folder_pick.xml index 6e91a38d..c201752b 100644 --- a/Clover/app/src/main/res/layout/folder_pick.xml +++ b/Clover/app/src/main/res/layout/folder_pick.xml @@ -85,7 +85,7 @@ along with this program. If not, see . + android:background="@android:color/darker_gray" /> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Clover/app/src/main/res/layout/image_view.xml b/Clover/app/src/main/res/layout/image_view.xml new file mode 100644 index 00000000..beac169b --- /dev/null +++ b/Clover/app/src/main/res/layout/image_view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + diff --git a/Clover/app/src/main/res/layout/preference_pass.xml b/Clover/app/src/main/res/layout/preference_pass.xml index 5860e0d3..d86b4a45 100644 --- a/Clover/app/src/main/res/layout/preference_pass.xml +++ b/Clover/app/src/main/res/layout/preference_pass.xml @@ -1,5 +1,4 @@ - - - + android:gravity="center" + android:padding="24dp"> + style="?android:attr/textAppearanceMedium" /> . android:text="@string/pass_info_learn_more" android:textColor="@android:color/holo_blue_light" android:textSize="20sp" - android:textStyle="italic"/> + android:textStyle="italic" /> \ No newline at end of file diff --git a/Clover/app/src/main/res/layout/toolbar.xml b/Clover/app/src/main/res/layout/toolbar.xml new file mode 100644 index 00000000..8f4382cd --- /dev/null +++ b/Clover/app/src/main/res/layout/toolbar.xml @@ -0,0 +1,26 @@ + + diff --git a/Clover/app/src/main/res/layout/image_pager.xml b/Clover/app/src/main/res/layout/toolbar_activity.xml similarity index 60% rename from Clover/app/src/main/res/layout/image_pager.xml rename to Clover/app/src/main/res/layout/toolbar_activity.xml index 08bd2fc2..30f79740 100644 --- a/Clover/app/src/main/res/layout/image_pager.xml +++ b/Clover/app/src/main/res/layout/toolbar_activity.xml @@ -1,5 +1,4 @@ - - - + android:layout_height="match_parent"> - + + - - - \ No newline at end of file + android:layout_height="wrap_content" /> + + \ No newline at end of file diff --git a/Clover/app/src/main/res/layout/watch_description.xml b/Clover/app/src/main/res/layout/watch_description.xml new file mode 100644 index 00000000..9f2e53c9 --- /dev/null +++ b/Clover/app/src/main/res/layout/watch_description.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/Clover/app/src/main/res/menu/action_bar_switch.xml b/Clover/app/src/main/res/menu/action_bar_switch.xml index 9b901b8e..42c467d3 100644 --- a/Clover/app/src/main/res/menu/action_bar_switch.xml +++ b/Clover/app/src/main/res/menu/action_bar_switch.xml @@ -1,5 +1,4 @@ - - - + - + app:showAsAction="always" /> \ No newline at end of file diff --git a/Clover/app/src/main/res/menu/base.xml b/Clover/app/src/main/res/menu/base.xml index b1a80875..76b97950 100644 --- a/Clover/app/src/main/res/menu/base.xml +++ b/Clover/app/src/main/res/menu/base.xml @@ -15,12 +15,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . --> - + . android:id="@+id/action_reload_board" android:icon="@drawable/ic_action_refresh" android:orderInCategory="1" - android:showAsAction="always" + app:showAsAction="always" android:title="@string/action_reload_board" /> . android:id="@+id/action_reload_thread" android:icon="@drawable/ic_action_refresh" android:orderInCategory="5" - android:showAsAction="never" + app:showAsAction="never" android:title="@string/action_reload" /> . . android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:orderInCategory="7" - android:showAsAction="never" + app:showAsAction="never" android:title="@string/action_share" /> @@ -137,7 +138,7 @@ along with this program. If not, see . diff --git a/Clover/app/src/main/res/menu/board_edit.xml b/Clover/app/src/main/res/menu/board_edit.xml index 0c719afd..38f7aadf 100644 --- a/Clover/app/src/main/res/menu/board_edit.xml +++ b/Clover/app/src/main/res/menu/board_edit.xml @@ -1,5 +1,4 @@ - - - + + app:showAsAction="always" + android:title="@string/board_add" /> + android:title="@string/board_edit_enable_filler" /> diff --git a/Clover/app/src/main/res/menu/image_view.xml b/Clover/app/src/main/res/menu/image_view.xml index 8b523982..23d252e9 100644 --- a/Clover/app/src/main/res/menu/image_view.xml +++ b/Clover/app/src/main/res/menu/image_view.xml @@ -15,40 +15,41 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . --> - + \ No newline at end of file diff --git a/Clover/app/src/main/res/menu/settings.xml b/Clover/app/src/main/res/menu/settings.xml index 8e39bcca..74e44622 100644 --- a/Clover/app/src/main/res/menu/settings.xml +++ b/Clover/app/src/main/res/menu/settings.xml @@ -1,5 +1,4 @@ - - - + + app:showAsAction="never" + android:title="@string/action_settings_advanced" /> diff --git a/Clover/app/src/main/res/values/attrs.xml b/Clover/app/src/main/res/values/attrs.xml index 70990203..0af82eaf 100644 --- a/Clover/app/src/main/res/values/attrs.xml +++ b/Clover/app/src/main/res/values/attrs.xml @@ -1,5 +1,4 @@ - - - - - + + + + + + - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/Clover/app/src/main/res/values/colors.xml b/Clover/app/src/main/res/values/colors.xml index c67be2d8..39ca0b7d 100644 --- a/Clover/app/src/main/res/values/colors.xml +++ b/Clover/app/src/main/res/values/colors.xml @@ -1,5 +1,4 @@ - - + #ff4caf50 + #ff388e3c + #ff0099cc + + #bb000000 diff --git a/Clover/app/src/main/res/values/dimens.xml b/Clover/app/src/main/res/values/dimens.xml index 6345d959..318a2e20 100644 --- a/Clover/app/src/main/res/values/dimens.xml +++ b/Clover/app/src/main/res/values/dimens.xml @@ -1,5 +1,4 @@ - - + 260dp + + 4dp + + 90dp + diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 8f5513db..c0968006 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -1,5 +1,4 @@ - - - + + - + #ff000000 + + @style/ThemeOverlay.AppCompat.Dark.ActionBar + @style/ThemeOverlay.AppCompat.Light +