diff --git a/app/app.iml b/app/app.iml index 3d6f837..2bb4528 100644 --- a/app/app.iml +++ b/app/app.iml @@ -50,13 +50,13 @@ - - + + - + - - + + diff --git a/app/proguard-project.txt b/app/proguard-project.txt index c821b33..9c79170 100644 --- a/app/proguard-project.txt +++ b/app/proguard-project.txt @@ -36,6 +36,13 @@ -keep public class com.android.vending.licensing.ILicensingService -keep public class acr.browser.lightning.reading.* +-assumenosideeffects class android.util.Log { + public static *** d(...); + public static *** v(...); + public static *** w(...); + public static *** i(...); +} + # this will fix a force close in ReadingActivity -keep public class org.jsoup.** { public *; diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index 9d8c046..ce9eaee 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -8,13 +8,13 @@ import android.animation.ArgbEvaluator; import android.animation.LayoutTransition; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.IntentFilter; import android.content.res.Configuration; import android.content.res.Resources.Theme; import android.database.Cursor; @@ -25,6 +25,7 @@ import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; +import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.media.MediaPlayer; @@ -36,6 +37,7 @@ import android.os.Handler; import android.os.Message; import android.provider.Browser; import android.provider.MediaStore; +import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewCompat; @@ -49,6 +51,7 @@ import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; +import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; @@ -61,6 +64,7 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; +import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.DecelerateInterpolator; @@ -121,12 +125,14 @@ import acr.browser.lightning.object.ClickHandler; import acr.browser.lightning.object.DrawerArrowDrawable; import acr.browser.lightning.object.SearchAdapter; import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.receiver.NetworkReceiver; import acr.browser.lightning.utils.ProxyUtils; +import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.Utils; import acr.browser.lightning.view.AnimatedProgressBar; import acr.browser.lightning.view.LightningView; -public abstract class BrowserActivity extends ThemableActivity implements BrowserController, OnClickListener { +public abstract class BrowserActivity extends ThemableActivity implements BrowserController, OnClickListener, OnLongClickListener { // Layout private DrawerLayout mDrawerLayout; @@ -144,7 +150,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse private AnimatedProgressBar mProgressBar; private AutoCompleteTextView mSearch; - private ImageView mArrowImage; + private ImageView mArrowImage, mBookmarkTitleImage, mBookmarkImage; private VideoView mVideoView; private View mCustomView, mVideoProgressView; @@ -164,7 +170,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse // Primatives private boolean mSystemBrowser = false, mIsNewIntent = false, mFullScreen, mColorMode, mDarkTheme; - private int mOriginalOrientation, mBackgroundColor, mIdGenerator; + private int mOriginalOrientation, mBackgroundColor, mIdGenerator, mIconColor; private String mSearchText, mUntitledTitle, mHomepage, mCameraPhotoPath; // Storage @@ -173,7 +179,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse private PreferenceManager mPreferences; // Image - private Bitmap mDefaultVideoPoster, mWebpageBitmap; + private Bitmap mDefaultVideoPoster, mWebpageBitmap, mFolderBitmap; private final ColorDrawable mBackground = new ColorDrawable(); private Drawable mDeleteIcon, mRefreshIcon, mCopyIcon, mIcon; private DrawerArrowDrawable mArrowDrawable; @@ -183,6 +189,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse // Constant private static final int API = android.os.Build.VERSION.SDK_INT; + private static final String NETWORK_BROADCAST_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; private static final LayoutParams MATCH_PARENT = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams( @@ -216,6 +223,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mPreferences = PreferenceManager.getInstance(); //TODO make sure dark theme flag gets set correctly mDarkTheme = mPreferences.getUseTheme() != 0 || isIncognito(); + mIconColor = mDarkTheme ? ThemeUtils.getIconDarkThemeColor(this) : ThemeUtils.getIconLightThemeColor(this); mActivity = this; mWebViewList.clear(); @@ -227,7 +235,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mUiLayout = (LinearLayout) findViewById(R.id.ui_layout); mProgressBar = (AnimatedProgressBar) findViewById(R.id.progress_view); - RelativeLayout newTab = (RelativeLayout) findViewById(R.id.new_tab_button); + setupFrameLayoutButton(R.id.new_tab_button, R.id.icon_plus); mDrawerLeft = (LinearLayout) findViewById(R.id.left_drawer); // Drawer stutters otherwise mDrawerLeft.setLayerType(View.LAYER_TYPE_HARDWARE, null); @@ -236,11 +244,16 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mDrawerRight = (LinearLayout) findViewById(R.id.right_drawer); mDrawerRight.setLayerType(View.LAYER_TYPE_HARDWARE, null); mDrawerListRight = (ListView) findViewById(R.id.right_drawer_list); + mBookmarkTitleImage = (ImageView) findViewById(R.id.starIcon); + mBookmarkTitleImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); + ImageView tabTitleImage = (ImageView) findViewById(R.id.plusIcon); + tabTitleImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); setNavigationDrawerWidth(); mDrawerLayout.setDrawerListener(new DrawerLocker()); - mWebpageBitmap = Utils.getWebpageBitmap(getResources(), mDarkTheme); + mWebpageBitmap = ThemeUtils.getThemedBitmap(this, R.drawable.ic_webpage, mDarkTheme); + mFolderBitmap = ThemeUtils.getThemedBitmap(this, R.drawable.ic_folder, mDarkTheme); mHomepage = mPreferences.getHomepage(); @@ -273,34 +286,29 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse // Use hardware acceleration for the animation mArrowImage.setLayerType(View.LAYER_TYPE_HARDWARE, null); mArrowImage.setImageDrawable(mArrowDrawable); - LinearLayout arrowButton = (LinearLayout) actionBar.getCustomView().findViewById( + FrameLayout arrowButton = (FrameLayout) actionBar.getCustomView().findViewById( R.id.arrow_button); arrowButton.setOnClickListener(this); mProxyUtils = ProxyUtils.getInstance(this); - RelativeLayout back = (RelativeLayout) findViewById(R.id.action_back); - back.setOnClickListener(this); + setupFrameLayoutButton(R.id.action_back, R.id.icon_back); + setupFrameLayoutButton(R.id.action_forward, R.id.icon_forward); + setupFrameLayoutButton(R.id.action_add_bookmark, R.id.icon_star); + setupFrameLayoutButton(R.id.action_toggle_desktop, R.id.icon_desktop); + setupFrameLayoutButton(R.id.action_reading, R.id.icon_reading); - RelativeLayout forward = (RelativeLayout) findViewById(R.id.action_forward); - forward.setOnClickListener(this); + mBookmarkImage = (ImageView) findViewById(R.id.icon_star); // create the search EditText in the ToolBar mSearch = (AutoCompleteTextView) actionBar.getCustomView().findViewById(R.id.search); mUntitledTitle = getString(R.string.untitled); mBackgroundColor = getResources().getColor(R.color.primary_color); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - mDeleteIcon = getResources().getDrawable(R.drawable.ic_action_delete); - mRefreshIcon = getResources().getDrawable(R.drawable.ic_action_refresh); - mCopyIcon = getResources().getDrawable(R.drawable.ic_action_copy); - } else { - Theme theme = getTheme(); - mDeleteIcon = getResources().getDrawable(R.drawable.ic_action_delete, theme); - mRefreshIcon = getResources().getDrawable(R.drawable.ic_action_refresh, theme); - mCopyIcon = getResources().getDrawable(R.drawable.ic_action_copy, theme); - } + mDeleteIcon = ThemeUtils.getLightThemedDrawable(this, R.drawable.ic_action_delete); + mRefreshIcon = ThemeUtils.getLightThemedDrawable(this, R.drawable.ic_action_refresh); + mCopyIcon = ThemeUtils.getLightThemedDrawable(this, R.drawable.ic_action_copy); - int iconBounds = Utils.convertDpToPixels(24); + int iconBounds = Utils.convertDpToPixels(30); mDeleteIcon.setBounds(0, 0, iconBounds, iconBounds); mRefreshIcon.setBounds(0, 0, iconBounds, iconBounds); mCopyIcon.setBounds(0, 0, iconBounds, iconBounds); @@ -318,8 +326,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse @Override public void run() { mBookmarkManager = BookmarkManager.getInstance(mActivity.getApplicationContext()); - mBookmarkList.clear(); - mBookmarkList.addAll(mBookmarkManager.getBookmarks(true)); + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(null, true), false); if (mBookmarkList.size() == 0 && mPreferences.getDefaultBookmarks()) { for (String[] array : BookmarkManager.DEFAULT_BOOKMARKS) { HistoryItem bookmark = new HistoryItem(array[0], array[1]); @@ -339,20 +346,16 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse }); initialize.run(); - newTab.setOnClickListener(this); - newTab.setOnLongClickListener(new OnLongClickListener() { - + View view = findViewById(R.id.bookmark_back_button); + view.setOnClickListener(new OnClickListener() { @Override - public boolean onLongClick(View v) { - String url = mPreferences.getSavedUrl(); - if (url != null) { - newTab(url, true); - Utils.showSnackbar(mActivity, R.string.deleted_tab); + public void onClick(View v) { + if (mBookmarkManager == null) + return; + if (!mBookmarkManager.isRootFolder()) { + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(null, true), true); } - mPreferences.setSavedUrl(null); - return true; } - }); mDrawerLayout.setDrawerShadow(R.drawable.drawer_right_shadow, GravityCompat.END); @@ -492,7 +495,6 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse public class TouchListener implements OnTouchListener { - @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { if (mSearch.getCompoundDrawables()[2] != null) { @@ -791,14 +793,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse return true; case R.id.action_add_bookmark: if (mCurrentView != null && !mCurrentView.getUrl().startsWith(Constants.FILE)) { - HistoryItem bookmark = new HistoryItem(mCurrentView.getUrl(), - mCurrentView.getTitle()); - if (mBookmarkManager.addBookmark(bookmark)) { - mBookmarkList.add(bookmark); - Collections.sort(mBookmarkList, new SortIgnoreCase()); - notifyBookmarkDataSetChanged(); - mSearchAdapter.refreshBookmarks(); - } + addBookmark(mCurrentView.getTitle(), mCurrentView.getUrl()); } return true; case R.id.action_find: @@ -819,9 +814,71 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse * adapter doesn't always change when notifyDataChanged gets called. */ private void notifyBookmarkDataSetChanged() { + if (mBookmarkAdapter == null) + return; mBookmarkAdapter.notifyDataSetChanged(); } + private void addBookmark(String title, String url) { + HistoryItem bookmark = new HistoryItem(url, title); + if (mBookmarkManager.addBookmark(bookmark)) { + mBookmarkList.add(bookmark); + Collections.sort(mBookmarkList, new SortIgnoreCase()); + notifyBookmarkDataSetChanged(); + mSearchAdapter.refreshBookmarks(); + updateBookmarkIndicator(mCurrentView.getUrl()); + } + } + + private void setBookmarkDataSet(List items, boolean animate) { + mBookmarkList.clear(); + mBookmarkList.addAll(items); + if (mBookmarkAdapter != null) + mBookmarkAdapter.notifyDataSetChanged(); + final int resource; + if (mBookmarkManager.isRootFolder()) + resource = R.drawable.ic_action_star; + else + resource = R.drawable.ic_action_back; + + final Animation startRotation = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + mBookmarkTitleImage.setRotationY(90 * interpolatedTime); + } + }; + final Animation finishRotation = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + mBookmarkTitleImage.setRotationY((-90) + (90 * interpolatedTime)); + } + }; + startRotation.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + mBookmarkTitleImage.setImageResource(resource); + mBookmarkTitleImage.startAnimation(finishRotation); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + startRotation.setInterpolator(new AccelerateInterpolator()); + finishRotation.setInterpolator(new DecelerateInterpolator()); + startRotation.setDuration(250); + finishRotation.setDuration(250); + + if (animate) + mBookmarkTitleImage.startAnimation(startRotation); + else + mBookmarkTitleImage.setImageResource(resource); + } + /** * method that shows a dialog asking what string the user wishes to search * for. It highlights the text entered. @@ -918,6 +975,10 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse @Override public void onItemClick(AdapterView parent, View view, int position, long id) { + if (mBookmarkList.get(position).getIsFolder()) { + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(mBookmarkList.get(position).getUrl(), true), true); + return; + } if (mCurrentView != null) { mCurrentView.loadUrl(mBookmarkList.get(position).getUrl()); } @@ -938,6 +999,8 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse @Override public boolean onItemLongClick(AdapterView arg0, View arg1, final int position, long arg3) { + if (mBookmarkList.get(position).getIsFolder()) + return true; AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); builder.setTitle(mActivity.getResources().getString(R.string.action_bookmarks)); builder.setMessage(getResources().getString(R.string.dialog_bookmark)) @@ -955,12 +1018,14 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse @Override public void onClick(DialogInterface dialog, int which) { - if (mBookmarkManager.deleteBookmark(mBookmarkList.get(position) - .getUrl())) { + if (mBookmarkManager.deleteBookmark(mBookmarkList.get(position))) { mBookmarkList.remove(position); notifyBookmarkDataSetChanged(); mSearchAdapter.refreshBookmarks(); openBookmarks(); + if (mCurrentView != null) { + updateBookmarkIndicator(mCurrentView.getUrl()); + } } } }) @@ -985,38 +1050,58 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse * @param id which id in the list was chosen */ private synchronized void editBookmark(final int id) { - final AlertDialog.Builder homePicker = new AlertDialog.Builder(mActivity); - homePicker.setTitle(getResources().getString(R.string.title_edit_bookmark)); + final AlertDialog.Builder editBookmarkDialog = new AlertDialog.Builder(mActivity); + editBookmarkDialog.setTitle(R.string.title_edit_bookmark); final EditText getTitle = new EditText(mActivity); - getTitle.setHint(getResources().getString(R.string.hint_title)); + getTitle.setHint(R.string.hint_title); getTitle.setText(mBookmarkList.get(id).getTitle()); getTitle.setSingleLine(); final EditText getUrl = new EditText(mActivity); - getUrl.setHint(getResources().getString(R.string.hint_url)); + getUrl.setHint(R.string.hint_url); getUrl.setText(mBookmarkList.get(id).getUrl()); getUrl.setSingleLine(); + final EditText getFolder = new EditText(mActivity); + getFolder.setHint(R.string.folder); + getFolder.setText(mBookmarkList.get(id).getFolder()); + getFolder.setSingleLine(); LinearLayout layout = new LinearLayout(mActivity); layout.setOrientation(LinearLayout.VERTICAL); + int padding = Utils.convertDpToPixels(10); + layout.setPadding(padding, padding, padding, padding); layout.addView(getTitle); layout.addView(getUrl); - homePicker.setView(layout); - homePicker.setPositiveButton(getResources().getString(R.string.action_ok), + layout.addView(getFolder); + editBookmarkDialog.setView(layout); + editBookmarkDialog.setPositiveButton(getResources().getString(R.string.action_ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - mBookmarkList.get(id).setTitle(getTitle.getText().toString()); - mBookmarkList.get(id).setUrl(getUrl.getText().toString()); - mBookmarkManager.overwriteBookmarks(mBookmarkList); + HistoryItem item = new HistoryItem(); + String currentFolder = mBookmarkList.get(id).getFolder(); + item.setTitle(getTitle.getText().toString()); + item.setUrl(getUrl.getText().toString()); + item.setFolder(getFolder.getText().toString()); + mBookmarkManager.editBookmark(mBookmarkList.get(id), item); + + List list = mBookmarkManager.getBookmarksFromFolder(currentFolder, true); + if (list.size() == 0) { + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(null, true), true); + } else { + setBookmarkDataSet(list, false); + } + Collections.sort(mBookmarkList, new SortIgnoreCase()); - notifyBookmarkDataSetChanged(); if (mCurrentView != null && mCurrentView.getUrl().startsWith(Constants.FILE) && mCurrentView.getUrl().endsWith("bookmarks.html")) { openBookmarkPage(mWebView); } + if (mCurrentView != null) { + updateBookmarkIndicator(mCurrentView.getUrl()); + } } }); - homePicker.show(); + editBookmarkDialog.show(); } /** @@ -1080,6 +1165,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } }, 150); + updateBookmarkIndicator(mWebView.getUrl()); // new Handler().postDelayed(new Runnable() { // @Override @@ -1296,7 +1382,6 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse Utils.trimCache(this); } - @SuppressLint("NewApi") @SuppressWarnings("deprecation") private void clearCookies() { // TODO Break out web storage deletion into its own option/action @@ -1317,7 +1402,11 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse if (mDrawerLayout.isDrawerOpen(mDrawerLeft)) { mDrawerLayout.closeDrawer(mDrawerLeft); } else if (mDrawerLayout.isDrawerOpen(mDrawerRight)) { - mDrawerLayout.closeDrawer(mDrawerRight); + if (!mBookmarkManager.isRootFolder()) { + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(null, true), true); + } else { + mDrawerLayout.closeDrawer(mDrawerRight); + } } else { if (mCurrentView != null) { Log.d(Constants.TAG, "onBackPressed"); @@ -1347,6 +1436,11 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mCurrentView.pauseTimers(); mCurrentView.onPause(); } + try { + unregisterReceiver(mNetworkReceiver); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } } void saveOpenTabs() { @@ -1372,6 +1466,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse Log.d(Constants.TAG, "onDestroy"); if (mHistoryDatabase != null) { mHistoryDatabase.close(); + mHistoryDatabase = null; } super.onDestroy(); } @@ -1395,9 +1490,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mCurrentView.onResume(); } mHistoryDatabase = HistoryDatabase.getInstance(getApplicationContext()); - mBookmarkList.clear(); - mBookmarkList.addAll(mBookmarkManager.getBookmarks(true)); - notifyBookmarkDataSetChanged(); + setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(null, true), false); initializePreferences(); for (int n = 0; n < mWebViewList.size(); n++) { if (mWebViewList.get(n) != null) { @@ -1408,6 +1501,10 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } supportInvalidateOptionsMenu(); + + IntentFilter filter = new IntentFilter(); + filter.addAction(NETWORK_BROADCAST_ACTION); + registerReceiver(mNetworkReceiver, filter); } /** @@ -1486,14 +1583,15 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse holder.txtTitle = (TextView) row.findViewById(R.id.textTab); holder.favicon = (ImageView) row.findViewById(R.id.faviconTab); holder.exit = (ImageView) row.findViewById(R.id.deleteButton); - holder.exit.setTag(position); + holder.exitButton = (FrameLayout) row.findViewById(R.id.deleteAction); + holder.exit.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); row.setTag(holder); } else { holder = (LightningViewHolder) row.getTag(); } - holder.exit.setTag(position); - holder.exit.setOnClickListener(mExitListener); + holder.exitButton.setTag(position); + holder.exitButton.setOnClickListener(mExitListener); ViewCompat.jumpDrawablesToCurrentState(holder.exit); @@ -1534,6 +1632,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse TextView txtTitle; ImageView favicon; ImageView exit; + FrameLayout exitButton; } } @@ -1592,12 +1691,14 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse final Context context; List data = null; final int layoutResourceId; + final Bitmap folderIcon; public BookmarkViewAdapter(Context context, int layoutResourceId, List data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; + this.folderIcon = mFolderBitmap; } @Override @@ -1617,10 +1718,14 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse holder = (BookmarkViewHolder) row.getTag(); } + ViewCompat.jumpDrawablesToCurrentState(row); + HistoryItem web = data.get(position); holder.txtTitle.setText(web.getTitle()); holder.favicon.setImageBitmap(mWebpageBitmap); - if (web.getBitmap() == null) { + if (web.getIsFolder()) { + holder.favicon.setImageBitmap(this.folderIcon); + } else if (web.getBitmap() == null) { getImage(holder.favicon, web); } else { holder.favicon.setImageBitmap(web.getBitmap()); @@ -1663,34 +1768,40 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } // checks to see if the image exists if (!image.exists()) { + FileOutputStream fos = null; + InputStream in = null; try { // if not, download it... URL urlDownload = new URL(urldisplay); HttpURLConnection connection = (HttpURLConnection) urlDownload.openConnection(); connection.setDoInput(true); connection.connect(); - InputStream in = connection.getInputStream(); + in = connection.getInputStream(); if (in != null) { mIcon = BitmapFactory.decodeStream(in); } // ...and cache it if (mIcon != null) { - FileOutputStream fos = new FileOutputStream(image); + fos = new FileOutputStream(image); mIcon.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); - fos.close(); Log.d(Constants.TAG, "Downloaded: " + urldisplay); } } catch (Exception e) { e.printStackTrace(); + } finally { + Utils.close(in); + Utils.close(fos); } } else { // if it exists, retrieve it from the cache mIcon = BitmapFactory.decodeFile(image.getPath()); } if (mIcon == null) { + InputStream in = null; + FileOutputStream fos = null; try { // if not, download it... URL urlDownload = new URL("https://www.google.com/s2/favicons?domain_url=" @@ -1698,21 +1809,23 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse HttpURLConnection connection = (HttpURLConnection) urlDownload.openConnection(); connection.setDoInput(true); connection.connect(); - InputStream in = connection.getInputStream(); + in = connection.getInputStream(); if (in != null) { mIcon = BitmapFactory.decodeStream(in); } // ...and cache it if (mIcon != null) { - FileOutputStream fos = new FileOutputStream(image); + fos = new FileOutputStream(image); mIcon.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); - fos.close(); } } catch (Exception e) { e.printStackTrace(); + } finally { + Utils.close(in); + Utils.close(fos); } } if (mIcon == null) { @@ -1793,7 +1906,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } try { if (mHistoryDatabase == null) { - mHistoryDatabase = HistoryDatabase.getInstance(mActivity); + mHistoryDatabase = HistoryDatabase.getInstance(mActivity.getApplicationContext()); } mHistoryDatabase.visitHistoryItem(url, title); } catch (IllegalStateException e) { @@ -1916,9 +2029,20 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuItem back = menu.findItem(R.id.action_back); + MenuItem forward = menu.findItem(R.id.action_forward); + if (back != null && back.getIcon() != null) + back.getIcon().setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); + if (forward != null && forward.getIcon() != null) + forward.getIcon().setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); + return super.onCreateOptionsMenu(menu); + } + /** * open the HTML bookmarks page, parameter view is the WebView that should show the page */ + @Override public void openBookmarkPage(WebView view) { StringBuilder bookmarkBuilder = new StringBuilder(); bookmarkBuilder.append(BookmarkPage.HEADING); @@ -1936,12 +2060,14 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } bookmarkBuilder.append(BookmarkPage.END); File bookmarkWebPage = new File(mActivity.getFilesDir(), BookmarkPage.FILENAME); + FileWriter bookWriter = null; try { - FileWriter bookWriter = new FileWriter(bookmarkWebPage, false); + bookWriter = new FileWriter(bookmarkWebPage, false); bookWriter.write(bookmarkBuilder.toString()); - bookWriter.close(); } catch (IOException e) { e.printStackTrace(); + } finally { + Utils.close(bookWriter); } view.loadUrl(Constants.FILE + bookmarkWebPage); @@ -2187,7 +2313,6 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse setBackgroundColor(ctx.getResources().getColor(android.R.color.black)); } - @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(@NonNull MotionEvent evt) { return true; @@ -2208,7 +2333,6 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse return mDefaultVideoPoster; } - @SuppressLint("InflateParams") @Override /** * dumb method that returns the loading progress for a video @@ -2558,6 +2682,17 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse } } + @Override + public void updateBookmarkIndicator(String url) { + if (url == null || !mBookmarkManager.isBookmark(url)) { + mBookmarkImage.setImageResource(R.drawable.ic_action_star); + mBookmarkImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); + } else { + mBookmarkImage.setImageResource(R.drawable.ic_bookmark); + mBookmarkImage.setColorFilter(ThemeUtils.getAccentColor(this), PorterDuff.Mode.SRC_IN); + } + } + private class SortIgnoreCase implements Comparator { public int compare(HistoryItem o1, HistoryItem o2) { @@ -2606,6 +2741,58 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse mWebView.clearMatches(); mSearchBar.setVisibility(View.GONE); break; + case R.id.action_reading: + Intent read = new Intent(this, ReadingActivity.class); + read.putExtra(Constants.LOAD_READING_URL, mCurrentView.getUrl()); + startActivity(read); + break; + case R.id.action_toggle_desktop: + mCurrentView.toggleDesktopUA(this); + mCurrentView.reload(); + closeDrawers(); + break; + case R.id.action_add_bookmark: + if (mCurrentView != null && !mCurrentView.getUrl().startsWith(Constants.FILE)) { + addBookmark(mCurrentView.getTitle(), mCurrentView.getUrl()); + } + break; } } + + @Override + public boolean onLongClick(View view) { + switch (view.getId()) { + case R.id.new_tab_button: + String url = mPreferences.getSavedUrl(); + if (url != null) { + newTab(url, true); + Utils.showSnackbar(mActivity, R.string.deleted_tab); + } + mPreferences.setSavedUrl(null); + break; + } + return true; + } + + private void setupFrameLayoutButton(@IdRes int buttonId, @IdRes int imageId) { + FrameLayout frameButton = (FrameLayout) findViewById(buttonId); + frameButton.setOnClickListener(this); + frameButton.setOnLongClickListener(this); + ImageView buttonImage = (ImageView) findViewById(imageId); + buttonImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); + } + + private NetworkReceiver mNetworkReceiver = new NetworkReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + boolean isConnected = isConnected(context); + Log.d("Lightning", "Network Connected: " + String.valueOf(isConnected)); + for (int n = 0; n < mWebViewList.size(); n++) { + WebView view = mWebViewList.get(n).getWebView(); + if (view != null) + view.setNetworkAvailable(isConnected); + } + } + }; } diff --git a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java index 9b59c76..46a4f15 100644 --- a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java @@ -2,13 +2,12 @@ package acr.browser.lightning.activity; import android.content.Intent; import android.os.Build; -import android.os.Bundle; import android.view.Menu; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; -import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.R; +import acr.browser.lightning.preference.PreferenceManager; @SuppressWarnings("deprecation") public class IncognitoActivity extends BrowserActivity { diff --git a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java index 2c08b49..59d1f42 100644 --- a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java @@ -2,13 +2,12 @@ package acr.browser.lightning.activity; import android.content.Intent; import android.os.Build; -import android.os.Bundle; import android.view.Menu; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; -import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.R; +import acr.browser.lightning.preference.PreferenceManager; @SuppressWarnings("deprecation") public class MainActivity extends BrowserActivity { diff --git a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java index a96d321..b689269 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java @@ -1,11 +1,13 @@ package acr.browser.lightning.activity; import android.animation.ObjectAnimator; +import android.app.Activity; import android.app.ProgressDialog; -import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.graphics.PorterDuff; +import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AlertDialog; @@ -27,6 +29,7 @@ import acr.browser.lightning.constant.Constants; import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.reading.HtmlFetcher; import acr.browser.lightning.reading.JResult; +import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.Utils; public class ReadingActivity extends AppCompatActivity { @@ -37,6 +40,8 @@ public class ReadingActivity extends AppCompatActivity { private String mUrl = null; private PreferenceManager mPreferences; private int mTextSize; + private ProgressDialog mProgressDialog; + private static final float XXLARGE = 30.0f; private static final float XLARGE = 26.0f; private static final float LARGE = 22.0f; @@ -48,11 +53,19 @@ public class ReadingActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { mPreferences = PreferenceManager.getInstance(); mInvert = mPreferences.getInvertColors(); + final int color; if (mInvert) { - this.setTheme(R.style.Theme_SettingsTheme_Dark); + setTheme(R.style.Theme_SettingsTheme_Dark); + color = ThemeUtils.getPrimaryColorDark(this); + getWindow().setBackgroundDrawable(new ColorDrawable(color)); + } else { + setTheme(R.style.Theme_SettingsTheme); + color = ThemeUtils.getPrimaryColor(this); + getWindow().setBackgroundDrawable(new ColorDrawable(color)); } super.onCreate(savedInstanceState); setContentView(R.layout.reading_view); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -98,6 +111,13 @@ public class ReadingActivity extends AppCompatActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.reading, menu); + MenuItem invert = menu.findItem(R.id.invert_item); + MenuItem textSize = menu.findItem(R.id.text_size_item); + int iconColor = mInvert ? ThemeUtils.getIconDarkThemeColor(this) : ThemeUtils.getIconLightThemeColor(this); + if (invert != null && invert.getIcon() != null) + invert.getIcon().setColorFilter(iconColor, PorterDuff.Mode.SRC_IN); + if (textSize != null && textSize.getIcon() != null) + textSize.getIcon().setColorFilter(iconColor, PorterDuff.Mode.SRC_IN); return super.onCreateOptionsMenu(menu); } @@ -117,23 +137,22 @@ public class ReadingActivity extends AppCompatActivity { private class PageLoader extends AsyncTask { - private final Context mContext; - private ProgressDialog mProgressDialog; + private final Activity mActivity; private String mTitleText; private List mBodyText; - public PageLoader(Context context) { - mContext = context; + public PageLoader(Activity activity) { + mActivity = activity; } @Override protected void onPreExecute() { super.onPreExecute(); - mProgressDialog = new ProgressDialog(mContext); + mProgressDialog = new ProgressDialog(mActivity); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.setCancelable(false); mProgressDialog.setIndeterminate(true); - mProgressDialog.setMessage(mContext.getString(R.string.loading)); + mProgressDialog.setMessage(mActivity.getString(R.string.loading)); mProgressDialog.show(); } @@ -160,7 +179,10 @@ public class ReadingActivity extends AppCompatActivity { @Override protected void onPostExecute(Void result) { - mProgressDialog.dismiss(); + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + mProgressDialog = null; + } if (mTitleText.isEmpty() || mBodyText.isEmpty()) { setText(getString(R.string.untitled), getString(R.string.loading_failed)); } else { @@ -176,6 +198,8 @@ public class ReadingActivity extends AppCompatActivity { } private void setText(String title, String body) { + if (mTitle == null || mBody == null) + return; if (mTitle.getVisibility() == View.INVISIBLE) { mTitle.setAlpha(0.0f); mTitle.setVisibility(View.VISIBLE); @@ -199,6 +223,15 @@ public class ReadingActivity extends AppCompatActivity { } } + @Override + protected void onDestroy() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + mProgressDialog = null; + } + super.onDestroy(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/acr/browser/lightning/activity/ThemableActivity.java b/app/src/main/java/acr/browser/lightning/activity/ThemableActivity.java index 18130a8..443baab 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ThemableActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ThemableActivity.java @@ -33,9 +33,6 @@ public abstract class ThemableActivity extends AppCompatActivity { } private void restart() { - Intent intent = getIntent(); - finish(); - overridePendingTransition(0, 0); - startActivity(intent); + recreate(); } } diff --git a/app/src/main/java/acr/browser/lightning/activity/ThemableSettingsActivity.java b/app/src/main/java/acr/browser/lightning/activity/ThemableSettingsActivity.java index 12009c0..ebcb0fe 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ThemableSettingsActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ThemableSettingsActivity.java @@ -39,11 +39,6 @@ public abstract class ThemableSettingsActivity extends AppCompatPreferenceActivi } private void restart() { - final Bundle outState = new Bundle(); - onSaveInstanceState(outState); - final Intent intent = new Intent(this, getClass()); - finish(); - overridePendingTransition(0, 0); - startActivity(intent); + recreate(); } } diff --git a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java index 45f07a7..b3b5f50 100644 --- a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java @@ -15,6 +15,7 @@ import acr.browser.lightning.activity.BrowserApp; import acr.browser.lightning.database.HistoryItem; import acr.browser.lightning.R; import acr.browser.lightning.database.HistoryDatabase; +import acr.browser.lightning.utils.Utils; public class HistoryPage { @@ -53,12 +54,14 @@ public class HistoryPage { historyBuilder.append(HistoryPage.END); File historyWebPage = new File(context.getFilesDir(), FILENAME); + FileWriter historyWriter = null; try { - FileWriter historyWriter = new FileWriter(historyWebPage, false); + historyWriter = new FileWriter(historyWebPage, false); historyWriter.write(historyBuilder.toString()); - historyWriter.close(); } catch (IOException e) { e.printStackTrace(); + } finally { + Utils.close(historyWriter); } return Constants.FILE + historyWebPage; } diff --git a/app/src/main/java/acr/browser/lightning/controller/BrowserController.java b/app/src/main/java/acr/browser/lightning/controller/BrowserController.java index 072648c..b76a7b1 100644 --- a/app/src/main/java/acr/browser/lightning/controller/BrowserController.java +++ b/app/src/main/java/acr/browser/lightning/controller/BrowserController.java @@ -54,4 +54,6 @@ public interface BrowserController { boolean proxyIsNotReady(); + void updateBookmarkIndicator(String url); + } diff --git a/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java b/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java index 57e541a..89052da 100644 --- a/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java +++ b/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java @@ -18,13 +18,12 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.Set; import acr.browser.lightning.R; -import acr.browser.lightning.constant.Constants; import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.utils.Utils; @@ -36,8 +35,9 @@ public class BookmarkManager { private static final String FOLDER = "folder"; private static final String ORDER = "order"; private static final String FILE_BOOKMARKS = "bookmarks.dat"; - private static SortedMap mBookmarkMap = new TreeMap<>( - String.CASE_INSENSITIVE_ORDER); + private static Set mBookmarkSearchSet = new HashSet<>(); + private static final List mBookmarkList = new ArrayList<>(); + private static String mCurrentFolder = ""; private static BookmarkManager mInstance; public static BookmarkManager getInstance(Context context) { @@ -49,19 +49,27 @@ public class BookmarkManager { private BookmarkManager(Context context) { mContext = context; - mBookmarkMap = getBookmarkUrls(); + mBookmarkList.clear(); + mBookmarkList.addAll(getAllBookmarks(true)); + mBookmarkSearchSet = getBookmarkUrls(mBookmarkList); + } + + public boolean isBookmark(String url) { + return mBookmarkSearchSet.contains(url); } /** - * This method adds the the HistoryItem item to permanent bookmark storage + * This method adds the the HistoryItem item to permanent bookmark storage. + * It returns true if the operation was successful. * * @param item the item to add */ public synchronized boolean addBookmark(HistoryItem item) { File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); - if (item.getUrl() == null || mBookmarkMap.containsKey(item.getUrl())) { + if (item.getUrl() == null || mBookmarkSearchSet.contains(item.getUrl())) { return false; } + mBookmarkList.add(item); BufferedWriter bookmarkWriter = null; try { bookmarkWriter = new BufferedWriter(new FileWriter(bookmarksFile, true)); @@ -72,8 +80,7 @@ public class BookmarkManager { object.put(ORDER, item.getOrder()); bookmarkWriter.write(object.toString()); bookmarkWriter.newLine(); - bookmarkWriter.close(); - mBookmarkMap.put(item.getUrl(), 1); + mBookmarkSearchSet.add(item.getUrl()); } catch (IOException | JSONException e) { e.printStackTrace(); } finally { @@ -94,14 +101,15 @@ public class BookmarkManager { bookmarkWriter = new BufferedWriter(new FileWriter(bookmarksFile, true)); JSONObject object = new JSONObject(); for (HistoryItem item : list) { - if (item.getUrl() != null && !mBookmarkMap.containsKey(item.getUrl())) { + if (item.getUrl() != null && !mBookmarkSearchSet.contains(item.getUrl())) { object.put(TITLE, item.getTitle()); object.put(URL, item.getUrl()); object.put(FOLDER, item.getFolder()); object.put(ORDER, item.getOrder()); bookmarkWriter.write(object.toString()); bookmarkWriter.newLine(); - mBookmarkMap.put(item.getUrl(), 1); + mBookmarkSearchSet.add(item.getUrl()); + mBookmarkList.add(item); } } } catch (IOException | JSONException e) { @@ -112,20 +120,23 @@ public class BookmarkManager { } /** - * This method deletes the bookmark with the given url + * This method deletes the bookmark with the given url. It returns + * true if the deletion was successful. * - * @param url the url of the bookmark to delete + * @param deleteItem the bookmark item to delete */ - public synchronized boolean deleteBookmark(String url) { + public synchronized boolean deleteBookmark(HistoryItem deleteItem) { List list; - if (url == null) { + if (deleteItem == null || deleteItem.getIsFolder()) { return false; } - mBookmarkMap.remove(url); - list = getBookmarks(false); + mBookmarkSearchSet.remove(deleteItem.getUrl()); + mBookmarkList.remove(deleteItem); + list = getAllBookmarks(false); File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); boolean bookmarkDeleted = false; BufferedWriter fileWriter = null; + String url = deleteItem.getUrl(); try { fileWriter = new BufferedWriter(new FileWriter(bookmarksFile, false)); JSONObject object = new JSONObject(); @@ -149,12 +160,66 @@ public class BookmarkManager { return bookmarkDeleted; } + /** + * This method edits a particular bookmark in the bookmark database + * + * @param oldItem This is the old item that you wish to edit + * @param newItem This is the new item that will overwrite the old item + */ + public synchronized void editBookmark(HistoryItem oldItem, HistoryItem newItem) { + List list; + if (oldItem == null || newItem == null || oldItem.getIsFolder()) { + return; + } + mBookmarkList.remove(oldItem); + mBookmarkList.add(newItem); + if (!oldItem.getUrl().equals(newItem.getUrl())) { + // Update the BookmarkMap if the URL has been changed + mBookmarkSearchSet.remove(oldItem.getUrl()); + mBookmarkSearchSet.add(newItem.getUrl()); + } + if (newItem.getUrl().length() == 0) { + deleteBookmark(oldItem); + return; + } + if (newItem.getTitle().length() == 0) { + newItem.setTitle(mContext.getString(R.string.untitled)); + } + list = getAllBookmarks(false); + File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); + BufferedWriter fileWriter = null; + try { + fileWriter = new BufferedWriter(new FileWriter(bookmarksFile, false)); + JSONObject object = new JSONObject(); + final String url = oldItem.getUrl(); + for (HistoryItem item : list) { + if (!item.getUrl().equalsIgnoreCase(url)) { + object.put(TITLE, item.getTitle()); + object.put(URL, item.getUrl()); + object.put(FOLDER, item.getFolder()); + object.put(ORDER, item.getOrder()); + } else { + object.put(TITLE, newItem.getTitle()); + object.put(URL, newItem.getUrl()); + object.put(FOLDER, newItem.getFolder()); + object.put(ORDER, newItem.getOrder()); + } + fileWriter.write(object.toString()); + fileWriter.newLine(); + } + } catch (IOException | JSONException e) { + e.printStackTrace(); + } finally { + Utils.close(fileWriter); + } + } + /** * This method exports the stored bookmarks to a text file in the device's * external download directory */ public synchronized void exportBookmarks(Activity activity) { - List bookmarkList = getBookmarks(true); + List bookmarkList = getAllBookmarks(true); File bookmarksExport = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "BookmarksExport.txt"); @@ -189,11 +254,13 @@ public class BookmarkManager { } /** - * This method returns a list of all stored bookmarks + * This method returns a list of ALL stored bookmarks. + * This is a disk-bound operation and should not be + * done very frequently. * * @return returns a list of bookmarks that can be sorted */ - public synchronized List getBookmarks(boolean sort) { + public synchronized List getAllBookmarks(boolean sort) { List bookmarks = new ArrayList<>(); File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); BufferedReader bookmarksReader = null; @@ -222,73 +289,86 @@ public class BookmarkManager { } /** - * This method returns a list of bookmarks located in the specified folder + * This method returns a list of bookmarks and folders located in the specified folder. + * This method should generally be used by the UI when it needs a list to display to the + * user as it returns a subset of all bookmarks and includes folders as well which are + * really 'fake' bookmarks. * * @param folder the name of the folder to retrieve bookmarks from * @return a list of bookmarks found in that folder */ - public synchronized List getBookmarksFromFolder(String folder) { + public synchronized List getBookmarksFromFolder(String folder, boolean sort) { List bookmarks = new ArrayList<>(); - File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); - BufferedReader bookmarksReader = null; - try { - bookmarksReader = new BufferedReader(new FileReader(bookmarksFile)); - String line; - while ((line = bookmarksReader.readLine()) != null) { - JSONObject object = new JSONObject(line); - if (object.getString(FOLDER).equals(folder)) { - HistoryItem item = new HistoryItem(); - item.setTitle(object.getString(TITLE)); - item.setUrl(object.getString(URL)); - item.setFolder(object.getString(FOLDER)); - item.setOrder(object.getInt(ORDER)); - item.setImageId(R.drawable.ic_bookmark); - bookmarks.add(item); - } - } - bookmarksReader.close(); - } catch (IOException | JSONException e) { - e.printStackTrace(); - } finally { - Utils.close(bookmarksReader); +// File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); +// BufferedReader bookmarksReader = null; + if (folder == null || folder.length() == 0) { + bookmarks.addAll(getFolders(sort)); + folder = ""; + } + mCurrentFolder = folder; + for (int n = 0; n < mBookmarkList.size(); n++) { + if (mBookmarkList.get(n).getFolder().equals(folder)) + bookmarks.add(mBookmarkList.get(n)); + } +// try { +// bookmarksReader = new BufferedReader(new FileReader(bookmarksFile)); +// String line; +// while ((line = bookmarksReader.readLine()) != null) { +// JSONObject object = new JSONObject(line); +// if (object.getString(FOLDER).equals(folder)) { +// HistoryItem item = new HistoryItem(); +// item.setTitle(object.getString(TITLE)); +// item.setUrl(object.getString(URL)); +// item.setFolder(object.getString(FOLDER)); +// item.setOrder(object.getInt(ORDER)); +// item.setImageId(R.drawable.ic_bookmark); +// bookmarks.add(item); +// } +// } +// } catch (IOException | JSONException e) { +// e.printStackTrace(); +// } finally { +// Utils.close(bookmarksReader); +// } + if (sort) { + Collections.sort(bookmarks, new SortIgnoreCase()); } return bookmarks; } + /** + * Tells you if you are at the root folder or in a subfolder + * + * @return returns true if you are in the root folder + */ + public boolean isRootFolder() { + return mCurrentFolder.length() == 0; + } + /** * Method is used internally for searching the bookmarks * * @return a sorted map of all bookmarks, useful for seeing if a bookmark exists */ - private synchronized SortedMap getBookmarkUrls() { - SortedMap map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); - BufferedReader bookmarksReader = null; - try { - bookmarksReader = new BufferedReader(new FileReader(bookmarksFile)); - String line; - while ((line = bookmarksReader.readLine()) != null) { - JSONObject object = new JSONObject(line); - map.put(object.getString(URL), 1); - } - bookmarksReader.close(); - } catch (JSONException | IOException e) { - e.printStackTrace(); - } finally { - Utils.close(bookmarksReader); + private static Set getBookmarkUrls(List list) { + Set set = new HashSet<>(); + for (int n = 0; n < list.size(); n++) { + if (!mBookmarkList.get(n).getIsFolder()) + set.add(mBookmarkList.get(n).getUrl()); } - return map; + return set; } /** - * This method returns a list of all folders + * This method returns a list of all folders. + * Folders cannot be empty as they are generated from + * the list of bookmarks that have non-empty folder fields. * * @return a list of all folders */ - public synchronized List getFolders() { + public synchronized List getFolders(boolean sort) { List folders = new ArrayList<>(); - SortedMap folderMap = new TreeMap<>( - String.CASE_INSENSITIVE_ORDER); + Set folderMap = new HashSet<>(); File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); BufferedReader bookmarksReader = null; try { @@ -297,11 +377,12 @@ public class BookmarkManager { while ((line = bookmarksReader.readLine()) != null) { JSONObject object = new JSONObject(line); String folderName = object.getString(FOLDER); - if (!folderName.isEmpty() && !folderMap.containsKey(folderName)) { + if (!folderName.isEmpty() && !folderMap.contains(folderName)) { HistoryItem item = new HistoryItem(); item.setTitle(folderName); - item.setUrl(Constants.FOLDER + folderName); - folderMap.put(folderName, 1); + item.setUrl(folderName); + item.setIsFolder(true); + folderMap.add(folderName); folders.add(item); } } @@ -310,6 +391,9 @@ public class BookmarkManager { } finally { Utils.close(bookmarksReader); } + if (sort) { + Collections.sort(folders, new SortIgnoreCase()); + } return folders; } @@ -406,12 +490,14 @@ public class BookmarkManager { bookmarkWriter = new BufferedWriter(new FileWriter(bookmarksFile, false)); JSONObject object = new JSONObject(); for (HistoryItem item : list) { - object.put(TITLE, item.getTitle()); - object.put(URL, item.getUrl()); - object.put(FOLDER, item.getFolder()); - object.put(ORDER, item.getOrder()); - bookmarkWriter.write(object.toString()); - bookmarkWriter.newLine(); + if (!item.getIsFolder()) { + object.put(TITLE, item.getTitle()); + object.put(URL, item.getUrl()); + object.put(FOLDER, item.getFolder()); + object.put(ORDER, item.getOrder()); + bookmarkWriter.write(object.toString()); + bookmarkWriter.newLine(); + } } } catch (IOException | JSONException e) { e.printStackTrace(); diff --git a/app/src/main/java/acr/browser/lightning/database/HistoryItem.java b/app/src/main/java/acr/browser/lightning/database/HistoryItem.java index 2078b9d..6bb3c00 100644 --- a/app/src/main/java/acr/browser/lightning/database/HistoryItem.java +++ b/app/src/main/java/acr/browser/lightning/database/HistoryItem.java @@ -16,12 +16,21 @@ public class HistoryItem implements Comparable { private Bitmap mBitmap = null; private int mImageId = 0; private int mOrder = 0; + private boolean mIsFolder = false; // Empty constructor public HistoryItem() { } + public HistoryItem(HistoryItem item) { + this.mUrl = item.mUrl; + this.mTitle = item.mTitle; + this.mFolder = item.mFolder; + this.mOrder = item.mOrder; + this.mIsFolder = item.mIsFolder; + } + // constructor public HistoryItem(int id, String url, String title) { this.mId = id; @@ -107,6 +116,14 @@ public class HistoryItem implements Comparable { this.mTitle = (title == null) ? "" : title; } + public void setIsFolder(boolean isFolder) { + mIsFolder = isFolder; + } + + public boolean getIsFolder() { + return mIsFolder; + } + @Override public String toString() { return mTitle; diff --git a/app/src/main/java/acr/browser/lightning/fragment/DisplaySettingsFragment.java b/app/src/main/java/acr/browser/lightning/fragment/DisplaySettingsFragment.java index bc06e04..7285cc8 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/DisplaySettingsFragment.java +++ b/app/src/main/java/acr/browser/lightning/fragment/DisplaySettingsFragment.java @@ -10,6 +10,14 @@ import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.v7.app.AlertDialog; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; import acr.browser.lightning.R; import acr.browser.lightning.preference.PreferenceManager; @@ -23,6 +31,12 @@ public class DisplaySettingsFragment extends PreferenceFragment implements Prefe private static final String SETTINGS_REFLOW = "text_reflow"; private static final String SETTINGS_THEME = "app_theme"; private static final String SETTINGS_TEXTSIZE = "text_size"; + private static final float XXLARGE = 30.0f; + private static final float XLARGE = 26.0f; + private static final float LARGE = 22.0f; + private static final float MEDIUM = 18.0f; + private static final float SMALL = 14.0f; + private static final float XSMALL = 10.0f; private Activity mActivity; private PreferenceManager mPreferences; @@ -117,28 +131,64 @@ public class DisplaySettingsFragment extends PreferenceFragment implements Prefe } private void textSizePicker() { - AlertDialog.Builder picker = new AlertDialog.Builder(mActivity); - picker.setTitle(getResources().getString(R.string.title_text_size)); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = getActivity().getLayoutInflater(); + LinearLayout view = (LinearLayout) inflater.inflate(R.layout.seek_layout, null); + final SeekBar bar = (SeekBar) view.findViewById(R.id.text_size_seekbar); + final TextView sample = new TextView(getActivity()); + sample.setText(R.string.untitled); + sample.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)); + sample.setGravity(Gravity.CENTER_HORIZONTAL); + view.addView(sample); + bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - int n = mPreferences.getTextSize(); + @Override + public void onProgressChanged(SeekBar view, int size, boolean user) { + sample.setTextSize(getTextSize(size)); + } - picker.setSingleChoiceItems(R.array.text_size, n - 1, - new DialogInterface.OnClickListener() { + @Override + public void onStartTrackingTouch(SeekBar arg0) { + } - @Override - public void onClick(DialogInterface dialog, int which) { - mPreferences.setTextSize(which + 1); - } - }); - picker.setNeutralButton(getResources().getString(R.string.action_ok), - new DialogInterface.OnClickListener() { + @Override + public void onStopTrackingTouch(SeekBar arg0) { + } - @Override - public void onClick(DialogInterface dialog, int which) { + }); + final int MAX = 5; + bar.setMax(MAX); + bar.setProgress(MAX - mPreferences.getTextSize()); + builder.setView(view); + builder.setTitle(R.string.title_text_size); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - } - }); - picker.show(); + @Override + public void onClick(DialogInterface arg0, int arg1) { + mPreferences.setTextSize(MAX - bar.getProgress()); + } + + }); + builder.show(); + } + + private float getTextSize(int size) { + switch (size) { + case 0: + return XSMALL; + case 1: + return SMALL; + case 2: + return MEDIUM; + case 3: + return LARGE; + case 4: + return XLARGE; + case 5: + return XXLARGE; + default: + return MEDIUM; + } } private void themePicker() { diff --git a/app/src/main/java/acr/browser/lightning/object/SearchAdapter.java b/app/src/main/java/acr/browser/lightning/object/SearchAdapter.java index 7fd3865..750ae67 100644 --- a/app/src/main/java/acr/browser/lightning/object/SearchAdapter.java +++ b/app/src/main/java/acr/browser/lightning/object/SearchAdapter.java @@ -1,10 +1,10 @@ package acr.browser.lightning.object; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; -import android.content.res.Resources.Theme; import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.AsyncTask; @@ -40,6 +40,7 @@ import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.HistoryDatabase; import acr.browser.lightning.database.HistoryItem; import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.Utils; public class SearchAdapter extends BaseAdapter implements Filterable { @@ -59,15 +60,15 @@ public class SearchAdapter extends BaseAdapter implements Filterable { private static final String ENCODING = "ISO-8859-1"; private static final long INTERVAL_DAY = 86400000; private final String mSearchSubtitle; - private static final int API = Build.VERSION.SDK_INT; - private final Theme mTheme; private SearchFilter mFilter; + private final Drawable mSearchDrawable; + private final Drawable mHistoryDrawable; + private final Drawable mBookmarkDrawable; public SearchAdapter(Context context, boolean dark, boolean incognito) { mDatabaseHandler = HistoryDatabase.getInstance(context.getApplicationContext()); - mTheme = context.getTheme(); mBookmarkManager = BookmarkManager.getInstance(context.getApplicationContext()); - mAllBookmarks.addAll(mBookmarkManager.getBookmarks(true)); + mAllBookmarks.addAll(mBookmarkManager.getAllBookmarks(true)); mUseGoogle = PreferenceManager.getInstance().getGoogleSearchSuggestionsEnabled(); mContext = context; mSearchSubtitle = mContext.getString(R.string.suggestion); @@ -81,6 +82,21 @@ public class SearchAdapter extends BaseAdapter implements Filterable { } }); + int color = mDarkTheme ? ThemeUtils.getIconDarkThemeColor(context) : ThemeUtils.getIconLightThemeColor(context); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mSearchDrawable = context.getDrawable(R.drawable.ic_search); + mBookmarkDrawable = context.getDrawable(R.drawable.ic_bookmark); + mHistoryDrawable = context.getDrawable(R.drawable.ic_history); + } else { + mSearchDrawable = context.getResources().getDrawable(R.drawable.ic_search); + mBookmarkDrawable = context.getResources().getDrawable(R.drawable.ic_bookmark); + mHistoryDrawable = context.getResources().getDrawable(R.drawable.ic_history); + } + if (mSearchDrawable != null && mBookmarkDrawable != null && mHistoryDrawable != null) { + mSearchDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + mBookmarkDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + mHistoryDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } delete.start(); } @@ -117,7 +133,7 @@ public class SearchAdapter extends BaseAdapter implements Filterable { public void refreshBookmarks() { mAllBookmarks.clear(); - mAllBookmarks.addAll(mBookmarkManager.getBookmarks(true)); + mAllBookmarks.addAll(mBookmarkManager.getAllBookmarks(true)); } @Override @@ -135,8 +151,6 @@ public class SearchAdapter extends BaseAdapter implements Filterable { return 0; } - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") @Override public View getView(int position, View convertView, ViewGroup parent) { SuggestionHolder holder; @@ -158,42 +172,34 @@ public class SearchAdapter extends BaseAdapter implements Filterable { holder.mTitle.setText(web.getTitle()); holder.mUrl.setText(web.getUrl()); - int imageId = R.drawable.ic_bookmark; + Drawable image; switch (web.getImageId()) { case R.drawable.ic_bookmark: { - if (!mDarkTheme) { - imageId = R.drawable.ic_bookmark; - } else { + if (mDarkTheme) holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_bookmark_dark; - } + image = mBookmarkDrawable; break; } case R.drawable.ic_search: { - if (!mDarkTheme) { - imageId = R.drawable.ic_search; - } else { + if (mDarkTheme) holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_search_dark; - } + image = mSearchDrawable; break; } case R.drawable.ic_history: { - if (!mDarkTheme) { - imageId = R.drawable.ic_history; - } else { + if (mDarkTheme) holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_history_dark; - } + image = mHistoryDrawable; break; } + default: + if (mDarkTheme) + holder.mTitle.setTextColor(Color.WHITE); + image = mSearchDrawable; + break; } - if (API < Build.VERSION_CODES.LOLLIPOP) { - holder.mImage.setImageDrawable(mContext.getResources().getDrawable(imageId)); - } else { - holder.mImage.setImageDrawable(mContext.getResources().getDrawable(imageId, mTheme)); - } + holder.mImage.setImageDrawable(image); return convertView; } @@ -339,26 +345,30 @@ public class SearchAdapter extends BaseAdapter implements Filterable { if (!isNetworkConnected(mContext)) { return cacheFile; } + InputStream in = null; + FileOutputStream fos = null; try { URL url = new URL("http://google.com/complete/search?q=" + query + "&output=toolbar&hl=en"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); - InputStream in = connection.getInputStream(); + in = connection.getInputStream(); if (in != null) { - FileOutputStream fos = new FileOutputStream(cacheFile); + fos = new FileOutputStream(cacheFile); int buffer; while ((buffer = in.read()) != -1) { fos.write(buffer); } fos.flush(); - fos.close(); } cacheFile.setLastModified(System.currentTimeMillis()); } catch (Exception e) { e.printStackTrace(); + } finally { + Utils.close(in); + Utils.close(fos); } return cacheFile; } diff --git a/app/src/main/java/acr/browser/lightning/reading/ArticleTextExtractor.java b/app/src/main/java/acr/browser/lightning/reading/ArticleTextExtractor.java index 0bc9a4e..ae22cd3 100644 --- a/app/src/main/java/acr/browser/lightning/reading/ArticleTextExtractor.java +++ b/app/src/main/java/acr/browser/lightning/reading/ArticleTextExtractor.java @@ -19,7 +19,7 @@ import org.jsoup.select.Elements; /** * This class is thread safe. - * + * * @author Alex P (ifesdjeen from jreadability) * @author Peter Karich */ @@ -246,7 +246,7 @@ public class ArticleTextExtractor { /** * Tries to extract an image url from metadata if determineImageSource * failed - * + * * @return image url or empty str */ protected String extractImageUrl(Document doc) { @@ -291,7 +291,7 @@ public class ArticleTextExtractor { * weighting child nodes. Since it's impossible to predict which exactly * names, ids or class names will be used in HTML, major role is played by * child nodes - * + * * @param e * Element to weight, along with child nodes */ @@ -311,7 +311,7 @@ public class ArticleTextExtractor { * 3 points for every element that's nested 2 levels deep. This way we give * more chances to extract the element that has less nested levels, * increasing probability of the correct extraction. - * + * * @param rootEl * Element, who's child nodes will be weighted */ @@ -493,7 +493,7 @@ public class ArticleTextExtractor { * Prepares document. Currently only stipping unlikely candidates, since * from time to time they're getting more score than good ones especially in * cases when major text is short. - * + * * @param doc * document to prepare. Passed as reference, and changed inside * of function @@ -506,7 +506,7 @@ public class ArticleTextExtractor { /** * Removes unlikely candidates from HTML. Currently takes id and class name * and matches them against list of patterns - * + * * @param doc * document to strip unlikely candidates from */ @@ -601,9 +601,9 @@ public class ArticleTextExtractor { /** * Comparator for Image by weight - * + * * @author Chris Alexander, chris@chris-alexander.co.uk - * + * */ public class ImageComparator implements Comparator { diff --git a/app/src/main/java/acr/browser/lightning/receiver/NetworkReceiver.java b/app/src/main/java/acr/browser/lightning/receiver/NetworkReceiver.java new file mode 100644 index 0000000..3c39475 --- /dev/null +++ b/app/src/main/java/acr/browser/lightning/receiver/NetworkReceiver.java @@ -0,0 +1,22 @@ +package acr.browser.lightning.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +public class NetworkReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + } + + public static boolean isConnected(Context context) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm == null) + return false; + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + return activeNetwork != null && activeNetwork.isConnected(); + } +} \ No newline at end of file diff --git a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java index 36ca4fb..ad1084c 100644 --- a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java +++ b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java @@ -1,10 +1,24 @@ package acr.browser.lightning.utils; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; import android.support.annotation.AttrRes; +import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.TypedValue; +import android.widget.ImageView; import acr.browser.lightning.R; @@ -31,4 +45,44 @@ public class ThemeUtils { return color; } + public static int getIconLightThemeColor(@NonNull Context context) { + return context.getResources().getColor(R.color.icon_light_theme); + } + + public static int getIconDarkThemeColor(@NonNull Context context) { + return context.getResources().getColor(R.color.icon_dark_theme); + } + + public static void themeImageView(ImageView icon, Context context, boolean dark) { + int color = dark ? getIconDarkThemeColor(context) : getIconLightThemeColor(context); + icon.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + + public static Bitmap getThemedBitmap(Context context, @DrawableRes int res, boolean dark) { + int color = dark ? getIconDarkThemeColor(context) : getIconLightThemeColor(context); + Bitmap sourceBitmap = BitmapFactory.decodeResource(context.getResources(), res); + Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Paint p = new Paint(); + ColorFilter filter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); + p.setColorFilter(filter); + Canvas canvas = new Canvas(resultBitmap); + canvas.drawBitmap(sourceBitmap, 0, 0, p); + sourceBitmap.recycle(); + return resultBitmap; + } + + @Nullable + public static Drawable getLightThemedDrawable(@NonNull Context context, @DrawableRes int res){ + final Drawable drawable; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + drawable = context.getResources().getDrawable(res); + } else { + drawable = context.getDrawable(res); + } + if (drawable == null) + return null; + drawable.mutate(); + drawable.setColorFilter(getIconLightThemeColor(context), PorterDuff.Mode.SRC_IN); + return drawable; + } } diff --git a/app/src/main/java/acr/browser/lightning/utils/Utils.java b/app/src/main/java/acr/browser/lightning/utils/Utils.java index 5b208e3..6ef4f22 100644 --- a/app/src/main/java/acr/browser/lightning/utils/Utils.java +++ b/app/src/main/java/acr/browser/lightning/utils/Utils.java @@ -15,7 +15,12 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Environment; +import android.support.annotation.DrawableRes; +import android.support.annotation.IntegerRes; +import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; @@ -38,9 +43,6 @@ import acr.browser.lightning.download.DownloadHandler; public final class Utils { - private Utils() { - } - public static void downloadFile(final Activity activity, final String url, final String userAgent, final String contentDisposition) { String fileName = URLUtil.guessFileName(url, null, null); @@ -75,15 +77,13 @@ public final class Utils { alert.show(); } - public static void showSnackbar(Activity activity, @StringRes int resource) { - if (activity == null) return; + public static void showSnackbar(@NonNull Activity activity, @StringRes int resource) { View view = activity.findViewById(android.R.id.content); if (view == null) return; Snackbar.make(view, resource, Snackbar.LENGTH_SHORT).show(); } - public static void showSnackbar(Activity activity, String message) { - if (activity == null) return; + public static void showSnackbar(@NonNull Activity activity, String message) { View view = activity.findViewById(android.R.id.content); if (view == null) return; Snackbar.make(view, message, Snackbar.LENGTH_SHORT).show(); @@ -232,23 +232,6 @@ public final class Utils { return false; } - public static Bitmap getWebpageBitmap(Resources resources, boolean dark) { - if (dark) { - if (mWebIconDark == null) { - mWebIconDark = BitmapFactory.decodeResource(resources, R.drawable.ic_webpage_dark); - } - return mWebIconDark; - } else { - if (mWebIconLight == null) { - mWebIconLight = BitmapFactory.decodeResource(resources, R.drawable.ic_webpage); - } - return mWebIconLight; - } - } - - private static Bitmap mWebIconLight; - private static Bitmap mWebIconDark; - public static void close(Closeable closeable) { if (closeable == null) return; @@ -258,4 +241,13 @@ public final class Utils { e.printStackTrace(); } } + + public static Drawable getDrawable(Context context, @DrawableRes int res) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + return context.getDrawable(res); + } else { + return context.getResources().getDrawable(res); + } + } + } diff --git a/app/src/main/java/acr/browser/lightning/view/LightningView.java b/app/src/main/java/acr/browser/lightning/view/LightningView.java index 953837f..a82a7a6 100644 --- a/app/src/main/java/acr/browser/lightning/view/LightningView.java +++ b/app/src/main/java/acr/browser/lightning/view/LightningView.java @@ -62,6 +62,7 @@ import acr.browser.lightning.download.LightningDownloadListener; import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.utils.AdBlock; import acr.browser.lightning.utils.IntentUtils; +import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.Utils; public class LightningView { @@ -82,6 +83,7 @@ public class LightningView { private boolean isForegroundTab; private boolean mTextReflow = false; private boolean mInvertPage = false; + private boolean mToggleDesktop = false; private static float mMaxFling; private static final int API = android.os.Build.VERSION.SDK_INT; private static final int SCROLL_UP_THRESHOLD = Utils.convertDpToPixels(10); @@ -91,8 +93,6 @@ public class LightningView { 0, 0, 0, 1.0f, 0 // alpha }; - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") public LightningView(Activity activity, String url, boolean darkTheme) { mActivity = activity; @@ -100,7 +100,7 @@ public class LightningView { mTitle = new Title(activity, darkTheme); mAdBlock = AdBlock.getInstance(activity.getApplicationContext()); - mWebpageBitmap = Utils.getWebpageBitmap(activity.getResources(), darkTheme); + mWebpageBitmap = mTitle.mDefaultIcon; mMaxFling = ViewConfiguration.get(activity).getScaledMaximumFlingVelocity(); @@ -119,7 +119,7 @@ public class LightningView { mWebView.setAlwaysDrawnWithCacheEnabled(false); mWebView.setBackgroundColor(0); - if (API > 15) { + if (API >= Build.VERSION_CODES.JELLY_BEAN) { mWebView.setBackground(null); mWebView.getRootView().setBackground(null); } else if (mWebView.getRootView() != null) { @@ -127,6 +127,7 @@ public class LightningView { } mWebView.setScrollbarFadingEnabled(true); mWebView.setSaveEnabled(true); + mWebView.setNetworkAvailable(true); mWebView.setWebChromeClient(new LightningChromeClient(activity)); mWebView.setWebViewClient(new LightningWebClient(activity)); mWebView.setDownloadListener(new LightningDownloadListener(activity)); @@ -238,12 +239,14 @@ public class LightningView { homepageBuilder.append(StartPage.END); File homepage = new File(mActivity.getFilesDir(), "homepage.html"); + FileWriter hWriter = null; try { - FileWriter hWriter = new FileWriter(homepage, false); + hWriter = new FileWriter(homepage, false); hWriter.write(homepageBuilder.toString()); - hWriter.close(); } catch (IOException e) { e.printStackTrace(); + } finally { + Utils.close(hWriter); } return Constants.FILE + homepage; @@ -284,24 +287,7 @@ public class LightningView { } } - switch (mPreferences.getUserAgentChoice()) { - case 1: - if (API > 16) { - mSettings.setUserAgentString(WebSettings.getDefaultUserAgent(context)); - } else { - mSettings.setUserAgentString(mDefaultUserAgent); - } - break; - case 2: - mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT); - break; - case 3: - mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT); - break; - case 4: - mSettings.setUserAgentString(mPreferences.getUserAgentString(mDefaultUserAgent)); - break; - } + setUserAgent(context, mPreferences.getUserAgentChoice()); if (mPreferences.getSavePasswordsEnabled() && !mBrowserController.isIncognito()) { if (API < 18) { @@ -342,12 +328,15 @@ public class LightningView { mSettings.setUseWideViewPort(mPreferences.getUseWideViewportEnabled()); mSettings.setLoadWithOverviewMode(mPreferences.getOverviewModeEnabled()); switch (mPreferences.getTextSize()) { - case 1: + case 0: mSettings.setTextZoom(200); break; - case 2: + case 1: mSettings.setTextZoom(150); break; + case 2: + mSettings.setTextZoom(125); + break; case 3: mSettings.setTextZoom(100); break; @@ -404,6 +393,37 @@ public class LightningView { } } + public void toggleDesktopUA(@NonNull Context context) { + if (mWebView == null) + return; + if (!mToggleDesktop) + mWebView.getSettings().setUserAgentString(Constants.DESKTOP_USER_AGENT); + else + setUserAgent(context, mPreferences.getUserAgentChoice()); + mToggleDesktop = !mToggleDesktop; + } + + public void setUserAgent(Context context, int choice) { + switch (choice) { + case 1: + if (API > 16) { + mSettings.setUserAgentString(WebSettings.getDefaultUserAgent(context)); + } else { + mSettings.setUserAgentString(mDefaultUserAgent); + } + break; + case 2: + mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT); + break; + case 3: + mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT); + break; + case 4: + mSettings.setUserAgentString(mPreferences.getUserAgentString(mDefaultUserAgent)); + break; + } + } + public boolean isShown() { return mWebView != null && mWebView.isShown(); } @@ -685,6 +705,7 @@ public class LightningView { public void onPageFinished(WebView view, String url) { if (view.isShown()) { mBrowserController.updateUrl(url, true); + mBrowserController.updateBookmarkIndicator(url); view.postInvalidate(); } if (view.getTitle() == null || view.getTitle().isEmpty()) { @@ -702,6 +723,7 @@ public class LightningView { public void onPageStarted(WebView view, String url, Bitmap favicon) { if (isShown()) { mBrowserController.updateUrl(url, false); + mBrowserController.updateBookmarkIndicator(url); mBrowserController.showActionBar(); } mTitle.setFavicon(mWebpageBitmap); @@ -1042,7 +1064,7 @@ public class LightningView { private final Bitmap mDefaultIcon; public Title(Context context, boolean darkTheme) { - mDefaultIcon = Utils.getWebpageBitmap(context.getResources(), darkTheme); + mDefaultIcon = ThemeUtils.getThemedBitmap(context, R.drawable.ic_webpage, darkTheme); mFavicon = mDefaultIcon; mTitle = mActivity.getString(R.string.action_new_tab); } diff --git a/app/src/main/res/drawable-hdpi/ic_action_back.png b/app/src/main/res/drawable-hdpi/ic_action_back.png index 59af5ca..11b4ddf 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_back.png and b/app/src/main/res/drawable-hdpi/ic_action_back.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_back_dark.png b/app/src/main/res/drawable-hdpi/ic_action_back_dark.png deleted file mode 100644 index a44b17f..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_back_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_collapse.png b/app/src/main/res/drawable-hdpi/ic_action_collapse.png index 68f40d3..e99b979 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_collapse.png and b/app/src/main/res/drawable-hdpi/ic_action_collapse.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_copy.png b/app/src/main/res/drawable-hdpi/ic_action_copy.png index f2db64e..3da2504 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_copy.png and b/app/src/main/res/drawable-hdpi/ic_action_copy.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_delete.png b/app/src/main/res/drawable-hdpi/ic_action_delete.png index ede3869..206c53d 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_delete.png and b/app/src/main/res/drawable-hdpi/ic_action_delete.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_delete_dark.png b/app/src/main/res/drawable-hdpi/ic_action_delete_dark.png deleted file mode 100644 index c6f7100..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_delete_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_desktop.png b/app/src/main/res/drawable-hdpi/ic_action_desktop.png new file mode 100644 index 0000000..5236883 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_desktop.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_expand.png b/app/src/main/res/drawable-hdpi/ic_action_expand.png index 2794d3e..82e354d 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_expand.png and b/app/src/main/res/drawable-hdpi/ic_action_expand.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_forward.png b/app/src/main/res/drawable-hdpi/ic_action_forward.png index b7cf852..f8dc437 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_forward.png and b/app/src/main/res/drawable-hdpi/ic_action_forward.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_forward_dark.png b/app/src/main/res/drawable-hdpi/ic_action_forward_dark.png deleted file mode 100644 index 854e1f5..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_forward_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_invert.png b/app/src/main/res/drawable-hdpi/ic_action_invert.png new file mode 100644 index 0000000..67db815 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_invert.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_invert_dark.png b/app/src/main/res/drawable-hdpi/ic_action_invert_dark.png deleted file mode 100644 index bd6cd0d..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_invert_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_invert_light.png b/app/src/main/res/drawable-hdpi/ic_action_invert_light.png deleted file mode 100644 index d35a668..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_invert_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_plus.png b/app/src/main/res/drawable-hdpi/ic_action_plus.png index d475a21..de178fa 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_plus.png and b/app/src/main/res/drawable-hdpi/ic_action_plus.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_plus_dark.png b/app/src/main/res/drawable-hdpi/ic_action_plus_dark.png deleted file mode 100644 index 6b859ad..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_plus_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_reading.png b/app/src/main/res/drawable-hdpi/ic_action_reading.png new file mode 100644 index 0000000..9db0d62 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_reading.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_refresh.png b/app/src/main/res/drawable-hdpi/ic_action_refresh.png index d2baf5b..34507ff 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_refresh.png and b/app/src/main/res/drawable-hdpi/ic_action_refresh.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_star.png b/app/src/main/res/drawable-hdpi/ic_action_star.png index 2946438..63d0562 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_action_star.png and b/app/src/main/res/drawable-hdpi/ic_action_star.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_star_dark.png b/app/src/main/res/drawable-hdpi/ic_action_star_dark.png deleted file mode 100644 index a04d62f..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_star_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_tabs.png b/app/src/main/res/drawable-hdpi/ic_action_tabs.png new file mode 100644 index 0000000..292389c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_tabs.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_tabs_dark.png b/app/src/main/res/drawable-hdpi/ic_action_tabs_dark.png deleted file mode 100644 index a894d9c..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_tabs_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_tabs_light.png b/app/src/main/res/drawable-hdpi/ic_action_tabs_light.png deleted file mode 100644 index 1a3ebfd..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_tabs_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_text_size.png b/app/src/main/res/drawable-hdpi/ic_action_text_size.png new file mode 100644 index 0000000..d402918 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_text_size.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_text_size_dark.png b/app/src/main/res/drawable-hdpi/ic_action_text_size_dark.png deleted file mode 100644 index a77414d..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_text_size_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_text_size_light.png b/app/src/main/res/drawable-hdpi/ic_action_text_size_light.png deleted file mode 100644 index 3069b3c..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_text_size_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_bookmark.png b/app/src/main/res/drawable-hdpi/ic_bookmark.png index 388f290..00fdd74 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_bookmark.png and b/app/src/main/res/drawable-hdpi/ic_bookmark.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_bookmark_dark.png b/app/src/main/res/drawable-hdpi/ic_bookmark_dark.png deleted file mode 100644 index 6890a42..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_bookmark_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_folder.png b/app/src/main/res/drawable-hdpi/ic_folder.png new file mode 100644 index 0000000..20fe938 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_folder.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_history.png b/app/src/main/res/drawable-hdpi/ic_history.png index 1426207..0d51442 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_history.png and b/app/src/main/res/drawable-hdpi/ic_history.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_history_dark.png b/app/src/main/res/drawable-hdpi/ic_history_dark.png deleted file mode 100644 index 1a565c8..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_history_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_search.png b/app/src/main/res/drawable-hdpi/ic_search.png index 163b86f..3b014b9 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_search.png and b/app/src/main/res/drawable-hdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_search_dark.png b/app/src/main/res/drawable-hdpi/ic_search_dark.png deleted file mode 100644 index c38b62f..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_search_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_webpage.png b/app/src/main/res/drawable-hdpi/ic_webpage.png index 595d129..346044c 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_webpage.png and b/app/src/main/res/drawable-hdpi/ic_webpage.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_webpage_dark.png b/app/src/main/res/drawable-hdpi/ic_webpage_dark.png deleted file mode 100644 index e2c2dd9..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_webpage_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_back.png b/app/src/main/res/drawable-xhdpi/ic_action_back.png index b5ae6c6..e44a4fc 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_back.png and b/app/src/main/res/drawable-xhdpi/ic_action_back.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_back_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_back_dark.png deleted file mode 100644 index 2e590b6..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_back_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_collapse.png b/app/src/main/res/drawable-xhdpi/ic_action_collapse.png index ea61cec..1c74a32 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_collapse.png and b/app/src/main/res/drawable-xhdpi/ic_action_collapse.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_copy.png b/app/src/main/res/drawable-xhdpi/ic_action_copy.png index a59809a..3abcd4f 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_copy.png and b/app/src/main/res/drawable-xhdpi/ic_action_copy.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_delete.png b/app/src/main/res/drawable-xhdpi/ic_action_delete.png index 8568f44..3320822 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_delete.png and b/app/src/main/res/drawable-xhdpi/ic_action_delete.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_delete_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_delete_dark.png deleted file mode 100644 index 456573f..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_delete_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_desktop.png b/app/src/main/res/drawable-xhdpi/ic_action_desktop.png new file mode 100644 index 0000000..8780b1c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_desktop.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_expand.png b/app/src/main/res/drawable-xhdpi/ic_action_expand.png index d3a3a72..595d639 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_expand.png and b/app/src/main/res/drawable-xhdpi/ic_action_expand.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_forward.png b/app/src/main/res/drawable-xhdpi/ic_action_forward.png index a7e916e..3bf25d5 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_forward.png and b/app/src/main/res/drawable-xhdpi/ic_action_forward.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_forward_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_forward_dark.png deleted file mode 100644 index 876b2e0..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_forward_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_invert.png b/app/src/main/res/drawable-xhdpi/ic_action_invert.png new file mode 100644 index 0000000..0ec4c37 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_invert.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_invert_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_invert_dark.png deleted file mode 100644 index 937dbe9..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_invert_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_invert_light.png b/app/src/main/res/drawable-xhdpi/ic_action_invert_light.png deleted file mode 100644 index 48149db..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_invert_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_plus.png b/app/src/main/res/drawable-xhdpi/ic_action_plus.png index 348982c..0723c99 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_plus.png and b/app/src/main/res/drawable-xhdpi/ic_action_plus.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_plus_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_plus_dark.png deleted file mode 100644 index 849ed06..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_plus_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_reading.png b/app/src/main/res/drawable-xhdpi/ic_action_reading.png new file mode 100644 index 0000000..8a8ec6c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_reading.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png index 0a3dc5a..740eaed 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png and b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_star.png b/app/src/main/res/drawable-xhdpi/ic_action_star.png index dbb747d..06c202f 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_star.png and b/app/src/main/res/drawable-xhdpi/ic_action_star.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_star_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_star_dark.png deleted file mode 100644 index b7c2ba9..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_star_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_tabs.png b/app/src/main/res/drawable-xhdpi/ic_action_tabs.png new file mode 100644 index 0000000..0b6881a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_tabs.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_tabs_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_tabs_dark.png deleted file mode 100644 index 20ce803..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_tabs_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_tabs_light.png b/app/src/main/res/drawable-xhdpi/ic_action_tabs_light.png deleted file mode 100644 index bc169db..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_tabs_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_text_size.png b/app/src/main/res/drawable-xhdpi/ic_action_text_size.png new file mode 100644 index 0000000..ae530e3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_text_size.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_text_size_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_text_size_dark.png deleted file mode 100644 index de5ed93..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_text_size_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_text_size_light.png b/app/src/main/res/drawable-xhdpi/ic_action_text_size_light.png deleted file mode 100644 index d325391..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_text_size_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmark.png b/app/src/main/res/drawable-xhdpi/ic_bookmark.png index f9a207d..ca87cdf 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_bookmark.png and b/app/src/main/res/drawable-xhdpi/ic_bookmark.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmark_dark.png b/app/src/main/res/drawable-xhdpi/ic_bookmark_dark.png deleted file mode 100644 index 4336388..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_bookmark_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_folder.png b/app/src/main/res/drawable-xhdpi/ic_folder.png new file mode 100644 index 0000000..829c181 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_folder.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_history.png b/app/src/main/res/drawable-xhdpi/ic_history.png index f16bd44..2a7b044 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_history.png and b/app/src/main/res/drawable-xhdpi/ic_history.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_history_dark.png b/app/src/main/res/drawable-xhdpi/ic_history_dark.png deleted file mode 100644 index 2f19dc3..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_history_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_search.png b/app/src/main/res/drawable-xhdpi/ic_search.png index 07e472c..82553c6 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_search.png and b/app/src/main/res/drawable-xhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_search_dark.png b/app/src/main/res/drawable-xhdpi/ic_search_dark.png deleted file mode 100644 index a0b4138..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_search_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_webpage.png b/app/src/main/res/drawable-xhdpi/ic_webpage.png index 9c31d1d..b939b9e 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_webpage.png and b/app/src/main/res/drawable-xhdpi/ic_webpage.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_webpage_dark.png b/app/src/main/res/drawable-xhdpi/ic_webpage_dark.png deleted file mode 100644 index 7524ab5..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_webpage_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_back.png b/app/src/main/res/drawable-xxhdpi/ic_action_back.png index 1499094..ae8a0a6 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_back.png and b/app/src/main/res/drawable-xxhdpi/ic_action_back.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_back_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_back_dark.png deleted file mode 100644 index 11319e4..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_back_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_collapse.png b/app/src/main/res/drawable-xxhdpi/ic_action_collapse.png index ac22f8a..c12d0de 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_collapse.png and b/app/src/main/res/drawable-xxhdpi/ic_action_collapse.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_copy.png b/app/src/main/res/drawable-xxhdpi/ic_action_copy.png index a11adc6..8a980d7 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_copy.png and b/app/src/main/res/drawable-xxhdpi/ic_action_copy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_delete.png b/app/src/main/res/drawable-xxhdpi/ic_action_delete.png index dfdc369..fac932f 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_delete.png and b/app/src/main/res/drawable-xxhdpi/ic_action_delete.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png deleted file mode 100644 index 37a738d..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_desktop.png b/app/src/main/res/drawable-xxhdpi/ic_action_desktop.png new file mode 100644 index 0000000..6777c07 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_desktop.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_expand.png b/app/src/main/res/drawable-xxhdpi/ic_action_expand.png index 12bfe7d..f4d927f 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_expand.png and b/app/src/main/res/drawable-xxhdpi/ic_action_expand.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_forward.png b/app/src/main/res/drawable-xxhdpi/ic_action_forward.png index 41b6105..4ffb590 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_forward.png and b/app/src/main/res/drawable-xxhdpi/ic_action_forward.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_forward_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_forward_dark.png deleted file mode 100644 index f603f13..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_forward_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_invert.png b/app/src/main/res/drawable-xxhdpi/ic_action_invert.png new file mode 100644 index 0000000..f35f65d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_invert.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_invert_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_invert_dark.png deleted file mode 100644 index c82ea79..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_invert_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_invert_light.png b/app/src/main/res/drawable-xxhdpi/ic_action_invert_light.png deleted file mode 100644 index 9e6844f..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_invert_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_plus.png b/app/src/main/res/drawable-xxhdpi/ic_action_plus.png index 75402a9..6fdc549 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_plus.png and b/app/src/main/res/drawable-xxhdpi/ic_action_plus.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_plus_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_plus_dark.png deleted file mode 100644 index 7927662..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_plus_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_reading.png b/app/src/main/res/drawable-xxhdpi/ic_action_reading.png new file mode 100644 index 0000000..cf9c7c0 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_reading.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png index e137835..7772050 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png and b/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_star.png b/app/src/main/res/drawable-xxhdpi/ic_action_star.png index 02b1ebf..1287ac8 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_star.png and b/app/src/main/res/drawable-xxhdpi/ic_action_star.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_star_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_star_dark.png deleted file mode 100644 index 44d9afd..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_star_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_tabs.png b/app/src/main/res/drawable-xxhdpi/ic_action_tabs.png new file mode 100644 index 0000000..0869e32 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_tabs.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_tabs_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_tabs_dark.png deleted file mode 100644 index 66cbcea..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_tabs_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_tabs_light.png b/app/src/main/res/drawable-xxhdpi/ic_action_tabs_light.png deleted file mode 100644 index 167f348..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_tabs_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_text_size.png b/app/src/main/res/drawable-xxhdpi/ic_action_text_size.png new file mode 100644 index 0000000..b9279b8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_text_size.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_text_size_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_text_size_dark.png deleted file mode 100644 index 29682af..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_text_size_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_text_size_light.png b/app/src/main/res/drawable-xxhdpi/ic_action_text_size_light.png deleted file mode 100644 index d76000f..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_text_size_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmark.png b/app/src/main/res/drawable-xxhdpi/ic_bookmark.png index 564f64b..79a95b3 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bookmark.png and b/app/src/main/res/drawable-xxhdpi/ic_bookmark.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmark_dark.png b/app/src/main/res/drawable-xxhdpi/ic_bookmark_dark.png deleted file mode 100644 index a039b7b..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bookmark_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_folder.png b/app/src/main/res/drawable-xxhdpi/ic_folder.png new file mode 100644 index 0000000..eba682d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_folder.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_history.png b/app/src/main/res/drawable-xxhdpi/ic_history.png index e1297df..7ae7af1 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_history.png and b/app/src/main/res/drawable-xxhdpi/ic_history.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_history_dark.png b/app/src/main/res/drawable-xxhdpi/ic_history_dark.png deleted file mode 100644 index 53fb748..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_history_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_search.png b/app/src/main/res/drawable-xxhdpi/ic_search.png index d153aab..4098a73 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_search.png and b/app/src/main/res/drawable-xxhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_search_dark.png b/app/src/main/res/drawable-xxhdpi/ic_search_dark.png deleted file mode 100644 index 25fdb5e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_search_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_webpage.png b/app/src/main/res/drawable-xxhdpi/ic_webpage.png index bcdf389..9eee7f1 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_webpage.png and b/app/src/main/res/drawable-xxhdpi/ic_webpage.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_webpage_dark.png b/app/src/main/res/drawable-xxhdpi/ic_webpage_dark.png deleted file mode 100644 index 9f6504e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_webpage_dark.png and /dev/null differ diff --git a/app/src/main/res/layout/bookmark_drawer.xml b/app/src/main/res/layout/bookmark_drawer.xml index 3ceb07f..0a5e553 100644 --- a/app/src/main/res/layout/bookmark_drawer.xml +++ b/app/src/main/res/layout/bookmark_drawer.xml @@ -6,55 +6,124 @@ android:layout_gravity="end" android:background="?attr/drawerBackground" android:clickable="true" + android:weightSum="1" android:fitsSystemWindows="true" - android:orientation="vertical" > + android:orientation="vertical"> - - - - + android:orientation="horizontal"> + + + + + - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/reading_view.xml b/app/src/main/res/layout/reading_view.xml index c086420..759daf1 100644 --- a/app/src/main/res/layout/reading_view.xml +++ b/app/src/main/res/layout/reading_view.xml @@ -1,20 +1,29 @@ + android:orientation="vertical"> - + + android:layout_height="match_parent"> + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="20dp"> + android:orientation="vertical"> - + android:orientation="horizontal"> - - + + + + - - - + - - + android:weightSum="3"> - + android:background="?attr/actionBarItemBackground" + android:clickable="true"> - + android:src="@drawable/ic_action_back" /> + - + android:background="?attr/actionBarItemBackground" + android:clickable="true"> - - + android:src="@drawable/ic_action_plus" /> + - + android:background="?attr/actionBarItemBackground" + android:clickable="true"> - + android:src="@drawable/ic_action_forward" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_list_item.xml b/app/src/main/res/layout/tab_list_item.xml index 5a43f1f..aff83ca 100644 --- a/app/src/main/res/layout/tab_list_item.xml +++ b/app/src/main/res/layout/tab_list_item.xml @@ -1,32 +1,28 @@ - + android:orientation="horizontal" + android:weightSum="1"> - + android:gravity="center_vertical" /> - - + android:gravity="center"> + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml index d54e396..86ddd1f 100644 --- a/app/src/main/res/layout/toolbar.xml +++ b/app/src/main/res/layout/toolbar.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:elevation="2dp" - android:orientation="vertical" > + android:orientation="vertical"> + android:background="?attr/progressBackgroundColor"> - - + diff --git a/app/src/main/res/layout/toolbar_settings.xml b/app/src/main/res/layout/toolbar_settings.xml index ba0f63a..408db8e 100644 --- a/app/src/main/res/layout/toolbar_settings.xml +++ b/app/src/main/res/layout/toolbar_settings.xml @@ -1,9 +1,9 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> @@ -14,7 +14,7 @@ android:id="@+id/action_forward" android:checkable="false" android:enabled="true" - android:icon="?arrowForwardDrawable" + android:icon="@drawable/ic_action_forward" android:title="@string/action_forward" android:visible="true" app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu-large/main.xml b/app/src/main/res/menu-large/main.xml index 7439e7b..a66f887 100644 --- a/app/src/main/res/menu-large/main.xml +++ b/app/src/main/res/menu-large/main.xml @@ -11,7 +11,9 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. + + --> @@ -29,7 +31,7 @@ android:id="@+id/action_forward" android:checkable="false" android:enabled="true" - android:icon="?arrowForwardDrawable" + android:icon="@drawable/ic_action_forward" android:title="@string/action_forward" android:visible="true" app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu-xlarge/incognito.xml b/app/src/main/res/menu-xlarge/incognito.xml index 80bd08e..19afb5f 100644 --- a/app/src/main/res/menu-xlarge/incognito.xml +++ b/app/src/main/res/menu-xlarge/incognito.xml @@ -6,7 +6,7 @@ android:id="@+id/action_back" android:checkable="false" android:enabled="true" - android:icon="?arrowBackDrawable" + android:icon="@drawable/ic_action_back" android:title="@string/action_back" android:visible="true" app:showAsAction="ifRoom"/> @@ -14,7 +14,7 @@ android:id="@+id/action_forward" android:checkable="false" android:enabled="true" - android:icon="?arrowForwardDrawable" + android:icon="@drawable/ic_action_forward" android:title="@string/action_forward" android:visible="true" app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu-xlarge/main.xml b/app/src/main/res/menu-xlarge/main.xml index 7439e7b..a66f887 100644 --- a/app/src/main/res/menu-xlarge/main.xml +++ b/app/src/main/res/menu-xlarge/main.xml @@ -11,7 +11,9 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. + + --> @@ -29,7 +31,7 @@ android:id="@+id/action_forward" android:checkable="false" android:enabled="true" - android:icon="?arrowForwardDrawable" + android:icon="@drawable/ic_action_forward" android:title="@string/action_forward" android:visible="true" app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 1f7be7a..1aad856 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -11,7 +11,8 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. + --> diff --git a/app/src/main/res/menu/reading.xml b/app/src/main/res/menu/reading.xml index 57c9dd1..70ff4d0 100644 --- a/app/src/main/res/menu/reading.xml +++ b/app/src/main/res/menu/reading.xml @@ -4,13 +4,13 @@ diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e1e2287..4812dd3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,5 +1,4 @@ - - - @color/transparent + @null @color/primary_color ?attr/listChoiceBackgroundIndicator @color/primary_color @@ -13,15 +13,13 @@ true false @null - @drawable/ic_action_invert_light - @drawable/ic_action_text_size_light @color/divider_light @@ -68,15 +62,9 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back - @drawable/ic_action_forward @style/overFlowButtonStyle @color/drawer_background - @drawable/ic_action_plus - @drawable/ic_action_delete - @drawable/ic_action_star @color/divider_light - @drawable/ic_action_tabs_light @drawable/list_bg_light true @color/secondary_color @@ -105,15 +93,9 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back_dark - @drawable/ic_action_forward_dark @style/overFlowButtonStyle @color/drawer_background_dark - @drawable/ic_action_plus_dark - @drawable/ic_action_delete_dark - @drawable/ic_action_star_dark @color/divider_dark - @drawable/ic_action_tabs_dark @drawable/list_bg_dark true @color/secondary_color @@ -136,14 +118,8 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back_dark - @drawable/ic_action_forward_dark @style/overFlowButtonStyle @color/black - @drawable/ic_action_plus_dark - @drawable/ic_action_delete_dark - @drawable/ic_action_star_dark - @drawable/ic_action_tabs_dark @color/black @drawable/list_bg_dark true diff --git a/app/src/main/res/values/attr.xml b/app/src/main/res/values/attr.xml index 69fd678..a359d3b 100644 --- a/app/src/main/res/values/attr.xml +++ b/app/src/main/res/values/attr.xml @@ -1,8 +1,6 @@ - - @@ -10,13 +8,7 @@ - - - - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e3d4ab7..072e30f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -30,4 +30,7 @@ #00000000 + #8A000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ccd739c..d9fcece 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,8 +2,7 @@ 260dp - 48dp - - 48dp + 48dp + 48dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 768a4ae..5dd5512 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -203,4 +203,5 @@ App Theme Light Theme Black Theme (AMOLED) + Folder Name diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a721565..e4deb6e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,7 +4,7 @@ @@ -68,14 +62,8 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back - @drawable/ic_action_forward @style/overFlowButtonStyle @color/drawer_background - @drawable/ic_action_plus - @drawable/ic_action_delete - @drawable/ic_action_star - @drawable/ic_action_tabs_light @color/divider_light @drawable/list_bg_light @@ -96,14 +84,8 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back_dark - @drawable/ic_action_forward_dark @style/overFlowButtonStyle @color/drawer_background_dark - @drawable/ic_action_plus_dark - @drawable/ic_action_delete_dark - @drawable/ic_action_star_dark - @drawable/ic_action_tabs_dark @color/divider_dark @drawable/list_bg_dark @@ -124,14 +106,8 @@ @color/gray_dark @color/black @color/gray_medium - @drawable/ic_action_back_dark - @drawable/ic_action_forward_dark @style/overFlowButtonStyle @color/black - @drawable/ic_action_plus_dark - @drawable/ic_action_delete_dark - @drawable/ic_action_star_dark - @drawable/ic_action_tabs_dark @color/black @drawable/list_bg_dark