diff --git a/org.fox.ttrss/build.gradle b/org.fox.ttrss/build.gradle index 6f822933..565f3b88 100644 --- a/org.fox.ttrss/build.gradle +++ b/org.fox.ttrss/build.gradle @@ -11,7 +11,7 @@ android { } lintOptions { - abortOnError false + abortOnError false } buildTypes { @@ -24,14 +24,14 @@ android { dependencies { compile project(':taskerlocaleapi') - compile 'com.jeremyfeinstein.slidingmenu:library:1.3@aar' - compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' - compile 'com.viewpagerindicator:library:2.4.1' - compile 'com.android.support:cardview-v7:21.+' - compile 'com.android.support:support-v4:19.1.0' - compile 'com.google.code.gson:gson:1.7.1' - compile 'com.android.support:appcompat-v7:19.1.0' compile files('libs/dashclock-api-r1.1.jar') compile files('libs/jsoup-1.6.1.jar') compile files('libs/universal-image-loader-1.9.3.jar') + compile 'com.jeremyfeinstein.slidingmenu:library:1.3@aar' + compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' + compile 'com.viewpagerindicator:library:2.4.1' + compile 'com.android.support:cardview-v7:21.0.0' + compile 'com.android.support:support-v4:19.1.0' + compile 'com.google.code.gson:gson:1.7.1' + compile 'com.android.support:appcompat-v7:19.1.0' } diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml index d8885db1..155be905 100644 --- a/org.fox.ttrss/src/main/AndroidManifest.xml +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ @@ -92,7 +92,6 @@ android:excludeFromRecents="true" android:label="@string/subscribe_name" android:theme="@style/DarkDialogTheme" > - @@ -100,7 +99,6 @@ - @@ -207,7 +205,7 @@ android:name=".offline.OfflineUploadService" android:enabled="true" /> - @@ -251,6 +248,11 @@ android:name="description" android:value="@string/app_name" /> + + + diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleImagesPagerActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleImagesPagerActivity.java new file mode 100644 index 00000000..3822d4ac --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleImagesPagerActivity.java @@ -0,0 +1,204 @@ +package org.fox.ttrss; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.ActionBarActivity; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ProgressBar; + +import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.ImageLoader; +import com.nostra13.universalimageloader.core.assist.FailReason; +import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; +import com.nostra13.universalimageloader.core.imageaware.ImageAware; +import com.nostra13.universalimageloader.core.imageaware.ImageViewAware; +import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; +import com.viewpagerindicator.UnderlinePageIndicator; + +import java.util.ArrayList; +import java.util.List; + +public class ArticleImagesPagerActivity extends ActionBarActivity { + private final String TAG = this.getClass().getSimpleName(); + + private ArrayList m_urls; + private String m_title; + + private class ArticleImagesPagerAdapter extends PagerAdapter implements View.OnClickListener { + private List m_urls; + + public ArticleImagesPagerAdapter(List urls) { + super(); + + m_urls = urls; + } + + public ArticleImagesPagerAdapter() { + super(); + } + + @Override + public int getCount() { + return m_urls.size(); + } + + @Override + public boolean isViewFromObject(View view, Object o) { + return view == o; + } + + @Override + public Object instantiateItem(ViewGroup container, final int position) { + String url = m_urls.get(position); + + Log.d(TAG, "called for URL: " + url); + + LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + View view = inflater.inflate(R.layout.article_images_image, null); + + ImageView imgView = (ImageView) view.findViewById(R.id.flavor_image); + imgView.setOnClickListener(this); + + DisplayImageOptions options = new DisplayImageOptions.Builder() + .cacheInMemory(true) + .resetViewBeforeLoading(true) + .cacheOnDisk(true) + .displayer(new FadeInBitmapDisplayer(200)) + .build(); + + ImageAware imageAware = new ImageViewAware(imgView, false); + + final ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.flavor_image_progress); + final View errorMessage = view.findViewById(R.id.flavor_image_error); + + ImageLoader.getInstance().displayImage(url, imageAware, options, new ImageLoadingListener() { + @Override + public void onLoadingStarted(String s, View view) { + + } + + @Override + public void onLoadingFailed(String s, View view, FailReason failReason) { + progressBar.setVisibility(View.GONE); + errorMessage.setVisibility(View.VISIBLE); + } + + @Override + public void onLoadingComplete(String s, View view, Bitmap bitmap) { + if (bitmap != null) { + if (bitmap.getWidth() < 128 || bitmap.getHeight() < 128) { + view.setVisibility(View.INVISIBLE); + errorMessage.setVisibility(View.VISIBLE); + } else { + view.setTag(s); + } + } + + progressBar.setVisibility(View.GONE); + } + + @Override + public void onLoadingCancelled(String s, View view) { + + } + }); + + ((ViewPager) container).addView(view, 0); + + return view; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((FrameLayout)object); + } + + @Override + public void onClick(View view) { + String url = (String) view.getTag(); + + if (url != null) { + Log.d(TAG, "click to open:" + url); + + try { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(browserIntent); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + + setTheme(R.style.DarkTheme); + + super.onCreate(savedInstanceState); + + setContentView(R.layout.article_images_pager); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + if (savedInstanceState == null) { + m_urls = getIntent().getStringArrayListExtra("urls"); + m_title = getIntent().getStringExtra("title"); + } else { + m_urls = savedInstanceState.getStringArrayList("urls"); + m_title = savedInstanceState.getString("title"); + } + + setTitle(m_title); + + Log.d(TAG, "urls size: " + m_urls.size()); + + ArticleImagesPagerAdapter adapter = new ArticleImagesPagerAdapter(m_urls); + + ViewPager pager = (ViewPager) findViewById(R.id.article_images_pager); + + pager.setAdapter(adapter); + + UnderlinePageIndicator indicator = (UnderlinePageIndicator)findViewById(R.id.article_images_indicator); + indicator.setViewPager(pager); + } + + @Override + public void onSaveInstanceState(Bundle out) { + super.onSaveInstanceState(out); + + out.putStringArrayList("urls", m_urls); + out.putString("title", m_title); + } + + /* @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.article_images_pager, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + if (id == R.id.action_settings) { + return true; + } + return super.onOptionsItemSelected(item); + } */ +} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index f63af9c6..2d0c82ea 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -465,7 +465,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, } m_activity.setProgressBarVisibility(false); - + super.onPostExecute(result); if (isAdded()) { @@ -670,7 +670,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public ImageView menuButtonView; public ViewGroup flavorImageHolder; public ProgressBar flavorImageLoadingBar; - public TextView flavorImageMore; + public View flavorImageArrow; } private class ArticleListAdapter extends ArrayAdapter
{ @@ -764,7 +764,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, holder.menuButtonView = (ImageView) v.findViewById(R.id.article_menu_button); holder.flavorImageHolder = (ViewGroup) v.findViewById(R.id.flavorImageHolder); holder.flavorImageLoadingBar = (ProgressBar) v.findViewById(R.id.flavorImageLoadingBar); - holder.flavorImageMore = (TextView) v.findViewById(R.id.flavorImageMore); + holder.flavorImageArrow = v.findViewById(R.id.flavorImageArrow); v.setTag(holder); @@ -860,10 +860,6 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, } } - if (holder.flavorImageMore != null) { - holder.flavorImageMore.setVisibility(View.GONE); - } - if (holder.flavorImageView != null && m_prefs.getBoolean("headlines_show_flavor_image", true)) { Document doc = Jsoup.parse(articleContent); @@ -872,7 +868,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, if (doc != null) { //Element img = doc.select("img").first(); - Elements imgs = doc.select("img"); + final Elements imgs = doc.select("img"); Element img = imgs.first(); if (img != null) { @@ -887,7 +883,32 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, .resetViewBeforeLoading(true) .cacheOnDisk(true) .build(); - + + holder.flavorImageView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + ArrayList imgsList = new ArrayList(); + + for (Element img : imgs) { + String imgSrc = img.attr("src"); + + if (imgSrc.indexOf("//") == 0) + imgSrc = "http:" + imgSrc; + + imgsList.add(imgSrc); + } + + Intent intent = new Intent(m_activity, ArticleImagesPagerActivity.class); + intent.putExtra("urls", imgsList); + intent.putExtra("title", article.title); + + startActivityForResult(intent, 0); + m_activity.overridePendingTransition(android.R.anim.fade_in, 0); + + + } + }); + final ViewGroup flavorImageHolder = holder.flavorImageHolder; final ImageView flavorImageView = holder.flavorImageView; final ProgressBar flavorImageLoadingBar = holder.flavorImageLoadingBar; @@ -896,9 +917,8 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, flavorImageHolder.setVisibility(View.VISIBLE); - if (imgs.size() > 1 && holder.flavorImageMore != null) { - holder.flavorImageMore.setVisibility(View.VISIBLE); - holder.flavorImageMore.setText(getString(R.string.flavor_image_more, imgs.size()-1)); + if (imgs.size() > 1 && holder.flavorImageArrow != null) { + holder.flavorImageArrow.setVisibility(View.VISIBLE); } final boolean weNeedAnimation = MemoryCacheUtils.findCachedBitmapsForImageUri(imgSrc, ImageLoader.getInstance().getMemoryCache()).size() == 0; diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java index ebf1bb07..3add9c90 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java @@ -1,12 +1,5 @@ package org.fox.ttrss.offline; -import org.fox.ttrss.CommonActivity; -import org.fox.ttrss.PreferencesActivity; -import org.fox.ttrss.R; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; @@ -33,6 +26,13 @@ import android.widget.EditText; import android.widget.SearchView; import android.widget.TextView; +import org.fox.ttrss.CommonActivity; +import org.fox.ttrss.PreferencesActivity; +import org.fox.ttrss.R; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; + public class OfflineActivity extends CommonActivity { private final String TAG = this.getClass().getSimpleName(); @@ -169,9 +169,9 @@ public class OfflineActivity extends CommonActivity { .getDefaultSharedPreferences(getApplicationContext()); setAppTheme(m_prefs); - + super.onCreate(savedInstanceState); - + requestWindowFeature(Window.FEATURE_PROGRESS); setProgressBarVisibility(false); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ArrowRight.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ArrowRight.java new file mode 100644 index 00000000..ecf55eb9 --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ArrowRight.java @@ -0,0 +1,96 @@ +package org.fox.ttrss.util; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Path.Direction; +import android.util.AttributeSet; +import android.view.View; + +//http://stackoverflow.com/questions/24723040/how-to-create-a-right-facing-arrow-using-xml-shapes-in-android + +public class ArrowRight extends View { + + private Paint arrowPaint; + private Path arrowPath; + private int arrowColor = 0xFF888888; + private float density; + private int diameter = 5, diameter_calc, radius_calc; + + public ArrowRight(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + stuff(); + } + + public ArrowRight(Context context, AttributeSet attrs) { + super(context, attrs); + stuff(); + } + + public ArrowRight(Context context) { + super(context); + stuff(); + } + + private void stuff() { + + //Getting density "dp" + density = getContext().getResources().getDisplayMetrics().scaledDensity; + //Calculating actual diameter + diameter_calc = (int) density * diameter; + radius_calc = diameter/2; + + //Creating paint + arrowPaint = new Paint(); + arrowPaint.setAntiAlias(true); + arrowPaint.setColor(arrowColor); + + //Initialize path + arrowPath = new Path(); + + this.setWillNotDraw(false); + } + + private int startX,startY, currentX, currentY; + + protected void onDraw(Canvas c) { + + startX = c.getWidth(); + startY = c.getHeight()/2; + + c.rotate(-45, startX, startY); + + arrowPath.reset(); + currentX = startX; + currentY = startY; + //Move to right end side center of the canvas + arrowPath.moveTo(currentX,currentY); + //Lets move up + currentY = radius_calc; + arrowPath.lineTo(currentX, currentY); + //Now draw circle + currentX-=radius_calc; + arrowPath.addCircle(currentX, radius_calc, radius_calc, Direction.CCW); + currentX-=radius_calc; + + arrowPath.lineTo(currentX,currentY); + // Go to inner side center point + currentX = startX - diameter_calc; + currentY = startY - diameter_calc; + arrowPath.lineTo(currentX,currentY); + // Go left + currentX = startX - startY + radius_calc; + arrowPath.lineTo(currentX, currentY); + //Draw circle + currentY+=radius_calc; + c.drawCircle(currentX, currentY, radius_calc, arrowPaint); + currentY+=radius_calc; + arrowPath.lineTo(currentX, currentY); + //Go to start + arrowPath.lineTo(startX, startY); + + c.drawPath(arrowPath, arrowPaint); + } + +} \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/article_images_image.xml b/org.fox.ttrss/src/main/res/layout/article_images_image.xml new file mode 100644 index 00000000..b78410ad --- /dev/null +++ b/org.fox.ttrss/src/main/res/layout/article_images_image.xml @@ -0,0 +1,29 @@ + + + + + + + + + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/article_images_pager.xml b/org.fox.ttrss/src/main/res/layout/article_images_pager.xml new file mode 100644 index 00000000..2735cc90 --- /dev/null +++ b/org.fox.ttrss/src/main/res/layout/article_images_pager.xml @@ -0,0 +1,24 @@ + +/* + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin"> */ + + + + + + + diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row.xml b/org.fox.ttrss/src/main/res/layout/headlines_row.xml index 8b2107c1..ef44fde3 100644 --- a/org.fox.ttrss/src/main/res/layout/headlines_row.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row.xml @@ -94,13 +94,13 @@ android:cropToPadding="true" android:visibility="visible" /> - + diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_selected.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_selected.xml index 6d8a68ab..978b5b4e 100644 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_selected.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_selected.xml @@ -94,13 +94,14 @@ android:cropToPadding="true" android:visibility="visible" /> - + + diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_selected_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_selected_unread.xml index 47e24ab7..680158e0 100644 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_selected_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_selected_unread.xml @@ -95,13 +95,14 @@ android:cropToPadding="true" android:visibility="visible" /> - + + diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml index 83e60fbb..0e671095 100644 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml @@ -95,13 +95,13 @@ android:cropToPadding="true" android:visibility="visible" /> - + diff --git a/org.fox.ttrss/src/main/res/menu/article_images_pager.xml b/org.fox.ttrss/src/main/res/menu/article_images_pager.xml new file mode 100644 index 00000000..bafc53ab --- /dev/null +++ b/org.fox.ttrss/src/main/res/menu/article_images_pager.xml @@ -0,0 +1,9 @@ + + + diff --git a/org.fox.ttrss/src/main/res/values/dimens.xml b/org.fox.ttrss/src/main/res/values/dimens.xml new file mode 100644 index 00000000..47c82246 --- /dev/null +++ b/org.fox.ttrss/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 16dp + diff --git a/org.fox.ttrss/src/main/res/values/strings.xml b/org.fox.ttrss/src/main/res/values/strings.xml index f452ca05..32608dc6 100644 --- a/org.fox.ttrss/src/main/res/values/strings.xml +++ b/org.fox.ttrss/src/main/res/values/strings.xml @@ -149,10 +149,12 @@ Dim status bar Dim status bar when reading %1$d comments + Trial mode, only one day left. Trial mode, %1$d days left. + Unlock full version Trial expired To continue using Tiny Tiny RSS please unlock the full version by purchasing the key. @@ -198,17 +200,21 @@ Light theme is not supported on Honeycomb Mark read on scroll Headlines will be marked read when scrolling past them + Mark %1$d article as read? Mark %1$d articles as read? + Confirm marking articles as read by %1$s + No unread articles One unread article %1$d unread articles + Headline text size Mark all articles in %1$s as read? Device Default @@ -233,4 +239,9 @@ Show full content Show article image (%1$d more) + ArticleImagesPagerActivity + Hello world! + Settings + Error loading image. +