├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── arrays.xml │ │ │ ├── colors.xml │ │ │ ├── attrs.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── drawable │ │ │ ├── tick.png │ │ │ ├── rating.png │ │ │ ├── ic_clear.xml │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── layout │ │ │ ├── settings_activity.xml │ │ │ ├── list_item.xml │ │ │ ├── drawer_item.xml │ │ │ ├── activity_app_chooser.xml │ │ │ ├── activity_app_drawer.xml │ │ │ ├── content_app_chooser.xml │ │ │ └── activity_main.xml │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ └── xml │ │ │ └── root_preferences.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ └── umairayub │ │ │ └── bitlauncher │ │ │ ├── model │ │ │ └── App.java │ │ │ ├── adapters │ │ │ └── Adapter.java │ │ │ ├── listeners │ │ │ └── OnSwipeTouchListener.java │ │ │ └── activites │ │ │ ├── MainActivity.java │ │ │ ├── AppDrawerActivity.java │ │ │ ├── SettingsActivity.java │ │ │ └── AppChooserActivity.java │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── screenshots ├── screenshot01.png ├── screenshot02.png └── screenshot03.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .idea ├── encodings.xml ├── code-comments.xml ├── vcs.xml ├── misc.xml ├── runConfigurations.xml ├── gradle.xml ├── codeStyles │ └── Project.xml └── BitLauncher.time ├── .gitignore ├── LICENSE ├── gradle.properties ├── hs_err_pid1342.log ├── README.md ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /screenshots/screenshot01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/screenshots/screenshot01.png -------------------------------------------------------------------------------- /screenshots/screenshot02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/screenshots/screenshot02.png -------------------------------------------------------------------------------- /screenshots/screenshot03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/screenshots/screenshot03.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/drawable/tick.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/drawable/rating.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/umairayub79/BitLauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /.idea/code-comments.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/model/App.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.model; 2 | 3 | public class App { 4 | public String packageName; 5 | public String Appname; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jul 22 02:55:38 PKT 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Reply 5 | Reply to all 6 | 7 | 8 | 9 | reply 10 | reply_all 11 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #F57C00 6 | #FFFFFF 7 | #111111 8 | 9 | #66000000 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/drawer_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | BitLauncher 3 | AppChooserActivity 4 | Settings 5 | 6 | 7 | Theme 8 | Dark Theme 9 | 10 | Light Theme 11 | 12 | Status Bar 13 | Hide Status bar 14 | 15 | Show Status bar 16 | 17 | AppDrawerActivity 18 | Dummy Button 19 | DUMMY\nCONTENT 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_app_chooser.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_app_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.0" 6 | defaultConfig { 7 | applicationId "umairayub.bitlauncher" 8 | minSdkVersion 20 9 | targetSdkVersion 29 10 | versionCode 12 11 | versionName "1.2" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'androidx.appcompat:appcompat:1.0.2' 24 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 25 | implementation 'com.google.android.material:material:1.0.0' 26 | implementation 'com.github.Binary-Finery:JetDB:1.0.5' 27 | implementation 'com.github.Binary-Finery:Bungee:2.0' 28 | implementation 'com.github.umairayub79:MaDialog:1.3' 29 | 30 | implementation 'androidx.preference:preference:1.1.0-rc01' 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Umair Ayub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx900m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/adapters/Adapter.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.adapters; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | 9 | import android.widget.TextView; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import umairayub.bitlauncher.R; 15 | import umairayub.bitlauncher.model.App; 16 | 17 | public class Adapter extends BaseAdapter { 18 | 19 | private final Context mContext; 20 | private final List appList; 21 | private ArrayList arraylist; 22 | 23 | 24 | // 1 25 | public Adapter(Context context,List applist) { 26 | this.mContext = context; 27 | this.appList = applist; 28 | } 29 | 30 | // 2 31 | @Override 32 | public int getCount() { 33 | return appList.size(); 34 | } 35 | 36 | // 3 37 | @Override 38 | public long getItemId(int position) { 39 | return position; 40 | } 41 | 42 | // 4 43 | @Override 44 | public Object getItem(int position) { 45 | return appList.get(position); 46 | } 47 | @Override 48 | public int getViewTypeCount() { 49 | return 2; 50 | } 51 | // 5 52 | @Override 53 | public View getView(int position, View convertView, ViewGroup parent) { 54 | 55 | if (convertView == null) { 56 | final LayoutInflater layoutInflater = LayoutInflater.from(mContext); 57 | convertView = layoutInflater.inflate(R.layout.list_item, null); 58 | } 59 | final TextView name = (TextView)convertView.findViewById(R.id.tv_item); 60 | 61 | name.setText(appList.get(position).Appname); 62 | 63 | return convertView; 64 | 65 | } 66 | 67 | 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 38 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/xml/root_preferences.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 33 | 34 | 38 | 42 | 46 | 50 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 19 | 20 | 25 | 26 | 31 | 32 | 36 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/listeners/OnSwipeTouchListener.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.listeners; 2 | 3 | import android.content.Context; 4 | import android.view.GestureDetector; 5 | import android.view.MotionEvent; 6 | import android.view.View; 7 | import android.widget.Toast; 8 | 9 | 10 | public class OnSwipeTouchListener implements View.OnTouchListener { 11 | private final GestureDetector gestureDetector; 12 | 13 | public OnSwipeTouchListener(Context ctx) { 14 | gestureDetector = new GestureDetector(ctx, new GestureListener(ctx)); 15 | } 16 | 17 | @Override 18 | public boolean onTouch(View view, MotionEvent motionEvent) { 19 | return gestureDetector.onTouchEvent(motionEvent); 20 | } 21 | 22 | public void onSwipeLeft() { 23 | 24 | } 25 | 26 | public void onSwipeRight() { 27 | 28 | } 29 | 30 | 31 | private final class GestureListener extends GestureDetector.SimpleOnGestureListener { 32 | private static final int SWIPE_THRESHOLD = 100; 33 | private static final int SWIPE_VELOCITY_THRESHOLD = 100; 34 | private final Context ctx; 35 | 36 | public GestureListener(Context ctx) { 37 | this.ctx = ctx; 38 | 39 | } 40 | 41 | @Override 42 | public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 43 | boolean result = false; 44 | try { 45 | float difffY = e2.getY() - e1.getY(); 46 | float diffX = e2.getX() - e1.getX(); 47 | if (Math.abs(diffX) > Math.abs(difffY)) { 48 | if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 49 | if (diffX > 0) { 50 | onSwipeRight(); 51 | } else { 52 | onSwipeLeft(); 53 | } 54 | result = true; 55 | } 56 | } 57 | } catch (Exception e) { 58 | e.printStackTrace(); 59 | Toast.makeText(ctx, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); 60 | } 61 | return result; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/content_app_chooser.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 12 | 13 | 18 | 19 | 26 | 27 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 47 | 52 | 53 | 58 | 59 | -------------------------------------------------------------------------------- /hs_err_pid1342.log: -------------------------------------------------------------------------------- 1 | # 2 | # There is insufficient memory for the Java Runtime Environment to continue. 3 | # Native memory allocation (mmap) failed to map 63438848 bytes for committing reserved memory. 4 | # Possible reasons: 5 | # The system is out of physical RAM or swap space 6 | # In 32 bit mode, the process size limit was hit 7 | # Possible solutions: 8 | # Reduce memory load on the system 9 | # Increase physical memory or swap space 10 | # Check if swap backing store is full 11 | # Use 64 bit Java on a 64 bit OS 12 | # Decrease Java heap size (-Xmx/-Xms) 13 | # Decrease number of Java threads 14 | # Decrease Java thread stack sizes (-Xss) 15 | # Set larger code cache with -XX:ReservedCodeCacheSize= 16 | # This output file may be truncated or incomplete. 17 | # 18 | # Out of Memory Error (os_linux.cpp:2640), pid=1342, tid=0x00007fc734d44700 19 | # 20 | # JRE version: OpenJDK Runtime Environment (8.0_152) (build 1.8.0_152-release-1343-b16-5323222) 21 | # Java VM: OpenJDK 64-Bit Server VM (25.152-b16-5323222 mixed mode linux-amd64 compressed oops) 22 | # Core dump written. Default location: /home/umair/Desktop/BitLauncher/core or core.1342 23 | # 24 | 25 | --------------- T H R E A D --------------- 26 | 27 | Current thread (0x00007fc730073800): VMThread [stack: 0x00007fc734c45000,0x00007fc734d45000] [id=1349] 28 | 29 | Stack: [0x00007fc734c45000,0x00007fc734d45000], sp=0x00007fc734d434e0, free space=1017k 30 | Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 31 | V [libjvm.so+0x9ffc88] VMError::report_and_die()+0x148 32 | V [libjvm.so+0x4ce9aa] report_vm_out_of_memory(char const*, int, unsigned long, VMErrorType, char const*)+0x8a 33 | V [libjvm.so+0x8673d8] os::pd_commit_memory(char*, unsigned long, unsigned long, bool)+0xd8 34 | V [libjvm.so+0x86201f] os::commit_memory(char*, unsigned long, unsigned long, bool)+0x1f 35 | V [libjvm.so+0x8d839b] PSVirtualSpace::expand_by(unsigned long)+0x5b 36 | V [libjvm.so+0x8d8ff0] PSYoungGen::resize_generation(unsigned long, unsigned long)+0xb0 37 | V [libjvm.so+0x8d930b] PSYoungGen::resize(unsigned long, unsigned long)+0x1b 38 | V [libjvm.so+0x8d5a3e] PSScavenge::invoke_no_policy()+0xdce 39 | V [libjvm.so+0x8d61f8] PSScavenge::invoke()+0x38 40 | V [libjvm.so+0x88a7e3] ParallelScavengeHeap::failed_mem_allocate(unsigned long)+0x63 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 23 | 24 | 25 | 41 | 42 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BitLauncher 2 | Minimalist launcher for Android 3 | 4 | 5 | ## Screenshots 6 | ![Example screenshot 1](./screenshots/screenshot01.png) 7 | ![Example screenshot 2](./screenshots/screenshot02.png) 8 | ![Example screenshot 3](./screenshots/screenshot03.png) 9 | 10 | # Description 11 | ``` 12 | 13 | ✶ Made with minimalism in mind.✶ 14 | ✶ Stay focused using the Bitlauncher.✶ 15 | ✶ Bit Launcher helps you use your Phone less and live in the moment✶ 16 | 17 | Minimal homescreen 18 | Focus on your five most important apps. 19 | 20 | Notified but not distracted 21 | Focus on what is essential. Your important notifications work normally, so you don’t miss anything. 22 | 23 | Truly private 24 | We are not in the business of capturing or selling your data. We don't track any personally identifiable data -- we even allow you to turn off our anonymous analytics. 25 | 26 | Save your battery 27 | Use our true black background to significantly preserve your battery (if your phone has an AMOLED screen). 28 | 29 | 30 | Easy set up 31 | Our guided process helps you get BitLauncher set up in no time. 32 | 33 | We respect your privacy. We don't track personally identifiable data and allow for several ways to make your experience even more private. 34 | ``` 35 | 36 | 37 | 38 | 39 | # License 40 | ``` 41 | MIT License 42 | 43 | Copyright (c) 2019 Umair Ayub 44 | 45 | Permission is hereby granted, free of charge, to any person obtaining a copy 46 | of this software and associated documentation files (the "Software"), to deal 47 | in the Software without restriction, including without limitation the rights 48 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 49 | copies of the Software, and to permit persons to whom the Software is 50 | furnished to do so, subject to the following conditions: 51 | 52 | The above copyright notice and this permission notice shall be included in all 53 | copies or substantial portions of the Software. 54 | 55 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 56 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 57 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 58 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 59 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 60 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 61 | SOFTWARE. 62 | ``` 63 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/activites/MainActivity.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.activites; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.AdapterView; 8 | import android.widget.ListView; 9 | import android.widget.TextView; 10 | 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.constraintlayout.widget.ConstraintLayout; 13 | 14 | 15 | import java.util.List; 16 | 17 | import spencerstudios.com.bungeelib.Bungee; 18 | import spencerstudios.com.jetdblib.JetDB; 19 | import umairayub.bitlauncher.R; 20 | import umairayub.bitlauncher.adapters.Adapter; 21 | import umairayub.bitlauncher.listeners.OnSwipeTouchListener; 22 | import umairayub.bitlauncher.model.App; 23 | 24 | public class MainActivity extends AppCompatActivity { 25 | 26 | TextView tvSettings; 27 | ListView listView; 28 | List HomeAppList; 29 | MainActivity context = MainActivity.this; 30 | Boolean theme; 31 | Boolean status_bar; 32 | ConstraintLayout root; 33 | 34 | @SuppressLint("ClickableViewAccessibility") 35 | @Override 36 | protected void onCreate(Bundle savedInstanceState) { 37 | 38 | status_bar = JetDB.getBoolean(context, "status", false); 39 | theme = JetDB.getBoolean(context, "theme", false); 40 | 41 | if (status_bar) { 42 | if (theme) { 43 | setTheme(R.style.AppThemeDarkFullScreen); 44 | } else { 45 | setTheme(R.style.AppThemeFullScreen); 46 | } 47 | } else { 48 | if (theme) { 49 | setTheme(R.style.AppThemeDark); 50 | } else { 51 | setTheme(R.style.AppTheme); 52 | } 53 | } 54 | 55 | super.onCreate(savedInstanceState); 56 | setContentView(R.layout.activity_main); 57 | 58 | root = findViewById(R.id.relativeLayout); 59 | tvSettings = findViewById(R.id.tvSettings); 60 | listView = findViewById(R.id.listview); 61 | 62 | listView.setOnTouchListener(new OnSwipeTouchListener(this) { 63 | @Override 64 | public void onSwipeLeft() { 65 | super.onSwipeLeft(); 66 | Intent i = new Intent(context, AppDrawerActivity.class); 67 | startActivity(i); 68 | Bungee.slideLeft(context); 69 | } 70 | }); 71 | tvSettings.setOnClickListener(new View.OnClickListener() { 72 | @Override 73 | public void onClick(View view) { 74 | Intent intent = new Intent(context, SettingsActivity.class); 75 | startActivity(intent); 76 | finish(); 77 | } 78 | }); 79 | listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 80 | @Override 81 | public void onItemClick(AdapterView adapterView, View view, int i, long l) { 82 | // Getting the package name from HomeAppList 83 | String packageName = HomeAppList.get(i).packageName; 84 | 85 | //Getting the launch intent for the package 86 | Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 87 | if (intent != null) { 88 | //launching the activity if intent is not null 89 | startActivity(intent); 90 | } 91 | } 92 | }); 93 | } 94 | 95 | @Override 96 | protected void onResume() { 97 | super.onResume(); 98 | 99 | //Getting the List of user selected apps from SharedPrefs using JetDB 100 | HomeAppList = JetDB.getListOfObjects(context, App.class, "apps"); 101 | //checking if HomeAppList is empty then launching the app chooser activity 102 | if (HomeAppList.isEmpty()) { 103 | Intent i = new Intent(context, AppChooserActivity.class); 104 | startActivity(i); 105 | } 106 | // if HomeAppList is not empty then create adapter and show the app list 107 | Adapter adapter = new Adapter(context, HomeAppList); 108 | listView.setAdapter(adapter); 109 | 110 | } 111 | 112 | @Override 113 | public void onBackPressed() { 114 | // Do nothing 115 | } 116 | 117 | 118 | } 119 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/activites/AppDrawerActivity.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.activites; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.pm.PackageManager; 7 | import android.content.pm.ResolveInfo; 8 | import android.os.Bundle; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.AdapterView; 14 | import android.widget.ArrayAdapter; 15 | import android.widget.EditText; 16 | import android.widget.ListView; 17 | import android.widget.TextView; 18 | import android.widget.Toast; 19 | 20 | import androidx.appcompat.app.AppCompatActivity; 21 | 22 | import java.util.ArrayList; 23 | import java.util.Collections; 24 | import java.util.List; 25 | 26 | import spencerstudios.com.bungeelib.Bungee; 27 | import spencerstudios.com.jetdblib.JetDB; 28 | import umairayub.bitlauncher.R; 29 | import umairayub.bitlauncher.listeners.OnSwipeTouchListener; 30 | 31 | public class AppDrawerActivity extends AppCompatActivity { 32 | 33 | Boolean status_bar; 34 | Boolean theme; 35 | private List packageNames = new ArrayList<>(); 36 | private List appNamesPosition = new ArrayList<>(); 37 | private ArrayAdapter adapter; 38 | private ListView listView; 39 | private Context context = AppDrawerActivity.this; 40 | 41 | @Override 42 | protected void onResume() { 43 | super.onResume(); 44 | if (getActivities(getPackageManager()).size() - 1 != packageNames.size()) { 45 | fetchAppList(); 46 | } 47 | } 48 | 49 | @Override 50 | protected void onCreate(Bundle savedInstanceState) { 51 | status_bar = JetDB.getBoolean(context, "status", false); 52 | theme = JetDB.getBoolean(context, "theme", false); 53 | 54 | if (status_bar) { 55 | if (theme) { 56 | setTheme(R.style.AppThemeDarkFullScreen); 57 | } else { 58 | setTheme(R.style.AppThemeFullScreen); 59 | } 60 | } else { 61 | if (theme) { 62 | setTheme(R.style.AppThemeDark); 63 | } else { 64 | setTheme(R.style.AppTheme); 65 | } 66 | } 67 | super.onCreate(savedInstanceState); 68 | setContentView(R.layout.activity_app_drawer); 69 | 70 | EditText editTextFilter = findViewById(R.id.searchFilter); 71 | 72 | adapter = createNewAdapter(); 73 | listView = findViewById(R.id.listViewAllApps_d); 74 | listView.setAdapter(adapter); 75 | fetchAppList(); 76 | 77 | editTextFilter.addTextChangedListener(new TextWatcher() { 78 | @Override 79 | public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 80 | 81 | } 82 | 83 | @Override 84 | public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 85 | adapter.getFilter().filter(charSequence); 86 | } 87 | 88 | @Override 89 | public void afterTextChanged(Editable editable) { 90 | 91 | } 92 | }); 93 | 94 | } 95 | 96 | private ArrayAdapter createNewAdapter() { 97 | return new ArrayAdapter(this, R.layout.drawer_item, new ArrayList()) { 98 | @Override 99 | public View getView(int position, View convertView, ViewGroup parent) { 100 | TextView view = (TextView) super.getView(position, convertView, parent); 101 | return view; 102 | } 103 | }; 104 | } 105 | 106 | private void fetchAppList() { 107 | packageNames.clear(); 108 | adapter.clear(); 109 | for (ResolveInfo resolver : getActivities(getPackageManager())) { 110 | String appName = (String) resolver.loadLabel(getPackageManager()); 111 | if (appName.equals("BitLauncher")) 112 | continue; 113 | adapter.add(appName); 114 | appNamesPosition.add(appName); 115 | packageNames.add(resolver.activityInfo.packageName); 116 | } 117 | setActions(); 118 | } 119 | 120 | private List getActivities(PackageManager packageManager) { 121 | Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER); 122 | List activities = packageManager.queryIntentActivities(intent, 0); 123 | Collections.sort(activities, new ResolveInfo.DisplayNameComparator(packageManager)); 124 | return activities; 125 | } 126 | 127 | private void setActions() { 128 | onClickHandler(); 129 | onSwipeHandler(); 130 | } 131 | 132 | private void onClickHandler() { 133 | listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 134 | @Override 135 | public void onItemClick(AdapterView adapterView, View view, int i, long l) { 136 | String appName = adapterView.getItemAtPosition(i).toString(); 137 | String packageName = packageNames.get(appNamesPosition.indexOf(appName)); 138 | try { 139 | startActivity(getPackageManager().getLaunchIntentForPackage(packageName)); 140 | } catch (Exception e) { 141 | e.printStackTrace(); 142 | Toast.makeText(context, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); 143 | } 144 | } 145 | }); 146 | } 147 | 148 | @SuppressLint("ClickableViewAccessibility") 149 | private void onSwipeHandler() { 150 | listView.setOnTouchListener(new OnSwipeTouchListener(context) { 151 | @Override 152 | public void onSwipeRight() { 153 | super.onSwipeRight(); 154 | onBackPressed(); 155 | } 156 | }); 157 | } 158 | 159 | @Override 160 | public void onBackPressed() { 161 | super.onBackPressed(); 162 | Bungee.slideRight(context); 163 | } 164 | 165 | } 166 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/activites/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.activites; 2 | 3 | import android.content.Intent; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import android.provider.Settings; 7 | import android.widget.LinearLayout; 8 | 9 | import androidx.appcompat.app.AppCompatActivity; 10 | import androidx.preference.Preference; 11 | import androidx.preference.PreferenceFragmentCompat; 12 | 13 | import spencerstudios.com.jetdblib.JetDB; 14 | import umairayub.bitlauncher.R; 15 | import umairayub.madialog.MaDialog; 16 | import umairayub.madialog.MaDialogListener; 17 | 18 | public class SettingsActivity extends AppCompatActivity { 19 | 20 | Boolean status_bar; 21 | Boolean theme; 22 | SettingsActivity context = SettingsActivity.this; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | status_bar = JetDB.getBoolean(context, "status", false); 27 | theme = JetDB.getBoolean(context, "theme", false); 28 | 29 | if (status_bar) { 30 | if (theme) { 31 | setTheme(R.style.AppThemeDarkFullScreen); 32 | } else { 33 | setTheme(R.style.AppThemeFullScreen); 34 | } 35 | } else { 36 | if (theme) { 37 | setTheme(R.style.AppThemeDark); 38 | } else { 39 | setTheme(R.style.AppTheme); 40 | } 41 | } 42 | super.onCreate(savedInstanceState); 43 | setContentView(R.layout.settings_activity); 44 | 45 | getSupportFragmentManager() 46 | .beginTransaction() 47 | .replace(R.id.settings, new SettingsFragment()) 48 | .commit(); 49 | 50 | 51 | } 52 | 53 | @Override 54 | public void onBackPressed() { 55 | Intent intent = new Intent(SettingsActivity.this, MainActivity.class); 56 | startActivity(intent); 57 | super.onBackPressed(); 58 | } 59 | 60 | public static class SettingsFragment extends PreferenceFragmentCompat { 61 | @Override 62 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 63 | setPreferencesFromResource(R.xml.root_preferences, rootKey); 64 | 65 | Preference theme = findPreference("theme"); 66 | if (theme != null) { 67 | theme.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 68 | @Override 69 | public boolean onPreferenceClick(Preference preference) { 70 | getActivity().recreate(); 71 | return true; 72 | } 73 | }); 74 | } 75 | Preference statusBar = findPreference("status"); 76 | if (statusBar != null) { 77 | statusBar.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 78 | @Override 79 | public boolean onPreferenceClick(Preference preference) { 80 | getActivity().recreate(); 81 | return true; 82 | } 83 | }); 84 | } 85 | 86 | Preference sysSettings = findPreference("sysSettings"); 87 | if (sysSettings != null) { 88 | sysSettings.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 89 | @Override 90 | public boolean onPreferenceClick(Preference preference) { 91 | startActivity(new Intent(Settings.ACTION_SETTINGS)); 92 | return true; 93 | } 94 | }); 95 | } 96 | Preference launcherSettings = findPreference("launcherSettings"); 97 | if (launcherSettings != null) { 98 | launcherSettings.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 99 | @Override 100 | public boolean onPreferenceClick(Preference preference) { 101 | startActivity(new Intent(Settings.ACTION_HOME_SETTINGS)); 102 | return true; 103 | } 104 | }); 105 | } 106 | Preference appChooser = findPreference("appchooser"); 107 | if (appChooser != null) { 108 | appChooser.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 109 | @Override 110 | public boolean onPreferenceClick(Preference preference) { 111 | Intent intent = new Intent(getContext(), AppChooserActivity.class); 112 | startActivity(intent); 113 | return true; 114 | } 115 | }); 116 | } 117 | Preference Rate_us = findPreference("rate_us"); 118 | if (Rate_us != null) { 119 | Rate_us.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 120 | @Override 121 | public boolean onPreferenceClick(Preference preference) { 122 | new MaDialog.Builder(getContext()) 123 | .setImage(R.drawable.rating) 124 | .setBackgroundColor(R.color.colorWhite) 125 | .setTitleTextColor(R.color.colorBlack) 126 | .setMessageTextColor(R.color.colorBlack) 127 | .setTitle("Rate BitLauncher") 128 | .setMessage("Tell others what you think about this app") 129 | .setButtonOrientation(LinearLayout.VERTICAL) 130 | .AddNewButton(R.style.btnTheme, "Sure", new MaDialogListener() { 131 | @Override 132 | public void onClick() { 133 | try { 134 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getContext().getPackageName()))); 135 | } catch (android.content.ActivityNotFoundException e) { 136 | e.printStackTrace(); 137 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + getContext().getPackageName()))); 138 | } 139 | } 140 | }) 141 | .AddNewButton(R.style.btnTheme, "I don't want to", new MaDialogListener() { 142 | @Override 143 | public void onClick() { 144 | 145 | } 146 | }) 147 | .build(); 148 | return true; 149 | } 150 | }); 151 | } 152 | Preference feedback = findPreference("feedback"); 153 | if (feedback != null) { 154 | feedback.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 155 | @Override 156 | public boolean onPreferenceClick(Preference preference) { 157 | 158 | Intent emailIntent = new Intent(Intent.ACTION_SENDTO); 159 | emailIntent.setData(Uri.parse("mailto:umairayub79@gmail.com")); 160 | emailIntent.putExtra(Intent.EXTRA_SUBJECT, "BitLauncher Feedback"); 161 | startActivity(Intent.createChooser(emailIntent, "Send Feedback!")); 162 | 163 | return true; 164 | } 165 | }); 166 | } 167 | 168 | } 169 | 170 | } 171 | } -------------------------------------------------------------------------------- /app/src/main/java/umairayub/bitlauncher/activites/AppChooserActivity.java: -------------------------------------------------------------------------------- 1 | package umairayub.bitlauncher.activites; 2 | 3 | import android.content.Intent; 4 | import android.content.pm.ApplicationInfo; 5 | import android.content.pm.PackageManager; 6 | import android.graphics.Color; 7 | import android.os.AsyncTask; 8 | import android.os.Bundle; 9 | import android.util.Log; 10 | import android.view.View; 11 | import android.widget.AdapterView; 12 | import android.widget.ListView; 13 | import android.widget.ProgressBar; 14 | 15 | import androidx.appcompat.app.AppCompatActivity; 16 | 17 | import com.google.android.material.chip.Chip; 18 | import com.google.android.material.chip.ChipGroup; 19 | import com.google.android.material.floatingactionbutton.FloatingActionButton; 20 | 21 | import java.util.ArrayList; 22 | import java.util.Collections; 23 | import java.util.Comparator; 24 | import java.util.List; 25 | 26 | import spencerstudios.com.jetdblib.JetDB; 27 | import umairayub.bitlauncher.R; 28 | import umairayub.bitlauncher.adapters.Adapter; 29 | import umairayub.bitlauncher.model.App; 30 | import umairayub.madialog.MaDialog; 31 | import umairayub.madialog.MaDialogListener; 32 | 33 | //this is a one time activity to select apps for home screen 34 | //this activity can be launched from settings again if needed 35 | 36 | public class AppChooserActivity extends AppCompatActivity { 37 | 38 | // Declearing vars/views; 39 | ListView Listview; 40 | ProgressBar progressBar; 41 | Adapter adapter; 42 | ArrayList apps = new ArrayList<>(); 43 | List SelectedApps = new ArrayList<>(); 44 | AppChooserActivity context = AppChooserActivity.this; 45 | ChipGroup mChipsGroup; 46 | Boolean status_bar; 47 | Boolean theme; 48 | 49 | @Override 50 | protected void onCreate(Bundle savedInstanceState) { 51 | status_bar = JetDB.getBoolean(context, "status", false); 52 | theme = JetDB.getBoolean(context, "theme", false); 53 | 54 | if (status_bar) { 55 | if (theme) { 56 | setTheme(R.style.AppThemeDarkFullScreen); 57 | } else { 58 | setTheme(R.style.AppThemeFullScreen); 59 | } 60 | } else { 61 | if (theme) { 62 | setTheme(R.style.AppThemeDark); 63 | } else { 64 | setTheme(R.style.AppTheme); 65 | } 66 | } 67 | super.onCreate(savedInstanceState); 68 | setContentView(R.layout.activity_app_chooser); 69 | 70 | //Inintializing views 71 | Listview = findViewById(R.id.listViewAllApps); 72 | progressBar = findViewById(R.id.progressBar); 73 | mChipsGroup = findViewById(R.id.chipGroup); 74 | FloatingActionButton fab = findViewById(R.id.fab); 75 | 76 | 77 | fab.setOnClickListener(new View.OnClickListener() { 78 | @Override 79 | public void onClick(View view) { 80 | if (!SelectedApps.isEmpty()) { 81 | //Saving user selected apps in sharedPrefs with JetDB 82 | JetDB.putListOfObjects(context, SelectedApps, "apps"); 83 | //Finishing this activity 84 | finish(); 85 | } else { 86 | new MaDialog.Builder(context) 87 | .setTitle("Oops!") 88 | .setMessage("You can't leave without selecting any apps") 89 | .setPositiveButtonText("Ok, Let me select some apps") 90 | .setPositiveButtonListener(new MaDialogListener() { 91 | @Override 92 | public void onClick() { 93 | 94 | } 95 | }) 96 | .build(); 97 | } 98 | } 99 | }); 100 | 101 | new LoadApps().execute(); 102 | Listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 103 | @Override 104 | public void onItemClick(AdapterView adapterView, View view, int i, long l) { 105 | // getting the app's name from apps array of object at position i 106 | String AppName = apps.get(i).Appname; 107 | Log.i("Settings", apps.get(i).packageName); 108 | //Making sure users select 7 apps Only 109 | if (SelectedApps.size() < 7) { 110 | //Making a app object 111 | final App app = apps.get(i); 112 | //adding the app object in SelectedApps Array 113 | SelectedApps.add(app); 114 | 115 | //Making a Chip 116 | final Chip chip = new Chip(context); 117 | chip.setText(AppName); 118 | chip.setCloseIconResource(R.drawable.ic_clear); 119 | chip.setCloseIconEnabled(true); 120 | chip.setCloseIconTintResource(R.color.colorWhite); 121 | chip.setPadding(2, 2, 2, 2); 122 | chip.setTextColor(Color.WHITE); 123 | chip.setChipBackgroundColorResource(R.color.colorAccent); 124 | chip.setOnCloseIconClickListener(new View.OnClickListener() { 125 | @Override 126 | public void onClick(View view) { 127 | // removing the chip 128 | mChipsGroup.removeView(chip); 129 | // removing the app from Arraylist 130 | SelectedApps.remove(app); 131 | //re adding the app to apps array 132 | apps.add(app); 133 | //Sorting the apps array again 134 | Collections.sort(apps, new Comparator() { 135 | @Override 136 | public int compare(App item, App t1) { 137 | return item.Appname.toLowerCase().compareTo(t1.Appname.toLowerCase()); 138 | } 139 | }); 140 | 141 | adapter.notifyDataSetChanged(); 142 | 143 | } 144 | }); 145 | // adding chip to chipsGroup 146 | mChipsGroup.addView(chip); 147 | //we remove the selected apps from apps array 148 | apps.remove(i); 149 | adapter.notifyDataSetChanged(); 150 | 151 | // showing a dialog if user tries to selected more than 7 apps 152 | } else { 153 | new MaDialog.Builder(context) 154 | .setTitle("Oops") 155 | .setMessage("You can't select more then 7 apps") 156 | .setPositiveButtonText("Oh, Okay") 157 | .setPositiveButtonListener(new MaDialogListener() { 158 | @Override 159 | public void onClick() { 160 | 161 | } 162 | }) 163 | .build(); 164 | } 165 | 166 | 167 | } 168 | }); 169 | 170 | } 171 | 172 | 173 | public class LoadApps extends AsyncTask> { 174 | 175 | PackageManager packageManager = getPackageManager(); 176 | 177 | @Override 178 | protected void onPreExecute() { 179 | super.onPreExecute(); 180 | } 181 | 182 | @Override 183 | protected List doInBackground(Integer... integers) { 184 | if (!apps.isEmpty()) { 185 | apps.clear(); 186 | } 187 | Intent i = new Intent(Intent.ACTION_MAIN, null); 188 | i.addCategory(Intent.CATEGORY_LAUNCHER); 189 | List applications = getPackageManager().getInstalledApplications(0); 190 | for (ApplicationInfo application : applications) { 191 | if (packageManager.getLaunchIntentForPackage(application.packageName) != null) { 192 | //Skipping Bit Launcher from apps list 193 | if (application.packageName.equals("umairayub.bitlauncher")) { 194 | continue; 195 | } 196 | 197 | App app = new App(); 198 | app.Appname = application.loadLabel(packageManager).toString(); 199 | app.packageName = application.packageName; 200 | apps.add(app); 201 | 202 | } 203 | } 204 | return apps; 205 | } 206 | 207 | @Override 208 | protected void onPostExecute(List items) { 209 | progressBar.setVisibility(View.GONE); 210 | Listview.setVisibility(View.VISIBLE); 211 | adapter = new Adapter(context, items); 212 | Collections.sort(items, new Comparator() { 213 | @Override 214 | public int compare(App item, App t1) { 215 | return item.Appname.toLowerCase().compareTo(t1.Appname.toLowerCase()); 216 | } 217 | }); 218 | Listview.setAdapter(adapter); 219 | 220 | SelectedApps = JetDB.getListOfObjects(context, App.class, "apps"); 221 | if (!SelectedApps.isEmpty()){ 222 | for (int i = 0; i < SelectedApps.size(); i++){ 223 | final App app = SelectedApps.get(i); 224 | //Making a Chip 225 | final Chip chip = new Chip(context); 226 | chip.setText(app.Appname); 227 | chip.setCloseIconResource(R.drawable.ic_clear); 228 | chip.setCloseIconEnabled(true); 229 | chip.setCloseIconTintResource(R.color.colorWhite); 230 | chip.setPadding(2, 2, 2, 2); 231 | chip.setTextColor(Color.WHITE); 232 | chip.setChipBackgroundColorResource(R.color.colorAccent); 233 | chip.setOnCloseIconClickListener(new View.OnClickListener() { 234 | @Override 235 | public void onClick(View view) { 236 | // removing the chip 237 | mChipsGroup.removeView(chip); 238 | // removing the app from Arraylist 239 | SelectedApps.remove(app); 240 | } 241 | }); 242 | // adding chip to chipsGroup 243 | mChipsGroup.addView(chip); 244 | 245 | } 246 | } 247 | super.onPostExecute(items); 248 | } 249 | } 250 | } 251 | -------------------------------------------------------------------------------- /.idea/BitLauncher.time: -------------------------------------------------------------------------------- 1 | "2019-07-22 02:55:38:851",0 2 | "2019-07-22 02:56:29:312",48000 3 | "2019-07-22 02:57:58:648",9000 4 | "2019-07-22 02:58:02:387",0 5 | "2019-07-22 02:58:10:679",6000 6 | "2019-07-22 02:58:14:153",2000 7 | "2019-07-22 02:59:42:601",87000 8 | "2019-07-22 02:59:43:399",0 9 | "2019-07-22 03:00:50:563",3000 10 | "2019-07-22 03:14:15:388",711000 11 | "2019-07-22 19:14:11:473",473000 12 | "2019-07-22 19:18:30:011",235000 13 | "2019-07-22 19:23:45:540",312000 14 | "2019-07-22 19:23:55:111",6000 15 | "2019-07-22 19:24:00:050",0 16 | "2019-07-22 19:24:08:024",7000 17 | "2019-07-22 19:24:08:279",0 18 | "2019-07-22 19:30:29:789",339000 19 | "2019-07-22 19:32:40:622",54000 20 | "2019-07-22 19:32:55:032",0 21 | "2019-07-22 19:33:07:707",12000 22 | "2019-07-22 19:41:59:088",459000 23 | "2019-07-22 19:42:55:117",48000 24 | "2019-07-22 19:48:55:611",20000 25 | "2019-07-22 19:52:35:048",210000 26 | "2019-07-22 19:58:30:866",317000 27 | "2019-07-23 10:33:46:093",677000 28 | "2019-07-23 10:38:48:807",295000 29 | "2019-07-23 10:44:18:426",300000 30 | "2019-07-23 10:48:32:050",126000 31 | "2019-07-23 10:52:51:870",1000 32 | "2019-07-23 10:53:12:285",17000 33 | "2019-07-23 10:54:53:013",76000 34 | "2019-07-23 10:54:54:809",0 35 | "2019-07-23 10:55:08:193",9000 36 | "2019-07-23 10:55:12:516",0 37 | "2019-07-23 10:55:27:877",11000 38 | "2019-07-23 10:55:42:343",0 39 | "2019-07-23 11:07:11:255",687000 40 | "2019-07-23 11:08:30:249",44000 41 | "2019-07-23 11:10:03:955",60000 42 | "2019-07-23 11:11:13:219",37000 43 | "2019-07-23 11:14:56:127",34000 44 | "2019-07-23 11:15:04:379",0 45 | "2019-07-23 20:47:14:259",300000 46 | "2019-07-23 20:52:41:772",181000 47 | "2019-07-23 20:52:53:929",11000 48 | "2019-07-23 20:53:13:722",0 49 | "2019-07-23 20:55:03:450",110000 50 | "2019-07-23 20:55:10:675",1000 51 | "2019-07-23 20:55:35:047",24000 52 | "2019-07-23 20:55:43:786",4000 53 | "2019-07-23 20:55:47:980",1000 54 | "2019-07-23 20:56:08:090",19000 55 | "2019-07-23 21:03:44:508",410000 56 | "2019-07-23 21:03:46:972",0 57 | "2019-07-23 21:17:52:067",793000 58 | "2019-07-23 21:22:42:176",106000 59 | "2019-07-23 21:22:51:295",2000 60 | "2019-07-23 21:28:41:386",36000 61 | "2019-07-23 21:31:06:101",107000 62 | "2019-07-23 21:31:21:489",2000 63 | "2019-07-23 21:31:45:689",2000 64 | "2019-07-23 21:36:03:038",197000 65 | "2019-07-23 21:36:19:780",0 66 | "2019-07-24 00:20:19:495",101000 67 | "2019-07-24 00:20:37:023",13000 68 | "2019-07-24 00:20:53:645",14000 69 | "2019-07-24 00:24:13:040",170000 70 | "2019-07-24 00:36:33:008",735000 71 | "2019-07-24 00:45:56:657",554000 72 | "2019-07-24 00:48:23:003",0 73 | "2019-07-24 06:03:14:445",477000 74 | "2019-07-24 06:03:47:158",27000 75 | "2019-07-24 06:16:55:615",781000 76 | "2019-07-24 06:17:20:662",23000 77 | "2019-07-24 06:17:21:493",1000 78 | "2019-07-24 06:17:23:657",0 79 | "2019-07-24 06:19:26:071",1000 80 | "2019-07-24 06:19:28:412",0 81 | "2019-07-24 06:20:19:038",49000 82 | "2019-07-24 06:39:51:623",997000 83 | "2019-07-24 06:44:21:165",0 84 | "2019-07-24 12:17:16:446",21000 85 | "2019-07-24 12:17:45:724",6000 86 | "2019-07-24 12:18:37:549",2000 87 | "2019-07-24 12:26:39:409",480000 88 | "2019-07-24 12:28:21:691",70000 89 | "2019-07-24 12:29:37:740",73000 90 | "2019-07-24 18:55:55:660",268000 91 | "2019-07-24 19:00:49:881",289000 92 | "2019-07-24 19:01:32:311",33000 93 | "2019-07-24 19:03:03:650",70000 94 | "2019-07-24 19:04:35:719",86000 95 | "2019-07-24 19:20:25:620",944000 96 | "2019-07-24 19:26:56:706",300000 97 | "2019-07-24 19:42:38:768",0 98 | "2019-07-24 19:55:23:826",61000 99 | "2019-07-24 20:00:45:183",314000 100 | "2019-07-24 20:21:22:682",1227000 101 | "2019-07-24 20:30:55:327",558000 102 | "2019-07-24 20:31:10:758",0 103 | "2019-07-24 21:08:44:497",560000 104 | "2019-07-24 21:15:17:258",348000 105 | "2019-07-24 21:16:09:999",29000 106 | "2019-07-24 21:16:11:476",0 107 | "2019-07-25 00:12:55:054",686000 108 | "2019-07-25 00:19:40:553",319000 109 | "2019-07-25 00:27:27:146",451000 110 | "2019-07-25 00:30:09:958",0 111 | "2019-07-25 00:41:05:339",650000 112 | "2019-07-25 00:42:12:481",11000 113 | "2019-07-25 00:48:18:354",263000 114 | "2019-07-25 01:08:32:978",51000 115 | "2019-07-25 01:24:07:754",923000 116 | "2019-07-25 01:34:38:059",0 117 | "2019-07-25 01:37:20:581",139000 118 | "2019-07-25 01:37:27:144",2000 119 | "2019-07-25 01:37:39:646",0 120 | "2019-07-25 01:38:37:433",2000 121 | "2019-07-25 06:20:10:182",450000 122 | "2019-07-25 06:20:13:045",0 123 | "2019-07-25 06:25:14:289",300000 124 | "2019-07-25 06:26:16:660",0 125 | "2019-07-25 06:31:19:759",300000 126 | "2019-07-25 06:37:18:456",0 127 | "2019-07-25 06:42:32:691",300000 128 | "2019-07-25 07:00:21:575",705000 129 | "2019-07-25 11:25:58:871",430000 130 | "2019-07-25 11:31:35:207",0 131 | "2019-07-25 11:41:50:304",614000 132 | "2019-07-25 11:43:31:857",67000 133 | "2019-07-25 11:43:38:575",2000 134 | "2019-07-25 11:48:09:475",60000 135 | "2019-07-25 11:52:21:177",6000 136 | "2019-07-25 11:52:24:522",0 137 | "2019-07-25 11:52:28:911",0 138 | "2019-07-25 11:53:14:619",45000 139 | "2019-07-25 11:55:00:748",60000 140 | "2019-07-25 12:00:15:465",307000 141 | "2019-07-25 12:00:33:319",0 142 | "2019-07-25 12:00:33:909",1000 143 | "2019-07-25 12:01:01:879",15000 144 | "2019-07-25 12:01:32:130",6000 145 | "2019-07-25 12:01:51:373",10000 146 | "2019-07-25 12:10:54:754",224000 147 | "2019-07-25 12:32:41:806",216000 148 | "2019-07-25 12:33:22:568",0 149 | "2019-07-25 19:17:14:858",349000 150 | "2019-07-25 19:24:32:993",174000 151 | "2019-07-25 19:40:41:156",101000 152 | "2019-07-25 19:45:47:278",300000 153 | "2019-07-25 19:55:36:076",318000 154 | "2019-07-25 19:55:55:292",5000 155 | "2019-07-25 20:00:03:406",224000 156 | "2019-07-25 20:00:12:475",5000 157 | "2019-07-25 20:00:37:225",0 158 | "2019-07-25 20:00:45:194",5000 159 | "2019-07-25 20:00:51:297",1000 160 | "2019-07-25 20:06:55:034",333000 161 | "2019-07-25 20:19:43:913",304000 162 | "2019-07-25 20:28:07:342",350000 163 | "2019-07-25 20:34:08:619",0 164 | "2019-07-26 01:07:37:963",174000 165 | "2019-07-26 01:10:00:594",1000 166 | "2019-07-26 01:13:31:423",201000 167 | "2019-07-26 01:13:51:556",0 168 | "2019-07-26 01:13:57:752",0 169 | "2019-07-26 01:15:35:804",98000 170 | "2019-07-26 01:17:15:138",93000 171 | "2019-07-26 01:37:15:788",1174000 172 | "2019-07-26 01:37:20:387",0 173 | "2019-07-26 01:37:35:616",12000 174 | "2019-07-26 01:39:10:859",0 175 | "2019-07-26 01:47:29:070",494000 176 | "2019-07-26 01:49:01:990",61000 177 | "2019-07-26 01:49:09:494",1000 178 | "2019-07-26 01:49:19:254",5000 179 | "2019-07-26 01:50:00:562",5000 180 | "2019-07-26 01:50:47:363",35000 181 | "2019-07-26 01:51:41:046",15000 182 | "2019-07-26 01:52:40:284",34000 183 | "2019-07-26 01:55:02:889",6000 184 | "2019-07-26 01:56:05:107",15000 185 | "2019-07-26 01:57:46:610",80000 186 | "2019-07-26 01:58:54:381",8000 187 | "2019-07-26 02:05:19:373",265000 188 | "2019-07-26 15:00:39:897",584000 189 | "2019-07-26 15:02:08:527",77000 190 | "2019-07-26 15:16:53:146",877000 191 | "2019-07-26 15:20:24:442",125000 192 | "2019-07-26 15:23:31:006",25000 193 | "2019-07-26 15:24:43:938",65000 194 | "2019-07-26 15:25:48:983",19000 195 | "2019-07-26 15:26:30:042",20000 196 | "2019-07-26 15:27:04:906",22000 197 | "2019-07-26 15:28:54:649",68000 198 | "2019-07-26 15:32:04:688",182000 199 | "2019-07-26 15:33:00:747",41000 200 | "2019-07-26 15:33:28:621",2000 201 | "2019-07-26 15:33:53:413",2000 202 | "2019-07-26 15:35:07:067",55000 203 | "2019-07-26 15:39:20:455",219000 204 | "2019-07-26 15:39:42:746",4000 205 | "2019-07-26 19:22:21:203",267000 206 | "2019-07-26 19:25:13:692",161000 207 | "2019-07-26 19:29:46:625",255000 208 | "2019-07-26 19:30:01:889",0 209 | "2019-07-26 19:30:02:468",1000 210 | "2019-07-26 19:30:17:765",12000 211 | "2019-07-26 19:30:40:191",20000 212 | "2019-07-26 19:38:27:007",464000 213 | "2019-07-26 19:43:55:959",318000 214 | "2019-07-26 19:45:43:088",27000 215 | "2019-07-26 19:49:41:497",235000 216 | "2019-07-26 19:53:00:121",135000 217 | "2019-07-26 20:01:36:290",510000 218 | "2019-07-26 20:06:18:097",238000 219 | "2019-07-26 20:20:27:317",152000 220 | "2019-07-26 20:20:29:917",0 221 | "2019-07-26 20:20:31:781",0 222 | "2019-07-26 20:22:59:020",147000 223 | "2019-07-26 20:23:13:091",13000 224 | "2019-07-26 20:24:17:730",39000 225 | "2019-07-26 20:25:24:102",42000 226 | "2019-07-26 20:25:38:354",4000 227 | "2019-07-26 20:25:41:115",0 228 | "2019-07-26 20:25:48:254",2000 229 | "2019-07-26 20:30:49:468",301000 230 | "2019-07-26 20:38:03:533",347000 231 | "2019-07-26 20:54:19:103",300000 232 | "2019-07-26 21:00:50:639",200000 233 | "2019-07-26 21:00:53:019",0 234 | "2019-07-27 00:20:18:271",300000 235 | "2019-07-27 01:08:42:184",539000 236 | "2019-07-27 01:14:21:023",47000 237 | "2019-07-27 01:24:02:808",566000 238 | "2019-07-27 01:29:27:642",0 239 | "2019-07-27 01:35:53:450",384000 240 | "2019-07-27 01:38:03:223",125000 241 | "2019-07-27 01:38:11:789",4000 242 | "2019-07-27 01:39:45:368",76000 243 | "2019-07-27 01:53:39:218",830000 244 | "2019-07-27 02:24:21:961",508000 245 | "2019-07-27 02:35:59:680",0 246 | "2019-07-27 02:46:25:263",619000 247 | "2019-07-27 02:57:21:450",594000 248 | "2019-07-27 03:03:00:968",0 249 | "2019-07-27 03:03:08:164",1000 250 | "2019-07-27 03:06:58:765",205000 251 | "2019-07-27 03:07:20:719",20000 252 | "2019-07-27 03:08:31:169",53000 253 | "2019-07-27 03:11:43:735",6000 254 | "2019-07-27 03:13:05:674",12000 255 | "2019-07-27 03:13:56:643",32000 256 | "2019-07-27 03:38:03:943",300000 257 | "2019-07-27 03:43:53:865",9000 258 | "2019-07-27 03:50:42:103",1000 259 | "2019-07-27 03:51:34:959",3000 260 | "2019-07-27 03:56:42:387",300000 261 | "2019-07-27 03:59:34:855",0 262 | "2019-07-27 03:59:36:444",0 263 | "2019-07-27 19:34:16:168",300000 264 | "2019-07-27 19:46:59:991",585000 265 | "2019-07-27 19:54:53:296",407000 266 | "2019-07-27 19:59:23:604",265000 267 | "2019-07-27 20:09:16:889",300000 268 | "2019-07-28 02:25:44:365",300000 269 | "2019-07-28 02:29:16:262",56000 270 | "2019-07-28 02:29:25:988",2000 271 | "2019-07-28 02:29:34:107",5000 272 | "2019-07-28 02:37:06:531",449000 273 | "2019-07-28 02:40:30:957",17000 274 | "2019-07-28 02:43:13:366",1000 275 | "2019-07-28 02:43:48:781",28000 276 | "2019-07-28 02:52:00:872",473000 277 | "2019-07-28 02:52:02:829",0 278 | "2019-07-28 03:18:51:402",196000 279 | "2019-07-28 03:19:26:897",13000 280 | "2019-07-28 03:19:29:768",0 281 | "2019-07-28 03:19:32:418",0 282 | "2019-07-28 03:20:21:596",47000 283 | "2019-07-28 03:29:11:674",519000 284 | "2019-07-28 03:33:15:270",240000 285 | "2019-07-28 03:34:11:776",47000 286 | "2019-07-28 03:35:04:586",7000 287 | "2019-07-28 03:37:04:925",9000 288 | "2019-07-28 03:37:20:791",11000 289 | "2019-07-28 03:37:21:733",0 290 | "2019-07-28 03:37:24:985",0 291 | "2019-07-28 03:37:38:768",10000 292 | "2019-07-28 03:38:01:362",0 293 | "2019-07-28 18:44:57:156",713000 294 | "2019-07-28 18:54:09:170",6000 295 | "2019-07-28 18:54:11:764",0 296 | "2019-07-28 18:54:14:586",0 297 | "2019-07-28 18:54:16:310",1000 298 | "2019-07-28 18:54:44:996",26000 299 | "2019-07-28 18:59:20:355",220000 300 | "2019-07-28 19:09:30:032",182000 301 | "2019-07-28 19:14:35:617",300000 302 | "2019-07-28 19:52:58:988",2262000 303 | "2019-07-28 19:59:03:537",2000 304 | "2019-07-28 19:59:14:598",12000 305 | --------------------------------------------------------------------------------