From c267a8f4ebe3c40dedf686aad41bde06b4111700 Mon Sep 17 00:00:00 2001 From: msmannan00 Date: Tue, 6 Apr 2021 00:07:02 +0500 Subject: [PATCH] Bug Fixes Bug Fixes --- app/build.gradle | 2 +- .../main/assets/Homepage/homepage-dark.html | 2 +- app/src/main/assets/Homepage/homepage.html | 2 +- .../Homepage/javascript/js-homepage-dark.js | 9 +- .../assets/Homepage/javascript/js-homepage.js | 3 + .../Homepage/style/cs-homepage-dark.css | 12 + .../assets/Homepage/style/cs-homepage.css | 12 + .../bookmarkManager/bookmarkAdapter.java | 13 +- .../bridgeManager/bridgeController.java | 14 +- .../appManager/bridgeManager/bridgeModel.java | 29 +- .../bridgeManager/bridgeViewController.java | 6 +- .../historyManager/historyAdapter.java | 13 +- .../geckoManager/NestedGeckoView.java | 8 +- .../geckoManager/geckoClients.java | 33 +- .../geckoManager/geckoSession.java | 76 +++- .../homeManager/hintManager/hintAdapter.java | 79 ++-- .../homeController/homeController.java | 250 ++++++++--- .../homeManager/homeController/homeModel.java | 5 +- .../homeController/homeViewController.java | 116 +++-- .../clearManager/settingClearController.java | 11 +- .../appManager/tabManager/tabAdapter.java | 192 +++++++-- .../appManager/tabManager/tabController.java | 164 +++++-- .../appManager/tabManager/tabEnums.java | 6 +- .../tabManager/tabViewController.java | 27 +- .../genesissearchengine/constants/enums.java | 6 +- .../genesissearchengine/constants/keys.java | 1 + .../genesissearchengine/constants/status.java | 4 +- .../dataManager/dataController.java | 4 +- .../dataManager/suggestionDataModel.java | 9 +- .../dataManager/tabDataModel.java | 44 +- .../helperManager/helperMethod.java | 60 ++- .../pluginManager/messageManager.java | 4 +- .../pluginManager/orbotManager.java | 2 + .../pluginManager/pluginController.java | 2 +- .../generic/xml/gx_generic_tab_button.xml | 14 +- .../images/xml/ic_baseline_badge.xml | 10 + .../images/xml/ic_baseline_cancel.xml | 10 + .../res/custom-xml/tab/xml/tx_card_corner.xml | 17 + .../res/drawable-hdpi/tick_recycler_view.png | Bin 35888 -> 82371 bytes .../alert/layout/popup_data_cleared.xml | 139 +++--- .../res/layouts/alert/layout/popup_find.xml | 10 +- .../alert/layout/popup_update_bridges.xml | 39 +- .../bridge/layout/bridge_settings_view.xml | 3 + .../res/layouts/home/layout/hint_view.xml | 9 +- .../res/layouts/home/layout/home_view.xml | 2 +- .../setting/layout/setting_advance_view.xml | 4 + .../setting/layout/setting_general_view.xml | 3 + .../setting/layout/setting_privacy_view.xml | 403 +++++++++--------- .../setting/layout/setting_tracking_view.xml | 6 + .../res/layouts/tab/layout/tab_grid_view.xml | 110 ++--- .../main/res/layouts/tab/layout/tab_menu.xml | 2 +- .../res/layouts/tab/layout/tab_row_view.xml | 4 +- .../main/res/layouts/tab/layout/tab_view.xml | 7 +- app/src/main/res/values-ca/strings.xml | 9 + app/src/main/res/values-ch/strings.xml | 9 + app/src/main/res/values-de/strings.xml | 9 + app/src/main/res/values-el/strings.xml | 9 + app/src/main/res/values-fr/strings.xml | 9 + app/src/main/res/values-hu/strings.xml | 10 +- app/src/main/res/values-in-rID/strings.xml | 9 + app/src/main/res/values-it/strings.xml | 10 +- app/src/main/res/values-ja-rJP/strings.xml | 8 + app/src/main/res/values-ko/strings.xml | 9 + app/src/main/res/values-nl/strings.xml | 9 + app/src/main/res/values-pt/strings.xml | 8 + app/src/main/res/values-ro/strings.xml | 9 + app/src/main/res/values-ru/strings.xml | 10 +- app/src/main/res/values-th/strings.xml | 9 + app/src/main/res/values-tr/strings.xml | 11 +- app/src/main/res/values-uk/strings.xml | 9 + app/src/main/res/values-ur/strings.xml | 9 + app/src/main/res/values-vi/strings.xml | 9 + app/src/main/res/values-zh/strings.xml | 11 +- app/src/main/res/values/strings.xml | 3 +- .../android/service/OrbotService.java | 137 +++--- .../android/service/util/Prefs.java | 19 + .../service/wrapper/orbotLocalConstants.java | 2 +- 77 files changed, 1668 insertions(+), 690 deletions(-) create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_badge.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_cancel.xml create mode 100644 app/src/main/res/custom-xml/tab/xml/tx_card_corner.xml diff --git a/app/build.gradle b/app/build.gradle index 91384f77..01691d0b 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -151,7 +151,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - implementation 'com.google.android.material:material:1.4.0-alpha01' + implementation 'com.google.android.material:material:1.4.0-alpha02' implementation 'androidx.preference:preference:1.1.1' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.appcompat:appcompat:1.2.0' diff --git a/app/src/main/assets/Homepage/homepage-dark.html b/app/src/main/assets/Homepage/homepage-dark.html index 5b7f1c9a..d0d0a3c3 100644 --- a/app/src/main/assets/Homepage/homepage-dark.html +++ b/app/src/main/assets/Homepage/homepage-dark.html @@ -29,7 +29,7 @@ - +

diff --git a/app/src/main/assets/Homepage/homepage.html b/app/src/main/assets/Homepage/homepage.html index 0e05ef53..15b8086f 100644 --- a/app/src/main/assets/Homepage/homepage.html +++ b/app/src/main/assets/Homepage/homepage.html @@ -29,7 +29,7 @@ - +

diff --git a/app/src/main/assets/Homepage/javascript/js-homepage-dark.js b/app/src/main/assets/Homepage/javascript/js-homepage-dark.js index 450b3cc0..56327496 100644 --- a/app/src/main/assets/Homepage/javascript/js-homepage-dark.js +++ b/app/src/main/assets/Homepage/javascript/js-homepage-dark.js @@ -71,9 +71,12 @@ function onTriggerScriptHandler(pCommand,pData) { $(window).on('load', function() { /* For Local Testing */ - var mResponseJson = '[{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://wikileaks.org/static/img/wl-logo.png", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"}]'; - setTimeout(mHomepageLoader.onLoadReferenceWebsites, 500); - setTimeout(mHomepageLoader.onLoadReferenceWebsiteContent, 1000, mResponseJson); + // var mResponseJson = '[{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://wikileaks.org/static/img/wl-logo.png", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"}]'; + // setTimeout(mHomepageLoader.onLoadReferenceWebsites, 500); + // setTimeout(mHomepageLoader.onLoadReferenceWebsiteContent, 1000, mResponseJson); + document.getElementById("pBody").classList.toggle('body_fadein'); + setTimeout(function (){ onTriggerScriptHandler(Commands.onLoadReferenceWebsites, null) + }, 100); }); diff --git a/app/src/main/assets/Homepage/javascript/js-homepage.js b/app/src/main/assets/Homepage/javascript/js-homepage.js index 64404f8b..8934820a 100644 --- a/app/src/main/assets/Homepage/javascript/js-homepage.js +++ b/app/src/main/assets/Homepage/javascript/js-homepage.js @@ -74,6 +74,9 @@ $(window).on('load', function() { // var mResponseJson = '[{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://wikileaks.org/static/img/wl-logo.png", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"},{ "mIcon":"https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196", "mHeader":"Experience", "mBody":"Donec id elit non mi porta gravida at eget metus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui"}]'; // setTimeout(mHomepageLoader.onLoadReferenceWebsites, 500); // setTimeout(mHomepageLoader.onLoadReferenceWebsiteContent, 1000, mResponseJson); + document.getElementById("pBody").classList.toggle('body_fadein'); + setTimeout(function (){ onTriggerScriptHandler(Commands.onLoadReferenceWebsites, null) + }, 1000); }); diff --git a/app/src/main/assets/Homepage/style/cs-homepage-dark.css b/app/src/main/assets/Homepage/style/cs-homepage-dark.css index ebfe7cc3..af83d036 100644 --- a/app/src/main/assets/Homepage/style/cs-homepage-dark.css +++ b/app/src/main/assets/Homepage/style/cs-homepage-dark.css @@ -1,4 +1,16 @@ /*Search*/ +body{ + opacity: 0; + transition: opacity 2s; + -webkit-transition: opacity 2s; /* Safari */ +} + +.body_fadein { + opacity: 1; + transition-duration: 0.5s; + transition-property: opacity; +} + .line-style { border: 0; height: 1px; diff --git a/app/src/main/assets/Homepage/style/cs-homepage.css b/app/src/main/assets/Homepage/style/cs-homepage.css index de14b372..bc5e08ee 100644 --- a/app/src/main/assets/Homepage/style/cs-homepage.css +++ b/app/src/main/assets/Homepage/style/cs-homepage.css @@ -1,4 +1,16 @@ /*Search*/ +body{ + opacity: 0; + transition: opacity 2s; + -webkit-transition: opacity 2s; /* Safari */ +} + +.body_fadein { + opacity: 1; + transition-duration: 0.5s; + transition-property: opacity; +} + .line-style { border: 0; height: 1px; diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java index 4da066f3..e7d2ca3d 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java @@ -2,6 +2,8 @@ package com.darkweb.genesissearchengine.appManager.bookmarkManager; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Handler; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -17,6 +19,9 @@ import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -441,7 +446,13 @@ public class bookmarkAdapter extends RecyclerView.Adapter mFaviconLogo.setImageDrawable(mHindTypeIconTemp.getDrawable())); + mContext.runOnUiThread(() -> { + Bitmap mBitmap = helperMethod.drawableToBitmap(mHindTypeIconTemp.getDrawable()); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + mBitmap.compress(Bitmap.CompressFormat.PNG, 20, out); + Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); + mFaviconLogo.setImageBitmap(decoded); + }); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java index 64042d1f..cada3377 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java @@ -83,7 +83,7 @@ public class bridgeController extends AppCompatActivity { mCustomBridgeBlocker = findViewById(R.id.pCustomBridgeBlocker); mBridgeViewController.initialization(mCustomPort, mBridgeButton,this, mBridgeObfs, mBridgeChina, mBridgeCustom, mCustomBridgeBlocker); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,0)); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,0,status.sBridgeCustomType)); mBridgeModel = new bridgeModel(new bridgeController.bridgeModelCallback(), this); } @@ -127,10 +127,10 @@ public class bridgeController extends AppCompatActivity { /* EXTERNAL LISTENERS */ - public void onUpdateBridges(String pString) { - if(pString.length()>5){ - mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_CUSTOM_BRIDGE, Collections.singletonList(pString)); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + public void onUpdateBridges(String pBridge, String pType) { + if(pBridge.length()>5){ + mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_CUSTOM_BRIDGE, Arrays.asList(pBridge, pType)); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250, status.sBridgeCustomType)); }else { if(status.sBridgeCustomBridge.equals("meek")){ mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_MEEK_BRIDGE, null); @@ -198,10 +198,10 @@ public class bridgeController extends AppCompatActivity { } public void onMeekChecked(View view){ mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_MEEK_BRIDGE, null); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250, status.sBridgeCustomType)); } public void onObfsChecked(View view){ mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_OBFS_CHECK, null); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250, status.sBridgeCustomType)); } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java index 998202f8..6fd5a868 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java @@ -16,6 +16,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static com.darkweb.genesissearchengine.constants.strings.BRIDGE_CUSTOM_BRIDGE_MEEK; +import static com.darkweb.genesissearchengine.constants.strings.BRIDGE_CUSTOM_BRIDGE_OBFS4; +import static com.darkweb.genesissearchengine.constants.strings.GENERIC_EMPTY_STR; import static com.darkweb.genesissearchengine.pluginManager.pluginEnums.eMessageManager.M_BRIDGE_MAIL; class bridgeModel @@ -38,18 +41,32 @@ class bridgeModel pluginController.getInstance().onMessageManagerInvoke(Arrays.asList(constants.CONST_BACKEND_GOOGLE_URL, mContext), M_BRIDGE_MAIL); } - public void onCustomChecked(String pString){ - status.sBridgeCustomBridge = pString; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + public void onCustomChecked(String pBridge, String pType){ + status.sBridgeCustomBridge = pBridge; + status.sBridgeCustomType = pType; + status.sBridgeGatewayManual = true; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_TYPE,status.sBridgeCustomType)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_GATEWAY_MANUAL,status.sBridgeGatewayManual)); } public void onMeekChecked(){ - status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_MEEK; + status.sBridgeCustomBridge = BRIDGE_CUSTOM_BRIDGE_MEEK; + status.sBridgeCustomType = GENERIC_EMPTY_STR; + status.sBridgeGatewayManual = false; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_TYPE,status.sBridgeCustomType)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_GATEWAY_MANUAL,status.sBridgeGatewayManual)); } public void onObfsChecked(){ - status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_OBFS4; + status.sBridgeCustomBridge = BRIDGE_CUSTOM_BRIDGE_OBFS4; + status.sBridgeCustomType = GENERIC_EMPTY_STR; + status.sBridgeGatewayManual = false; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_TYPE,status.sBridgeCustomType)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_GATEWAY_MANUAL,status.sBridgeGatewayManual)); } public void onTrigger(bridgeEnums.eBridgeModelCommands pCommands, List pData){ @@ -57,7 +74,7 @@ class bridgeModel requestBridges(); } else if(pCommands == bridgeEnums.eBridgeModelCommands.M_CUSTOM_BRIDGE){ - onCustomChecked((String) pData.get(0)); + onCustomChecked((String) pData.get(0), (String) pData.get(1)); } else if(pCommands == bridgeEnums.eBridgeModelCommands.M_MEEK_BRIDGE){ onMeekChecked(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java index de9edb14..bdebe113 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java @@ -106,7 +106,7 @@ class bridgeViewController mCustomBridgeBlocker.setVisibility(View.GONE); } - private void initViews(String p_bridge, int p_duration){ + private void initViews(String p_bridge, int p_duration, String pType){ resetRadioButtons(p_duration); if(p_bridge.equals(strings.BRIDGE_CUSTOM_BRIDGE_OBFS4)){ animateColor(mBridgeObfs, mBridgeObfs.getCurrentTextColor(), mContext.getResources().getColor(R.color.c_text_v1), "textColor", p_duration); @@ -126,13 +126,13 @@ class bridgeViewController mCustomPort.setText(strings.GENERIC_EMPTY_STR); }else { onEnableCustomBridge(); - mCustomPort.setText(p_bridge.replace("\n","")); + mCustomPort.setText(("(Type) " + pType + " ➔ " + "(Config) "+p_bridge.replace("\n",""))); } } public void onTrigger(bridgeEnums.eBridgeViewCommands p_commands, List p_data){ if(p_commands == bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS){ - initViews((String) p_data.get(0), (int)p_data.get(1)); + initViews((String) p_data.get(0), (int)p_data.get(1), (String) p_data.get(2)); } if(p_commands == bridgeEnums.eBridgeViewCommands.M_ENABLE_CUSTOM_BRIDGE){ onEnableCustomBridge(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java index d4f2b37c..2008210f 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java @@ -2,6 +2,8 @@ package com.darkweb.genesissearchengine.appManager.historyManager; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; @@ -19,6 +21,9 @@ import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -488,7 +493,13 @@ public class historyAdapter extends RecyclerView.Adapter mFaviconLogo.setImageDrawable(mHindTypeIconTemp.getDrawable())); + mContext.runOnUiThread(() -> { + Bitmap mBitmap = helperMethod.drawableToBitmap(mHindTypeIconTemp.getDrawable()); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + mBitmap.compress(Bitmap.CompressFormat.PNG, 20, out); + Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); + mFaviconLogo.setImageBitmap(decoded); + }); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/NestedGeckoView.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/NestedGeckoView.java index 38adbe6f..8ea8b29f 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/NestedGeckoView.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/NestedGeckoView.java @@ -9,9 +9,7 @@ import android.view.MotionEvent; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.helperManager.eventObserver; import org.mozilla.geckoview.GeckoView; - import java.util.Collections; - import static com.darkweb.genesissearchengine.constants.enums.etype.GECKO_SCROLL_CHANGED; public class NestedGeckoView extends GeckoView { @@ -48,6 +46,7 @@ public class NestedGeckoView extends GeckoView { switch (action) { case MotionEvent.ACTION_MOVE: + // mEvent.invokeObserver(Collections.singletonList(null), GECKO_SCROLL_FINISHED); final boolean allowScroll = status.sFullScreenBrowsing; int deltaY = mLastY - eventY; @@ -76,15 +75,18 @@ public class NestedGeckoView extends GeckoView { case MotionEvent.ACTION_DOWN: mLastY = eventY; startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); + // mEvent.invokeObserver(Collections.singletonList(null), GECKO_SCROLL_FINISHED); break; case MotionEvent.ACTION_UP: + // mEvent.invokeObserver(Collections.singletonList(null), GECKO_SCROLL_FINISHED); case MotionEvent.ACTION_CANCEL: + // mEvent.invokeObserver(Collections.singletonList(null), GECKO_SCROLL_FINISHED); stopNestedScroll(); break; default: - // We don't care about other touch events + // mEvent.invokeObserver(Collections.singletonList(null), GECKO_SCROLL_FINISHED); } // Execute event handler from parent class in all cases diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoClients.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoClients.java index 888abf1c..0251f94a 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoClients.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoClients.java @@ -14,6 +14,8 @@ import com.darkweb.genesissearchengine.helperManager.helperMethod; import java.io.File; import java.util.List; + +import static com.darkweb.genesissearchengine.constants.constants.CONST_REPORT_URL; import static com.darkweb.genesissearchengine.constants.enums.etype.on_handle_external_intent; import static org.mozilla.geckoview.GeckoSessionSettings.USER_AGENT_MODE_MOBILE; import static org.mozilla.geckoview.StorageController.ClearFlags.AUTH_SESSIONS; @@ -70,10 +72,10 @@ public class geckoClients onUpdateFont(); } - public void onValidateInitializeFromStartup(){ + public void onValidateInitializeFromStartup(NestedGeckoView mNestedGeckoView){ boolean mStatus = mSession.onValidateInitializeFromStartup(); if(mStatus){ - loadURL(mSession.getCurrentURL()); + loadURL(mSession.getCurrentURL(), mNestedGeckoView); } } @@ -145,7 +147,7 @@ public class geckoClients } @SuppressLint("WrongConstant") - public void updateSetting(){ + public void updateSetting(NestedGeckoView mNestedGeckoView){ mRuntime.getSettings().setRemoteDebuggingEnabled(false); mRuntime.getSettings().setWebFontsEnabled(status.sShowWebFonts); mRuntime.getSettings().getContentBlocking().setCookieBehavior(getCookiesBehaviour()); @@ -166,7 +168,7 @@ public class geckoClients mSession.getSettings().setUserAgentMode(USER_AGENT_MODE_MOBILE ); mSession.getSettings().setAllowJavascript(status.sSettingJavaStatus); onUpdateFont(); - onReload(); + onReload(mNestedGeckoView); } public void initSession(geckoSession mSession){ @@ -190,22 +192,24 @@ public class geckoClients mSession.initURL(url); } - public void loadURL(String url) { + public void loadURL(String url, NestedGeckoView mNestedGeckoView) { + mSession = (geckoSession)mNestedGeckoView.getSession(); + if(mSession==null){ + return; + } if(mSession.onGetInitializeFromStartup()){ mSession.initURL(url); - if(url.startsWith("https://boogle.store/?pG") || url.startsWith("https://boogle.store?pG") || url.endsWith("boogle.store") || url.endsWith(constants.CONST_GENESIS_DOMAIN_URL_SLASHED)){ + if(!url.startsWith(CONST_REPORT_URL) && (url.startsWith("https://boogle.store/?pG") || url.startsWith("https://boogle.store?pG") || url.endsWith("boogle.store") || url.endsWith(constants.CONST_GENESIS_DOMAIN_URL_SLASHED))){ try{ mSession.initURL(constants.CONST_GENESIS_DOMAIN_URL); if(status.sTheme == enums.Theme.THEME_LIGHT || helperMethod.isDayMode(context)){ String mURL = constants.CONST_GENESIS_URL_CACHED + "?pData="+ dataController.getInstance().invokeReferenceWebsite(dataEnums.eReferenceWebsiteCommands.M_FETCH,null); mSession.getSettings().setAllowJavascript(true); mSession.loadUri(mURL); - return; }else { String mURL = constants.CONST_GENESIS_URL_CACHED_DARK + "?pData="+ dataController.getInstance().invokeReferenceWebsite(dataEnums.eReferenceWebsiteCommands.M_FETCH,null); mSession.getSettings().setAllowJavascript(true); mSession.loadUri(mURL); - return; } }catch (Exception ex){ ex.printStackTrace(); @@ -217,19 +221,17 @@ public class geckoClients if(status.sTheme == enums.Theme.THEME_LIGHT || helperMethod.isDayMode(context)){ mSession.getSettings().setAllowJavascript(true); mSession.loadUri(constants.CONST_GENESIS_HELP_URL_CACHE); - return; }else { mSession.getSettings().setAllowJavascript(true); mSession.loadUri(constants.CONST_GENESIS_HELP_URL_CACHE_DARK); - return; } }catch (Exception ex){ ex.printStackTrace(); } }else { + mSession.getSettings().setAllowJavascript(status.sSettingJavaStatus); mSession.loadUri(url); } - mSession.getSettings().setAllowJavascript(status.sSettingJavaStatus); } } @@ -310,9 +312,9 @@ public class geckoClients mSession.stop(); } - public void onReload(){ + public void onReload(NestedGeckoView mNestedGeckoView){ mSession.stop(); - loadURL(mSession.getCurrentURL()); + loadURL(mSession.getCurrentURL(), mNestedGeckoView); } public void manual_download(String url, AppCompatActivity context){ @@ -361,7 +363,10 @@ public class geckoClients @Override public Object invokeObserver(List data, Object e_type) { - if (mSessionID!=null && mSessionID.equals(data.get(1)) || e_type.equals(enums.etype.FINDER_RESULT_CALLBACK) || e_type.equals(enums.etype.ON_UPDATE_TAB_TITLE) || e_type.equals(enums.etype.on_update_favicon) ||e_type.equals(enums.etype.on_update_history) || e_type.equals(enums.etype.on_request_completed) || e_type.equals(enums.etype.on_update_suggestion) || e_type.equals(enums.etype.on_update_suggestion_url)) + if(e_type.equals(enums.etype.SESSION_ID)){ + return mSession.getSessionID(); + } + else if (mSessionID!=null && mSessionID.equals(data.get(1)) || e_type.equals(enums.etype.FINDER_RESULT_CALLBACK) || e_type.equals(enums.etype.ON_UPDATE_TAB_TITLE) || e_type.equals(enums.etype.on_update_favicon) ||e_type.equals(enums.etype.on_update_history) || e_type.equals(enums.etype.on_request_completed) || e_type.equals(enums.etype.on_update_suggestion) || e_type.equals(enums.etype.on_update_suggestion_url)) { if (e_type.equals(on_handle_external_intent)) { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java index e245add7..db59b0b3 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java @@ -23,6 +23,8 @@ import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; import android.view.inputmethod.InputMethodManager; import android.widget.Toast; + +import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; @@ -95,6 +97,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele private String mTheme = null; private boolean mPreviousErrorPage = false; private boolean mRemovableFromBackPressed = false; + private boolean mThemeChanged = false; /*Temp Variables*/ private GeckoSession.HistoryDelegate.HistoryList mHistoryList = null; @@ -120,6 +123,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele setContentDelegate(this); setAutoFillDelegate(); setPermissionDelegate(this); + setScrollDelegate(this); mDownloadManager = new geckoDownloadManager(); setPromptDelegate(new geckoPromptView(mContext)); } @@ -148,6 +152,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele } public void onSessionReinit(){ + mCrashCount = 0; if(!isFirstPaintExecuted){ event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id), enums.etype.ON_SESSION_REINIT); }else { @@ -164,6 +169,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele void initURL(String url){ if(mIsLoaded){ + mCrashCount = 0; isPageLoading = true; setURL(url); mCurrentTitle = mCurrentURL; @@ -179,6 +185,10 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele } /*Scroll Delegate*/ + @UiThread + public void onScrollChanged(@NonNull GeckoSession session, int scrollX, int scrollY) { + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme), enums.etype.M_UPDATE_PIXEL_BACKGROUND); + } /*Autofill Delegate*/ @@ -251,13 +261,15 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele if(!isPageLoading){ mCurrentTitle = "loading"; m_current_url_id = -1; - mTheme = null; + //mTheme = null; + mThemeChanged = false; } isPageLoading = true; if(!var2.equals("about:blank") && !mCurrentTitle.equals("loading")){ mProgress = 5; event.invokeObserver(Arrays.asList(5, mSessionID), enums.etype.progress_update); - mTheme = null; + //mTheme = null; + mThemeChanged = false; } } } @@ -266,13 +278,24 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele public void onPageStop(@NonNull GeckoSession var1, boolean var2) { if(var2){ if(mProgress>=100){ - event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, mTheme), enums.etype.ON_UPDATE_THEME); + //event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, mTheme), enums.etype.ON_UPDATE_THEME); event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme), enums.etype.on_update_favicon); event.invokeObserver(Arrays.asList(null,mSessionID), enums.etype.on_page_loaded); + + if(!mThemeChanged){ + new Handler().postDelayed(() -> + { + if(!mThemeChanged){ + mTheme = null; + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, mTheme), enums.etype.ON_UPDATE_THEME); + } + }, 500); + } } } } + @Override public void onProgressChange(@NonNull GeckoSession session, int progress) { @@ -283,6 +306,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele if(!mIsProgressBarChanging){ mIsProgressBarChanging = true; mContext.runOnUiThread(() -> event.invokeObserver(Arrays.asList(mProgress,mSessionID), enums.etype.progress_update)); + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme), enums.etype.M_UPDATE_PIXEL_BACKGROUND); } }else { mIsProgressBarChanging = false; @@ -315,6 +339,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele mHistoryList = var2; } + /*Navigation Delegate*/ public void onLocationChange(@NonNull GeckoSession var1, @Nullable String var2) { @@ -461,8 +486,8 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele @UiThread public void onFirstContentfulPaint(@NonNull GeckoSession var1) { - isFirstPaintExecuted = true; + isFirstPaintExecuted = true; if(mPreviousErrorPage || mCurrentURL.contains("boogle.store") || mCurrentURL.startsWith(CONST_GENESIS_URL_CACHED) || mCurrentURL.startsWith(CONST_GENESIS_URL_CACHED_DARK) || mCurrentURL.startsWith(CONST_GENESIS_HELP_URL_CACHE) || mCurrentURL.toString().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, false), enums.etype.M_ON_BANNER_UPDATE); }else { @@ -475,6 +500,8 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele }else { onSessionReinit(); } + + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme), enums.etype.M_UPDATE_PIXEL_BACKGROUND); } @UiThread @@ -485,9 +512,12 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele @UiThread public void onWebAppManifest(@NonNull GeckoSession var1, @NonNull JSONObject var2) { try { + mThemeChanged = true; mTheme = var2.getString("theme_color"); event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, mTheme), enums.etype.ON_UPDATE_THEME); } catch (Exception ex) { + mTheme = null; + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, mTheme), enums.etype.ON_UPDATE_THEME); ex.printStackTrace(); } event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme), enums.etype.ON_UPDATE_TAB_TITLE); @@ -509,6 +539,39 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele } } + int mCrashCount = 0; + @UiThread + public void onCrash(@NonNull GeckoSession session) { + String mSessionID = (String) event.invokeObserver(null, enums.etype.SESSION_ID); + if(mSessionID.equals(getSessionID())){ + if(mCrashCount<=5){ + final Handler handler = new Handler(); + handler.postDelayed(() -> { + if(!session.isOpen()){ + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme, this), enums.etype.M_OPEN_SESSION); + } + }, mCrashCount*500); + } + mCrashCount+=1; + } + } + + @UiThread + public void onKill(@NonNull GeckoSession session) { + String mSessionID = (String) event.invokeObserver(null, enums.etype.SESSION_ID); + if(mSessionID.equals(getSessionID())){ + if(mCrashCount<=5){ + final Handler handler = new Handler(); + handler.postDelayed(() -> { + if(!session.isOpen()){ + event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id, mTheme, this), enums.etype.M_OPEN_SESSION); + } + }, mCrashCount*500); + } + mCrashCount+=1; + } + } + @Override public void onFullScreen(@NonNull GeckoSession var1, boolean var2) { mFullScreen = var2; @@ -786,7 +849,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele try { mCounter+=1; sleep(100); - if(mCounter>10){ + if(mCounter>100){ return; } } catch (InterruptedException e) { @@ -795,7 +858,8 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele } try { - FinderResult mResult = mFinder.poll(); + FinderResult mResult = mFinder.poll(1000); + Log.i("FUCK","FUCK : " + mResult.found + "----" + mResult.current + "-----" + mResult.total); event.invokeObserver(Arrays.asList(mResult.total, mResult.current), enums.etype.FINDER_RESULT_CALLBACK); } catch (Throwable throwable) { throwable.printStackTrace(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java index b58beb08..cfe0b3a8 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java @@ -2,6 +2,8 @@ package com.darkweb.genesissearchengine.appManager.homeManager.hintManager; import android.annotation.SuppressLint; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.LayoutInflater; @@ -15,6 +17,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; +import androidx.room.Ignore; + import com.darkweb.genesissearchengine.appManager.historyManager.historyRowModel; import com.darkweb.genesissearchengine.appManager.tabManager.tabEnums; import com.darkweb.genesissearchengine.constants.enums; @@ -22,6 +26,9 @@ import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -95,7 +102,7 @@ public class hintAdapter extends RecyclerView.Adapter6){ - break; + if(mURLLink.contains("boogle.store") || mURLLink.contains("genesis.onion")){ + mHintWebIcon.setColorFilter(null); + mHintWebIcon.clearColorFilter(); + mHintWebIcon.setImageTintList(null); + mHintWebIcon.setClipToOutline(true); + mHintWebIcon.setImageDrawable(itemView.getResources().getDrawable(R.drawable.genesis)); + }else + { + new Thread(){ + public void run(){ + try { + mHindTypeIconTemp.setImageDrawable(null); + mEvent.invokeObserver(Arrays.asList(mHindTypeIconTemp, "https://" + helperMethod.getDomainName(model.getDescription())), enums.etype.fetch_favicon); + while (true){ + int mCounter=0; + if(mHindTypeIconTemp.isAttachedToWindow() || mHindTypeIconTemp.getDrawable()==null){ + sleep(10); + mCounter+=1; + }else { + Log.i("BREAK",""); + break; + } + if(mCounter>6){ + break; + } } + + mContext.runOnUiThread(() -> { + mHintWebIcon.setColorFilter(null); + mHintWebIcon.clearColorFilter(); + mHintWebIcon.setImageTintList(null); + mHintWebIcon.setClipToOutline(true); + mWebIcon.put(mURLLink,mHindTypeIconTemp.getDrawable()); + mHintWebIcon.setImageDrawable(mHindTypeIconTemp.getDrawable()); + + }); + + } catch (InterruptedException e) { + e.printStackTrace(); } - - mContext.runOnUiThread(() -> { - mHintWebIcon.setColorFilter(null); - mHintWebIcon.clearColorFilter(); - mHintWebIcon.setImageTintList(null); - mHintWebIcon.setClipToOutline(true); - mHintWebIcon.setImageDrawable(mHindTypeIconTemp.getDrawable()); - mWebIcon.put(mURLLink,mHindTypeIconTemp.getDrawable()); - }); - - } catch (InterruptedException e) { - e.printStackTrace(); } - } - }.start(); + }.start(); + } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java index 7e883401..408746e3 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java @@ -89,7 +89,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.concurrent.Callable; - import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_HELP_URL_CACHE; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_HELP_URL_CACHE_DARK; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_URL_CACHED; @@ -97,6 +96,7 @@ import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_ import static com.darkweb.genesissearchengine.constants.enums.etype.GECKO_SCROLL_CHANGED; import static com.darkweb.genesissearchengine.constants.enums.etype.M_INITIALIZE_TAB_LINK; import static com.darkweb.genesissearchengine.constants.enums.etype.M_INITIALIZE_TAB_SINGLE; +import static com.darkweb.genesissearchengine.constants.enums.etype.ON_OPEN_TAB_VIEW; import static com.darkweb.genesissearchengine.pluginManager.pluginEnums.eMessageManager.*; import static com.darkweb.genesissearchengine.pluginManager.pluginEnums.eMessageManagerCallbacks.M_RATE_APPLICATION; import static java.lang.Character.isLetter; @@ -157,7 +157,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba private boolean isFocusChanging = false; private boolean mAppRestarted = false; private boolean mSearchBarLoading = false; + private boolean mSearchBarWasBackButtonPressed = false; private String mSearchBarPreviousText = strings.GENERIC_EMPTY_STR; + private Handler mScrollHandler = null; + private Runnable mScrollRunnable = null; /*-------------------------------------------------------INITIALIZATION-------------------------------------------------------*/ @@ -266,21 +269,39 @@ public class homeController extends AppCompatActivity implements ComponentCallba } public void onLoadTabFromTabController(){ - Object mTempModel = dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); - if(mTempModel!=null){ - tabRowModel model = (tabRowModel)mTempModel; - mGeckoView.releaseSession(); - mGeckoClient.initSession(model.getSession()); - mGeckoView.setSession(model.getSession()); - mHomeViewController.onUpdateSearchBar(model.getSession().getCurrentURL(), false, false, false); + Object mTempModel = dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); + if(mTempModel!=null){ + tabRowModel model = (tabRowModel)mTempModel; + if(model.getSession().onGetInitializeFromStartup()){ + mGeckoClient.getmRuntime(); + mGeckoClient.initSession(model.getSession()); + mGeckoView.releaseSession(); + mGeckoView.setSession(model.getSession()); - if(model.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.wasPreviousErrorPage() || model.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || model.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || model.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || model.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ - mHomeViewController.updateBannerAdvertStatus(false, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); + if(!model.getSession().isOpen()){ + model.getSession().open(mGeckoClient.getmRuntime()); + onLoadURL(model.getSession().getCurrentURL()); + } + + mGeckoClient.onValidateInitializeFromStartup(mGeckoView); + mGeckoClient.onSessionReinit(); + } + + if(mGeckoClient.getSession().getCurrentURL().equals("about:blank") || mGeckoClient.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.wasPreviousErrorPage() || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ + mHomeViewController.updateBannerAdvertStatus(false, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); + if(model.getSession().onGetInitializeFromStartup()) { + mHomeViewController.progressBarReset(); + } + }else { + mHomeViewController.updateBannerAdvertStatus(true, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); + } + mHomeViewController.onUpdateSearchBar(mGeckoClient.getSession().getCurrentURL(),false,false,false); }else { - mHomeViewController.updateBannerAdvertStatus(true, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); + if(status.sSettingSearchStatus.equals(constants.CONST_BACKEND_GENESIS_URL)){ + mHomeViewController.updateBannerAdvertStatus(false, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); + } } - } } public void onLoadTabOnResume(){ @@ -296,7 +317,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba onNewIntent(getIntent()); onOpenLinkNewTab(helperMethod.getDomainName(mHomeModel.getSearchEngine())); } - initTabCount(); + initTabCountForced(); if(!status.mThemeApplying){ mHomeViewController.onUpdateSearchBar(mGeckoClient.getSession().getCurrentURL(), false, false, false); } @@ -408,7 +429,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.initialization(new homeViewCallback(),this,mNewTab, mWebViewContainer, mLoadingText, mProgressBar, mSearchbar, mSplashScreen, mLoadingIcon, mBannerAds, mGatewaySplash, mTopBar, mGeckoView, mBackSplash, mConnectButton, mFindBar, mFindText, mFindCount, mTopLayout, mVoiceInput, mMenu, mNestedScroll, mBlocker, mBlockerFullSceen, mSearchEngineBar, mCopyright, mHintListView, mAppBar, mOrbotLogManager, mInfoLandscape, mInfoPortrait, mProgressBarIndeterminate, mTabFragment, mTopBarContainer, mSearchLock, mPopupLoadNewTab, mTopBarHider); mGeckoView.onSetHomeEvent(new nestedGeckoViewCallback()); mGeckoClient.initialize(mGeckoView, new geckoViewCallback(), this,false); - mGeckoClient.onValidateInitializeFromStartup(); + mGeckoClient.onValidateInitializeFromStartup(mGeckoView); dataController.getInstance().initializeListData(); } @@ -451,12 +472,12 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void initializeGeckoView(boolean isForced, boolean pDatabaseSavable){ mGeckoClient.initialize(mGeckoView, new geckoViewCallback(), this,isForced); onSaveCurrentTab(mGeckoClient.getSession(),pDatabaseSavable); - mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), false); + initTabCountForced(); } public void initTab(boolean isKeyboardOpened){ postNewTabAnimation(isKeyboardOpened, false); - mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), false); + initTabCountForced(); } @Override @@ -479,13 +500,14 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void onGetThumbnail(ImageView pImageView,boolean pLoadTabView){ try{ mRenderedBitmap = mGeckoView.capturePixels(); - dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, pImageView, mGeckoView, pLoadTabView)); - }catch (Exception ex){ - ex.printStackTrace(); - if(pLoadTabView){ - onOpenTabReady(); - } + }catch (Exception ignored){} + if(mScrollHandler!=null){ + mScrollHandler.removeCallbacksAndMessages(null); } + new Handler().postDelayed(() -> + { + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, pImageView, mGeckoView, pLoadTabView)); + }, 100); } @@ -502,7 +524,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void initRuntimeSettings() { - mGeckoClient.updateSetting(); + mGeckoClient.updateSetting(mGeckoView); } public void onReDrawGeckoview(){ @@ -511,15 +533,14 @@ public class homeController extends AppCompatActivity implements ComponentCallba } public void onLoadURL(String url){ - - if(mGeckoView!=null && mGeckoView.getSession()!=null && !mGeckoView.getSession().isOpen()){ + if(mGeckoView.getSession()!=null && !mGeckoView.getSession().isOpen()){ mGeckoView.getSession().open(mGeckoClient.getmRuntime()); } mAppBar.animate().cancel(); mHomeViewController.onClearSelections(true); Objects.requireNonNull(mGeckoView.getSession()).stop(); - mGeckoClient.loadURL(url.replace("genesis.onion","boogle.store")); + mGeckoClient.loadURL(url.replace("genesis.onion","boogle.store"),mGeckoView); } public void onLoadTab(geckoSession mTempSession, boolean isSessionClosed, boolean pExpandAppBar){ @@ -546,7 +567,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.progressBarReset(); } - mGeckoClient.onValidateInitializeFromStartup(); + mGeckoClient.onValidateInitializeFromStartup(mGeckoView); mGeckoClient.onSessionReinit(); mHomeViewController.onUpdateStatusBarTheme(mTempSession.getTheme(), false); mHomeViewController.onUpdateSearchBar(mGeckoClient.getSession().getCurrentURL(), false, false, false); @@ -560,7 +581,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.expandTopBar(); } - if(mGeckoClient.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.wasPreviousErrorPage() || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ + if(mGeckoClient.getSession().getCurrentURL().equals("about:blank") || mGeckoClient.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.wasPreviousErrorPage() || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ mHomeViewController.updateBannerAdvertStatus(false, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); }else { mHomeViewController.updateBannerAdvertStatus(true, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); @@ -610,7 +631,6 @@ public class homeController extends AppCompatActivity implements ComponentCallba case TRIM_MEMORY_MODERATE: Log.i("wow : ", "trim memory requested: clean up some memory"); break; - case TRIM_MEMORY_RUNNING_CRITICAL: Log.i("wow : ", "trim memory requested: memory on device is very low and critical"); break; @@ -648,6 +668,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mNewTab.setOnTouchListener((v, event) -> { if(event.getAction() == MotionEvent.ACTION_DOWN){ onOpenTabViewBoundary(null); + initTabCount(null, null); } return false; }); @@ -779,6 +800,12 @@ public class homeController extends AppCompatActivity implements ComponentCallba mSearchbar.setOnFocusChangeListener((v, hasFocus) -> { if(!hasFocus) { + mSearchBarWasBackButtonPressed = true; + new Handler().postDelayed(() -> + { + mSearchBarWasBackButtonPressed = false; + }, 100); + if(!isSuggestionSearchOpened){ if(isSuggestionChanged){ isSuggestionChanged = false; @@ -795,6 +822,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba } mSearchbar.setSelection(0); }else { + mSearchBarWasBackButtonPressed = false; if(!isFocusChanging){ if(!status.mThemeApplying){ mHomeViewController.initSearchBarFocus(true, isKeyboardOpened); @@ -822,6 +850,15 @@ public class homeController extends AppCompatActivity implements ComponentCallba }); KeyboardUtils.addKeyboardToggleListener(this, isVisible -> isKeyboardOpened = isVisible); + + + mNestedScroll.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { + if(v.getChildAt(v.getChildCount() - 1) != null) { + if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) && + scrollY > oldScrollY) { + } + } + }); } private ArrayList mSuggestions; @@ -862,6 +899,9 @@ public class homeController extends AppCompatActivity implements ComponentCallba } public void onHomeButton(View view){ + + mGeckoClient.getSession().setTheme(null); + mHomeViewController.onUpdateStatusBarTheme(mGeckoClient.getSession().getTheme(), true); onLoadURL(helperMethod.getDomainName(mHomeModel.getSearchEngine())); mHomeViewController.onUpdateLogo(); } @@ -910,15 +950,16 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoView.getSession().open(mGeckoClient.getmRuntime()); } - onLoadURL(helperMethod.getDomainName(status.sSettingSearchStatus)); mHomeViewController. onUpdateSearchBar(helperMethod.getDomainName(status.sSettingSearchStatus),false,true, false); + onLoadURL(helperMethod.getDomainName(status.sSettingSearchStatus)); + mGeckoView.getSession().setActive(true); + }else { onLoadURL("about:blank"); mHomeViewController. onUpdateSearchBar(strings.HOME_BLANK_PAGE,false,true, false); mHomeViewController.onNewTab(); } mHomeViewController.progressBarReset(); - mHomeViewController.onSessionChanged(); mHomeViewController.onUpdateStatusBarTheme(mGeckoClient.getSession().getTheme(), false); } @@ -927,7 +968,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba initializeGeckoView(true, true); mHomeViewController.progressBarReset(); mHomeViewController.onUpdateSearchBar(url,false,true, false); - mGeckoClient.loadURL(url); + mGeckoClient.loadURL(url, mGeckoView); if(isRemovable){ mGeckoClient.setRemovableFromBackPressed(true); @@ -946,24 +987,29 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoClient.initialize(mGeckoView, new geckoViewCallback(), this,true); mHomeViewController.progressBarReset(); mGeckoClient.initURL(url); - mGeckoClient.loadURL(url); + mGeckoClient.loadURL(url, mGeckoView); mGeckoClient.getSession().setURL(url); onSaveCurrentTab(mGeckoClient.getSession(),false); onLoadTab(mSession,false,false); mAppBar.setTag(R.id.expandableBar,true); - initTabCount(); + initTabCountForced(); mHomeViewController.onUpdateSearchBar(mSession.getCurrentURL(),false,true, false); } public void onNewTab(boolean isKeyboardOpenedTemp, boolean isKeyboardOpened){ - try { - onGetThumbnail(null, false); - }catch (Exception ignored){} - final Handler handler = new Handler(); - handler.postDelayed(() -> mHomeViewController.onNewTabAnimation(Arrays.asList(isKeyboardOpenedTemp, isKeyboardOpened), M_INITIALIZE_TAB_SINGLE), 100); + mRenderedBitmap = mGeckoView.capturePixels(); + new Handler().postDelayed(() -> + { + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, null, mGeckoView, false)); + mHomeViewController.onNewTabAnimation(Arrays.asList(isKeyboardOpenedTemp, isKeyboardOpened), M_INITIALIZE_TAB_SINGLE); + }, 100); + } + + public void onUpdateScreenPixel(){ + } public void onNewTabBackground(boolean isKeyboardOpenedTemp, boolean isKeyboardOpened){ @@ -980,21 +1026,24 @@ public class homeController extends AppCompatActivity implements ComponentCallba } public void onOpenTabViewBoundary(View view){ - onGetThumbnail(null, true); - mGeckoClient.onRedrawPixel(); + onInvokePixelGenerator(); mNewTab.setPressed(true); + onOpenTabReady(); } public void onOpenTabReady(){ if(!status.mThemeApplying){ runOnUiThread(() -> { - activityContextManager.getInstance().getTabController().onInit(); mHomeViewController.onShowTabContainer(); - // overridePendingTransition(R.anim.popup_anim_in, R.anim.popup_anim_out); + activityContextManager.getInstance().getTabController().onInit(); }); } } + public void onLoadFirstElement(){ + activityContextManager.getInstance().getTabController().onInitFirstElement(); + } + public void onLockSecure(View view){ pluginController.getInstance().onMessageManagerInvoke(Arrays.asList(mGeckoClient.getSession().getCurrentURL(), status.sSettingJavaStatus, status.sStatusDoNotTrack, status.sSettingTrackingProtection, status.sSettingCookieStatus, this), M_SECURE_CONNECTION); } @@ -1033,14 +1082,17 @@ public class homeController extends AppCompatActivity implements ComponentCallba @Override public void onBackPressed(){ if(mTabFragment.getVisibility()==View.VISIBLE){ - onResumeDump(); - mHomeViewController.onHideTabContainer(); - activityContextManager.getInstance().getTabController().onPostExit(); - activityContextManager.getInstance().getTabController().onBackPressed(); + if(activityContextManager.getInstance().getTabController().getSelectionCount()>0){ + activityContextManager.getInstance().getTabController().onClearSelection(null); + }else { + onResumeDump(); + mHomeViewController.onHideTabContainer(); + activityContextManager.getInstance().getTabController().onPostExit(); + activityContextManager.getInstance().getTabController().onBackPressed(); + } return; } - mSearchbar.clearFocus(); if(mFindBar!=null && mFindBar.getVisibility() == View.VISIBLE){ mHomeViewController.onUpdateFindBar(false); } @@ -1052,7 +1104,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoClient.onExitFullScreen(); mHomeViewController.onUpdateStatusBarTheme(mGeckoClient.getSession().getTheme(), false); } - else { + else if(mSearchbar.isFocused() || isKeyboardOpened){ + mHomeViewController.onClearSelections(true); + } + else if(!mSearchBarWasBackButtonPressed){ mGeckoClient.onBackPressed(true); } } @@ -1104,7 +1159,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onSetBannerAdMargin(true,(boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); } - if(mGeckoClient.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ + if(mGeckoClient.getSession().getCurrentURL().equals("about:blank") || mGeckoClient.getSession().getCurrentURL().contains("boogle.store") || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_URL_CACHED_DARK) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE) || mGeckoClient.getSession().getCurrentURL().startsWith(CONST_GENESIS_HELP_URL_CACHE_DARK)){ mHomeViewController.updateBannerAdvertStatus(false, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); }else { mHomeViewController.updateBannerAdvertStatus(true, (boolean)pluginController.getInstance().onAdsInvoke(null, pluginEnums.eAdManager.M_IS_ADVERT_LOADED)); @@ -1139,6 +1194,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onUpdateStatusBarTheme(mGeckoClient.getSession().getTheme(), false); pluginController.getInstance().onMessageManagerInvoke(null, M_RESET); pluginController.getInstance().onNotificationInvoke(Collections.singletonList(1296000000) /* Every 15 Days */ , pluginEnums.eNotificationManager.M_CREATE_NOTIFICATION); + mSearchBarWasBackButtonPressed = false; } @Override @@ -1179,6 +1235,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba pluginController.getInstance().onNotificationInvoke(null, pluginEnums.eNotificationManager.M_CLEAR_NOTIFICATION ); initWidget(); + initTabCountForced(); super.onResume(); } @@ -1263,7 +1320,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba } }else { - onSearchBarInvoked(mSearchbar); + mHomeViewController.onClearSelections(true); } } /*-------------------------------------------------------External Callback Methods-------------------------------------------------------*/ @@ -1323,7 +1380,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba session.stop(); session.close(); - initTabCount(); + initTabCountForced(); if(model!=null){ if(mTabFragment.getVisibility()!=View.VISIBLE){ @@ -1340,12 +1397,12 @@ public class homeController extends AppCompatActivity implements ComponentCallba } } - public void initTabCount(){ - mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), false); + public void initTabCount(enums.etype pEvent, List pData){ + mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), false, pEvent, pData); } public void initTabCountForced(){ - mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), true); + mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null), true, null, null); } /*-------------------------------------------------------CALLBACKS-------------------------------------------------------*/ @@ -1398,8 +1455,8 @@ public class homeController extends AppCompatActivity implements ComponentCallba else if (menuId == R.id.menu9) { helperMethod.hideKeyboard(this); mGeckoClient.onRedrawPixel(); - activityContextManager.getInstance().getTabController().onInit(); mHomeViewController.onShowTabContainer(); + activityContextManager.getInstance().getTabController().onInit(); } else if (menuId == R.id.menu8) { helperMethod.hideKeyboard(this); @@ -1420,8 +1477,8 @@ public class homeController extends AppCompatActivity implements ComponentCallba } else if (menuId == R.id.pMenuOpenRecentTab) { - activityContextManager.getInstance().getTabController().onInit(); mHomeViewController.onShowTabContainer(); + activityContextManager.getInstance().getTabController().onInit(); // overridePendingTransition(R.anim.popup_anim_in, R.anim.popup_anim_out); } else if (menuId == R.id.pMenuOpenNewTab) @@ -1501,7 +1558,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba if (menuId == R.id.menu26 || menuId == R.id.menu27) { helperMethod.hideKeyboard(this); mGeckoClient.toogleUserAgent(); - mGeckoClient.onReload(); + mGeckoClient.onReload(mGeckoView); } if(menuId == R.id.menu25){ helperMethod.hideKeyboard(this); @@ -1537,9 +1594,28 @@ public class homeController extends AppCompatActivity implements ComponentCallba @Override public Object invokeObserver(List data, Object e_type) { - if(e_type.equals(enums.etype.M_INIT_TAB_COUNT)) + if(e_type.equals(enums.etype.M_INIT_TAB_COUNT_FORCED)) { - initTabCount(); + initTabCountForced(); + } + else if(e_type.equals(enums.etype.M_CACHE_UPDATE_TAB)){ + new Handler().postDelayed(() -> + { + mTabFragment.setAlpha(0.01f); + mTabFragment.setVisibility(View.VISIBLE); + activityContextManager.getInstance().getTabController().onInit(); + mTabFragment.setVisibility(View.GONE); + mHomeViewController.onHideTabContainer(); + }, 1000); + } + else if(e_type.equals(enums.etype.M_UPDATE_PIXEL_BACKGROUND)){ + onInvokePixelGenerator(); + } + else if(e_type.equals(enums.etype.ON_NEW_TAB_ANIMATION)){ + postNewTabAnimation((boolean)data.get(0),(boolean)data.get(1)); + } + else if(e_type.equals(enums.etype.ON_OPEN_TAB_VIEW)){ + onOpenTabViewBoundary(null); } else if(e_type.equals(enums.etype.download_folder)) { @@ -1553,7 +1629,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onUpdateStatusBarTheme(mGeckoClient.getSession().getTheme(),false); } else if(e_type.equals(M_INITIALIZE_TAB_SINGLE)){ - postNewTabAnimation((boolean)data.get(0),(boolean)data.get(1)); + initTabCount(enums.etype.ON_NEW_TAB_ANIMATION,data); } else if(e_type.equals(M_INITIALIZE_TAB_LINK)){ postNewLinkTabAnimation((String)data.get(0),false); @@ -1673,6 +1749,47 @@ public class homeController extends AppCompatActivity implements ComponentCallba } } + public void onClearSettings(){ + mHomeViewController.updateBannerAdvertStatus(false, true); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_CLEAR_TAB, null); + activityContextManager.getInstance().getTabController().onCloseAllTabs(); + onLoadTabFromTabController(); + initTabCountForced(); + } + + public void onClearAllTabs(){ + mHomeViewController.updateBannerAdvertStatus(false, true); + } + + public void onInvokePixelGenerator(){ + + if(mTabFragment.getVisibility()==View.VISIBLE){ + return; + } + + if(mScrollHandler!=null){ + mScrollHandler.removeCallbacksAndMessages(null); + } + + mScrollHandler = new Handler(); + mScrollRunnable = () -> { + + try{ + mRenderedBitmap = mGeckoView.capturePixels(); + }catch (Exception ignored){} + new Handler().postDelayed(() -> + { + if(mTabFragment.getVisibility()!=View.VISIBLE){ + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, null, mGeckoView, true)); + }else { + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, null, mGeckoView, true)); + } + }, 150); + + }; + mScrollHandler.postDelayed(mScrollRunnable, 250); + } + public class geckoViewCallback implements eventObserver.eventListener{ @Override @@ -1801,6 +1918,17 @@ public class homeController extends AppCompatActivity implements ComponentCallba else if(e_type.equals(enums.etype.M_ON_MAIL)){ helperMethod.sendCustomMail(homeController.this, (String)data.get(0)); } + else if(e_type.equals(enums.etype.M_OPEN_SESSION)){ + tabRowModel model = (tabRowModel)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); + if(model!=null){ + onLoadTab(model.getSession(),true,true); + onLoadURL(model.getSession().getCurrentURL()); + } + } + else if(e_type.equals(enums.etype.M_UPDATE_PIXEL_BACKGROUND)){ + onInvokePixelGenerator(); + } + return null; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeModel.java index 8968017a..c34f6069 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeModel.java @@ -15,7 +15,10 @@ class homeModel } String urlComplete(String pURL, String pSearchEngine){ - if(pURL.equals("about:config")){ + if(pURL.equals("about:blank")){ + return helperMethod.completeURL("boogle.store"); + } + else if(pURL.equals("about:config")){ return pURL; }else { try diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeViewController.java index 493d2282..aea6598c 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeViewController.java @@ -3,6 +3,7 @@ package com.darkweb.genesissearchengine.appManager.homeManager.homeController; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.Context; @@ -178,6 +179,7 @@ class homeViewController updateBannerAdvertStatus(false, false); expandTopBar(); + mBlockerFullSceen.setVisibility(View.GONE); } public void initTopBarPadding(){ @@ -232,43 +234,31 @@ class homeViewController } public void onShowTabContainer(){ + if(mTabFragment.getAlpha()==0 || mTabFragment.getAlpha()==1){ - onUpdateStatusBarTheme(null, false); - + mTabFragment.animate().cancel(); mTabFragment.setAlpha(0); - mTabFragment.setTranslationY(0); mTabFragment.setVisibility(View.VISIBLE); - mTabFragment.setTranslationY(-1 * helperMethod.pxFromDp(15)); - mTopBarHider.setVisibility(View.VISIBLE); - mTopBarHider.animate().alpha(1).setDuration(0); + mTabFragment.animate().alpha(1).setDuration(250); - new Handler().postDelayed(() -> - { - mTabFragment.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mTabFragment.animate().withLayer() - .setDuration(250) - .translationY(0) - .alpha(1f) - .withEndAction( - () -> mTabFragment.setLayerType(View.LAYER_TYPE_NONE, null) - ).start(); - - }, 10); + onUpdateStatusBarTheme(null, false); } } public void onHideTabContainer(){ - if(mTabFragment.getAlpha()==1){ + if(mTabFragment.getAlpha()>0 || mTabFragment.getVisibility()!=View.GONE){ new Handler().postDelayed(() -> { - mTopBarHider.animate().alpha(0).setDuration(0).setStartDelay(0).withEndAction(() -> mTopBarHider.setVisibility(View.GONE)); + mTopBarHider.animate().alpha(0).setDuration(250).setStartDelay(0).withEndAction(() -> mTopBarHider.setVisibility(View.GONE)); mEvent.invokeObserver(null, enums.etype.M_UPDATE_THEME); - }, 150); + }, 250); - mTabFragment.animate() .setDuration(150).alpha(0f).withEndAction(() -> mTabFragment.setVisibility(View.GONE)); - mEvent.invokeObserver(Collections.singletonList(status.sSettingSearchStatus), enums.etype.M_INIT_TAB_COUNT); + mTabFragment.animate().setDuration(150).setStartDelay(150).alpha(0f).withEndAction(() -> { + mTabFragment.setVisibility(View.GONE); + mEvent.invokeObserver(null, enums.etype.M_UPDATE_PIXEL_BACKGROUND); + }); } } @@ -357,6 +347,18 @@ class homeViewController final Handler handler = new Handler(); handler.postDelayed(() -> { + Drawable drawable; + Resources res = mContext.getResources(); + try { + if(status.sSettingEnableVoiceInput){ + drawable = Drawable.createFromXml(res, res.getXml(R.xml.ic_baseline_keyboard_voice)); + }else { + drawable = Drawable.createFromXml(res, res.getXml(R.xml.ic_baseline_cancel)); + } + mVoiceInput.setImageDrawable(drawable); + } catch (Exception ex) { + ex.printStackTrace(); + } mVoiceInput.setVisibility(View.VISIBLE); }, 0); @@ -381,25 +383,35 @@ class homeViewController } } - void initTab(int count, boolean pForced){ + void initTab(int count, boolean pForced, enums.etype pEvent, List pData){ if(!pForced){ - mNewTab.animate().cancel(); - mNewTab.animate().withLayer() - .rotationX(60) - .alpha(0.4f) - .setDuration(120) - .withEndAction( - new Runnable() { - @Override public void run() { - mNewTab.setRotationX(-60); - mNewTab.animate().withLayer() - .rotationX(0) - .alpha(1) - .setDuration(150) - .start(); - } - } - ).start(); + ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(mNewTab, + PropertyValuesHolder.ofFloat("scaleX", 1, 0.70f, 1), + PropertyValuesHolder.ofFloat("scaleY", 1, 0.70f, 1)); + scaleDown.setDuration(250); + scaleDown.start(); + + scaleDown.addListener(new Animator.AnimatorListener() { + + @Override + public void onAnimationStart(Animator arg0) { + } + + @Override + public void onAnimationRepeat(Animator arg0) { + } + + @Override + public void onAnimationEnd(Animator arg0) { + if(pEvent!=null){ + mEvent.invokeObserver(pData, pEvent); + } + } + + @Override + public void onAnimationCancel(Animator arg0) { + } + }); } mNewTab.setText((count+strings.GENERIC_EMPTY_STR)); @@ -423,7 +435,7 @@ class homeViewController public void initStatusBarColor(boolean mInstant) { animatedColor oneToTwo = new animatedColor(ContextCompat.getColor(mContext, R.color.landing_ease_blue), ContextCompat.getColor(mContext, R.color.green_dark_v2)); - int mDelay = 500; + int mDelay = 800; if(status.mThemeApplying || mInstant){ mDelay = 0; } @@ -515,12 +527,15 @@ class homeViewController private void initSplashScreen(){ mIsAnimating = false; - mSearchbar.setEnabled(false); helperMethod.hideKeyboard(mContext); mSearchLock.setTag(R.id.themed,false); mAppBar.setTag(R.id.expandableBar,true); - mSearchbar.setEnabled(false); + if(!status.mThemeApplying){ + mSearchbar.setEnabled(false); + }else { + mSearchbar.setEnabled(true); + } View root = mSearchbar.getRootView(); root.setBackgroundColor(ContextCompat.getColor(mContext, R.color.c_background_keyboard)); @@ -586,7 +601,7 @@ class homeViewController triggerPostUI(); mProgressBar.setVisibility(View.GONE); mSplashScreen.animate().cancel(); - mProgressBarIndeterminate.animate().setDuration(250).alpha(0).withEndAction(() -> mSplashScreen.animate().setDuration(350).setStartDelay(200).alpha(0).withEndAction(() -> { + mProgressBarIndeterminate.animate().setStartDelay(300).setDuration(250).alpha(0).withEndAction(() -> mSplashScreen.animate().setDuration(350).setStartDelay(200).alpha(0).withEndAction(() -> { mProgressBarIndeterminate.setVisibility(View.GONE); mSplashScreen.setClickable(false); mSplashScreen.setFocusable(false); @@ -598,7 +613,7 @@ class homeViewController mBlocker.setVisibility(View.GONE); mGatewaySplash.setVisibility(View.GONE); mConnectButton.setVisibility(View.GONE); - + mEvent.invokeObserver(null, enums.etype.M_CACHE_UPDATE_TAB); })); mEvent.invokeObserver(null, enums.etype.M_WELCOME_MESSAGE); mOrbotLogManager.setClickable(false); @@ -820,8 +835,10 @@ class homeViewController { if(total==0){ mFindCount.setText("0/0"); + mFindCount.setTextColor(ContextCompat.getColor(mContext, R.color.dark_red_soft)); }else { mFindCount.setText((total + "/" + index)); + mFindCount.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v6)); } } @@ -835,7 +852,7 @@ class homeViewController mColor = -1; } - if(!mSearchbar.isFocused() && pTheme!=null && status.sToolbarTheme && mColor!=-1 && helperMethod.getColorDensity(mColor)<0.80){ + if(!mSearchbar.isFocused() && pTheme!=null && status.sToolbarTheme && mColor!=-1 && helperMethod.getColorDensity(mColor)<0.80 && status.sTheme != enums.Theme.THEME_DARK){ mTopBar.setBackgroundColor(mColor); mSearchbar.setTextColor(helperMethod.invertedGrayColor(mColor)); mSearchbar.setHintTextColor(helperMethod.invertedGrayColor(mColor)); @@ -891,6 +908,7 @@ class homeViewController View decorView = mContext.getWindow().getDecorView(); //set status background black decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + mTopBarHider.setBackgroundColor(mColor); } else{ mSearchLock.setTag(R.id.themed,false); @@ -936,6 +954,8 @@ class homeViewController View decorView = mContext.getWindow().getDecorView(); decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + + mTopBarHider.setBackground(ContextCompat.getDrawable(mContext, R.color.c_background)); } } } @@ -947,6 +967,8 @@ class homeViewController mFindBar.setVisibility(View.VISIBLE); mFindBar.setAlpha(1); mFindText.requestFocus(); + mFindCount.setText("0/0"); + mFindCount.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v6)); final Handler handler = new Handler(); handler.postDelayed(() -> { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java index b60a7f56..bce61390 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java @@ -156,8 +156,7 @@ public class settingClearController extends AppCompatActivity { pluginController.getInstance().onMessageManagerInvoke(Collections.singletonList(this), M_DATA_CLEARED); if(mHomeInvoked){ - activityContextManager.getInstance().getHomeController().initializeGeckoView(true, true); - activityContextManager.getInstance().getHomeController().onHomeButton(null); + activityContextManager.getInstance().getHomeController().onClearSettings(); } } @@ -171,7 +170,7 @@ public class settingClearController extends AppCompatActivity { dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_IS_WELCOME_ENABLED,true)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.PROXY_IS_APP_RATED,false)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.VPN_ENABLED,false)); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_ENABLES,true)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_ENABLES,false)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_FONT_ADJUSTABLE,true)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_ZOOM,true)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_VOICE_INPUT,true)); @@ -183,7 +182,7 @@ public class settingClearController extends AppCompatActivity { dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.SETTING_LANGUAGE_REGION,strings.SETTING_DEFAULT_LANGUAGE_REGION)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.SETTING_SEARCH_ENGINE,constants.CONST_BACKEND_GENESIS_URL)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,strings.BRIDGE_CUSTOM_BRIDGE_OBFS4)); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS,0)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS,1)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_RESTORE_TAB,false)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_CHARACTER_ENCODING,false)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_SHOW_IMAGES,0)); @@ -192,8 +191,10 @@ public class settingClearController extends AppCompatActivity { dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_FULL_SCREEN_BROWSIING,true)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_THEME, enums.Theme.THEME_DEFAULT)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_LIST_VIEW,true)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_SHOW_TAB_GRID,true)); dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_OPEN_URL_IN_NEW_TAB,true)); - + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_POPUP,true)); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_TYPE,strings.BRIDGE_CUSTOM_BRIDGE_OBFS4)); } /* LOCAL OVERRIDES */ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java index a6699d2c..b6cd20fa 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java @@ -1,23 +1,30 @@ package com.darkweb.genesissearchengine.appManager.tabManager; +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.util.Log; +import android.graphics.drawable.TransitionDrawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.ScaleAnimation; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.constants.enums; @@ -30,13 +37,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; - import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_DOMAIN_URL; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_HELP_URL; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_HELP_URL_CACHE; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_HELP_URL_CACHE_DARK; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_URL_CACHED; import static com.darkweb.genesissearchengine.constants.constants.CONST_GENESIS_URL_CACHED_DARK; +import static org.mozilla.gecko.util.ThreadUtils.runOnUiThread; public class tabAdapter extends RecyclerView.Adapter { @@ -46,15 +53,23 @@ public class tabAdapter extends RecyclerView.Adapter private eventObserver.eventListener mEvent; private ArrayList mSelectedList = new ArrayList<>(); private Boolean mLongPressMenuEnabled = false; + private boolean mViewLoaded = false; + private ObjectAnimator mFirstRow = null; tabAdapter(ArrayList pModelList, eventObserver.eventListener event) { + initialize(pModelList); + this.mEvent = event; + } + + private void initialize(ArrayList pModelList){ this.mModelList.clear(); this.mModelList.addAll(pModelList); mModelList.add(new tabRowModel(null, null,null)); - this.mEvent = event; + mViewLoaded = false; } + private void reInitData(ArrayList pModelList){ for(int mCounter=0;mCounter holder.itemView.setTag(position); holder.itemView.findViewById(R.id.pRemoveRow).setTag(position); holder.itemView.findViewById(R.id.pLoadSession).setTag(position); + if(position == 0 && status.sTabGridLayoutEnabled && !mViewLoaded){ + onExpandScale(holder.itemView); + mViewLoaded = true; + }else if(position != mModelList.size()-1){ + holder.itemView.setScaleY(1f); + holder.itemView.setScaleX(1f); + } + } + + private boolean mFirstRowAnimating = false; + public void onExpandScale(View v) { + if(mFirstRowAnimating){ + return; + } + mFirstRowAnimating = true; + v.bringToFront(); + if(mFirstRow!=null){ + mFirstRow.end(); + mFirstRow.cancel(); + } + v.setScaleY(0.85f); + v.setScaleX(0.85f); + mFirstRow = ObjectAnimator.ofPropertyValuesHolder(v, + PropertyValuesHolder.ofFloat("scaleX", 0.85f, 1), + PropertyValuesHolder.ofFloat("scaleY", 0.85f, 1)); + mFirstRow.setDuration(200); + mFirstRow.setStartDelay(150); + mFirstRow.start(); + mFirstRow.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation, boolean isReverse) { + + } + + @Override + public void onAnimationEnd(Animator animation, boolean isReverse) { + mFirstRowAnimating = false; + } + + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + mFirstRowAnimating = false; + } + + @Override + public void onAnimationCancel(Animator animation) { + mFirstRowAnimating = false; + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + } + + public void scaleView(View v) { + v.bringToFront(); + ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(v, + PropertyValuesHolder.ofFloat("scaleX", 1, 0.85f), + PropertyValuesHolder.ofFloat("scaleY", 1, 0.85f)); + scaleDown.setDuration(200); + scaleDown.start(); } @Override @@ -114,8 +197,6 @@ public class tabAdapter extends RecyclerView.Adapter } } } - - mEvent.invokeObserver(null, tabEnums.eTabAdapterCallback.ON_SHOW_UNDO_DIALOG); } } @@ -141,7 +222,6 @@ public class tabAdapter extends RecyclerView.Adapter mEvent.invokeObserver(Collections.singletonList(0), tabEnums.eTabAdapterCallback.ON_REMOVE_TAB_VIEW_RETAIN_BACKUP); } - mEvent.invokeObserver(null, tabEnums.eTabAdapterCallback.ON_SHOW_UNDO_DIALOG); } private void onClearAllSelection(){ @@ -214,8 +294,8 @@ public class tabAdapter extends RecyclerView.Adapter notifyItemRangeChanged(mIndex, mModelList.size()); } + mEvent.invokeObserver(Collections.singletonList(mIndex), tabEnums.eTabAdapterCallback.M_CLEAR_BACKUP); mEvent.invokeObserver(Collections.singletonList(mIndex), tabEnums.eTabAdapterCallback.ON_REMOVE_TAB_VIEW); - mEvent.invokeObserver(null, tabEnums.eTabAdapterCallback.ON_SHOW_UNDO_DIALOG); } /*View Holder Extensions*/ @@ -257,8 +337,15 @@ public class tabAdapter extends RecyclerView.Adapter mItemSelectionMenu.setVisibility(View.VISIBLE); mItemSelectionMenuButton.setOnClickListener(this); }else { + mLoadSession.setOnLongClickListener(this); + mRemoveRow.setOnClickListener(this); + mLoadSession.setOnClickListener(this); if(model.getSession().getTheme()==null){ - mBorder.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_ripple_v2)); + if(status.sTabGridLayoutEnabled){ + mBorder.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_view_divier_background_inner)); + }else { + mBorder.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_ripple)); + } }else { try{ mBorder.setBackgroundColor(Color.parseColor(model.getSession().getTheme())); @@ -281,15 +368,30 @@ public class tabAdapter extends RecyclerView.Adapter } if(status.sTabGridLayoutEnabled){ - mDescription.setText(helperMethod.getDomainName(mURL)); + mDescription.setText((model.getSession().getTitle())); }else { mDescription.setText(mURL); } mDate.setText(model.getDate()); - mWebThumbnail.setImageBitmap(model.getBitmap()); - if(getLayoutPosition()==0){ - // mEvent.invokeObserver(Arrays.asList(mWebThumbnail, mURL), enums.etype.fetch_thumbnail); + if(mURL.equals("about:blank")){ + mWebThumbnail.setAlpha(0f); + }else { + Thread timer = new Thread() + { + public void run() + { + runOnUiThread(() -> { + if(mWebThumbnail.getDrawable()==null){ + mWebThumbnail.setImageBitmap(model.getBitmap()); + }else { + Drawable mDrawable = new BitmapDrawable(itemView.getContext().getResources(), model.getBitmap()); + helperMethod.setImageDrawableWithAnimation(mWebThumbnail, mDrawable,250); + } + }); + } + }; + timer.start(); } if(mSelectedList.contains(model.getSession().getSessionID())){ @@ -298,11 +400,7 @@ public class tabAdapter extends RecyclerView.Adapter onSelectionClear(mSelectedView); } - if(model.getSession().equals(mModelList.get(0).getSession())){ - if(!status.sTabGridLayoutEnabled){ - itemView.setBackgroundColor(ContextCompat.getColor(activityContextManager.getInstance().getHomeController(), R.color.c_list_item_current)); - } - }else { + if(!model.getSession().equals(mModelList.get(0).getSession()) && !status.sTabGridLayoutEnabled){ Drawable mDrawable; Resources res = itemView.getContext().getResources(); try { @@ -311,9 +409,49 @@ public class tabAdapter extends RecyclerView.Adapter } catch (Exception ignored) { } } - mLoadSession.setOnLongClickListener(this); - mRemoveRow.setOnClickListener(this); - mLoadSession.setOnClickListener(this); + } + + itemView.setBackgroundColor(ContextCompat.getColor(activityContextManager.getInstance().getHomeController(), R.color.clear_alpha)); + if(!status.sTabGridLayoutEnabled){ + if(getLayoutPosition() == 0){ + itemView.setBackgroundColor(ContextCompat.getColor(activityContextManager.getInstance().getHomeController(), R.color.c_list_item_current)); + } + } + + if(status.sTabGridLayoutEnabled){ + CardView mLayout = itemView.findViewById(R.id.pRowContainerInner); + CardView mCardView = itemView.findViewById(R.id.pCardViewParent); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mLayout.getLayoutParams(); + + if(getLayoutPosition() == 0){ + params.leftMargin = helperMethod.pxFromDp(2.5f); + params.rightMargin = helperMethod.pxFromDp(2.5f); + params.topMargin = helperMethod.pxFromDp(2.5f); + params.bottomMargin = helperMethod.pxFromDp(2.5f); + + if(status.sTheme == enums.Theme.THEME_DARK || status.sDefaultNightMode){ + mCardView.setCardBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_button_text_v1_inverted)); + }else { + mCardView.setCardBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.text_color_highlight_v3)); + } + }else { + + if(status.sTheme == enums.Theme.THEME_DARK || status.sDefaultNightMode){ + params.leftMargin = helperMethod.pxFromDp(2.5f); + params.rightMargin = helperMethod.pxFromDp(2.5f); + params.topMargin = helperMethod.pxFromDp(2.5f); + params.bottomMargin = helperMethod.pxFromDp(2.5f); + + mCardView.setCardBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_tab_background)); + }else { + params.leftMargin = helperMethod.pxFromDp(0f); + params.rightMargin = helperMethod.pxFromDp(0f); + params.topMargin = helperMethod.pxFromDp(0f); + params.bottomMargin = helperMethod.pxFromDp(0f); + + mCardView.setCardBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.c_view_divier_background)); + } + } } if(this.getLayoutPosition()==mModelList.size()-1){ @@ -327,9 +465,6 @@ public class tabAdapter extends RecyclerView.Adapter mItemSelectionMenuButton.animate().setDuration(250).alpha(1); } }else { - if(model.getmId()!=null){ - mItemSelectionMenuReference.animate().cancel(); - } itemView.setVisibility(View.VISIBLE); mLongPressMenuEnabled = false; mItemSelectionMenuButton.animate().setDuration(250).alpha(1); @@ -351,6 +486,9 @@ public class tabAdapter extends RecyclerView.Adapter }else { onTriggerURL(mModelList.get(this.getLayoutPosition())); + if(status.sTabGridLayoutEnabled){ + scaleView(itemView); + } } }else { for(int mCounter=0;mCounter onRemoveAll(); }else if(pCommands.equals(tabEnums.eTabAdapterCommands.REMOVE_ROW_CROSSED)){ onRemoveRowCross((int)pData.get(0)); + }else if(pCommands.equals(tabEnums.eTabAdapterCommands.M_INITIALIZE)){ + initialize((ArrayList) pData.get(0)); } return null; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java index 35b45bfd..6a03775d 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java @@ -1,6 +1,7 @@ package com.darkweb.genesissearchengine.appManager.tabManager; import android.annotation.SuppressLint; +import android.content.res.Configuration; import android.graphics.Canvas; import android.os.Bundle; import android.os.Handler; @@ -27,6 +28,7 @@ import com.darkweb.genesissearchengine.appManager.homeManager.homeController.hom import com.darkweb.genesissearchengine.appManager.settingManager.advanceManager.settingAdvanceController; import com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage.settingHomeController; import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; @@ -62,14 +64,21 @@ public class tabController extends Fragment private tabAdapter mTabAdapter; private Handler mScrollHandler = null; private Runnable mScrollRunnable = null; - int minScroll = 0; - int maxScroll = 0; + private boolean mTabGridLayoutEnabled = status.sTabGridLayoutEnabled; + private float minScroll = 0; + private float maxScroll = 0; + private float mScreenHeight; + private float getmScreenWidth; + private boolean mClosed = false; + private boolean mClosedByNewTab = false; /*Initializations*/ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @SuppressLint("InflateParams") View root = inflater.inflate(R.layout.tab_view, null); mRootView = root; + mScreenHeight = helperMethod.pxFromDp(helperMethod.getScreenHeight(activityContextManager.getInstance().getHomeController())); + getmScreenWidth = helperMethod.pxFromDp(helperMethod.getScreenWidth(activityContextManager.getInstance().getHomeController())); super.onCreate(savedInstanceState); return root; @@ -82,11 +91,36 @@ public class tabController extends Fragment } public void onInit(){ - initializeActivity(); - initializeViews(); - initializeLocalEventHandlers(); - initializeList(); - initSwipe(); + if(mTabAdapter==null || mTabGridLayoutEnabled!=status.sTabGridLayoutEnabled){ + initializeActivity(); + initializeViews(); + initializeLocalEventHandlers(); + initializeList(); + initSwipe(); + mTabGridLayoutEnabled = status.sTabGridLayoutEnabled; + }else { + initializeList(); + } + + + mClosed = false; + mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_RELEASE_BLOCKER, null); + mNestedScrollView.scrollTo(0,0); + mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_HIDE_UNDO_DIALOG_INIT, null); + mRecycleView.setAlpha(1); + mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.M_INITIALIZE, Collections.singletonList(mListModel.getList())); + mTabAdapter.notifyDataSetChanged(); + } + + public void onInitFirstElement(){ + if(mTabAdapter!=null){ + mHomeController.runOnUiThread(new Runnable() { + @Override + public void run() { + mTabAdapter.notifyItemChanged(0); + } + }); + } } public void initializeActivity(){ @@ -129,10 +163,16 @@ public class tabController extends Fragment }); mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { - int scrollY = mNestedScrollView.getScrollY(); + float scrollY = mNestedScrollView.getScrollY(); minScroll = scrollY; - maxScroll = mRecycleView.computeVerticalScrollRange() - helperMethod.pxFromDp(500); + int orientation = this.getResources().getConfiguration().orientation; + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + maxScroll = mRecycleView.computeVerticalScrollRange() - mScreenHeight*0.350f; + } else { + maxScroll = mRecycleView.computeVerticalScrollRange() - getmScreenWidth*0.20f; + } + onSwipeBounce(300); }); @@ -147,18 +187,22 @@ public class tabController extends Fragment } public void onSwipeBounce(int mDuration){ - if(minScroll > maxScroll){ - if(mScrollHandler!=null){ + if(!mClosed){ + if(minScroll > maxScroll){ + if(mScrollHandler!=null){ + mScrollHandler.removeCallbacksAndMessages(null); + } + + mScrollHandler = new Handler(); + mScrollRunnable = () -> { + mNestedScrollView.clearFocus(); + mRecycleView.clearFocus(); + mNestedScrollView.smoothScrollTo(0, (int)maxScroll); + }; + mScrollHandler.postDelayed(mScrollRunnable, mDuration); + }else if(mScrollHandler!=null){ mScrollHandler.removeCallbacksAndMessages(null); } - - mScrollHandler = new Handler(); - mScrollRunnable = () -> { - mNestedScrollView.clearFocus(); - mRecycleView.clearFocus(); - mNestedScrollView.smoothScrollTo(0, maxScroll); - }; - mScrollHandler.postDelayed(mScrollRunnable, mDuration); } } @@ -217,11 +261,11 @@ public class tabController extends Fragment public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); + onExitAndClearBackup(); boolean mStatus = onInitRemoveView(position, true); if(mStatus){ mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.NOTIFY_SWIPE, Collections.singletonList(position)); } - onShowUndoDialog(); viewHolder.itemView.animate().alpha(0); } @@ -251,7 +295,7 @@ public class tabController extends Fragment public void onRemoveTab(int pIndex){ mListModel.onTrigger(tabEnums.eModelCallback.M_REMOVE_TAB,Collections.singletonList(pIndex)); if(mListModel.getList().size()<1){ - mRecycleView.animate().setDuration(350).alpha(0); + mRecycleView.animate().setDuration(200).alpha(0); } initTabCount(400); activityContextManager.getInstance().getHomeController().onLoadTabFromTabController(); @@ -263,14 +307,23 @@ public class tabController extends Fragment mListModel.onTrigger(tabEnums.eModelCallback.M_REMOVE_TAB,Collections.singletonList(pIndex)); mListModel.getList().remove(pIndex); if(mListModel.getList().size()<1){ - mRecycleView.animate().setDuration(350).alpha(0).withEndAction(() -> mTabAdapter.notifyDataSetChanged()); + mRecycleView.animate().setDuration(200).alpha(0).withEndAction(() -> { + onShowUndoDialog(); + mTabAdapter.notifyDataSetChanged(); + }); activityContextManager.getInstance().getHomeController().onLoadTabFromTabController(); - new Handler().postDelayed(() -> onSwipeBounce(0), 400); + new Handler().postDelayed(() -> { + onSwipeBounce(0); + }, 400); return false; }else{ + onShowUndoDialog(); mTabAdapter.notifyItemRangeChanged(pIndex, mTabAdapter.getItemCount() - pIndex); + mTabAdapter.notifyItemChanged(0); activityContextManager.getInstance().getHomeController().onLoadTabFromTabController(); - new Handler().postDelayed(() -> onSwipeBounce(0), 400); + new Handler().postDelayed(() -> { + onSwipeBounce(0); + }, 400); return true; } } @@ -285,11 +338,15 @@ public class tabController extends Fragment } public void onNewTabInvoked(){ - if(mListModel.getList().size()>=1){ + ArrayList mBackup = (ArrayList)mListModel.onTrigger(tabEnums.eModelCallback.M_GET_BACKUP,null); + if(mListModel.getList().size()>=1 && mBackup.size()!=1){ mHomeController.onNewTabBackground(true,false); } + + mClosedByNewTab = false; + onPostExit(); + onBackPressed(); onClose(); - mHomeController.onBackPressed(); } public void onRestoreTab(View view){ @@ -300,18 +357,21 @@ public class tabController extends Fragment handler.postDelayed(() -> { mPopupUndo.findViewById(R.id.pBlockerUndo).setVisibility(View.VISIBLE); - mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_HIDE_UNDO_DIALOG, null); if(mRecycleView.getAlpha()==0){ + mTabAdapter.notifyDataSetChanged(); initializeList(); mRecycleView.animate().cancel(); mRecycleView.setVisibility(View.VISIBLE); - mRecycleView.animate().setDuration(350).alpha(1); + mRecycleView.animate().setDuration(200).alpha(1).withEndAction(() -> mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_HIDE_UNDO_DIALOG, null)); + }else { + mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_HIDE_UNDO_DIALOG, null); + mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.REINIT_DATA, Collections.singletonList(mBackup)); } - mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.REINIT_DATA, Collections.singletonList(mBackup)); mListModel.onTrigger(tabEnums.eModelCallback.M_CLEAR_BACKUP_RETAIN_DATABASE,null); }, 100); + activityContextManager.getInstance().getHomeController().onLoadTabFromTabController(); } public void onShowUndoDialog(){ @@ -339,7 +399,7 @@ public class tabController extends Fragment /*UI Triggers*/ public void onPostExit() { - if(mtabViewController!=null){ + if(mtabViewController!=null && !mClosedByNewTab){ mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_EXIT, null); } } @@ -348,12 +408,16 @@ public class tabController extends Fragment mtabViewController.onTrigger(tabEnums.eTabViewCommands.M_SHOW_MENU, Collections.singletonList(view)); } + public int getSelectionCount(){ + return (int)mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.GET_SELECTION_SIZE,null); + } + public void onRemoveSelection(View view) { int mSelectionSize = (int)mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.GET_SELECTION_SIZE,null); if(mSelectionSize >= mListModel.getList().size()){ - mRecycleView.animate().setDuration(350).alpha(0).withEndAction(() -> { + mRecycleView.animate().setDuration(200).alpha(0).withEndAction(() -> { mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.M_REMOVE_ALL_SELECTION, null); - onShowUndoDialog(); + //onShowUndoDialog(); }); }else { mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.M_REMOVE_ALL_SELECTION, null); @@ -370,7 +434,9 @@ public class tabController extends Fragment public void onClearSelection(View view) { mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.M_CLEAR_ALL_SELECTION, null); - mNestedScrollView.smoothScrollTo(0,0); + if(!mClosed){ + mNestedScrollView.smoothScrollTo(0,0); + } } public void onTriggerSelected(View view){ @@ -384,18 +450,35 @@ public class tabController extends Fragment /*Tab Menu*/ + public void onCloseAllTabs(){ + if(mTabAdapter!=null){ + mTabAdapter.notifyDataSetChanged(); + } + } + public void onMenuTrigger(View pView){ if(pView.getId() == R.id.pNewTab){ - onNewTabInvoked(); + new Handler().postDelayed(this::onNewTabInvoked, 350); + mClosedByNewTab = true; + mHomeController.onBackPressed(); + } + if(pView.getId() == R.id.pNewTabMenu){ + new Handler().postDelayed(this::onNewTabInvoked, 350); + mClosedByNewTab = true; + mHomeController.onBackPressed(); } else if(pView.getId() == R.id.pCloseTab){ - mRecycleView.animate().setDuration(350).alpha(0).withEndAction(() -> { + mRecycleView.animate().setDuration(200).alpha(0).withEndAction(() -> { onClearTabBackup(); mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.REMOVE_ALL, null); }); } else if(pView.getId() == R.id.pOpenSetting){ - helperMethod.openActivity(settingAdvanceController.class, constants.CONST_LIST_HISTORY, activityContextManager.getInstance().getHomeController(),true); + activityContextManager.getInstance().getHomeController().onBackPressed(); + new Handler().postDelayed(() -> + { + helperMethod.openActivity(settingAdvanceController.class, constants.CONST_LIST_HISTORY, activityContextManager.getInstance().getHomeController(),true); + }, 300); } mtabViewController.onTrigger(tabEnums.eTabViewCommands.M_DISMISS_MENU, null); } @@ -421,7 +504,7 @@ public class tabController extends Fragment public void onBackPressed() { - if(mTabAdapter!=null){ + if(mTabAdapter!=null && !mClosedByNewTab){ boolean mStatus = (boolean) mTabAdapter.onTrigger(tabEnums.eTabAdapterCommands.M_SELECTION_MENU_SHOWING, null); onClearTabBackup(); onClearSelection(null); @@ -457,6 +540,8 @@ public class tabController extends Fragment onBackPressed(); } else if(e_type.equals(tabEnums.eTabAdapterCallback.ON_LOAD_TAB)){ + mClosed = true; + mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_HOLD_BLOCKER, null); mHomeController.onLoadTab((geckoSession)data.get(0),(boolean)data.get(1),true); } else if(e_type.equals(tabEnums.eTabAdapterCallback.ON_REMOVE_TAB_VIEW)){ @@ -466,13 +551,12 @@ public class tabController extends Fragment else if(e_type.equals(tabEnums.eTabAdapterCallback.ON_REMOVE_TAB_VIEW_RETAIN_BACKUP)){ onInitRemoveView((Integer) data.get(0), false); } - else if(e_type.equals(tabEnums.eTabAdapterCallback.ON_SHOW_UNDO_DIALOG)){ - mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_SHOW_UNDO_DIALOG, Collections.singletonList(mListModel.getList().size())); + else if(e_type.equals(tabEnums.eTabAdapterCallback.M_CLEAR_BACKUP)){ + onExitAndClearBackup(); } else if(e_type.equals(tabEnums.eTabAdapterCallback.ON_SHOW_SELECTION_MENU)){ mtabViewController.onTrigger(tabEnums.eTabViewCommands.ON_SHOW_SELECTION_MENU, data); } - return null; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java index 3bf65263..35feb57c 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java @@ -4,15 +4,15 @@ public class tabEnums { /*Settings Manager*/ public enum eTabViewCommands { - M_DISMISS_MENU, M_SHOW_MENU, INIT_TAB_COUNT, ON_HIDE_SELECTION, ON_SHOW_SELECTION, ON_SHOW_SELECTION_MENU, ON_SHOW_UNDO_DIALOG, ON_HIDE_UNDO_DIALOG, ON_GENERATE_SWIPABLE_BACKGROUND, ON_EXIT + M_DISMISS_MENU, M_SHOW_MENU, INIT_TAB_COUNT, ON_HIDE_SELECTION, ON_SHOW_SELECTION, ON_SHOW_SELECTION_MENU, ON_SHOW_UNDO_DIALOG, ON_HIDE_UNDO_DIALOG, ON_GENERATE_SWIPABLE_BACKGROUND, ON_EXIT, ON_HIDE_UNDO_DIALOG_INIT, ON_HOLD_BLOCKER, ON_RELEASE_BLOCKER } public enum eTabAdapterCommands { - M_SELECTION_MENU_SHOWING, M_REMOVE_ALL_SELECTION, M_CLEAR_ALL_SELECTION, ENABLE_LONG_CLICK_MENU, INIT_FIRST_ROW, REINIT_DATA, NOTIFY_SWIPE, GET_SELECTION_SIZE, REMOVE_ALL, REMOVE_ROW_CROSSED + M_SELECTION_MENU_SHOWING, M_REMOVE_ALL_SELECTION, M_CLEAR_ALL_SELECTION, ENABLE_LONG_CLICK_MENU, INIT_FIRST_ROW, REINIT_DATA, NOTIFY_SWIPE, GET_SELECTION_SIZE, REMOVE_ALL, REMOVE_ROW_CROSSED, M_INITIALIZE } public enum eTabAdapterCallback { - ON_HIDE_SELECTION, ON_SHOW_SELECTION, ON_CLEAR_TAB_BACKUP, ON_REMOVE_TAB, ON_INIT_TAB_COUNT, ON_BACK_PRESSED, ON_LOAD_TAB, ON_REMOVE_TAB_VIEW,ON_REMOVE_TAB_VIEW_RETAIN_BACKUP, ON_SHOW_UNDO_DIALOG, ON_SHOW_SELECTION_MENU + ON_HIDE_SELECTION, ON_SHOW_SELECTION, ON_CLEAR_TAB_BACKUP, ON_REMOVE_TAB, ON_INIT_TAB_COUNT, ON_BACK_PRESSED, ON_LOAD_TAB, ON_REMOVE_TAB_VIEW,ON_REMOVE_TAB_VIEW_RETAIN_BACKUP, M_CLEAR_BACKUP, ON_SHOW_SELECTION_MENU } public enum eModelCallback { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java index c237b77f..bdc654ff 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java @@ -180,13 +180,20 @@ class tabViewController mUndoLayout.setVisibility(View.VISIBLE); mUndoLayout.animate().cancel(); - mUndoLayout.setTranslationY(60); + + int mDuration = 220; + if(mUndoLayout.getAlpha()>0){ + mUndoLayout.setTranslationY(360); + mDuration = 400; + }else { + mUndoLayout.setTranslationY(60); + } mUndoLayout.setAlpha(0); mUndoLayout.animate().withLayer() .translationY(0) .alpha(1f) - .setDuration(220).start(); + .setDuration(mDuration).start(); initTabCount(pTabCount); @@ -208,6 +215,13 @@ class tabViewController mUndoLayout.setVisibility(View.GONE); } + public void blockUI(boolean pStatus){ + if(pStatus){ + mBlocker.setVisibility(View.VISIBLE); + }else { + mBlocker.setVisibility(View.GONE); + } + } private void onDrawSwipableBackground(Canvas pCanvas, RecyclerView.ViewHolder pViewHolder, float pDX, int pActionState) { @@ -271,6 +285,15 @@ class tabViewController }else if(pCommands.equals(tabEnums.eTabViewCommands.ON_EXIT)){ initExitUI(); } + else if(pCommands.equals(tabEnums.eTabViewCommands.ON_HIDE_UNDO_DIALOG_INIT)){ + onHideUndoDialogInit(); + } + else if(pCommands.equals(tabEnums.eTabViewCommands.ON_HOLD_BLOCKER)){ + blockUI(true); + } + else if(pCommands.equals(tabEnums.eTabViewCommands.ON_RELEASE_BLOCKER)){ + blockUI(false); + } return null; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java index a791ffb1..8d5a72a0 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java @@ -4,9 +4,9 @@ public class enums { /*Settings Manager*/ public enum etype{ - on_update_favicon,ON_UPDATE_TAB_TITLE, ON_LOAD_REQUEST,GECKO_SCROLL_CHANGED,ON_UPDATE_SEARCH_BAR,M_ON_MAIL, - on_verify_selected_url_menu,FINDER_RESULT_CALLBACK,M_ADMOB_BANNER_RECHECK, - welcome, reload,download_folder, M_UPDATE_THEME,M_ON_BANNER_UPDATE, M_LOAD_HOMEPAGE_GENESIS,M_INIT_TAB_COUNT, + on_update_favicon,ON_UPDATE_TAB_TITLE, ON_OPEN_TAB_VIEW,ON_NEW_TAB_ANIMATION, ON_LOAD_REQUEST,GECKO_SCROLL_CHANGED,GECKO_SCROLL_FINISHED,ON_UPDATE_SEARCH_BAR,M_ON_MAIL,SESSION_ID,M_UPDATE_PIXEL_BACKGROUND,M_CACHE_UPDATE_TAB, + on_verify_selected_url_menu,FINDER_RESULT_CALLBACK,M_ADMOB_BANNER_RECHECK,M_OPEN_SESSION, + welcome, reload,download_folder, M_UPDATE_THEME,M_ON_BANNER_UPDATE, M_LOAD_HOMEPAGE_GENESIS,M_INIT_TAB_COUNT,M_INIT_TAB_COUNT_FORCED, url_triggered, url_triggered_new_tab,url_clear,fetch_favicon, fetch_thumbnail,url_clear_at,remove_from_database,is_empty,M_HOME_PAGE,M_PRELOAD_URL,ON_KEYBOARD_CLOSE,M_CLOSE_TAB, on_close_sesson,on_long_press, on_full_screen,on_handle_external_intent,on_update_suggestion_url,progress_update,progress_update_forced, ON_EXPAND_TOP_BAR,recheck_orbot,on_url_load,on_playstore_load,back_list_empty,start_proxy, ON_UPDATE_THEME, M_INITIALIZE_TAB_SINGLE, M_INITIALIZE_TAB_LINK,on_request_completed, on_update_history,on_update_suggestion,M_WELCOME_MESSAGE,ON_UPDATE_TITLE_BAR,ON_FIRST_PAINT, ON_LOAD_TAB_ON_RESUME, ON_SESSION_REINIT,on_page_loaded,on_load_error,download_file_popup,on_init_ads,search_update, open_new_tab } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java index a22ee7da..387bd5df 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java @@ -61,6 +61,7 @@ public class keys /*Bridge Settings*/ public static final String BRIDGE_CUSTOM_BRIDGE_1 = "CLEAR_PREFS"; + public static final String BRIDGE_CUSTOM_TYPE = "BRIDGE_CUSTOM_TYPE"; public static final String BRIDGE_NOTIFICATION = "BRIDGE_NOTIFICATION"; public static final String BRIDGE_ENABLES = "pref_bridges_enabled"; public static final String VPN_ENABLED = "pref_vpn"; diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java index 55af2f81..d9f1a846 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java @@ -25,6 +25,7 @@ public class status public static String sSettingLanguageRegion = "Us"; public static String mReferenceWebsites; public static String sBridgeCustomBridge = strings.GENERIC_EMPTY_STR; + public static String sBridgeCustomType = strings.GENERIC_EMPTY_STR; public static boolean sSettingEnableZoom = true; public static boolean sSettingEnableVoiceInput = true; @@ -92,7 +93,8 @@ public class status status.sSettingLanguageRegion = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.SETTING_LANGUAGE_REGION,strings.SETTING_DEFAULT_LANGUAGE_REGION)); status.sSettingSearchStatus = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.SETTING_SEARCH_ENGINE,constants.CONST_BACKEND_GENESIS_URL)); status.sBridgeCustomBridge = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,strings.BRIDGE_CUSTOM_BRIDGE_OBFS4)); - status.sBridgeNotificationManual = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS,0)); + status.sBridgeCustomType = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_TYPE,strings.GENERIC_EMPTY_SPACE)); + status.sBridgeNotificationManual = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS,1)); status.sRestoreTabs = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_RESTORE_TAB,false)); status.sCharacterEncoding = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_CHARACTER_ENCODING,false)); status.sShowImages = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_SHOW_IMAGES,0)); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/dataController.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/dataController.java index 834ccfff..0417ec47 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/dataController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/dataController.java @@ -58,7 +58,7 @@ public class dataController } if(status.sRestoreTabs || mThemeApplying){ mTabModel.initializeTab(databaseController.getInstance().selectTabs()); - activityContextManager.getInstance().getHomeController().initTabCount(); + activityContextManager.getInstance().getHomeController().initTabCountForced(); }else{ invokeTab(dataEnums.eTabCommands.M_CLEAR_TAB, null); } @@ -102,7 +102,7 @@ public class dataController return mBookmarkDataModel.onTrigger(pCommands, pData); } - public Object invokeTab(dataEnums.eTabCommands pCommands, List pData){ + public Object invokeTab(dataEnums.eTabCommands pCommands, List pData){ return mTabModel.onTrigger(pCommands, pData); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java index 0891569d..585c55f1 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java @@ -11,6 +11,7 @@ import android.view.textservice.TextServicesManager; import com.darkweb.genesissearchengine.appManager.bookmarkManager.bookmarkRowModel; import com.darkweb.genesissearchengine.appManager.historyManager.historyRowModel; +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; import java.util.ArrayList; @@ -135,8 +136,14 @@ public class suggestionDataModel implements SpellCheckerSession.SpellCheckerSess } if(pQuery.length()>0){ - mCurrentList.add( 0,new historyRowModel(pQuery, strings.GENERIC_EMPTY_STR,-1)); + if(!pQuery.equals("about:blank")){ + mCurrentList.add( 0,new historyRowModel(pQuery, strings.GENERIC_EMPTY_STR,-1)); + } } + if(mCurrentList.size()<=0) { + mCurrentList.add( 0,new historyRowModel("Genesis Search", "genesis.onion",-1)); + } + return mCurrentList; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java index a990c27e..1acaf2ef 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java @@ -15,6 +15,7 @@ import com.darkweb.genesissearchengine.appManager.homeManager.geckoManager.Neste import com.darkweb.genesissearchengine.appManager.homeManager.geckoManager.geckoSession; import com.darkweb.genesissearchengine.appManager.tabManager.tabRowModel; import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; import org.mozilla.geckoview.GeckoResult; import java.io.ByteArrayInputStream; @@ -163,7 +164,7 @@ class tabDataModel } tabRowModel getRecentTab(){ - if(mTabs.size()>0){ + if(mTabs.size()>1){ return mTabs.get(1); } else { @@ -221,22 +222,31 @@ class tabDataModel int finalCounter = counter; if (mTabs.get(counter).getSession().getSessionID().equals(pSessionID)) { GeckoResult mResult = pBitmapManager.withHandler(handler); - Bitmap mBitmap = pBitmapManager.poll(4000); + Bitmap mBitmap = pBitmapManager.poll(0); + ByteArrayOutputStream out = new ByteArrayOutputStream(); mBitmap.compress(Bitmap.CompressFormat.PNG, 20, out); Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); - mTabs.get(finalCounter).setmBitmap(decoded); - if(pImageView!=null){ - activityContextManager.getInstance().getHomeController().runOnUiThread(() -> pImageView.setImageBitmap(mBitmap)); + + Bitmap emptyBitmap = Bitmap.createBitmap(decoded.getWidth(), decoded.getHeight(), decoded.getConfig()); + if (!decoded.sameAs(emptyBitmap)) { + + mTabs.get(finalCounter).setmBitmap(decoded); + + if(pImageView!=null){ + activityContextManager.getInstance().getHomeController().runOnUiThread(() -> { + pImageView.setImageBitmap(mBitmap); + }); + } + + byte[] mThumbnail = out.toByteArray(); + if(status.sRestoreTabs){ + ContentValues mContentValues = new ContentValues(); + mContentValues.put("mThumbnail", mThumbnail); + databaseController.getInstance().execTab("tab",mContentValues, mTabs.get(finalCounter).getmId()); + } } - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] mThumbnail = bos.toByteArray(); - - ContentValues mContentValues = new ContentValues(); - mContentValues.put("mThumbnail", mThumbnail); - databaseController.getInstance().execTab("tab",mContentValues, mTabs.get(finalCounter).getmId()); } } @@ -244,7 +254,7 @@ class tabDataModel throwable.printStackTrace(); } if(pOpenTabView){ - activityContextManager.getInstance().getHomeController().onOpenTabReady(); + activityContextManager.getInstance().getHomeController().onLoadFirstElement(); } } @@ -287,15 +297,21 @@ class tabDataModel } else if(pCommands == dataEnums.eTabCommands.CLOSE_TAB){ closeTab((geckoSession)pData.get(0), pData.get(1)); + activityContextManager.getInstance().getHomeController().initTabCountForced(); } else if(pCommands == dataEnums.eTabCommands.M_CLEAR_TAB){ clearTab(); + activityContextManager.getInstance().getHomeController().initTabCountForced(); } else if(pCommands == dataEnums.eTabCommands.M_ADD_TAB){ - return addTabs((geckoSession)pData.get(0), (boolean)pData.get(1)); + int mTabs = addTabs((geckoSession)pData.get(0), (boolean)pData.get(1)); + activityContextManager.getInstance().getHomeController().initTabCountForced(); + + return mTabs; } else if(pCommands == dataEnums.eTabCommands.M_UPDATE_TAB){ updateTab((String) pData.get(1), (geckoSession) pData.get(5)); + activityContextManager.getInstance().getHomeController().initTabCountForced(); } else if(pCommands == dataEnums.eTabCommands.GET_TAB){ return getTab(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java index 4d6d0a4e..afd5e608 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java @@ -13,10 +13,14 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Point; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; import android.net.Uri; import android.os.Vibrator; import android.text.SpannableString; @@ -29,10 +33,12 @@ import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.view.animation.RotateAnimation; import android.view.inputmethod.InputMethodManager; import android.webkit.MimeTypeMap; import android.widget.ActionMenuView; +import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; @@ -217,10 +223,10 @@ public class helperMethod final Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{mail}); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, "get bridges"); - emailIntent.putExtra(Intent.EXTRA_TEXT, "get bridges"); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "get transport obfs4"); + emailIntent.putExtra(Intent.EXTRA_TEXT, "get transport obfs4"); emailIntent.setSelector( selectorIntent ); - context.startActivity(Intent.createChooser(emailIntent, "get transport")); + context.startActivity(Intent.createChooser(emailIntent, "get transport obfs4")); } public static void sendBridgeEmail(Context context){ @@ -229,10 +235,10 @@ public class helperMethod final Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"bridges@torproject.org"}); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, "get bridges"); - emailIntent.putExtra(Intent.EXTRA_TEXT, "get bridges"); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "get transport obfs4"); + emailIntent.putExtra(Intent.EXTRA_TEXT, "get transport obfs4"); emailIntent.setSelector( selectorIntent ); - context.startActivity(Intent.createChooser(emailIntent, "get transport")); + context.startActivity(Intent.createChooser(emailIntent, "get transport obfs4")); } public static void onRevealView(View pView) { @@ -258,6 +264,31 @@ public class helperMethod anim.start(); } + public static Bitmap drawableToBitmap (Drawable drawable) { + Bitmap bitmap = null; + + if(drawable==null){ + return null; + } + if (drawable instanceof BitmapDrawable) { + BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; + if(bitmapDrawable.getBitmap() != null) { + return bitmapDrawable.getBitmap(); + } + } + + if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { + bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel + } else { + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bitmap; + } + public static void hideKeyboard(AppCompatActivity context) { View view = context.findViewById(android.R.id.content); if (view != null) @@ -543,10 +574,25 @@ public class helperMethod return (int)(px / context.getResources().getDisplayMetrics().density); } - public static int pxFromDp(int dp){ + public static int pxFromDp(float dp){ return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } + public static void setImageDrawableWithAnimation(ImageView imageView, Drawable drawable, int duration) { + Drawable currentDrawable = imageView.getDrawable(); + if (currentDrawable == null) { + imageView.setImageDrawable(drawable); + return; + } + + TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[] { + currentDrawable, + drawable + }); + imageView.setImageDrawable(transitionDrawable); + transitionDrawable.startTransition(duration); + } + public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java index 3f78ab4e..24c7897e 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java @@ -282,7 +282,9 @@ class messageManager mContext.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); if(!status.sBridgeCustomBridge.equals("meek") && !status.sBridgeCustomBridge.equals("obfs4")){ ((EditText)mDialog.findViewById(R.id.pBridgeInput)).setText(status.sBridgeCustomBridge); + ((EditText)mDialog.findViewById(R.id.pBridgeType)).setText(status.sBridgeCustomType); } + mDialog.setOnShowListener(dialog -> mContext.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)); mDialog.setOnDismissListener(dialog -> { final Handler handler = new Handler(); @@ -310,7 +312,7 @@ class messageManager mDialog.dismiss(); mContext.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); helperMethod.hideKeyboard(mContext); - mEvent.invokeObserver(Collections.singletonList(((EditText)mDialog.findViewById(R.id.pBridgeInput)).getText().toString()), M_SET_BRIDGES); + mEvent.invokeObserver(Arrays.asList(((EditText)mDialog.findViewById(R.id.pBridgeInput)).getText().toString(), ((EditText)mDialog.findViewById(R.id.pBridgeType)).getText().toString()), M_SET_BRIDGES); }); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java index bc69180b..435186ce 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java @@ -39,6 +39,7 @@ class orbotManager private void onStartOrbot(){ orbotLocalConstants.mBridges = status.sBridgeCustomBridge; orbotLocalConstants.mIsManualBridge = status.sBridgeGatewayManual; + orbotLocalConstants.mManualBridgeType = status.sBridgeCustomType; Prefs.putBridgesEnabled(status.sBridgeStatus); Intent mServiceIntent = new Intent(mAppContext.getApplicationContext(), OrbotService.class); mServiceIntent.setAction(ACTION_START); @@ -49,6 +50,7 @@ class orbotManager { mAppContext.startService(mServiceIntent); } + initializeProxy(); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java index 30e7ea00..1253eca3 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java @@ -250,7 +250,7 @@ public class pluginController pluginController.getInstance().onMessageManagerInvoke(Arrays.asList(constants.CONST_BACKEND_GOOGLE_URL, this), M_BRIDGE_MAIL); } else if(pEventType.equals(M_SET_BRIDGES)){ - activityContextManager.getInstance().getBridgeController().onUpdateBridges((String) pData.get(0)); + activityContextManager.getInstance().getBridgeController().onUpdateBridges((String) pData.get(0), (String) pData.get(1)); } return null; } diff --git a/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml b/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml index c30d7c4c..dd8c4855 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml @@ -31,6 +31,18 @@ + + + + + + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_badge.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_badge.xml new file mode 100644 index 00000000..7e480e24 --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_badge.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_cancel.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_cancel.xml new file mode 100644 index 00000000..1ab7bacb --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_cancel.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/tab/xml/tx_card_corner.xml b/app/src/main/res/custom-xml/tab/xml/tx_card_corner.xml new file mode 100644 index 00000000..d7e75114 --- /dev/null +++ b/app/src/main/res/custom-xml/tab/xml/tx_card_corner.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/tick_recycler_view.png b/app/src/main/res/drawable-hdpi/tick_recycler_view.png index 3526b49cdc0c5b319354e6f657595a7a434a7654..5a15d393acf7e24a02c552f2c65fe21c360dff76 100644 GIT binary patch literal 82371 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 He)@j^y($d1 literal 35888 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�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 diff --git a/app/src/main/res/layouts/alert/layout/popup_data_cleared.xml b/app/src/main/res/layouts/alert/layout/popup_data_cleared.xml index 70b10830..888d2f95 100644 --- a/app/src/main/res/layouts/alert/layout/popup_data_cleared.xml +++ b/app/src/main/res/layouts/alert/layout/popup_data_cleared.xml @@ -7,83 +7,90 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + android:layout_height="match_parent" + android:background="@xml/hox_rounded_corner"> - - - - - - -