Skip to content

Commit 391d136

Browse files
committed
Started adding devTools
1 parent 2573ca2 commit 391d136

13 files changed

Lines changed: 372 additions & 27 deletions

File tree

main/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@
2929
<activity
3030
android:name=".EditorActivity"
3131
android:exported="false" />
32-
<activity
32+
<activity
3333
android:name=".SettingsActivity"
3434
android:exported="false" />
35+
<activity
36+
android:name=".DevToolsActivity"
37+
android:exported="false" />
3538
<activity
3639
android:name=".PreviewActivity"
3740
android:exported="true">
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package org.xedox.webaide;
2+
3+
import android.os.Bundle;
4+
import android.os.Handler;
5+
import android.os.Looper;
6+
import android.view.Menu;
7+
import android.view.MenuItem;
8+
import android.widget.ProgressBar;
9+
import androidx.appcompat.app.AppCompatActivity;
10+
import androidx.appcompat.widget.SearchView;
11+
import androidx.fragment.app.Fragment;
12+
import com.google.android.material.appbar.MaterialToolbar;
13+
import com.google.android.material.tabs.TabLayout;
14+
import org.xedox.utils.BaseActivity;
15+
import org.xedox.webaide.devtools.PreviewFragment;
16+
import org.xedox.webaide.devtools.SourceFragment;
17+
18+
public class DevToolsActivity extends BaseActivity
19+
implements SearchView.OnQueryTextListener, TabLayout.OnTabSelectedListener {
20+
21+
private MaterialToolbar toolbar;
22+
private TabLayout tabLayout;
23+
private ProgressBar progress;
24+
25+
private PreviewFragment previewFragment;
26+
private SourceFragment sourceFragment;
27+
28+
@Override
29+
protected void onCreate(Bundle savedInstanceState) {
30+
super.onCreate(savedInstanceState);
31+
setContentView(R.layout.activity_dev_tools);
32+
33+
toolbar = findViewById(R.id.toolbar);
34+
progress = findViewById(R.id.progress);
35+
tabLayout = findViewById(R.id.tab_layout);
36+
37+
setSupportActionBar(toolbar);
38+
if (getSupportActionBar() != null) {
39+
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
40+
}
41+
42+
previewFragment = PreviewFragment.newInstance(progress);
43+
sourceFragment = SourceFragment.newInstance();
44+
tabLayout.addOnTabSelectedListener(this);
45+
getSupportFragmentManager()
46+
.beginTransaction()
47+
.replace(R.id.content, previewFragment)
48+
.commit();
49+
new Handler(Looper.getMainLooper())
50+
.post(
51+
() -> {
52+
performSearch("https://www.example.com");
53+
});
54+
}
55+
56+
@Override
57+
public boolean onCreateOptionsMenu(Menu menu) {
58+
getMenuInflater().inflate(R.menu.dev_tools, menu);
59+
60+
MenuItem searchItem = menu.findItem(R.id.link);
61+
SearchView searchView = (SearchView) searchItem.getActionView();
62+
63+
if (searchView != null) {
64+
searchView.setQueryHint(getString(R.string.search_hint));
65+
searchView.setOnQueryTextListener(this);
66+
}
67+
68+
return true;
69+
}
70+
71+
private void performSearch(String query) {
72+
previewFragment.webView.loadUrl(query);
73+
}
74+
75+
@Override
76+
public boolean onOptionsItemSelected(MenuItem item) {
77+
if (item.getItemId() == android.R.id.home) {
78+
finish();
79+
return true;
80+
}
81+
return super.onOptionsItemSelected(item);
82+
}
83+
84+
@Override
85+
public boolean onQueryTextSubmit(String query) {
86+
if (query != null && !query.isEmpty()) {
87+
if (!query.startsWith("http://") && !query.startsWith("https://")) {
88+
query = "https://" + query;
89+
}
90+
performSearch(query);
91+
}
92+
return true;
93+
}
94+
95+
@Override
96+
public boolean onQueryTextChange(String newText) {
97+
return false;
98+
}
99+
100+
@Override
101+
public void onTabSelected(TabLayout.Tab tab) {
102+
if (tab.getPosition() == 0) {
103+
showFragment(previewFragment);
104+
} else if (tab.getPosition() == 1) {
105+
showFragment(sourceFragment);
106+
}
107+
}
108+
109+
private void showFragment(Fragment fragment) {
110+
getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
111+
}
112+
113+
@Override
114+
public void onTabUnselected(TabLayout.Tab tab) {}
115+
116+
@Override
117+
public void onTabReselected(TabLayout.Tab tab) {}
118+
}

main/src/main/java/org/xedox/webaide/MainActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class MainActivity extends BaseActivity {
2323
private RecyclerView projectsRecycler;
2424
private ProjectsAdapter projectsAdapter;
2525
private View emptyProjectsRecycler;
26-
private ImageButton newProject, settings;
26+
private ImageButton newProject, settings, devTools;
2727

2828
public static boolean initialize = false;
2929

@@ -37,6 +37,7 @@ protected void onCreate(Bundle savedInstanceState) {
3737

3838
newProject = findViewById(R.id.new_project);
3939
settings = findViewById(R.id.settings);
40+
devTools = findViewById(R.id.dev_tools);
4041

4142
setSupportActionBar(toolbar);
4243

@@ -56,6 +57,10 @@ protected void onCreate(Bundle savedInstanceState) {
5657
Intent intent = new Intent(this, SettingsActivity.class);
5758
startActivity(intent);
5859
});
60+
devTools.setOnClickListener((v) -> {
61+
Intent intent = new Intent(this, DevToolsActivity.class);
62+
startActivity(intent);
63+
});
5964
projectsAdapter.setOnChangeListener(
6065
hasItems ->
6166
emptyProjectsRecycler.setVisibility(hasItems ? View.GONE : View.VISIBLE));
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.xedox.webaide.devtools;
2+
3+
import androidx.fragment.app.Fragment;
4+
import org.xedox.utils.view.WebViewX;
5+
import android.widget.ProgressBar;
6+
import android.view.LayoutInflater;
7+
import android.view.ViewGroup;
8+
import android.os.Bundle;
9+
import android.view.View;
10+
11+
public class PreviewFragment extends Fragment {
12+
public WebViewX webView;
13+
public ProgressBar progressBar;
14+
15+
@Override
16+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle extraArgs) {
17+
if (webView == null) {
18+
webView = new WebViewX(getActivity());
19+
webView.setProgressBar(progressBar);
20+
progressBar.setVisibility(View.GONE);
21+
}
22+
return webView;
23+
}
24+
25+
public static PreviewFragment newInstance(ProgressBar progressBar) {
26+
PreviewFragment f = new PreviewFragment();
27+
f.progressBar = progressBar;
28+
return f;
29+
}
30+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.xedox.webaide.devtools;
2+
3+
import android.os.Bundle;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.ListView;
8+
import androidx.fragment.app.Fragment;
9+
import com.google.android.material.tabs.TabLayout;
10+
import org.xedox.webaide.R;
11+
12+
public class SourceFragment extends Fragment {
13+
14+
private TabLayout tabLayout;
15+
private ListView links;
16+
private View view;
17+
18+
@Override
19+
public View onCreateView(
20+
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
21+
if (view == null) {
22+
view = inflater.inflate(R.layout.fragment_source, container, false);
23+
24+
tabLayout = view.findViewById(R.id.tab_layout);
25+
links = view.findViewById(R.id.links);
26+
27+
tabLayout.addOnTabSelectedListener(
28+
new TabLayout.OnTabSelectedListener() {
29+
@Override
30+
public void onTabSelected(TabLayout.Tab tab) {
31+
updateContent(tab.getPosition());
32+
}
33+
34+
@Override
35+
public void onTabUnselected(TabLayout.Tab tab) {}
36+
37+
@Override
38+
public void onTabReselected(TabLayout.Tab tab) {}
39+
});
40+
}
41+
return view;
42+
}
43+
44+
private void updateContent(int tabPosition) {
45+
46+
switch (tabPosition) {
47+
case 0:
48+
break;
49+
case 1:
50+
break;
51+
case 2:
52+
break;
53+
}
54+
}
55+
56+
public static SourceFragment newInstance() {
57+
return new SourceFragment();
58+
}
59+
}

main/src/main/java/org/xedox/webaide/editor/drawer/DrawerManager.java

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,27 @@
1414
import com.google.android.material.appbar.MaterialToolbar;
1515
import com.google.android.material.navigationrail.NavigationRailView;
1616
import org.xedox.filetree.utils.Node;
17+
import org.xedox.filetree.widget.FileTreeView;
1718
import org.xedox.utils.BaseFragment;
1819
import org.xedox.utils.FileX;
1920
import org.xedox.utils.OverflowMenu;
2021
import org.xedox.webaide.EditorActivity;
2122
import org.xedox.webaide.MainActivity;
2223
import org.xedox.webaide.R;
24+
import org.xedox.webaide.SettingsActivity;
2325
import org.xedox.webaide.dialog.NewFileDialog;
2426
import org.xedox.webaide.dialog.RenameFileDialog;
2527
import org.xedox.webaide.editor.EditorManager;
2628
import org.xedox.webaide.project.Project;
2729

28-
public class DrawerManager implements NavigationRailView.OnItemSelectedListener, NavigationRailView.OnItemReselectedListener {
30+
public class DrawerManager
31+
implements NavigationRailView.OnItemSelectedListener,
32+
NavigationRailView.OnItemReselectedListener {
2933

3034
private final EditorActivity context;
3135
private final NavigationRailView navigationRail;
3236
private final FrameLayout navigationContent;
33-
private final FileTreeFragment fileTreeFragment;
37+
private FileTreeFragment fileTreeFragment;
3438
private final TextView titleView;
3539
private final DrawerLayout drawerLayout;
3640
private final MaterialToolbar toolbar;
@@ -49,34 +53,39 @@ public DrawerManager(@NonNull EditorActivity context) {
4953
this.editorManager = context.getEditorManager();
5054

5155
Project project = context.getProject();
52-
this.fileTreeFragment = FileTreeFragment.newInstance(project.getAbsolutePath());
5356
this.drawerToggle = new ActionBarDrawerToggle(context, drawerLayout, toolbar, 0, 0);
5457
drawerToggle.syncState();
5558

5659
navigationRail.setOnItemSelectedListener(this);
5760
navigationRail.setOnItemReselectedListener(this);
5861
drawerLayout.addDrawerListener(drawerToggle);
59-
showFragment(fileTreeFragment);
62+
this.fileTreeFragment = FileTreeFragment.newInstance(project.getAbsolutePath());
6063

61-
mainHandler.post(() -> {
62-
fileTreeFragment.getFileTree().setOnFileLongClickListener(this::handleFileLongClick);
63-
fileTreeFragment.getFileTree().setOnFileClickListener(this::handleFileClick);
64-
});
64+
showFragment(fileTreeFragment);
65+
mainHandler.postDelayed(
66+
() -> {
67+
FileTreeView ft = fileTreeFragment.getFileTree();
68+
ft.setOnFileLongClickListener(this::handleFileLongClick);
69+
ft.setOnFileClickListener(this::handleFileClick);
70+
}, 500);
6571
}
6672

6773
private void handleFileLongClick(View view, Node node) {
6874
int menuRes = node.isFile() ? R.menu.file : R.menu.folder;
69-
OverflowMenu.show(view, menuRes, item -> {
70-
if (item.getItemId() == R.id.delete) {
71-
if (node.isFile()) node.delete();
72-
else FileX.deleteDirectory(node);
73-
fileTreeFragment.getFileTree().removeNode(node);
74-
} else if (item.getItemId() == R.id.rename) {
75-
RenameFileDialog.show(context, fileTreeFragment.getFileTree(), node);
76-
} else if (item.getItemId() == R.id.new_file_folder && node.isDirectory()) {
77-
NewFileDialog.show(context, fileTreeFragment.getFileTree(), node);
78-
}
79-
});
75+
OverflowMenu.show(
76+
view,
77+
menuRes,
78+
item -> {
79+
if (item.getItemId() == R.id.delete) {
80+
if (node.isFile()) node.delete();
81+
else FileX.deleteDirectory(node);
82+
fileTreeFragment.getFileTree().removeNode(node);
83+
} else if (item.getItemId() == R.id.rename) {
84+
RenameFileDialog.show(context, fileTreeFragment.getFileTree(), node);
85+
} else if (item.getItemId() == R.id.new_file_folder && node.isDirectory()) {
86+
NewFileDialog.show(context, fileTreeFragment.getFileTree(), node);
87+
}
88+
});
8089
}
8190

8291
private void handleFileClick(View view, Node node) {
@@ -92,15 +101,25 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
92101
Intent intent = new Intent(context, MainActivity.class);
93102
context.finish();
94103
context.startActivity(intent);
95-
return true;
104+
return false;
105+
} else if (item.getItemId() == R.id.action_settings) {
106+
Intent intent = new Intent(context, SettingsActivity.class);
107+
context.startActivity(intent);
108+
return false;
96109
}
97110
return false;
98111
}
99112

100113
private void showFragment(BaseFragment fragment) {
101-
FragmentManager fragmentManager = context.getSupportFragmentManager();
102-
fragmentManager.beginTransaction().replace(navigationContent.getId(), fragment).commit();
103-
titleView.setText(fragment.getTitle());
114+
mainHandler.post(
115+
() -> {
116+
FragmentManager fragmentManager = context.getSupportFragmentManager();
117+
fragmentManager
118+
.beginTransaction()
119+
.replace(navigationContent.getId(), fragment)
120+
.commit();
121+
titleView.setText(fragment.getTitle());
122+
});
104123
}
105124

106125
@Override
@@ -109,4 +128,4 @@ public void onNavigationItemReselected(@NonNull MenuItem item) {}
109128
public void onDestroy() {
110129
drawerLayout.removeDrawerListener(drawerToggle);
111130
}
112-
}
131+
}

main/src/main/res/drawable/dev.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<!-- drawable/dev_to.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M7.73 11.93C7.73 13.65 7.71 13.76 7.5 14C7.31 14.17 7.12 14.23 6.74 14.23L6.23 14.24L6.2 11.97L6.18 9.7H6.7C7.05 9.7 7.3 9.77 7.47 9.91C7.71 10.12 7.73 10.16 7.73 11.93M22 7.5V16.5C22 17.61 21.11 18.5 20 18.5H4C2.89 18.5 2 17.61 2 16.5V7.5C2 6.39 2.89 5.5 4 5.5H20C21.11 5.5 22 6.39 22 7.5M8.93 11.73C8.9 9.89 8.88 9.74 8.64 9.34C8.24 8.66 7.79 8.5 6.28 8.5H5V15.5H6.21C7.54 15.5 8.1 15.33 8.5 14.79C8.91 14.26 9 13.81 8.93 11.73M13.12 8.5H11.64C10.15 8.5 10.14 8.5 9.93 8.78S9.7 9.21 9.7 12V14.96L9.97 15.23C10.22 15.5 10.28 15.5 11.68 15.5H13.12V14.31L12.03 14.27L10.93 14.24V12.6L11.61 12.57L12.27 12.53V11.34H10.88V9.7H13.12V8.5M19 8.56C19 8.5 18.7 8.5 18.34 8.5L17.66 8.56L17.07 10.91C16.69 12.39 16.45 13.18 16.4 13.04C16.32 12.77 15.26 8.6 15.26 8.55C15.26 8.5 14.95 8.5 14.58 8.5H13.89L14.3 10.05C14.5 10.92 14.89 12.33 15.11 13.2C15.45 14.55 15.57 14.85 15.86 15.14C16.06 15.36 16.31 15.5 16.47 15.5C16.8 15.5 17.23 15.16 17.37 14.77C17.5 14.5 19 8.69 19 8.56Z" /></vector>
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,11 @@
1-
<!-- drawable/content_save.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" /></vector>
1+
<!-- drawable/content_save.xml -->
2+
<vector
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:height="24dp"
5+
android:width="24dp"
6+
android:viewportWidth="24"
7+
android:viewportHeight="24">
8+
<path
9+
android:fillColor="@drawable/icon_tint"
10+
android:pathData="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" />
11+
</vector>

0 commit comments

Comments
 (0)