From fc1d48dea4fdeb6c98ef91cb27f576d4718ec9a6 Mon Sep 17 00:00:00 2001 From: msmannan00 Date: Sat, 13 Jul 2019 21:20:04 +0500 Subject: [PATCH] Code Revision and Menu Update --- app/build.gradle | 44 +++-- app/src/main/AndroidManifest.xml | 38 ++-- .../appManager/app_model.java | 54 ------ .../data_helper/database_controller.java | 82 +++++++++ .../data_helper/database_helper.java | 135 ++++++++++++++ .../list_activity/list_adapter.java | 159 ++++++++++++++++ .../list_activity/list_controller.java | 152 +++++++++++++++ .../appManager/list_activity/list_model.java | 78 ++++++++ .../list_activity/list_row_model.java | 26 +++ .../main_activity/AutoCompleteAdapter.java | 118 ++++++++++++ .../appManager/main_activity/app_model.java | 174 ++++++++++++++++++ .../applicationViewController.java | 72 ++++++-- .../application_controller.java | 101 +++++++--- .../{ => main_activity}/eventHandler.java | 86 +++++++-- .../{ => main_activity}/geckoClients.java | 85 +++++++-- .../{ => main_activity}/webviewClient.java | 9 +- .../setting_manager/setting_controller.java | 72 ++++++++ .../setting_manager/setting_model.java | 23 +++ .../setting_view_controller.java | 73 ++++++++ .../setting_manager/settings_ehandler.java | 104 +++++++++++ .../constants/constants.java | 15 +- .../genesissearchengine/constants/enums.java | 1 + .../genesissearchengine/constants/keys.java | 7 + .../constants/messages.java | 1 + .../genesissearchengine/constants/status.java | 17 +- .../constants/strings.java | 24 ++- .../dataManager/preference_manager.java | 2 +- .../genesissearchengine/helperMethod.java | 77 +++++--- .../httpManager/httpclient.java | 3 - .../httpManager/webRequestHandler.java | 2 +- .../pluginManager/admanager.java | 21 ++- .../pluginManager/fabricManager.java | 14 +- .../pluginManager/firebase.java | 11 +- .../pluginManager/message_manager.java | 132 +++++++++++-- .../pluginManager/orbot_manager.java | 6 +- app/src/main/res/drawable/back_arrow.png | Bin 0 -> 1813 bytes app/src/main/res/drawable/cancel.png | Bin 0 -> 10021 bytes app/src/main/res/drawable/dropdown_arrow.png | Bin 0 -> 966 bytes app/src/main/res/drawable/empty_list.png | Bin 0 -> 52179 bytes app/src/main/res/drawable/menu_item.png | Bin 0 -> 2566 bytes app/src/main/res/drawable/rouned_corner.xml | 12 ++ .../res/layout/activity_app_list_manager.xml | 93 ++++++++++ .../res/layout/hint_completion_layout.xml | 30 +++ .../{application_view.xml => home_view.xml} | 31 +++- app/src/main/res/layout/list_manager_row.xml | 51 +++++ app/src/main/res/layout/settings_activity.xml | 174 ++++++++++++++++++ app/src/main/res/menu/menu_main.xml | 46 +++++ app/src/main/res/values/arrays.xml | 12 ++ app/src/main/res/values/dimens.xml | 3 + app/src/main/res/values/strings.xml | 42 ++++- app/src/main/res/values/styles.xml | 18 ++ app/src/main/res/xml/border_set.xml | 13 ++ app/src/main/res/xml/root_preferences.xml | 54 ++++++ app/src/main/res/xml/search_back_default.xml | 6 +- .../main/res/xml/spinner_style_animate.xml | 27 +++ .../main/res/xml/spinner_style_background.xml | 15 ++ 56 files changed, 2392 insertions(+), 253 deletions(-) delete mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/app_model.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_controller.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_helper.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_adapter.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_controller.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_model.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_row_model.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/AutoCompleteAdapter.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/app_model.java rename app/src/main/java/com/darkweb/genesissearchengine/appManager/{ => main_activity}/applicationViewController.java (81%) rename app/src/main/java/com/darkweb/genesissearchengine/appManager/{ => main_activity}/application_controller.java (73%) rename app/src/main/java/com/darkweb/genesissearchengine/appManager/{ => main_activity}/eventHandler.java (54%) rename app/src/main/java/com/darkweb/genesissearchengine/appManager/{ => main_activity}/geckoClients.java (69%) rename app/src/main/java/com/darkweb/genesissearchengine/appManager/{ => main_activity}/webviewClient.java (90%) create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_controller.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_model.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_view_controller.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/settings_ehandler.java create mode 100644 app/src/main/res/drawable/back_arrow.png create mode 100644 app/src/main/res/drawable/cancel.png create mode 100644 app/src/main/res/drawable/dropdown_arrow.png create mode 100644 app/src/main/res/drawable/empty_list.png create mode 100644 app/src/main/res/drawable/menu_item.png create mode 100644 app/src/main/res/drawable/rouned_corner.xml create mode 100644 app/src/main/res/layout/activity_app_list_manager.xml create mode 100644 app/src/main/res/layout/hint_completion_layout.xml rename app/src/main/res/layout/{application_view.xml => home_view.xml} (92%) create mode 100644 app/src/main/res/layout/list_manager_row.xml create mode 100644 app/src/main/res/layout/settings_activity.xml create mode 100644 app/src/main/res/menu/menu_main.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/xml/border_set.xml create mode 100644 app/src/main/res/xml/root_preferences.xml create mode 100644 app/src/main/res/xml/spinner_style_animate.xml create mode 100644 app/src/main/res/xml/spinner_style_background.xml diff --git a/app/build.gradle b/app/build.gradle index 6220328c..0e6a4422 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'io.fabric' ext { geckoviewChannel = "" - geckoviewVersion = "64.0.20180927100037" + geckoviewVersion = "67.0.20190613202504" } @@ -44,31 +44,30 @@ android { flavorDimensions "abi" productFlavors { - arm { - versionCode 175 - versionName "175" + /*arm { + versionCode 180 + versionName "180" dimension "abi" buildConfigField "String", "VARIANT", "\"arm\"" } aarch64 { - versionCode 176 - versionName "176" + versionCode 181 + versionName "181" dimension "abi" buildConfigField "String", "VARIANT", "\"aarch64\"" - } + }*/ x86 { - versionCode 177 - versionName "177" + versionCode 182 + versionName "182" dimension "abi" buildConfigField "String", "VARIANT", "\"i686\"" } - - x86_64 { - versionCode 178 - versionName "178" + /*x86_64 { + versionCode 183 + versionName "183" dimension "abi" buildConfigField "String", "VARIANT", "\"x86_64\"" - } + }*/ } @@ -109,11 +108,15 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta2' implementation 'cz.msebera.android:httpclient:4.5.8' - x86Implementation "org.mozilla.geckoview:geckoview-x86:67.0.20190521210220" - x86_64Implementation "org.mozilla.geckoview:geckoview-x86_64:67.0.20190521210220" - armImplementation "org.mozilla.geckoview:geckoview-armeabi-v7a:67.0.20190521210220" - implementation 'com.google.firebase:firebase-core:17.0.0' - aarch64Implementation "org.mozilla.geckoview:geckoview-arm64-v8a:67.0.20190521210220" + x86Implementation "org.mozilla.geckoview:geckoview-x86:67.0.20190613202504" + //x86_64Implementation "org.mozilla.geckoview:geckoview-x86_64:67.0.20190613202504" + //armImplementation "org.mozilla.geckoview:geckoview-armeabi-v7a:67.0.20190613202504" + //aarch64Implementation "org.mozilla.geckoview:geckoview-arm64-v8a:67.0.20190613202504" + + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.preference:preference:1.1.0-alpha02' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.crowdfire.cfalertdialog:cfalertdialog:1.1.0' @@ -123,6 +126,9 @@ dependencies { implementation 'org.slf4j:slf4j-android:1.7.26' implementation 'com.google.android.gms:play-services-ads:18.0.0' implementation 'com.android.support:design:28.0.0' + androidTestImplementation 'androidx.test:runner:1.2.0-alpha03' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha03' + implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { transitive = true; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 698067b4..72c52ac9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,34 +1,50 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.example.myapplication"> - - + + + + + android:usesCleartextTraffic="true"> + + + + + - + android:required="false"/> + + - + + + + android:value="be76c64dae2519d4ab8daaed88298da14c7c294f"/> diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/app_model.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/app_model.java deleted file mode 100644 index cd014321..00000000 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/app_model.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.darkweb.genesissearchengine.appManager; - -import android.content.Context; - -public class app_model -{ - /*Data Objects*/ - private static String currentURL = "http://boogle.store/"; - private static int port = 9150; - private boolean isURLLoading = true; - private Context appContext; - private application_controller appInstance; - - - /*Initializations*/ - private static final app_model ourInstance = new app_model(); - public static app_model getInstance() - { - return ourInstance; - } - - - /*Getters Setters*/ - public int getPort() - { - return port; - } - - public void setPort(int port) - { - this.port = port; - } - - public Context getAppContext() - { - return appContext; - } - - public void setAppContext(Context appContext) - { - this.appContext = appContext; - } - - public application_controller getAppInstance() - { - return appInstance; - } - - public void setAppInstance(application_controller appInstance) - { - this.appInstance = appInstance; - } - -} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_controller.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_controller.java new file mode 100644 index 00000000..ca23131a --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_controller.java @@ -0,0 +1,82 @@ +package com.darkweb.genesissearchengine.appManager.data_helper; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import com.darkweb.genesissearchengine.appManager.list_activity.list_row_model; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.helperMethod; + +import java.io.IOException; +import java.util.ArrayList; + +import static android.content.Context.MODE_PRIVATE; + +public class database_controller +{ + private static final database_controller ourInstance = new database_controller(); + + public static database_controller getInstance() + { + return ourInstance; + } + + private SQLiteDatabase database_instance; + + private database_controller() + { + } + + public void initialize() + { + try + { + database_instance = app_model.getInstance().getAppInstance().openOrCreateDatabase("DatabaseName", MODE_PRIVATE, null); + database_instance.execSQL("CREATE TABLE IF NOT EXISTS " + "history" + " (id INT(4),date VARCHAR,url VARCHAR);"); + database_instance.execSQL("CREATE TABLE IF NOT EXISTS " + "bookmark" + " (id INT(4),title VARCHAR,url VARCHAR);"); + + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + } + + public void execSQL(String query) + { + database_instance.execSQL(query); + } + + public ArrayList selectHistory() + { + ArrayList tempmodel = new ArrayList(); + Cursor c = database_instance.rawQuery("SELECT * FROM history ORDER BY id DESC ", null); + if (c.moveToFirst()){ + do { + tempmodel.add(new list_row_model(c.getString(2), c.getString(1),Integer.parseInt(c.getString(0)))); + app_model.getInstance().initSuggestions(c.getString(2)); + } while(c.moveToNext()); + } + c.close(); + + return tempmodel; + } + + public ArrayList selectBookmark() + { + ArrayList tempmodel = new ArrayList(); + Cursor c = database_instance.rawQuery("SELECT * FROM bookmark ORDER BY id DESC ", null); + + if (c.moveToFirst()){ + do { + tempmodel.add(new list_row_model(c.getString(2), c.getString(1),Integer.parseInt(c.getString(0)))); + } while(c.moveToNext()); + } + c.close(); + + return tempmodel; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_helper.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_helper.java new file mode 100644 index 00000000..efd410f2 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/data_helper/database_helper.java @@ -0,0 +1,135 @@ +package com.darkweb.genesissearchengine.appManager.data_helper; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.database.sqlite.SQLiteOpenHelper; +import com.darkweb.genesissearchengine.appManager.list_activity.list_model; +import com.darkweb.genesissearchengine.appManager.list_activity.list_row_model; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; + +public class database_helper extends SQLiteOpenHelper +{ + private Context mContext; + private String mDbPath; + private String mDbName; + private int mDbVersion; + + public SQLiteDatabase db; + + public database_helper(Context context, String dbName, int version) { + super(context, dbName, null, version); + mContext = context; + mDbPath = context.getApplicationInfo().dataDir + "/databases/"; + mDbName = dbName; + mDbVersion = version; + } + + public boolean exists() { + SQLiteDatabase db = null; + + try { + db = SQLiteDatabase.openDatabase(mDbPath + mDbName, null, SQLiteDatabase.OPEN_READONLY); + } + catch (SQLiteException e) { + //database does not exist yet. + } + + if (db != null) { + db.close(); + return true; + } else { + return false; + } + } + + public void openDatabase(int flag) throws SQLiteException, IOException { + if (!exists()) { + if (flag == SQLiteDatabase.OPEN_READONLY) { + this.getReadableDatabase(); + } else if (flag == SQLiteDatabase.OPEN_READWRITE) { + this.getWritableDatabase(); + } + InputStream iStream = null; + OutputStream oStream = null; + try { + iStream = mContext.getAssets().open(mDbName); + oStream = new FileOutputStream(mDbPath + mDbName); + byte[] buffer = new byte[1024]; + int length; + + while ((length = iStream.read(buffer)) > 0) { + oStream.write(buffer, 0, length); + } + } catch (IOException e) { + throw e; + } finally { + if (iStream != null) { + iStream.close(); + } + + if (oStream != null) { + oStream.flush(); + oStream.close(); + } + } + } + + try { + if (flag == SQLiteDatabase.OPEN_READONLY) { + db = SQLiteDatabase.openDatabase(mDbPath + mDbName, null, + SQLiteDatabase.OPEN_READONLY); + } else if (flag == SQLiteDatabase.OPEN_READWRITE) { + db = SQLiteDatabase.openDatabase(mDbPath + mDbName, null, + SQLiteDatabase.OPEN_READWRITE); + } + } catch (SQLiteException e) { + throw e; + } + } + + @Override + public synchronized void close() { + if (db != null) { + db.close(); + } + super.close(); + } + + @Override + public void onCreate(SQLiteDatabase db) { + + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + public void runQuery(String query) + { + db.execSQL(query); + } + + public ArrayList selectHistory() + { + ArrayList tempmodel = new ArrayList(); + Cursor c = db.rawQuery("SELECT * FROM history ", null); + if (c.moveToFirst()){ + do { + tempmodel.add(new list_row_model(c.getString(0),c.getString(1),Integer.parseInt(c.getString(0)))); + } while(c.moveToNext()); + } + c.close(); + ///db.close(); + + return tempmodel; + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_adapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_adapter.java new file mode 100644 index 00000000..8a988abd --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_adapter.java @@ -0,0 +1,159 @@ +package com.darkweb.genesissearchengine.appManager.list_activity; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.*; +import androidx.recyclerview.widget.RecyclerView; +import com.darkweb.genesissearchengine.appManager.data_helper.database_controller; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.helperMethod; +import com.darkweb.genesissearchengine.pluginManager.orbot_manager; +import com.example.myapplication.R; + +public class list_adapter extends RecyclerView.Adapter +{ + private ImageView empty_list; + private list_controller controller; + + public list_adapter() + { + } + + public void initialize(ImageView empty_list,list_controller controller) + { + this.empty_list = empty_list; + this.controller = controller; + } + + @Override + public listViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_manager_row, parent, false); + listViewHolder viewHolder = new listViewHolder(view); + return viewHolder; + } + + @Override + public void onBindViewHolder(list_adapter.listViewHolder holder, int position) + { + holder.bindListView(list_model.getInstance().getModel().get(position)); + clearMessageItem(holder.messageButton,holder.empty_message,position); + } + + @Override + public int getItemCount() { + return list_model.getInstance().getModel().size(); + } + + public class listViewHolder extends RecyclerView.ViewHolder + { + public TextView heaaderText; + public TextView descriptionText; + public ImageButton messageButton; + public ImageView empty_message; + + public listViewHolder(View itemView) { + super(itemView); + } + + public void bindListView(list_row_model model) { + + heaaderText = itemView.findViewById(R.id.header); + descriptionText = itemView.findViewById(R.id.description); + + String header = model.getHeader(); + descriptionText.setText(model.getDescription()); + + if(model.getHeader().length()<=2) + { + header = model.getDescription() + model.getHeader(); + } + heaaderText.setText(header); + + + messageButton = itemView.findViewById(R.id.message_button); + empty_message = itemView.findViewById(R.id.empty_list); + + setItemViewOnClickListener(itemView,header); + } + } + + public void setItemViewOnClickListener(View itemView,String url) + { + itemView.setOnClickListener(new View.OnClickListener(){ + + @Override + public void onClick(View v) + { + + String tempurl = url; + isValidUrl(tempurl); + controller.finish(); + } + }); + } + + public boolean isValidUrl(String url) + { + url = helperMethod.completeURL(url); + + if(!url.contains("boogle") && !url.equals(constants.backendGoogle) && !url.equals(constants.backendBing)) + { + if(orbot_manager.getInstance().initOrbot(url)) + { + app_model.getInstance().getAppInstance().onloadURL(url,true,false); + return true; + } + return false; + } + else + { + app_model.getInstance().getAppInstance().onloadURL(url,false,false); + return true; + } + } + + public void clearMessageItem(ImageButton messageButton,ImageView view,int index) + { + ImageView newview = view; + messageButton.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + deleteFromDatabase(list_model.getInstance().getModel().get(index).getId()); + list_model.getInstance().getModel().remove(index); + list_model.getInstance().removeFromMainList(list_model.getInstance().getIndex().get(index)); + list_model.getInstance().removeIndex(index); + list_adapter.this.notifyItemRemoved(index); + list_adapter.this.notifyDataSetChanged(); + isListEmpty(newview); + } + }); + } + + public void deleteFromDatabase(int index) + { + String table="bookmark"; + if(list_model.getInstance().getType()==constants.list_history) + { + table = "history"; + } + Log.i("dgfdfg","delete from "+table+" where id="+index); + database_controller.getInstance().execSQL("delete from "+table+" where id="+index); + } + + public void isListEmpty(ImageView view) + { + if(list_model.getInstance().getModel().size()<=0) + { + empty_list.setAlpha(0f); + empty_list.setVisibility(View.VISIBLE); + empty_list.animate().alpha(1); + } + + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_controller.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_controller.java new file mode 100644 index 00000000..24338380 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_controller.java @@ -0,0 +1,152 @@ +package com.darkweb.genesissearchengine.appManager.list_activity; + +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.ImageView; +import androidx.appcompat.app.AppCompatActivity; +import android.os.Bundle; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.darkweb.genesissearchengine.appManager.data_helper.database_controller; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.pluginManager.message_manager; +import com.example.myapplication.R; +import java.util.ArrayList; + +public class list_controller extends AppCompatActivity +{ + private ImageView empty_list; + private EditText search_bar; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_app_list_manager); + + initializeListInstance(); + initializeListModel(); + initializeListController(); + initSearchBar(); + updatelist(); + } + + public void initializeListInstance() + { + app_model.getInstance().setListInstance(this); + app_model.getInstance().setListContext(this); + } + + + public void initializeListModel() + { + Bundle bundle = getIntent().getExtras(); + if(bundle.getInt(keys.list_type)==constants.list_bookmark) + { + list_model.getInstance().setType(constants.list_bookmark); + list_model.getInstance().setMainList(app_model.getInstance().getBookmark()); + } + else + { + list_model.getInstance().setType(constants.list_history); + list_model.getInstance().setMainList(app_model.getInstance().getHistory()); + } + } + + public void initializeListController() + { + empty_list = findViewById(R.id.empty_list); + search_bar = findViewById(R.id.search); + RecyclerView list_view = findViewById(R.id.listview); + + list_adapter adapter = new list_adapter(); + adapter.initialize(empty_list,this); + list_view.setAdapter(adapter); + list_view.setLayoutManager(new LinearLayoutManager(this)); + isListEmpty(); + } + + public void clearHistory(View view) + { + if(app_model.getInstance().getHistory().size()>0) + { + message_manager.getInstance().clearData(); + } + } + + public void clearAll() + { + list_model.getInstance().getModel().clear(); + list_model.getInstance().getMainList().clear(); + initializeListController(); + + empty_list.setAlpha(0f); + empty_list.setVisibility(View.VISIBLE); + empty_list.animate().alpha(1); + search_bar.setText(""); + + String table="bookmark"; + if(list_model.getInstance().getType()==constants.list_history) + { + table = "history"; + } + database_controller.getInstance().execSQL("delete from "+table+" where 1"); + + } + + public void isListEmpty() + { + if(list_model.getInstance().getModel().size()<=0) + { + empty_list.setVisibility(View.VISIBLE); + } + else + { + empty_list.setVisibility(View.GONE); + } + + } + + public void initSearchBar() + { + search_bar.setOnEditorActionListener((v, actionId, event) -> + { + if (actionId != EditorInfo.IME_ACTION_NEXT) + { + return false; + } + else + { + return updatelist(); + } + }); + } + + public boolean updatelist() + { + String query = search_bar.getText().toString(); + ArrayList temp_model = new ArrayList(); + list_model.getInstance().getIndex().clear(); + for(int counter=0;counter<=list_model.getInstance().getMainList().size()-1;counter++) + { + if(list_model.getInstance().getMainList().get(counter).getHeader().contains(query) || list_model.getInstance().getMainList().get(counter).getDescription().contains(query)) + { + temp_model.add(list_model.getInstance().getMainList().get(counter)); + list_model.getInstance().setIndex(counter); + } + } + list_model.getInstance().setModel(temp_model); + initializeListController(); + + return true; + } + + public void onBackPressed(View view) + { + finish(); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_model.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_model.java new file mode 100644 index 00000000..e9bbf7ba --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_model.java @@ -0,0 +1,78 @@ +package com.darkweb.genesissearchengine.appManager.list_activity; + +import java.util.ArrayList; + +public class list_model +{ + private static final list_model ourInstance = new list_model(); + + public static list_model getInstance() + { + return ourInstance; + } + + private list_model() + { + } + + public ArrayList list_model = new ArrayList(); + public ArrayList list_index = new ArrayList(); + private ArrayList main_model_ref = new ArrayList(); + + public int listType; + + public void setType(int listType) + { + this.listType = listType; + } + + public int getType() + { + return listType; + } + + public void setModel(ArrayList list_model) + { + this.list_model = list_model; + } + + public ArrayList getModel() + { + return list_model; + } + + public void setIndex(int index) + { + list_index.add(index); + } + + public ArrayList getIndex() + { + return list_index; + } + + public void removeIndex(int index) + { + list_index.remove(index); + for(int counter=index;counter<=list_index.size()-1;counter++) + { + list_index.set(counter,list_index.get(counter)-1); + } + } + + public void setMainList(ArrayList model) + { + main_model_ref = model; + } + + public ArrayList getMainList() + { + return main_model_ref; + } + + public void removeFromMainList(int index) + { + main_model_ref.remove(index); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_row_model.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_row_model.java new file mode 100644 index 00000000..8da32334 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/list_activity/list_row_model.java @@ -0,0 +1,26 @@ +package com.darkweb.genesissearchengine.appManager.list_activity; + +public class list_row_model +{ + private int id; + private String header; + private String description; + + public list_row_model(String header, String description,int id) { + this.id = id; + this.header = header; + this.description = description; + } + + public String getHeader() { + return header; + } + + public String getDescription() { + return description; + } + + public int getId() { + return id; + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/AutoCompleteAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/AutoCompleteAdapter.java new file mode 100644 index 00000000..4c42019a --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/AutoCompleteAdapter.java @@ -0,0 +1,118 @@ +package com.darkweb.genesissearchengine.appManager.main_activity; + +import java.util.ArrayList; +import java.util.List; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Filter; +import android.widget.Filterable; + +public class AutoCompleteAdapter extends ArrayAdapter implements Filterable { + + private ArrayList fullList; + private ArrayList mOriginalValues; + private ArrayFilter mFilter; + private int getResultCount=0; + + public int getResultCount() + { + if(getResultCount>0) + return 4; + else + return getResultCount; + } + + public AutoCompleteAdapter(Context context, int resource, int textViewResourceId, List objects) { + + super(context, resource, textViewResourceId, objects); + fullList = (ArrayList) objects; + mOriginalValues = new ArrayList(fullList); + } + + @Override + public int getCount() { + return fullList.size(); + } + + @Override + public String getItem(int position) { + return fullList.get(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return super.getView(position, convertView, parent); + } + + @Override + public Filter getFilter() { + if (mFilter == null) { + mFilter = new ArrayFilter(); + } + return mFilter; + } + + + private class ArrayFilter extends Filter { + private Object lock; + + @Override + protected FilterResults performFiltering(CharSequence prefix) { + FilterResults results = new FilterResults(); + + if (mOriginalValues == null) { + synchronized (lock) { + mOriginalValues = new ArrayList(fullList); + } + } + + if (prefix == null || prefix.length() == 0) { + synchronized (lock) { + ArrayList list = new ArrayList(mOriginalValues); + results.values = list; + results.count = list.size(); + } + } else { + final String prefixString = prefix.toString().toLowerCase(); + + ArrayList values = mOriginalValues; + int count = values.size(); + + ArrayList newValues = new ArrayList(count); + + for (int i = 0; i < count; i++) { + String item = values.get(i); + if (item.toLowerCase().contains(prefixString)) { + newValues.add(item); + } + + } + + results.values = newValues; + results.count = newValues.size(); + } + + getResultCount = results.count; + return results; + } + + @SuppressWarnings("unchecked") + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + + if(results.values!=null){ + fullList = (ArrayList) results.values; + }else{ + fullList = new ArrayList(); + } + if (results.count > 0) { + notifyDataSetChanged(); + } else { + notifyDataSetInvalidated(); + } + } + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/app_model.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/app_model.java new file mode 100644 index 00000000..992c6dcf --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/app_model.java @@ -0,0 +1,174 @@ +package com.darkweb.genesissearchengine.appManager.main_activity; + +import android.content.Context; +import android.net.Uri; +import com.darkweb.genesissearchengine.appManager.data_helper.database_controller; +import com.darkweb.genesissearchengine.appManager.list_activity.list_controller; +import com.darkweb.genesissearchengine.appManager.list_activity.list_model; +import com.darkweb.genesissearchengine.appManager.list_activity.list_row_model; +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperMethod; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class app_model +{ + /*Data Objects*/ + private ArrayList history = new ArrayList(); + private ArrayList bookmarks = new ArrayList(); + private HashSet suggestions = new HashSet(); + private static int port = 9150; + + private Context appContext; + private application_controller appInstance; + + private Context listContext; + private list_controller listInstance; + + /*Initializations*/ + public void initialization() + { + database_controller.getInstance().initialize(); + initializeHistory(); + initializeBookmarks(); + } + + /*Setter Getter Initializations*/ + private static final app_model ourInstance = new app_model(); + public static app_model getInstance() + { + return ourInstance; + } + + + /*Getters Setters*/ + public int getPort() + { + return port; + } + public void setPort(int port) + { + this.port = port; + } + + + public void setAppContext(Context appContext) + { + this.appContext = appContext; + } + public Context getAppContext() + { + return appContext; + } + + + public application_controller getAppInstance() + { + return appInstance; + } + public void setAppInstance(application_controller appInstance) + { + this.appInstance = appInstance; + } + + + public void initializeHistory(){ + if(!status.history_status) + { + history = database_controller.getInstance().selectHistory(); + } + else + { + database_controller.getInstance().execSQL("delete from history where 1"); + } + app_model.getInstance().getAppInstance().reInitializeSuggestion(); + } + public void addHistory(String url) { + + if(history.size()> constants.max_history_size) + { + database_controller.getInstance().execSQL("delete from history where id="+history.get(history.size()-1).getId()); + history.remove(history.size()-1); + } + + int autoval = 0; + if(history.size()>0) + { + autoval = history.get(0).getId()+1; + } + + addSuggestions(url); + SimpleDateFormat d_form = new SimpleDateFormat("yyyy-MM-dd | HH-mm-ss"); + String date = d_form.format(new Date()); + database_controller.getInstance().execSQL("INSERT INTO history(id,date,url) VALUES("+autoval+",'"+date+"','"+url+"');"); + history.add(0,new list_row_model(url,date,autoval)); + } + public ArrayList getHistory() { + return history; + } + + + public void initializeBookmarks(){ + bookmarks = database_controller.getInstance().selectBookmark(); + } + public void addBookmark(String url,String title){ + int autoval = 0; + if(bookmarks.size()> constants.max_bookmark_size) + { + database_controller.getInstance().execSQL("delete from bookmark where id="+bookmarks.get(bookmarks.size()-1).getId()); + bookmarks.remove(history.size()-1); + } + + if(bookmarks.size()>0) + { + autoval = bookmarks.get(0).getId()+1; + } + + if(title.equals("")) + { + title = "New_Bookmark"+autoval; + } + database_controller.getInstance().execSQL("INSERT INTO bookmark(id,title,url) VALUES("+autoval+",'"+title+"','"+url+"');"); + bookmarks.add(0,new list_row_model(url,title,autoval)); + } + public ArrayList getBookmark(){ + return bookmarks; + } + + + public void initSuggestions(String url) { + suggestions.add(url); + } + public void addSuggestions(String url) { + if(url.contains("boogle.store")) + { + Uri uri = Uri.parse(url); + String actual_url = uri.getQueryParameter("q"); + suggestions.add(actual_url); + } + suggestions.add(url); + app_model.getInstance().getAppInstance().reInitializeSuggestion(); + } + public ArrayList getSuggestions() { + return new ArrayList(suggestions); + } + + + public void setListInstance(list_controller listInstance){ + this.listInstance = listInstance; + } + public list_controller getListInstance(){ + return listInstance; + } + + + public void setListContext(Context listContext) { + this.listContext = listContext; + } + public Context getListContext(){ + return listContext; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/applicationViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/applicationViewController.java similarity index 81% rename from app/src/main/java/com/darkweb/genesissearchengine/appManager/applicationViewController.java rename to app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/applicationViewController.java index 4950104d..229d548e 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/applicationViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/applicationViewController.java @@ -1,23 +1,21 @@ -package com.darkweb.genesissearchengine.appManager; +package com.darkweb.genesissearchengine.appManager.main_activity; import android.annotation.SuppressLint; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Handler; -import android.os.Looper; import android.os.Message; import android.text.SpannableString; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.util.Log; +import android.view.MenuInflater; import android.view.View; import android.view.WindowManager; import android.webkit.WebView; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; +import android.widget.*; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.view.MenuCompat; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.messages; @@ -25,6 +23,7 @@ import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.dataManager.preference_manager; import com.darkweb.genesissearchengine.helperMethod; import com.darkweb.genesissearchengine.httpManager.serverRequestManager; +import com.darkweb.genesissearchengine.pluginManager.admanager; import com.darkweb.genesissearchengine.pluginManager.message_manager; import com.darkweb.genesissearchengine.pluginManager.orbot_manager; import com.example.myapplication.R; @@ -37,7 +36,7 @@ public class applicationViewController /*ViewControllers*/ private WebView webView; private ProgressBar progressBar; - private EditText searchbar; + private AutoCompleteTextView searchbar; private ConstraintLayout splashScreen; private ConstraintLayout requestFailure; private FloatingActionButton floatingButton; @@ -49,6 +48,7 @@ public class applicationViewController private boolean pageLoadedSuccessfully = true; private boolean isSplashLoading = false; private Handler updateUIHandler = null; + private AutoCompleteAdapter suggestionAdapter; /*ProgressBar Delayed Updater*/ Handler progressBarHandler = null; @@ -65,7 +65,7 @@ public class applicationViewController { } - public void initialization(WebView webView1, TextView loadingText, ProgressBar progressBar, EditText searchbar, ConstraintLayout splashScreen, ConstraintLayout requestFailure, FloatingActionButton floatingButton, ImageView loading, ImageView splashlogo) + public void initialization(WebView webView1, TextView loadingText, ProgressBar progressBar, AutoCompleteTextView searchbar, ConstraintLayout splashScreen, ConstraintLayout requestFailure, FloatingActionButton floatingButton, ImageView loading, ImageView splashlogo) { this.webView = webView1; this.progressBar = progressBar; @@ -83,6 +83,26 @@ public class applicationViewController initLock(); initViews(); createUpdateUiHandler(); + initializeSuggestionView(); + } + + private void initializeSuggestionView() + { + suggestionAdapter = new AutoCompleteAdapter(app_model.getInstance().getAppInstance(), R.layout.hint_completion_layout, R.id.hintCompletionText,app_model.getInstance().getSuggestions()); + + searchbar.setThreshold(2); + searchbar.setAdapter(suggestionAdapter); + searchbar.setDropDownVerticalOffset(27); + searchbar.setDropDownWidth(helperMethod.screenWidth()-80); + searchbar.setDropDownHorizontalOffset(-88); + searchbar.setDropDownHeight(Math.round(helperMethod.screenHeight(false)*0.35f)); + searchbar.setDropDownBackgroundDrawable(app_model.getInstance().getAppInstance().getResources().getDrawable(R.drawable.rouned_corner)); + + } + + public void reInitializeSuggestion() + { + initializeSuggestionView(); } public boolean isHiddenView() @@ -143,11 +163,11 @@ public class applicationViewController try { boolean isFirstInstall = preference_manager.getInstance().getBool(keys.hasOrbotInstalled,true); - while (!status.isTorInitialized && isFirstInstall) - { - startPostTask(messages.UPDATE_LOADING_TEXT); - sleep(100); - } + //while (!status.isTorInitialized && isFirstInstall) + //{ + // startPostTask(messages.UPDATE_LOADING_TEXT); + // sleep(100); + //} preference_manager.getInstance().setBool(keys.hasOrbotInstalled,false); startPostTask(messages.DISABLE_SPLASH_SCREEN); } @@ -179,11 +199,16 @@ public class applicationViewController { loadingText.setText(orbot_manager.getInstance().getLogs()); } - if(msg.what == messages.DISABLE_SPLASH_SCREEN) + else if(msg.what == messages.DISABLE_SPLASH_SCREEN) { status.isApplicationLoaded = true; splashScreen.animate().alpha(0.0f).setDuration(200).setListener(null).withEndAction((() -> splashScreen.setVisibility(View.GONE))); onWelcomeMessageCheck(); + //app_model.getInstance().getAppInstance().initAdManager(); + } + else if(msg.what == messages.SHOW_ADS) + { + admanager.getInstance().showAd(true); } } }; @@ -202,6 +227,7 @@ public class applicationViewController } } + @SuppressLint("RestrictedApi") public void onPageFinished(boolean status) { helperMethod.hideKeyboard(); @@ -338,6 +364,20 @@ public class applicationViewController serverRequestManager.getInstance().versionChecker(); } + public void onShowAds() + { + startPostTask(messages.SHOW_ADS); + } + + public void openMenu(View view) + { + PopupMenu popup = new PopupMenu(app_model.getInstance().getAppInstance(), view); + MenuInflater inflater = popup.getMenuInflater(); + inflater.inflate(R.menu.menu_main, popup.getMenu()); + MenuCompat.setGroupDividerEnabled(popup.getMenu(), true); + popup.show(); + } + public void onReload() { if(!isHiddenView()) @@ -351,5 +391,9 @@ public class applicationViewController } } + public String getSearchBarUrl() + { + return searchbar.getText().toString(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/application_controller.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/application_controller.java similarity index 73% rename from app/src/main/java/com/darkweb/genesissearchengine/appManager/application_controller.java rename to app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/application_controller.java index f27468f2..914aa6b8 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/application_controller.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/application_controller.java @@ -1,4 +1,4 @@ -package com.darkweb.genesissearchengine.appManager; +package com.darkweb.genesissearchengine.appManager.main_activity; import android.os.Build; import android.os.Bundle; @@ -9,6 +9,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import com.darkweb.genesissearchengine.*; import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.dataManager.preference_manager; import com.darkweb.genesissearchengine.pluginManager.*; @@ -27,7 +29,7 @@ public class application_controller extends AppCompatActivity private ProgressBar progressBar; private ConstraintLayout requestFailure; private ConstraintLayout splashScreen; - private EditText searchbar; + private AutoCompleteTextView searchbar; private FloatingActionButton floatingButton; private ImageView loadingIcon; private ImageView splashlogo; @@ -43,24 +45,27 @@ public class application_controller extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.application_view); + setContentView(R.layout.home_view); if(helperMethod.isBuildValid()) { initializeAppModel(); + preference_manager.getInstance().initialize(); + + status.initStatus(); initializeCrashlytics(); initializeConnections(); initializeWebView(); initializeLocalEventHandlers(); + initAdManager(); - preference_manager.getInstance().initialize(); orbot_manager.getInstance().reinitOrbot(); - admanager.getInstance().initialize(); applicationViewController.getInstance().initialization(webView,loadingText,progressBar,searchbar,splashScreen,requestFailure,floatingButton, loadingIcon,splashlogo); firebase.getInstance().initialize(); geckoclient.initialize(geckoView); + app_model.getInstance().initialization(); - startApplication(); + initSearchEngine(); } else { @@ -70,10 +75,26 @@ public class application_controller extends AppCompatActivity } - public void startApplication() + public void initAdManager() + { + admanager.getInstance().initialize(); + } + + public void initSearchEngine() { fabricManager.getInstance().sendEvent("HOME PAGE LOADING : " ); - webView.loadUrl(constants.backendUrl); + if(status.search_status.equals(enums.searchEngine.Google.toString())) + { + webView.loadUrl(constants.backendGoogle); + } + else if(status.search_status.equals(enums.searchEngine.Bing.toString())) + { + webView.loadUrl(constants.backendBing); + } + else + { + webView.loadUrl(constants.backendGenesis); + } } public void initializeAppModel() @@ -104,7 +125,7 @@ public class application_controller extends AppCompatActivity public void initializeCrashlytics() { - fabricManager.getInstance().init(); + //fabricManager.getInstance().init(); } public void initializeWebView() @@ -116,14 +137,13 @@ public class application_controller extends AppCompatActivity public void setWebViewSettings(WebView view) { view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); - view.getSettings().setJavaScriptEnabled(true); + view.getSettings().setJavaScriptEnabled(false); view.getSettings().setUseWideViewPort(true); } /*------------------------------------------------------- Event Handler ----------------------------------------------------*/ - private void initializeLocalEventHandlers() - { + private void initializeLocalEventHandlers() { searchbar.setOnEditorActionListener((v, actionId, event) -> { return eventhandler.onEditorClicked(v,actionId,event); @@ -151,13 +171,17 @@ public class application_controller extends AppCompatActivity eventhandler.onHomeButtonPressed(); } + public void onMenuButtonPressed(View view) + { + eventhandler.onMenuButtonPressed(view); + } + /*-------------------------------------------------------Helper Method In UI Redirection----------------------------------------------------*/ - public void onloadURL(String url,boolean isHiddenWeb) - { + public void onloadURL(String url,boolean isHiddenWeb,boolean isUrlSavable) { if(isHiddenWeb) { - geckoclient.loadGeckoURL(url,geckoView); + geckoclient.loadGeckoURL(url,geckoView,isUrlSavable); } else { @@ -166,8 +190,7 @@ public class application_controller extends AppCompatActivity } } - public void onRequestTriggered(boolean isHiddenWeb,String url) - { + public void onRequestTriggered(boolean isHiddenWeb,String url) { applicationViewController.getInstance().onRequestTriggered(isHiddenWeb,url); } @@ -181,8 +204,7 @@ public class application_controller extends AppCompatActivity applicationViewController.getInstance().onUpdateSearchBar(url); } - public void onInternetErrorView() - { + public void onInternetErrorView() { applicationViewController.getInstance().onInternetError(); applicationViewController.getInstance().disableFloatingView(); } @@ -192,8 +214,7 @@ public class application_controller extends AppCompatActivity return applicationViewController.getInstance().onDisableInternetError(); } - public void onProgressBarUpdateView(int progress) - { + public void onProgressBarUpdateView(int progress) { applicationViewController.getInstance().onProgressBarUpdate(progress); } @@ -217,17 +238,39 @@ public class application_controller extends AppCompatActivity applicationViewController.getInstance().onReload(); } + public void onShowAds() + { + applicationViewController.getInstance().onShowAds(); + } + + public void openMenu(View view) { + applicationViewController.getInstance().openMenu(view); + } + + public void reInitializeSuggestion() { + applicationViewController.getInstance().reInitializeSuggestion(); + } /*-------------------------------------------------------Helper Method Out UI Redirection----------------------------------------------------*/ + public String getSearchBarUrl() + { + return applicationViewController.getInstance().getSearchBarUrl(); + } + + public void onReInitGeckoView() { + geckoclient.initialize(geckoView); + geckoclient.onReloadHiddenView(); + } + public void onHiddenGoBack() { geckoclient.onHiddenGoBack(geckoView); } - public void stopHiddenView() - { + public void stopHiddenView() { geckoclient.stopHiddenView(geckoView); + geckoclient.removeHistory(); } public void onReloadHiddenView() @@ -240,14 +283,18 @@ public class application_controller extends AppCompatActivity return geckoclient.isGeckoViewRunning(); } - public void forcedCachePatch() - { - } - public boolean isInternetErrorOpened() { return requestFailure.getAlpha()==1; } + /*-------------------------------------------------------Menu Handler----------------------------------------------------*/ + + public boolean onMenuOptionSelected(MenuItem item) { + + eventhandler.onMenuPressed(item.getItemId()); + return super.onOptionsItemSelected(item); + } + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/eventHandler.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/eventHandler.java similarity index 54% rename from app/src/main/java/com/darkweb/genesissearchengine/appManager/eventHandler.java rename to app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/eventHandler.java index 678e041f..baeb6284 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/eventHandler.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/eventHandler.java @@ -1,14 +1,19 @@ -package com.darkweb.genesissearchengine.appManager; +package com.darkweb.genesissearchengine.appManager.main_activity; import android.util.Patterns; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.TextView; +import com.darkweb.genesissearchengine.appManager.list_activity.list_controller; +import com.darkweb.genesissearchengine.appManager.setting_manager.setting_controller; import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.helperMethod; import com.darkweb.genesissearchengine.pluginManager.fabricManager; import com.darkweb.genesissearchengine.pluginManager.message_manager; +import com.example.myapplication.R; import java.io.IOException; import java.net.URL; @@ -42,47 +47,65 @@ public class eventHandler if(host.getHost().contains(constants.backendUrlHost) || host.getHost().contains(constants.frontEndUrlHost) || host.getHost().contains(constants.frontEndUrlHost_v1)) { fabricManager.getInstance().sendEvent("EDITOR BASE URL REQUEST : " + url); - appContoller.onloadURL(url.replace(constants.frontEndUrlHost_v1,constants.backendUrlHost),false); + appContoller.onloadURL(url.replace(constants.frontEndUrlHost_v1,constants.backendUrlHost),false,true); return true; } - else /*if(host.getHost().contains(constants.allowedHost))*/ - { - fabricManager.getInstance().sendEvent("EDITOR ONION URL REQUEST : " + url); - app_model.getInstance().getAppInstance().onloadURL(url,true); - return true; - }/* else { - message_manager.getInstance().baseURLError(); + fabricManager.getInstance().sendEvent("EDITOR ONION URL REQUEST : " + url); + app_model.getInstance().getAppInstance().onloadURL(url,true,true); return true; - }*/ + } } } catch (IOException e){} - String editedURL = "https://boogle.store/search?q="+v.getText().toString().replaceAll(" ","+")+"&p_num=1&s_type=all&savesearch=on"; - appContoller.onloadURL(editedURL,false); + String editedURL = getSearchEngine(v.getText().toString().replaceAll(" ","+")); + app_model.getInstance().addHistory(editedURL); + appContoller.onloadURL(editedURL,false,true); appContoller.onClearSearchBarCursorView(); fabricManager.getInstance().sendEvent("EDITOR SEARCHED : " + editedURL); return true; } + public String getSearchEngine(String query) + { + if(status.search_status.equals(enums.searchEngine.Darkweb.toString())) + { + return "https://boogle.store/search?q="+query+"&p_num=1&s_type=all&savesearch=on"; + } + else if(status.search_status.equals(enums.searchEngine.Google.toString())) + { + return "https://www.google.com/search?source=hp&q="+query; + } + else + { + return "https://www.bing.com/search?q="+query; + } + + } + public void onReloadButtonPressed(View view) { fabricManager.getInstance().sendEvent("RELOAD BUTTON PRESSSED : "); appContoller.onReload(); } + public void onMenuButtonPressed(View view) + { + appContoller.openMenu(view); + } + public void onHomeButtonPressed() { + appContoller.stopHiddenView(); fabricManager.getInstance().sendEvent("HOME BUTTON PRESSSED : "); applicationViewController.getInstance().checkSSLTextColor(); - appContoller.onloadURL(constants.backendUrlSlashed,false); + appContoller.initSearchEngine(); helperMethod.hideKeyboard(); appContoller.onUpdateSearchBarView(constants.frontUrlSlashed); - appContoller.stopHiddenView(); } public void onFloatingButtonPressed() @@ -97,4 +120,39 @@ public class eventHandler appContoller.onBackPressedView(); } + public void onMenuPressed(int menuId) + { + if (menuId == R.id.menu1) { + helperMethod.openActivity(list_controller.class,constants.list_history); + } + else if (menuId == R.id.menu2) { + helperMethod.openActivity(setting_controller.class,constants.list_history); + } + else if (menuId == R.id.menu3) { + helperMethod.openActivity(setting_controller.class,constants.list_history); + } + else if (menuId == R.id.menu4) + { + message_manager.getInstance().bookmark(app_model.getInstance().getAppInstance().getSearchBarUrl()); + } + else if (menuId == R.id.menu5) + { + helperMethod.openActivity(list_controller.class,constants.list_bookmark); + } + else if (menuId == R.id.menu6) + { + message_manager.getInstance().reportURL(); + } + else if (menuId == R.id.menu7) + { + helperMethod.rateApp(); + } + else if (menuId == R.id.menu8) + { + helperMethod.shareApp(); + } + + } + + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/geckoClients.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/geckoClients.java similarity index 69% rename from app/src/main/java/com/darkweb/genesissearchengine/appManager/geckoClients.java rename to app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/geckoClients.java index 69dddd96..0ffd4d25 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/geckoClients.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/geckoClients.java @@ -1,10 +1,13 @@ -package com.darkweb.genesissearchengine.appManager; +package com.darkweb.genesissearchengine.appManager.main_activity; import android.os.Handler; import android.util.Log; import android.view.View; -import com.darkweb.genesissearchengine.pluginManager.admanager; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.preference_manager; import com.darkweb.genesissearchengine.pluginManager.fabricManager; +import com.darkweb.genesissearchengine.pluginManager.message_manager; import com.darkweb.genesissearchengine.pluginManager.orbot_manager; import org.mozilla.geckoview.GeckoRuntime; import org.mozilla.geckoview.GeckoSession; @@ -28,13 +31,22 @@ public class geckoClients private boolean loadingCompeleted = false; private String currentURL = ""; private boolean wasBackPressed = false; + private boolean isUrlSavable = true; - public void loadGeckoURL(String url,GeckoView geckoView) + private int urlRequestCount = 0; + private boolean isAppRated = false; + + public geckoClients() + { + isAppRated = preference_manager.getInstance().getBool(keys.isAppRated,false); + } + + public void loadGeckoURL(String url,GeckoView geckoView,boolean isUrlSavable) { boolean init_status = orbot_manager.getInstance().initOrbot(url); if (init_status) { - urlList.clear(); + this.isUrlSavable = isUrlSavable; navigatedURL = ""; loadingCompeleted = false; initialize(geckoView); @@ -42,20 +54,28 @@ public class geckoClients app_model.getInstance().getAppInstance().onRequestTriggered(true,url); app_model.getInstance().getAppInstance().onProgressBarUpdateView(4); isFirstTimeLoad = true; + if(isUrlSavable) + { + urlList.clear(); + } } } public void initialize(GeckoView geckoView) { - session1 = new GeckoSession(); - runtime1 = GeckoRuntime.getDefault(app_model.getInstance().getAppContext()); - session1.open(runtime1); - geckoView.releaseSession(); - geckoView.setSession(session1); - session1.setProgressDelegate(new progressDelegate()); - session1.setNavigationDelegate(new navigationDelegate()); - geckoView.setVisibility(View.VISIBLE); - geckoView.setAlpha(1); + if(urlList.size()<=0) + { + session1 = new GeckoSession(); + runtime1 = GeckoRuntime.getDefault(app_model.getInstance().getAppContext()); + runtime1.getSettings().setJavaScriptEnabled(status.java_status); + session1.open(runtime1); + geckoView.releaseSession(); + geckoView.setSession(session1); + session1.setProgressDelegate(new progressDelegate()); + session1.setNavigationDelegate(new navigationDelegate()); + geckoView.setVisibility(View.VISIBLE); + geckoView.setAlpha(1); + } } class navigationDelegate implements GeckoSession.NavigationDelegate @@ -119,19 +139,38 @@ public class geckoClients { if(isFirstTimeLoad) { - admanager.getInstance().showAd(true); + //admanager.getInstance().showAd(true); isFirstTimeLoad = false; } - if((urlList.size()==0 || urlList.size()>0 && !urlList.get(urlList.size()-1).equals(navigatedURL))&&!wasBackPressed) + if((urlList.size()==0 || urlList.size()>0 && !urlList.get(urlList.size()-1).equals(navigatedURL))&& !wasBackPressed) { urlList.add(navigatedURL); } if(urlList.size()>0) { - admanager.getInstance().showAd(false); + //admanager.getInstance().showAd(false); } + urlRequestCount++; + if(urlRequestCount==5) + { + if(!isAppRated) + { + isAppRated = true; + message_manager.getInstance().rateApp(); + } + } + else if(urlRequestCount>=4 && isAppRated) + { + app_model.getInstance().getAppInstance().onShowAds(); + } + + if(isUrlSavable && !urlList.get(urlList.size()-1).equals("navigatedURL")) + { + app_model.getInstance().addHistory(navigatedURL); + } + isUrlSavable = true; app_model.getInstance().getAppInstance().onDisableInternetError(); app_model.getInstance().getAppInstance().onProgressBarUpdateView(0); fabricManager.getInstance().sendEvent("ONION GECKO_CLIENT URL SUCCESS : " + success + "--" + isContentLoading); @@ -209,6 +248,11 @@ public class geckoClients } + public void removeHistory() + { + urlList.clear(); + } + public boolean isGeckoViewRunning() { return isRunning; @@ -216,8 +260,11 @@ public class geckoClients public void onReloadHiddenView() { - wasBackPressed = true; - session1.stop(); - session1.loadUri(navigatedURL); + if(urlList.size()>0) + { + wasBackPressed = true; + session1.stop(); + session1.loadUri(navigatedURL); + } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/webviewClient.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/webviewClient.java similarity index 90% rename from app/src/main/java/com/darkweb/genesissearchengine/appManager/webviewClient.java rename to app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/webviewClient.java index 14641e4c..d64ab42e 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/webviewClient.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/main_activity/webviewClient.java @@ -1,9 +1,9 @@ -package com.darkweb.genesissearchengine.appManager; +package com.darkweb.genesissearchengine.appManager.main_activity; -import android.util.Log; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.pluginManager.fabricManager; import com.darkweb.genesissearchengine.pluginManager.orbot_manager; @@ -25,19 +25,20 @@ public class webviewClient app_model.getInstance().getAppInstance().onProgressBarUpdateView(0); return true; } - if(!url.contains("boogle")) + if(!url.contains("boogle") && !url.equals(constants.backendGoogle) && !url.equals(constants.backendBing)) { app_model.getInstance().getAppInstance().stopHiddenView(); fabricManager.getInstance().sendEvent("BASE SIMPLE SEARCHED : " + url); isGeckoView = true; if(orbot_manager.getInstance().initOrbot(url)) { - app_model.getInstance().getAppInstance().onloadURL(url,true); + app_model.getInstance().getAppInstance().onloadURL(url,true,true); } return true; } else { + app_model.getInstance().addHistory(url); fabricManager.getInstance().sendEvent("BASE ONION SEARCHED : " + url); app_model.getInstance().getAppInstance().onRequestTriggered(false,url); return false; diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_controller.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_controller.java new file mode 100644 index 00000000..265c034c --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_controller.java @@ -0,0 +1,72 @@ +package com.darkweb.genesissearchengine.appManager.setting_manager; + +import android.os.Bundle; +import android.view.View; +import android.widget.Spinner; +import androidx.appcompat.app.AppCompatActivity; +import com.example.myapplication.R; + +public class setting_controller extends AppCompatActivity +{ + + /*Private Variables*/ + + private setting_view_controller viewController; + private Spinner search; + private Spinner javascript; + private Spinner history; + + /*Initializations*/ + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + + viewsInitializations(); + listenersInitializations(); + initializeModel(); + } + + public void viewsInitializations() + { + search = findViewById(R.id.search_manager); + javascript = findViewById(R.id.javascript_manager); + history = findViewById(R.id.history_manager); + + viewController = new setting_view_controller(search,javascript,history); + } + + public void listenersInitializations() + { + initializeItemSelectedListener(search); + initializeItemSelectedListener(javascript); + initializeItemSelectedListener(history); + } + + public void initializeModel() + { + setting_model.getInstance().setSettingInstance(this); + } + + /*Event Handlers*/ + + public void initializeItemSelectedListener(Spinner view) + { + settings_ehandler.getInstance().onItemListnerInitialization(view); + } + + public void onBackPressed(View view) + { + settings_ehandler.getInstance().onBackPressed(); + } + + /*View Handlers*/ + + public void closeView() + { + viewController.closeView(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_model.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_model.java new file mode 100644 index 00000000..67088e4f --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_model.java @@ -0,0 +1,23 @@ +package com.darkweb.genesissearchengine.appManager.setting_manager; + +public class setting_model +{ + private static final setting_model ourInstance = new setting_model(); + private setting_model(){ + } + public static setting_model getInstance() + { + return ourInstance; + } + + private setting_controller settingInstance; + + setting_controller getSettingInstance() + { + return settingInstance; + } + void setSettingInstance(setting_controller settingInstance) + { + this.settingInstance = settingInstance; + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_view_controller.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_view_controller.java new file mode 100644 index 00000000..7a0cc39d --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/setting_view_controller.java @@ -0,0 +1,73 @@ +package com.darkweb.genesissearchengine.appManager.setting_manager; + +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.strings; +import com.darkweb.genesissearchengine.dataManager.preference_manager; + +import static com.darkweb.genesissearchengine.constants.status.history_status; +import static com.darkweb.genesissearchengine.constants.status.java_status; + +class setting_view_controller +{ + /*Private Variables*/ + + private Spinner search; + private Spinner javascript; + private Spinner history; + + /*Initializations*/ + + setting_view_controller(Spinner search, Spinner javascript, Spinner history) + { + this.search = search; + this.search = javascript; + this.search = history; + + initJavascript(); + initHistory(); + initSearchEngine(); + } + + private void initJavascript() + { + if (java_status) + { + javascript.setSelection(0); + } + else + { + javascript.setSelection(1); + } + } + + private void initHistory() + { + if (history_status) + { + history.setSelection(0); + } + else + { + history.setSelection(1); + } + } + + @SuppressWarnings("unchecked") + private void initSearchEngine() + { + String myString = preference_manager.getInstance().getString(keys.search_engine, strings.darkweb); + ArrayAdapter myAdap = (ArrayAdapter) search.getAdapter(); + int spinnerPosition = myAdap.getPosition(myString); + search.setSelection(spinnerPosition); + } + + /*Helper Methods*/ + + void closeView() + { + setting_model.getInstance().getSettingInstance().finish(); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/settings_ehandler.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/settings_ehandler.java new file mode 100644 index 00000000..f62db563 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/setting_manager/settings_ehandler.java @@ -0,0 +1,104 @@ +package com.darkweb.genesissearchengine.appManager.setting_manager; + +import android.view.View; +import android.widget.AdapterView; +import android.widget.Spinner; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.dataManager.preference_manager; +import com.example.myapplication.R; + +import static com.darkweb.genesissearchengine.constants.status.*; +import static com.darkweb.genesissearchengine.constants.status.search_status; + +public class settings_ehandler +{ + /*Initializations*/ + + private static final settings_ehandler ourInstance = new settings_ehandler(); + + public static settings_ehandler getInstance() + { + return ourInstance; + } + + private settings_ehandler() + { + } + + /*Listeners*/ + + @SuppressWarnings("ConstantConditions") + private void onJavaScriptListener(int position) + { + if(position==1 && java_status) + { + java_status = false; + preference_manager.getInstance().setBool(keys.java_script, java_status); + app_model.getInstance().getAppInstance().onReInitGeckoView(); + } + else if(!java_status) + { + java_status = true; + preference_manager.getInstance().setBool(keys.java_script, java_status); + app_model.getInstance().getAppInstance().onReInitGeckoView(); + } + } + + private void onSearchListner(AdapterView parentView,int position) + { + if(!search_status.equals(parentView.getItemAtPosition(position).toString())) + { + search_status = parentView.getItemAtPosition(position).toString(); + preference_manager.getInstance().setString(keys.search_engine, search_status); + app_model.getInstance().getAppInstance().initSearchEngine(); + } + } + + @SuppressWarnings("ConstantConditions") + private void onHistoryListener(int position) + { + if(position==1 && history_status) + { + history_status = false; + preference_manager.getInstance().setBool(keys.history_clear, history_status); + } + else if(!java_status) + { + history_status = true; + preference_manager.getInstance().setBool(keys.history_clear, history_status); + } + } + + void onBackPressed() + { + setting_model.getInstance().getSettingInstance().closeView(); + } + + /*Listener Initializations*/ + + void onItemListnerInitialization(Spinner view) + { + view.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + if(selectedItemView.getId()== R.id.search_manager) + { + settings_ehandler.getInstance().onJavaScriptListener(position); + } + else if(selectedItemView.getId()== R.id.javascript_manager) + { + settings_ehandler.getInstance().onHistoryListener(position); + } + else if(selectedItemView.getId()== R.id.history_manager) + { + settings_ehandler.getInstance().onSearchListner(parentView,position); + } + } + @Override + public void onNothingSelected(AdapterView parentView) { + } + }); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java index dfec2583..6b7bc6e9 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java @@ -9,7 +9,9 @@ public class constants public static String softwares = "https://boogle.store/search?q=softwares+tools&p_num=1&s_type=all&p_num=1&s_type=all"; /*URL CONSTANTS*/ - public static String backendUrl = "https://boogle.store"; + public static String backendGenesis = "https://boogle.store"; + public static String backendGoogle = "https://www.google.com/"; + public static String backendBing = "https://www.bing.com/"; public static String backendUrlHost = "boogle.store"; public static String backendUrlSlashed = "https://boogle.store/"; public static String frontUrlSlashed = "https://genesis.onion/"; @@ -31,7 +33,16 @@ public class constants public static boolean proxy_socks_remote_dns = true; public static boolean proxy_cache = false; public static boolean proxy_memory = false; - public static String proxy_useragent_override = "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0"; + public static String proxy_useragent_override = "Mozilla/5.0 (Android 9; Mobile; rv:67.0) Gecko/67.0 Firefox/67.0"; public static boolean proxy_donottrackheader_enabled = false; public static int proxy_donottrackheader_value = 1; + + public static int list_history = 1; + public static int list_bookmark = 2; + + public static String databae_name="genesis.db"; + public static int databae_version=1; + + public static int max_history_size=3; + public static int max_bookmark_size=3; } 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 90de3ef5..424286f6 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java @@ -5,5 +5,6 @@ public class enums /*Web Request*/ public enum webRequestStatus{notRunning,running,repeat;} + public enum searchEngine{Darkweb,Bing,Google} } \ No newline at end of file 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 ba42f3a3..b0e7fc4d 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java @@ -20,5 +20,12 @@ public class keys public static String proxy_donottrackheader_enabled = "privacy.donottrackheader.enabled"; public static String proxy_donottrackheader_value = "privacy.donottrackheader.value"; public static String hasOrbotInstalled = "hasOrbotInstalled"; + public static String isAppRated = "isAppRated"; + public static String list_type = "list_type"; + + /*Settings*/ + public static String search_engine = "search_engine"; + public static String java_script = "java_script"; + public static String history_clear = "history_clear"; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/messages.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/messages.java index a3df77fe..ec891b3b 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/messages.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/messages.java @@ -9,4 +9,5 @@ public class messages public final static int LOAD_WEBVIEW_BACKGROUND = 2; public final static int DISABLE_SPLASH_SCREEN =3; public final static int UPDATE_LOADING_TEXT =5; + public final static int SHOW_ADS =6; } 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 3ebb6bbe..7b041ab1 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java @@ -1,10 +1,25 @@ package com.darkweb.genesissearchengine.constants; +import com.darkweb.genesissearchengine.dataManager.preference_manager; + public class status { + /*App Level*/ public static boolean isApplicationLoaded = false; public static boolean isPlayStoreInstalled = true; public static boolean isTorInitialized = false; + public static String version_code = "6.0"; + + /*Settings Level*/ + public static String search_status = ""; + public static boolean java_status = false; + public static boolean history_status = true; + + public static void initStatus() + { + status.java_status = preference_manager.getInstance().getBool(keys.java_script,true); + status.history_status = preference_manager.getInstance().getBool(keys.history_clear,true); + status.search_status = preference_manager.getInstance().getString(keys.search_engine,"Darkweb"); + } - public static String version_code = "5.0"; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java index d289d9bd..24c39d25 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java @@ -2,6 +2,8 @@ package com.darkweb.genesissearchengine.constants; public class strings { + public static String torfolder = "torfiles"; + public static String welcome_message_title = "Welcome | Deep Web Gateway"; public static String welcome_message_desc = "\nWelcome to Deep Web | Dark Web Gateway. This application provide you a platform to Search and Open Dark Web urls.\n\nYou cannot open any url related to normal internet as its not the intended purpose. You can check out following urls to get yourself started\n\nHere are few Suggestions\n"; public static String welcome_message_bt1 = "Deep Web Online Market"; @@ -37,7 +39,27 @@ public class strings public static String report_success_desc = "URL has been successfully reported. It will take about a week to completely remove this website from our servers\n"; public static String report_success_bt1 = "Dismiss"; - public static String torfolder = "torfiles"; + public static String rate_title = "Rate US"; + public static String rate_message = "We dont take donations or earn money from this app. We are trying to make a private anonymous internet \n\nIf you think this app works please rate us it gives us hope and strength to continue"; + public static String rate_positive = "Like This App"; + public static String rate_negative = "Don't Like This App"; + + public static String rate_success_title = "Sorry To Hear That!"; + public static String rate_success_desc = "If you are having any trouble and want to contact us please email us at gamesolstudios@gmail.com \n\nWe will try to solve your problem as soon as possible"; + public static String rate_success_bt1 = "Dismiss"; + + public static String bookmark_url_title = "Bookmark This Page"; + public static String bookmark_url_desc = "Bookmark this URL To Restore It Again Afterward\n"; + public static String bookmark_url_bt1 = "Bookmark"; + public static String bookmark_url_bt2 = "Dismiss"; + + public static String clear_title = "Warning | Clearing Data"; + public static String clear_desc = "You are about to clear your data if you are sure please continue\n"; + public static String clear_bt1 = "Clear Data"; + public static String clear_bt2 = "Dismiss"; + + public static String darkweb = "Darkweb"; + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/preference_manager.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/preference_manager.java index 92c1dcbf..3a2a53ab 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/preference_manager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/preference_manager.java @@ -2,7 +2,7 @@ package com.darkweb.genesissearchengine.dataManager; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import com.darkweb.genesissearchengine.appManager.app_model; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; public class preference_manager { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperMethod.java b/app/src/main/java/com/darkweb/genesissearchengine/helperMethod.java index 76935ca5..d560c8f4 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperMethod.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperMethod.java @@ -1,12 +1,14 @@ package com.darkweb.genesissearchengine; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.net.Uri; import android.os.Build; import android.preference.PreferenceManager; import android.util.DisplayMetrics; @@ -17,10 +19,17 @@ import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.view.inputmethod.InputMethodManager; -import com.darkweb.genesissearchengine.appManager.app_model; +import androidx.core.app.ShareCompat; +import com.darkweb.genesissearchengine.appManager.list_activity.list_controller; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.dataManager.preference_manager; import com.example.myapplication.BuildConfig; +import java.net.MalformedURLException; +import java.net.URL; + public class helperMethod { /*Helper Methods*/ @@ -35,20 +44,6 @@ public class helperMethod return false; } - public static String readHomepageHTML(Context applicationContext) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext); - return prefs.getString(keys.homepage_html_key,""); - } - - public static void setHomepageHTML(String html, Context applicationContext) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext); - SharedPreferences.Editor edit = prefs.edit(); - edit.putString(keys.homepage_html_key, html); - edit.commit(); - - } public static String completeURL(String url) { @@ -83,6 +78,11 @@ public class helperMethod } } + public static int screenWidth() + { + return (int)(Resources.getSystem().getDisplayMetrics().widthPixels); + } + public static int getNavigationBarHeight() { Resources resources = app_model.getInstance().getAppContext().getResources(); int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); @@ -100,14 +100,6 @@ public class helperMethod return rotate; } - public static Bitmap screenShot(View view) - { - Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - view.draw(canvas); - return bitmap; - } - public static ViewGroup.MarginLayoutParams getCenterScreenPoint(ViewGroup.LayoutParams itemLayoutParams) { double heightloader = Resources.getSystem().getDisplayMetrics().heightPixels*0.78; @@ -149,4 +141,43 @@ public class helperMethod } + public static void rateApp() + { + preference_manager.getInstance().setBool(keys.isAppRated,true); + app_model.getInstance().getAppInstance().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.darkweb.genesissearchengine"))); + } + + public static void shareApp() + { + ShareCompat.IntentBuilder.from(app_model.getInstance().getAppInstance()) + .setType("text/plain") + .setChooserTitle("Genesis | Onion Search") + .setText("http://play.google.com/store/apps/details?id=" + app_model.getInstance().getAppInstance().getPackageName()) + .startChooser(); + } + + public static String getHost(String link) + { + URL url = null; + try + { + url = new URL(link); + String host = url.getHost(); + return host; + } + catch (MalformedURLException e) + { + e.printStackTrace(); + return ""; + } + + } + + public static void openActivity( Class cls,int type) + { + Intent myIntent = new Intent(app_model.getInstance().getAppInstance(), cls); + myIntent.putExtra(keys.list_type, type); + app_model.getInstance().getAppInstance().startActivity(myIntent); + } + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/httpManager/httpclient.java b/app/src/main/java/com/darkweb/genesissearchengine/httpManager/httpclient.java index 13f1e52d..eced7892 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/httpManager/httpclient.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/httpManager/httpclient.java @@ -2,10 +2,7 @@ package com.darkweb.genesissearchengine.httpManager; import android.os.Handler; import android.os.Message; -import com.darkweb.genesissearchengine.appManager.app_model; -import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.messages; -import com.darkweb.genesissearchengine.helperMethod; import cz.msebera.android.httpclient.HttpResponse; import cz.msebera.android.httpclient.client.HttpClient; import cz.msebera.android.httpclient.client.methods.HttpGet; diff --git a/app/src/main/java/com/darkweb/genesissearchengine/httpManager/webRequestHandler.java b/app/src/main/java/com/darkweb/genesissearchengine/httpManager/webRequestHandler.java index 113d6128..5e825f22 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/httpManager/webRequestHandler.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/httpManager/webRequestHandler.java @@ -5,7 +5,7 @@ import android.os.Message; import android.os.Handler; -import com.darkweb.genesissearchengine.appManager.app_model; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; import com.darkweb.genesissearchengine.constants.messages; public class webRequestHandler diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java index 530ef3d0..25cfbea8 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java @@ -1,6 +1,6 @@ package com.darkweb.genesissearchengine.pluginManager; -import com.darkweb.genesissearchengine.appManager.app_model; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import com.google.android.gms.ads.MobileAds; @@ -12,6 +12,7 @@ public class admanager private static final admanager ourInstance = new admanager(); private InterstitialAd mInterstitialAd; private int adCount = 0; + boolean isAdShown = false; /*Initializations*/ @@ -24,22 +25,25 @@ public class admanager public void initialize() { - /* - MobileAds.initialize(app_model.getInstance().getAppContext(), "ca-app-pub-5074525529134731~2926711128"); - mInterstitialAd = new InterstitialAd(app_model.getInstance().getAppContext()); + MobileAds.initialize(app_model.getInstance().getAppInstance(), "ca-app-pub-5074525529134731~2926711128"); + mInterstitialAd = new InterstitialAd(app_model.getInstance().getAppInstance()); mInterstitialAd.setAdUnitId("ca-app-pub-5074525529134731/8478420705"); - mInterstitialAd.loadAd(new AdRequest.Builder().build());*/ + mInterstitialAd.loadAd(new AdRequest.Builder().build()); } /*Helper Methods*/ public void showAd(boolean isAdForced) { - /* + if(isAdShown) + { + return; + } + if(!mInterstitialAd.isLoading() && !mInterstitialAd.isLoaded()) { mInterstitialAd.loadAd(new AdRequest.Builder().build()); - if(isAdForced || adCount==0 || adCount%5==0) + if(isAdForced || adCount==0 || adCount%3==0) { adCount = 0; } @@ -54,6 +58,7 @@ public class admanager { if(isAdForced) { + isAdShown = true; mInterstitialAd.show(); adCount = 1; } @@ -66,6 +71,6 @@ public class admanager adCount += 1; } } - }*/ + } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/fabricManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/fabricManager.java index ffe88bc6..4ae2a869 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/fabricManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/fabricManager.java @@ -1,11 +1,5 @@ package com.darkweb.genesissearchengine.pluginManager; -import com.crashlytics.android.Crashlytics; -import com.crashlytics.android.answers.Answers; -import com.crashlytics.android.answers.CustomEvent; -import com.darkweb.genesissearchengine.appManager.app_model; -import io.fabric.sdk.android.Fabric; - public class fabricManager { private static final fabricManager ourInstance = new fabricManager(); @@ -21,13 +15,13 @@ public class fabricManager public void init() { - Fabric.with(app_model.getInstance().getAppContext(), new Crashlytics()); - analyticmanager.getInstance().initialize(app_model.getInstance().getAppContext()); - analyticmanager.getInstance().logUser(); + //Fabric.with(app_model.getInstance().getAppContext(), new Crashlytics()); + //analyticmanager.getInstance().initialize(app_model.getInstance().getAppContext()); + //analyticmanager.getInstance().logUser(); } public void sendEvent(String value) { - analyticmanager.getInstance().sendEvent(value); + //analyticmanager.getInstance().sendEvent(value); } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/firebase.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/firebase.java index e68c9a11..26d017b5 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/firebase.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/firebase.java @@ -1,8 +1,6 @@ package com.darkweb.genesissearchengine.pluginManager; -import android.os.Bundle; -import com.darkweb.genesissearchengine.appManager.app_model; -import com.google.firebase.analytics.FirebaseAnalytics; +//import com.google.firebase.analytics.FirebaseAnalytics; public class firebase { @@ -13,20 +11,21 @@ public class firebase return ourInstance; } - private FirebaseAnalytics mFirebaseAnalytics; + //private FirebaseAnalytics mFirebaseAnalytics; public void initialize() { - mFirebaseAnalytics = FirebaseAnalytics.getInstance(app_model.getInstance().getAppContext()); + //mFirebaseAnalytics = FirebaseAnalytics.getInstance(app_model.getInstance().getAppContext()); } public void logEvent(String value,String id) { + /* Bundle bundle = new Bundle(); bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id); bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, value); bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "Custom"); - mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle); + mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);*/ } private firebase() diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/message_manager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/message_manager.java index 99221eba..9f4d223c 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/message_manager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/message_manager.java @@ -1,13 +1,19 @@ package com.darkweb.genesissearchengine.pluginManager; +import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Handler; +import android.widget.RelativeLayout; +import android.widget.RelativeLayout.LayoutParams; +import android.text.InputType; +import android.widget.EditText; +import androidx.core.content.ContextCompat; import com.crowdfire.cfalertdialog.CFAlertDialog; -import com.darkweb.genesissearchengine.appManager.app_model; -import com.darkweb.genesissearchengine.appManager.application_controller; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; +import com.darkweb.genesissearchengine.appManager.main_activity.application_controller; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.strings; @@ -44,23 +50,23 @@ public class message_manager .setMessage(strings.welcome_message_desc) .addButton(strings.welcome_message_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED , (dialog, which) -> { dialog.dismiss(); - controller.onloadURL(constants.blackMarket,false); - controller.onloadURL(constants.blackMarket,false); + controller.onloadURL(constants.blackMarket,false,true); + controller.onloadURL(constants.blackMarket,false,true); }) .addButton(strings.welcome_message_bt2, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED , (dialog, which) -> { dialog.dismiss(); - controller.onloadURL(constants.leakedDocument,false); - controller.onloadURL(constants.leakedDocument,false); + controller.onloadURL(constants.leakedDocument,false,true); + controller.onloadURL(constants.leakedDocument,false,true); }) .addButton(strings.welcome_message_bt3, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED , (dialog, which) -> { dialog.dismiss(); - controller.onloadURL(constants.news,false); - controller.onloadURL(constants.news,false); + controller.onloadURL(constants.news,false,true); + controller.onloadURL(constants.news,false,true); }) .addButton(strings.welcome_message_bt4, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED , (dialog, which) -> { dialog.dismiss(); - controller.onloadURL(constants.softwares,false); - controller.onloadURL(constants.softwares,false); + controller.onloadURL(constants.softwares,false,true); + controller.onloadURL(constants.softwares,false,true); }) .addButton(strings.welcome_message_bt5, -1, -1, CFAlertDialog.CFAlertActionStyle.NEGATIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED , (dialog, which) -> { dialog.dismiss(); @@ -114,15 +120,31 @@ public class message_manager builder.show(); } - public void reportedSuccessfully() + public void ratedSuccessfully() { Context application_context = app_model.getInstance().getAppContext(); CFAlertDialog.Builder builder = new CFAlertDialog.Builder(application_context) .setDialogStyle(CFAlertDialog.CFAlertStyle.BOTTOM_SHEET) - .setTitle(strings.report_success_title) + .setTitle(strings.rate_success_title) .setBackgroundColor(application_context.getResources().getColor(R.color.blue_dark_v2)) .setTextColor(application_context.getResources().getColor(R.color.black)) - .setMessage(strings.report_success_desc) + .setMessage(strings.rate_success_desc) + .addButton(strings.rate_success_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + dialog.dismiss(); + }); + + builder.show(); + } + + public void reportedSuccessfully(String title,String desc) + { + Context application_context = app_model.getInstance().getAppContext(); + CFAlertDialog.Builder builder = new CFAlertDialog.Builder(application_context) + .setDialogStyle(CFAlertDialog.CFAlertStyle.BOTTOM_SHEET) + .setTitle(title) + .setBackgroundColor(application_context.getResources().getColor(R.color.blue_dark_v2)) + .setTextColor(application_context.getResources().getColor(R.color.black)) + .setMessage(desc) .addButton(strings.report_success_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { dialog.dismiss(); }); @@ -130,6 +152,60 @@ public class message_manager builder.show(); } + @SuppressLint("ResourceType") + public void bookmark(String url) + { + + final EditText input = new EditText(app_model.getInstance().getAppInstance()); + input.setInputType(InputType.TYPE_CLASS_TEXT); + input.setText(""); + input.setBackground(ContextCompat.getDrawable(app_model.getInstance().getAppContext(), R.xml.search_back_default)); + input.setPadding(40,15,40,15); + input.setHeight(80); + input.setTextSize(17); + input.setHint("Enter Bookmark Title"); + + Context application_context = app_model.getInstance().getAppContext(); + CFAlertDialog.Builder builder = new CFAlertDialog.Builder(application_context) + .setDialogStyle(CFAlertDialog.CFAlertStyle.ALERT) + .setBackgroundColor(application_context.getResources().getColor(R.color.blue_dark_v2)) + .setTextColor(application_context.getResources().getColor(R.color.black)) + //.setTitle(strings.bookmark_url_title) + .setHeaderView(input) + .setMessage("Bookmark URL | " + url + "\n") + .addButton(strings.bookmark_url_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + app_model.getInstance().addBookmark(url.replace("genesis.onion","boogle.store"),input.getText().toString()); + dialog.dismiss(); + }) + .addButton(strings.bookmark_url_bt2, -1, -1, CFAlertDialog.CFAlertActionStyle.NEGATIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + dialog.dismiss(); + }); + + builder.show(); + + } + + public void clearData() + { + Context application_context = app_model.getInstance().getListContext(); + CFAlertDialog.Builder builder = new CFAlertDialog.Builder(app_model.getInstance().getListContext()) + .setDialogStyle(CFAlertDialog.CFAlertStyle.BOTTOM_SHEET) + .setTitle(strings.clear_title) + .setBackgroundColor(application_context.getResources().getColor(R.color.blue_dark_v2)) + .setTextColor(application_context.getResources().getColor(R.color.black)) + .setMessage(strings.clear_desc) + .addButton(strings.clear_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + app_model.getInstance().getListInstance().clearAll(); + dialog.dismiss(); + }) + .addButton(strings.clear_bt2, -1, -1, CFAlertDialog.CFAlertActionStyle.NEGATIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + dialog.dismiss(); + }); + + builder.show(); + } + + public void reportURL() { Context application_context = app_model.getInstance().getAppContext(); @@ -140,11 +216,8 @@ public class message_manager .setTextColor(application_context.getResources().getColor(R.color.black)) .setMessage(strings.report_url_desc) .addButton(strings.report_url_bt1, -1, -1, CFAlertDialog.CFAlertActionStyle.NEGATIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { - - //String reportURL = constants.reportUrl+URL; - //serverRequestManager.getInstance().reportURL(reportURL); dialog.dismiss(); - reportedSuccessfully(); + reportedSuccessfully(strings.report_success_title,strings.report_success_desc); }) .addButton(strings.report_url_bt2, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { dialog.dismiss(); @@ -153,6 +226,29 @@ public class message_manager builder.show(); } + public void rateApp() + { + Context application_context = app_model.getInstance().getAppContext(); + CFAlertDialog.Builder builder = new CFAlertDialog.Builder(application_context) + .setDialogStyle(CFAlertDialog.CFAlertStyle.ALERT) + .setTitle(strings.rate_title) + .setBackgroundColor(application_context.getResources().getColor(R.color.blue_dark_v2)) + .setTextColor(application_context.getResources().getColor(R.color.black)) + .setMessage(strings.rate_message) + .addButton(strings.rate_positive, -1, -1, CFAlertDialog.CFAlertActionStyle.POSITIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + preference_manager.getInstance().setBool(keys.isAppRated,true); + app_model.getInstance().getAppInstance().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.darkweb.genesissearchengine"))); + dialog.dismiss(); + }) + .addButton(strings.rate_negative, -1, -1, CFAlertDialog.CFAlertActionStyle.NEGATIVE, CFAlertDialog.CFAlertActionAlignment.JUSTIFIED, (dialog, which) -> { + preference_manager.getInstance().setBool(keys.isAppRated,true); + dialog.dismiss(); + ratedSuccessfully(); + }); + + builder.show(); + } + public void startingOrbotInfo(String url) { if(!isPopupOn) @@ -185,7 +281,7 @@ public class message_manager { if(!url.equals("")) { - app_model.getInstance().getAppInstance().onloadURL(url,true); + app_model.getInstance().getAppInstance().onloadURL(url,true,true); } else { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbot_manager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbot_manager.java index 059907db..ce7fe711 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbot_manager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbot_manager.java @@ -1,18 +1,14 @@ package com.darkweb.genesissearchengine.pluginManager; -import android.util.Log; -import com.darkweb.genesissearchengine.appManager.app_model; +import com.darkweb.genesissearchengine.appManager.main_activity.app_model; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; -import com.darkweb.genesissearchengine.helperMethod; import com.msopentech.thali.android.toronionproxy.AndroidOnionProxyManager; import com.msopentech.thali.toronionproxy.OnionProxyManager; import org.mozilla.gecko.PrefsHelper; -import java.io.IOException; - public class orbot_manager { /*Private Variables*/ diff --git a/app/src/main/res/drawable/back_arrow.png b/app/src/main/res/drawable/back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..49a4c4a389d566a1d6d9e351f99e8f24d24b5e7b GIT binary patch literal 1813 zcmeHH`7;{`6b=zm;;d`16S|=p+Z#MB9x>`OHu1wwY^+D z94&R#6=WR^;y!|=T1T`crEGTpi=EkT=9@R)d+&#DzIpS~(I}+2sFElE01&scwZibL zH=l`MAOIlHVRkH+F9e7fqy?awp~B${p#XCya{!?3j@UjP#GkdI9dXwD{{Q&zCJ-dK zInH;V8-YP#0b|LXp`PGbyZ)#~-eoD5(Y9-f?x3mOh*!{Wc=09FkWtG)klY2qi7uUO z?-J2@he3@!f0++hCZXn{$c$||U2pf2PP&VZ|~uoU}qlE~HPuk0|AN)Zxt4P3<{MVJBtBVY5aeY|bf4t)Fq9wPa|r$5UI4 z57?Myv7*`Q&$fopvZ;ykc<={zMZu3r?O7lyffp=Igm;#ms%Zn?Z>$>reXu?+bSe~5 zByAh%EiZVgJqv9HNjK>}>^gh9BU}o0Q@XN9Wmr6))P3uK%mFxep_VK%;4`%(OC06Z z(R+cSD=1NR>`S$(-K51@l?ac{MfT0L#r`U)8Nn;IBJz3xw^rryV~PIufP7>9*%j`Y z6mj=;(pswY^*2Kcq=k$r3YnlFLr_?m(f(3@EH4XrXJQr6B8E*`02=?9R@Mx^_0aB% zR*u4o*0%#7ol2;am~NOWqERDlA|&Zlqvp5UnXQ8+ic_+)U-jV#jPqvEboJnRU*RT! zm&Z)**6xG^xR*3-ZWr%^L;bz3p{#n!aJ{|y!lgKPuYPJNP6yW14apJR(yGQg>@;U@ zZ)<|(7C(DhMjq&r1Bwr1{cUY~k26?4s>&&kJ8V>4#Onn^BI|xUYIUoKZumZ)!ma3D zHz1;mW82oFddiFoF715!3GR$~9&;MB+()~Sm4hQ~aHDk3bG(zd6~pJ3RXk<~ zkiDlGPbEiC^N;e5veR%-CQib#Nr$qk@Nj}d#ek;?)^so)Y%;Uqg z$rfHTrzq%+A0rqD<@JQ=*16=>)zL{ZvJm(nP*-=0xoi1i&$rKbOTv#Ta*rmv(`79b z*9IF?A89AwahBiMrq*hc(rO%?f88)^t!33AOs&vHYyH-y%Xk^(N|y;qFz19`+|1Qd zqTOM_lMm(zBT8h3p{j@pJs-Qz!roN`my1x;fGeKYHhi*f|$0yq4f*;t(1MM;m>L0Kke!FZHz5rhweH92b zQFMPH%xejhB71UzRG8*3#D^EDWepnSoWk6Yf5 ZB~!)O@}6F&u*rYEx1BZ0s@lRg`ETZgkOKe! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/cancel.png b/app/src/main/res/drawable/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..964dc9d7d355e053a55586b3190389b10611ccaa GIT binary patch literal 10021 zcmbWdbx>SS&^C&@gb>^kf&^V0f?FWCyDaWOg4<#tct{|y5Zv9}-3d-`TUZ=+@x?!W z^;O;b&wcM7Z&lAZ)pM$A=G64`JpJ@UsjJH4<51!tAtB)_e3sRGc|ZTxurQF2kQE5I zj9(OFcTIU|q{<2EgBJzOR!T(*38^L?_rVVYE_Vx z()KYu$-w^2An&_p`;FjL#4GUiNiSvf&sSp&wD10APg}{^=#~-HCF5z$noy+bh;cOX z%j?Nm>BP(Nl&=IYL?)pf%Oo#=Ov8Sefrrj$O^rw?-(hpv4H!m#5^R#%Q*7ktMWJ!O z1OavDid%(S%W7HcSnKZYJ8ps~J+0;BtYibu27VDaVukLLgvChIKi=^sGsg>QwPo=z z^&icv9n?5qJVe2}!&NoG%rVf2

Vu72Kd)=M%a$)Ye~GsYlOW`c-_}QkXflqy}u) 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 Jt&}zk{Xbm#i8}xQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/dropdown_arrow.png b/app/src/main/res/drawable/dropdown_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfbf8f2c0a29df1486a0874a661e5a79de58c35 GIT binary patch literal 966 zcmV;%13CPOP)Px#1ZP1_K>z@;j|==^1poj5Ay7Y<^2w4@PilVGlPAc zzd+;Mg>#&@;Ei(@g7Nl3G~QZB#_J22@!CRmyu45tFD(?u^9z;n+(LCcU1*HQ3(fIx zfidncu*RERbOn=CY^dGs2 z{*oK$eYv_mlq>6FxvD;uE9!G{HGN*Lq%X-;^kun%z9t{m*X4uymV8LxmJjGT@@_p( z-l^xxyYzf{hh8EV>t%AGUMd&q<#K_(N6yyw$(j0IIZNL!XXr=dP5qd>p&yl3_2cr2 zUPE5g>&OdwEqPY2C(r0L<%wQb9_h8^fnHzk=`G}^-bPM(EBUUslW%&d{FV8SuNC;- z|EFlh`lB4IR)3X)mFmNCuu6Se4pykomxI~s%jIC^`g%E-wZ2^rW~}FxgW2l&i5w*dJvfj2FSk>E?1B?25%7J$MedR#2{@!w+Reygu(5Qc=9E{dKR}Mz%pDhQy_0N}s zp87e;fwX>}av-Uns~m9a=PL)C`Z>!%tA5^cP^+K29F*$kF9*5$HOfI;zfL*u>(?p= opZfL60qWN*2d_W$!2;+017XKb7DD#i8~^|S07*qoM6N<$f=CS2nE(I) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/empty_list.png b/app/src/main/res/drawable/empty_list.png new file mode 100644 index 0000000000000000000000000000000000000000..92c616e3639409e559f14c877a806fbeb61c7aee GIT binary patch literal 52179 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 q+10`WdRhKI`8+NETQmLlh$hby%>M(66^hFM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/menu_item.png b/app/src/main/res/drawable/menu_item.png new file mode 100644 index 0000000000000000000000000000000000000000..98f4dc70cce072c984bb68fa90caffa86b263145 GIT binary patch literal 2566 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/rouned_corner.xml b/app/src/main/res/drawable/rouned_corner.xml new file mode 100644 index 00000000..79621e37 --- /dev/null +++ b/app/src/main/res/drawable/rouned_corner.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_app_list_manager.xml b/app/src/main/res/layout/activity_app_list_manager.xml new file mode 100644 index 00000000..1cabcb6c --- /dev/null +++ b/app/src/main/res/layout/activity_app_list_manager.xml @@ -0,0 +1,93 @@ + + + + + + +