diff --git a/app/build.gradle b/app/build.gradle index 90051e41..d46f3ae3 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,7 @@ dependencies { implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' implementation 'com.google.firebase:firebase-messaging:21.1.0' + implementation 'com.android.support:support-core-utils:28.0.0' /* Default Libraries */ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6bed4757..e2e3d053 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyRowModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyRowModel.java index 384a5285..67fb06a7 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyRowModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyRowModel.java @@ -1,5 +1,6 @@ package com.darkweb.genesissearchengine.appManager.historyManager; +import android.os.Handler; import android.widget.ImageView; import java.util.Calendar; import java.util.Date; diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java index 57cea63e..67754ebe 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoManager/geckoSession.java @@ -760,7 +760,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.MediaDele PendingIntent pIntent = PendingIntent.getActivity(mContext.get().getApplicationContext(), 0, intent, 0); String channel_id = createNotificationChannel(mContext.get().getApplicationContext()); - assert channel_id != null; + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext.get().getApplicationContext(), channel_id) .setSmallIcon(R.drawable.ic_download) .setContentTitle(filename) diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java index 86500968..78dcbc66 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/hintManager/hintAdapter.java @@ -5,6 +5,7 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -22,7 +23,10 @@ import androidx.room.Ignore; import com.darkweb.genesissearchengine.appManager.historyManager.historyRowModel; import com.darkweb.genesissearchengine.appManager.tabManager.tabEnums; import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; @@ -43,6 +47,10 @@ public class hintAdapter extends RecyclerView.Adapter mWebIcon = new HashMap<>(); + private ArrayList mKeys = new ArrayList<>(); + private Map mHandlers = new HashMap<>(); + private Map mPastWebIcon = new HashMap<>(); + private Map mPastIconFlicker = new HashMap<>(); public hintAdapter(ArrayList pHintList, eventObserver.eventListener pEvent, AppCompatActivity pContext, String pSearch) { this.mHintList = new ArrayList(); @@ -62,7 +70,9 @@ public class hintAdapter extends RecyclerView.Adapter6){ @@ -199,18 +227,49 @@ public class hintAdapter extends RecyclerView.Adapter { - mHintWebIcon.setColorFilter(null); - mHintWebIcon.clearColorFilter(); - mHintWebIcon.setImageTintList(null); - mHintWebIcon.setClipToOutline(true); mWebIcon.put(mURLLink,mHindTypeIconTemp.getDrawable()); + mKeys.add(mURLLink); + + if(mKeys.size()>5){ + mWebIcon.remove(mKeys.get(0)); + mKeys.remove(0); + } + if(mHindTypeIconTemp.getDrawable() != null){ - mHintWebIcon.setImageDrawable(mHindTypeIconTemp.getDrawable()); + if(mHandlers.containsKey(getLayoutPosition())){ + mHandlers.get(getLayoutPosition()).removeCallbacksAndMessages(null); + if(getLayoutPosition()==1){ + Log.i("SUPERFUCK1","SUPERFUCK1"); + } + }else { + mHandlers.put(getLayoutPosition(), new Handler()); + } + + if(mURLPast.equals(mPastIconFlicker.get(getLayoutPosition()))){ + Runnable mRunnable = () -> { + mHintWebIcon.setColorFilter(null); + mHintWebIcon.clearColorFilter(); + mHintWebIcon.setImageTintList(null); + mHintWebIcon.setClipToOutline(true); + mHintWebIcon.setImageDrawable(mHindTypeIconTemp.getDrawable()); + mPastWebIcon.put(getLayoutPosition(),mHindTypeIconTemp.getDrawable()); + + if(getLayoutPosition() == 1){ + Log.i("FUSSSS1111","FUSSSS1111"); + } + + }; + mHandlers.get(getLayoutPosition()).postDelayed(mRunnable, 200); + } + }else { - Resources res = itemView.getContext().getResources(); - try { - mHintWebIcon.setImageDrawable(Drawable.createFromXml(res, res.getXml(R.xml.ic_baseline_browser))); - } catch (Exception ignored) { + if(mURLPast.equals(mPastIconFlicker.get(getLayoutPosition()))){ + Resources res = itemView.getContext().getResources(); + try { + Log.i("FUSSSS1111","FUSSSS2222"); + mHintWebIcon.setImageDrawable(Drawable.createFromXml(res, res.getXml(R.xml.ic_baseline_browser))); + } catch (Exception ignored) { + } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java index 39aad603..3b1dcf07 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController/homeController.java @@ -108,7 +108,6 @@ import static com.darkweb.genesissearchengine.pluginManager.pluginEnums.eMessage import static com.darkweb.genesissearchengine.pluginManager.pluginEnums.eMessageManagerCallbacks.M_RATE_APPLICATION; import static java.lang.Character.isLetter; import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_FIRST_PARTY; -import static org.torproject.android.proxy.TorServiceConstants.REQUEST_VPN; public class homeController extends AppCompatActivity implements ComponentCallbacks2 { @@ -964,6 +963,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) && scrollY > oldScrollY) { } } + onInvokePixelGenerator(); }); } @@ -1323,6 +1323,8 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onClearSelections(true); } pluginController.getInstance().onLanguageInvoke(Collections.singletonList(this), pluginEnums.eLangManager.M_RESUME); + mHomeViewController.onClearSelections(true); + mHomeViewController.onUpdateSearchBar(mGeckoClient.getSession().getCurrentURL(),false,true, true); } @Override @@ -1383,6 +1385,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba } } + if(status.sSettingIsAppStarted){ + mHomeViewController.onClearSelections(isKeyboardOpened); + } + if(mAppBar!=null){ mHomeViewController.expandTopBar(); @@ -2055,10 +2061,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_UPDATE_PIXEL, Arrays.asList(mGeckoClient.getSession().getSessionID(), mRenderedBitmap, null, mGeckoView, true)); } } - }, 150); + }, 400); }; - mScrollHandler.postDelayed(mScrollRunnable, 250); + mScrollHandler.postDelayed(mScrollRunnable, 450); } public class geckoViewCallback implements eventObserver.eventListener{ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthContentProvider.java b/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthContentProvider.java new file mode 100644 index 00000000..67af8eb4 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthContentProvider.java @@ -0,0 +1,104 @@ +package com.darkweb.genesissearchengine.clientauth; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.provider.BaseColumns; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class ClientAuthContentProvider extends ContentProvider { + public static final String[] PROJECTION = { + V3ClientAuth._ID, + V3ClientAuth.DOMAIN, + V3ClientAuth.HASH, + V3ClientAuth.ENABLED, + }; + private static final String AUTH = "com.darkweb.genesissearchengine.clientauth.ClientAuthContentProvider"; + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTH + "/v3auth"); + private static final int V3AUTHS = 1, V3AUTH_ID = 2; + + private static final UriMatcher uriMatcher; + + static { + uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); + uriMatcher.addURI(AUTH, "v3auth", V3AUTHS); + uriMatcher.addURI(AUTH, "v3auth/#", V3AUTH_ID); + } + + private ClientAuthDatabase mDatabase; + + @Override + public boolean onCreate() { + mDatabase = new ClientAuthDatabase(getContext()); + return true; + } + + @Nullable + @Override + public String getType(@NonNull Uri uri) { + int match = uriMatcher.match(uri); + switch (match) { + case V3AUTHS: + return "vnd.android.cursor.dir/vnd.torproject.v3auths"; + case V3AUTH_ID: + return "vnd.android.cursor.item/vnd.torproject.v3auth"; + default: + return null; + } + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { + if (uriMatcher.match(uri) == V3AUTH_ID) + selection = "_id=" + uri.getLastPathSegment(); + SQLiteDatabase db = mDatabase.getReadableDatabase(); + return db.query(ClientAuthDatabase.DATABASE_NAME, projection, selection, selectionArgs, null, null, sortOrder); + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { + SQLiteDatabase db = mDatabase.getWritableDatabase(); + long regId = db.insert(ClientAuthDatabase.DATABASE_NAME, null, values); + getContext().getContentResolver().notifyChange(CONTENT_URI, null); + return ContentUris.withAppendedId(CONTENT_URI, regId); + } + + @Override + public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { + if (uriMatcher.match(uri) == V3AUTH_ID) + selection = "_id=" + uri.getLastPathSegment(); + SQLiteDatabase db = mDatabase.getWritableDatabase(); + int rows = db.delete(ClientAuthDatabase.DATABASE_NAME, selection, selectionArgs); + getContext().getContentResolver().notifyChange(CONTENT_URI, null); + return rows; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { + SQLiteDatabase db = mDatabase.getWritableDatabase(); + if (uriMatcher.match(uri) == V3AUTH_ID) + selection = "id_=" + uri.getLastPathSegment(); + int rows = db.update(ClientAuthDatabase.DATABASE_NAME, values, selection, null); + getContext().getContentResolver().notifyChange(CONTENT_URI, null); + return rows; + } + + public static final class V3ClientAuth implements BaseColumns { + private V3ClientAuth() { + } // no-op + + public static final String + DOMAIN = "domain", + HASH = "hash", + ENABLED = "enabled"; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthDatabase.java b/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthDatabase.java new file mode 100644 index 00000000..4dfda1a8 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/clientauth/ClientAuthDatabase.java @@ -0,0 +1,30 @@ +package com.darkweb.genesissearchengine.clientauth; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class ClientAuthDatabase extends SQLiteOpenHelper { + static final String DATABASE_NAME = "v3_client_auths"; + private static final int DATABASE_VERSION = 1; + + private static final String V3_AUTHS_CREATE_SQL = + "CREATE TABLE " + DATABASE_NAME + " (" + + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "domain TEXT, " + + "hash TEXT, " + + "enabled INTEGER DEFAULT 1);"; + + ClientAuthDatabase(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(V3_AUTHS_CREATE_SQL); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java index 12d3d29a..2a06442e 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/suggestionDataModel.java @@ -37,6 +37,9 @@ public class suggestionDataModel implements SpellCheckerSession.SpellCheckerSess private ArrayList getDefaultSuggestionsOnStart(String pQuery, int mSize, ArrayList mDuplicationHandler, boolean pDefaultHostChaned){ + if(pQuery.equals(strings.GENERIC_EMPTY_STR)){ + pQuery = "hidden web"; + } mCurrentList.clear(); if(!pQuery.equals(strings.GENERIC_EMPTY_STR) && !pQuery.equals("about:blank") && !pQuery.contains("?") && !pQuery.contains("/") && !pQuery.contains(" ") && !pQuery.contains(" ") && !pQuery.contains("\n")){ mCurrentList.size(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/ProxySettings.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/ProxySettings.java index 2b50c847..abbfdee7 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/ProxySettings.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/ProxySettings.java @@ -7,7 +7,7 @@ import ch.boye.httpclientandroidlib.HttpHost; public class ProxySettings { private static final String TOR_PROXY_ADDRESS = "127.0.0.1"; - private static final int TOR_PROXY_PORT = 1080; + private static final int TOR_PROXY_PORT = 8118; public static Proxy getProxy() { // TODO make configurable diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/downloadNotification.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/downloadNotification.java index 8cbe9ff9..c9263734 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/downloadNotification.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/downloadNotification.java @@ -12,7 +12,7 @@ public class downloadNotification extends BroadcastReceiver { int mCommand = intent.getExtras().getInt("N_COMMAND"); if(mCommand==1){ pluginController.getInstance().onDownloadInvoke(Collections.singletonList(intent.getExtras().getInt("N_ID")), pluginEnums.eDownloadManager.M_TRIGGER); - }else if(mCommand==0) { + }else if(mCommand==0 || mCommand==2) { pluginController.getInstance().onDownloadInvoke(Collections.singletonList(intent.getExtras().getInt("N_ID")), pluginEnums.eDownloadManager.M_CANCEL); } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java index 73a84aee..9e6a76c9 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java @@ -9,6 +9,7 @@ import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -632,13 +633,17 @@ public class helperMethod transitionDrawable.startTransition(duration); } - public static String getMimeType(String url) { - String type = null; - String extension = MimeTypeMap.getFileExtensionFromUrl(url); - if (extension != null) { - type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + public static String getMimeType(String url, Context pContext) { + String mimeType; + Uri myUri = Uri.parse(url); + if (ContentResolver.SCHEME_CONTENT.equals(myUri.getScheme())) { + ContentResolver cr = pContext.getContentResolver(); + mimeType = cr.getType(myUri); + } else { + String fileExtension = MimeTypeMap.getFileExtensionFromUrl(myUri.toString()); + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase()); } - return type; + return mimeType; } public static void openFile(File url, Context context) { @@ -650,7 +655,16 @@ public class helperMethod intent.setDataAndType(uri, Uri.parse(url.toString()).getScheme()); context.startActivity(intent); } catch (ActivityNotFoundException e) { - Toast.makeText(context, "No application found which can open the file", Toast.LENGTH_SHORT).show(); + try { + Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", url); + Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url.toString())); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setDataAndType(Uri.fromFile(url), getMimeType(uri.toString(),context)); + context.startActivity(intent); + } catch (ActivityNotFoundException ex) { + Toast.makeText(context, "No application found which can open the file", Toast.LENGTH_SHORT).show(); + } } } public static void copyURL(String url,Context context){ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/localFileDownloader.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/localFileDownloader.java index 7413b74c..f278bb09 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/localFileDownloader.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/localFileDownloader.java @@ -15,30 +15,34 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Environment; +import android.os.Handler; import android.os.StrictMode; import android.provider.MediaStore; +import android.widget.Toast; + import androidx.core.app.NotificationCompat; import androidx.core.content.FileProvider; import com.darkweb.genesissearchengine.netcipher.client.StrongHttpsClient; import com.example.myapplication.R; import org.mozilla.thirdparty.com.google.android.exoplayer2.util.Log; import org.torproject.android.proxy.util.Prefs; - -import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; +import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URI; import java.net.URL; import java.net.URLConnection; -import java.net.URLEncoder; +import java.text.DecimalFormat; +import ch.boye.httpclientandroidlib.HttpHost; import ch.boye.httpclientandroidlib.HttpResponse; import ch.boye.httpclientandroidlib.client.methods.HttpGet; +import ch.boye.httpclientandroidlib.conn.params.ConnRoutePNames; + import static java.lang.Thread.sleep; @@ -50,6 +54,7 @@ public class localFileDownloader extends AsyncTask { private NotificationCompat.Builder build; private OutputStream output; private InputStream mStream; + private Boolean mIsCanceled = false; private String PROXY_ADDRESS = "localhost"; private int PROXY_PORT = 9050; @@ -117,21 +122,39 @@ public class localFileDownloader extends AsyncTask { mNotifyManager.notify(mID, build.build()); } + public static String getFileSize(long size) { + if (size <= 0) + return "0"; + + final String[] units = new String[] { "B Downloaded", "KB ⇣", "MB ⇣", "GB ⇣", "TB ⇣" }; + int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); + + return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; + } + + @Override protected String doInBackground(String... f_url) { int count; + int mRequestCode = 0; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { try { URL url = new URL(f_url[0]); - Proxy proxy = new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(PROXY_ADDRESS, PROXY_PORT)); - URLConnection conection; + HttpURLConnection conection; + Proxy proxy; + if(helperMethod.getDomainName(f_url[0]).contains(".onion")){ + proxy = new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(PROXY_ADDRESS, 9050)); + conection = (HttpURLConnection) url.openConnection(proxy); + }else { + conection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(new URI(f_url[0]));; + } - conection = url.openConnection(proxy); - //conection = (HttpsURLConnection)ProxySelector.openConnectionWithProxy(new URI(f_url[0])); + conection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0"); + conection.setRequestProperty("Accept","*/*"); conection.connect(); int lenghtOfFile = conection.getContentLength(); - + mRequestCode = conection.getResponseCode(); mStream = conection.getInputStream(); // Output stream output = new FileOutputStream(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()+"/"+mFileName)); @@ -143,7 +166,12 @@ public class localFileDownloader extends AsyncTask { while ((count = mStream.read(data)) != -1) { total += count; int cur = (int) ((total * 100) / lenghtOfFile); - mDownloadByte = cur; + if(lenghtOfFile<0){ + cur = (int)total; + mDownloadByte = cur * -1; + }else { + mDownloadByte = cur; + } publishProgress(Math.min(cur, 100)); if (Math.min(cur, 100) > 98) { sleep(500); @@ -163,6 +191,10 @@ public class localFileDownloader extends AsyncTask { mStream.close(); } catch (Exception ex) { + Log.i("FIZZAHFUCK", ex.getMessage()); + if(mRequestCode>300){ + //Toast.makeText(context,"Request Forbidden Error Code : ",mRequestCode).show(); + } onCancel(); } }else { @@ -172,7 +204,11 @@ public class localFileDownloader extends AsyncTask { StrongHttpsClient httpclient = new StrongHttpsClient(context); - httpclient.useProxy(true, "SOCKS", "127.0.0.1", 9050); + if(helperMethod.getDomainName(f_url[0]).contains(".onion")){ + httpclient.useProxy(true, "SOCKS", "127.0.0.1", 9050); + }else { + httpclient.useProxy(true, "SOCKS", "127.0.0.1", 9050); + } HttpGet httpget = new HttpGet(urlEncoded); HttpResponse response = httpclient.execute(httpget); @@ -182,17 +218,26 @@ public class localFileDownloader extends AsyncTask { InputStream mStream = response.getEntity().getContent(); + mRequestCode = response.getStatusLine().getStatusCode(); output = new FileOutputStream(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()+"/"+mFileName)); byte[] data = new byte[100000]; long total = 0; - mTotalByte = response.getEntity().getContentLength(); + float lenghtOfFile = response.getEntity().getContentLength(); + mTotalByte = lenghtOfFile; int read; while ((read = mStream.read(data)) != -1) { total += read; int cur = (int) ((total * 100) / response.getEntity().getContentLength()); mDownloadByte = cur; + if(lenghtOfFile<0){ + cur = (int)total; + mDownloadByte = total * -1; + }else { + mDownloadByte = cur; + } + publishProgress(Math.min(cur, 100)); if (Math.min(cur, 100) > 98) { sleep(500); @@ -210,19 +255,24 @@ public class localFileDownloader extends AsyncTask { output.close(); mStream.close(); }catch (Exception ex){ - Log.d("sda", "dsa"); + if(mRequestCode>300){ + //Toast.makeText(context,"Request Forbidden Error Code : ",mRequestCode).show(); + } + onCancel(); } } return null; } protected void onProgressUpdate(Integer... progress) { - build.setProgress(100, progress[0], false); int mPercentage = (int)(mDownloadByte); if(mPercentage<0){ - mPercentage = 0; + build.setProgress(100, progress[0], true); + build.setContentText(getFileSize(mPercentage * -1)); + }else { + build.setProgress(100, progress[0], false); + build.setContentText(mPercentage+"%"); } - build.setContentText(mPercentage+"%"); mNotifyManager.notify(mID, build.build()); super.onProgressUpdate(progress); } @@ -230,19 +280,27 @@ public class localFileDownloader extends AsyncTask { @Override protected void onPostExecute(String file_url) { Intent snoozeIntentPost = new Intent(context, downloadNotification.class); - snoozeIntentPost.setAction("Download_Cancelled"); + snoozeIntentPost.setAction("Download_Open"); snoozeIntentPost.putExtra("N_ID", mID); snoozeIntentPost.putExtra("N_COMMAND", 1); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, mID, snoozeIntentPost, PendingIntent.FLAG_UPDATE_CURRENT); + Intent snoozeIntentPost1 = new Intent(context, downloadNotification.class); + snoozeIntentPost1.setAction("Download_Cancelled"); + snoozeIntentPost1.putExtra("N_ID", mID); + snoozeIntentPost1.putExtra("N_COMMAND", 2); + PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, mID, snoozeIntentPost1, PendingIntent.FLAG_UPDATE_CURRENT); + + build.addAction(0, null, null); build.setContentIntent(pendingIntent); - build.addAction(android.R.drawable.stat_sys_download, "Open",pendingIntent); build.setContentText("Download complete"); build.setSmallIcon(R.xml.ic_check); + build.setColor(Color.parseColor("#84989f")); build.setProgress(0, 0, false); build.setAutoCancel(true); - build.setColor(Color.parseColor("#212d45")); build.setOngoing(false); + build.addAction(android.R.drawable.stat_sys_download, "Open",pendingIntent); + build.addAction(R.drawable.ic_download, "Cancel",pendingIntent1); build.setPriority(Notification.PRIORITY_LOW); mNotifyManager.notify(mID, build.build()); @@ -258,7 +316,7 @@ public class localFileDownloader extends AsyncTask { contentValues.put(MediaStore.Downloads.TITLE, mFileName); contentValues.put(MediaStore.Downloads.DISPLAY_NAME, mFileName); contentValues.put(MediaStore.Downloads.SIZE, mDownloadByte); - contentValues.put(MediaStore.Downloads.MIME_TYPE, helperMethod.getMimeType(uri.toString())); + contentValues.put(MediaStore.Downloads.MIME_TYPE, helperMethod.getMimeType(uri.toString(), context)); contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + File.separator + "Temp"); @@ -266,21 +324,28 @@ public class localFileDownloader extends AsyncTask { database.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues); } else { Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", mFile); - dm.addCompletedDownload(mFileName, mURL, false, helperMethod.getMimeType(uri.toString()), mFile.getAbsolutePath(), mFile.length(), false); + String mime = helperMethod.getMimeType(uri.toString(), context); + if(mime!=null){ + dm.addCompletedDownload(mFileName, mURL, false, mime, mFile.getAbsolutePath(), mFile.length(), false); + } } } public void onCancel(){ + mIsCanceled = true; mNotifyManager.cancel(mID); cancel(true); } public void onTrigger(){ - mNotifyManager.cancel(mID); - String mPath = (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + File.separator + mFileName).replace("File//","content://"); - File mFile = new File(mPath); - helperMethod.openFile(mFile, context); + if(!mIsCanceled){ + mNotifyManager.cancel(mID); + String mPath = (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + File.separator + mFileName).replace("File//","content://"); + File mFile = new File(mPath); + + new Handler().postDelayed(() -> helperMethod.openFile(mFile, context), 500); + } } } diff --git a/app/src/main/res/custom-xml/generic/xml/file_path.xml b/app/src/main/res/custom-xml/generic/xml/file_path.xml new file mode 100644 index 00000000..01038999 --- /dev/null +++ b/app/src/main/res/custom-xml/generic/xml/file_path.xml @@ -0,0 +1,4 @@ + + + + diff --git a/orbotservice/src/main/java/org/torproject/android/proxy/OrbotService.java b/orbotservice/src/main/java/org/torproject/android/proxy/OrbotService.java index 541bd5b1..73dce933 100644 --- a/orbotservice/src/main/java/org/torproject/android/proxy/OrbotService.java +++ b/orbotservice/src/main/java/org/torproject/android/proxy/OrbotService.java @@ -73,8 +73,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; -import java.io.Reader; -import java.io.StringReader; import java.net.Socket; import java.util.ArrayList; import java.util.Arrays; @@ -93,22 +91,21 @@ import java.util.concurrent.TimeoutException; import IPtProxy.IPtProxy; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static org.torproject.android.proxy.wrapper.orbotLocalConstants.mBridgesDefault; public class OrbotService extends VpnService implements TorServiceConstants, OrbotConstants { public final static String BINARY_TOR_VERSION = org.torproject.android.binary.TorServiceConstants.BINARY_TOR_VERSION; - static final int NOTIFY_ID = 11; + static final int NOTIFY_ID = 1; private final static int CONTROL_SOCKET_TIMEOUT = 60000; private boolean mConnectivity = true; - private static final int ERROR_NOTIFY_ID = 31; - private static final int HS_NOTIFY_ID = 41; + private static final int ERROR_NOTIFY_ID = 3; + private static final int HS_NOTIFY_ID = 4; private Notification mNotification; private static final Uri V2_HS_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers/hs"); private static final Uri V3_ONION_SERVICES_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice/v3"); private static final Uri COOKIE_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers.cookie/cookie"); - private static final Uri V3_CLIENT_AUTH_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice.clientauth/v3auth"); - private final static String NOTIFICATION_CHANNEL_ID = "genesis_channel_1"; + private static final Uri V3_CLIENT_AUTH_URI = Uri.parse("content://com.darkweb.genesissearchengine.clientauth.ClientAuthContentProvider/v3auth"); + private final static String NOTIFICATION_CHANNEL_ID = "orbot_channel_1"; private static final String[] LEGACY_V2_ONION_SERVICE_PROJECTION = new String[]{ OnionService._ID, OnionService.NAME, @@ -237,9 +234,6 @@ public class OrbotService extends VpnService implements TorServiceConstants, Orb @RequiresApi(api = Build.VERSION_CODES.O) private void createNotificationChannel() { - if(1==1){ - return; - } if(orbotLocalConstants.mNotificationStatus==1) { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); @@ -258,9 +252,6 @@ public class OrbotService extends VpnService implements TorServiceConstants, Orb @SuppressLint({"NewApi", "RestrictedApi"}) protected void showToolbarNotification(String notifyMsg, int notifyType, int icon) { - if(1==1){ - return; - } //if(orbotLocalConstants.mNotificationStatus==1){ PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage(getPackageName()); @@ -981,12 +972,7 @@ public class OrbotService extends VpnService implements TorServiceConstants, Orb } protected void exec(Runnable runn) { - try { - new Thread(runn).start(); - }catch (Exception ex){ - ex.printStackTrace(); - Log.i("",""); - } + mExecutor.execute(runn); } private int exec(String cmd, boolean wait) throws Exception { @@ -1635,8 +1621,7 @@ public class OrbotService extends VpnService implements TorServiceConstants, Orb alBridges = new ArrayList<>(); try { - Reader inputString = new StringReader(mBridgesDefault); - BufferedReader in = new BufferedReader(inputString); + BufferedReader in = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.bridges), "UTF-8")); String str; while ((str = in.readLine()) != null) {