Skip to content

Commit 01b7253

Browse files
committed
[WIP] Add context menu "Open in Terminal" option
Fixes TeamAmaze#2666
1 parent bdc86af commit 01b7253

File tree

14 files changed

+535
-1
lines changed

14 files changed

+535
-1
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@
4040
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
4141
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
4242
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
43+
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
44+
<uses-permission android:name="com.termoneplus.permission.RUN_SCRIPT" />
45+
46+
<uses-permission android:name="jackpal.androidterm.permission.RUN_SCRIPT" />
47+
<uses-permission android:name="com.termoneplus.permission.RUN_SCRIPT" />
48+
<uses-permission android:name="yarolegovich.materialterminal.permission.RUN_SCRIPT" />
4349

4450
<uses-feature
4551
android:name="android.hardware.touchscreen"

app/src/main/java/com/amaze/filemanager/adapters/AppsRecyclerAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ class AppsRecyclerAdapter(
508508
MaterialDialog.Builder(fragment.requireContext())
509509
builder1
510510
.theme(
511-
themedActivity.appTheme.getMaterialDialogTheme(),
511+
themedActivity.appTheme.materialDialogTheme,
512512
)
513513
.content(fragment.getString(R.string.unin_system_apk))
514514
.title(fragment.getString(R.string.warning))

app/src/main/java/com/amaze/filemanager/adapters/RecyclerAdapter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,13 +1435,15 @@ private void showPopup(@NonNull View view, @NonNull final LayoutElementParcelabl
14351435
if (rowItem.isDirectory) {
14361436
popupMenu.getMenu().findItem(R.id.open_with).setVisible(false);
14371437
popupMenu.getMenu().findItem(R.id.share).setVisible(false);
1438+
popupMenu.getMenu().findItem(R.id.open_in_terminal).setVisible(true);
14381439

14391440
if (mainFragment.getMainActivity().mReturnIntent) {
14401441
popupMenu.getMenu().findItem(R.id.return_select).setVisible(true);
14411442
}
14421443
} else {
14431444
popupMenu.getMenu().findItem(R.id.book).setVisible(false);
14441445
popupMenu.getMenu().findItem(R.id.compress).setVisible(true);
1446+
popupMenu.getMenu().findItem(R.id.open_in_terminal).setVisible(false);
14451447

14461448
if (description.endsWith(fileExtensionZip)
14471449
|| description.endsWith(fileExtensionJar)

app/src/main/java/com/amaze/filemanager/ui/ItemPopupMenu.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737
import com.amaze.filemanager.ui.dialogs.EncryptAuthenticateDialog;
3838
import com.amaze.filemanager.ui.dialogs.EncryptWithPresetPasswordSaveAsDialog;
3939
import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation;
40+
import com.amaze.filemanager.ui.dialogs.OpenFolderInTerminalFragment;
4041
import com.amaze.filemanager.ui.fragments.MainFragment;
4142
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants;
4243
import com.amaze.filemanager.ui.provider.UtilitiesProvider;
4344
import com.amaze.filemanager.utils.DataUtils;
45+
import com.amaze.filemanager.utils.OpenTerminalUtilsExtKt;
4446

4547
import android.content.Context;
4648
import android.content.Intent;
@@ -256,6 +258,9 @@ public void onButtonPressed(Intent intent, String password)
256258
case R.id.return_select:
257259
mainFragment.returnIntentResults(new HybridFileParcelable[] {rowItem.generateBaseFile()});
258260
return true;
261+
case R.id.open_in_terminal:
262+
OpenFolderInTerminalFragment.Companion.openTerminalOrShow(rowItem.desc, mainActivity);
263+
return true;
259264
}
260265
return false;
261266
}

app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,7 @@ public boolean onPrepareOptionsMenu(Menu menu) {
11201120
menu.findItem(R.id.hiddenitems).setVisible(true);
11211121
menu.findItem(R.id.view).setVisible(true);
11221122
menu.findItem(R.id.extract).setVisible(false);
1123+
menu.findItem(R.id.open_in_terminal).setVisible(true);
11231124
invalidatePasteSnackbar(true);
11241125
findViewById(R.id.buttonbarframe).setVisibility(View.VISIBLE);
11251126
} else if (fragment instanceof AppsListFragment
@@ -1133,6 +1134,7 @@ public boolean onPrepareOptionsMenu(Menu menu) {
11331134
menu.findItem(R.id.home).setVisible(false);
11341135
menu.findItem(R.id.history).setVisible(false);
11351136
menu.findItem(R.id.extract).setVisible(false);
1137+
menu.findItem(R.id.open_in_terminal).setVisible(false);
11361138
if (fragment instanceof ProcessViewerFragment) {
11371139
menu.findItem(R.id.sort).setVisible(false);
11381140
} else if (fragment instanceof FtpServerFragment) {
@@ -1156,6 +1158,7 @@ public boolean onPrepareOptionsMenu(Menu menu) {
11561158
menu.findItem(R.id.hiddenitems).setVisible(false);
11571159
menu.findItem(R.id.view).setVisible(false);
11581160
menu.findItem(R.id.extract).setVisible(true);
1161+
menu.findItem(R.id.open_in_terminal).setVisible(false);
11591162
invalidatePasteSnackbar(false);
11601163
}
11611164
return super.onPrepareOptionsMenu(menu);
@@ -1292,6 +1295,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
12921295
case R.id.search:
12931296
getAppbar().getSearchView().revealSearchView();
12941297
break;
1298+
case R.id.open_in_terminal:
1299+
if (getFragmentAtFrame() instanceof MainFragment) {
1300+
1301+
}
1302+
break;
12951303
}
12961304
return null;
12971305
},

app/src/main/java/com/amaze/filemanager/ui/activities/superclasses/PermissionsActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ public void requestInstallApkPermission(
178178
isInitialStart);
179179
}
180180

181+
public void requestTerminalPermission() {
182+
183+
}
184+
181185
/**
182186
* Requests permission, overrides {@param rationale}'s POSITIVE button dialog action.
183187
*
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package com.amaze.filemanager.ui.dialogs
2+
3+
import android.content.SharedPreferences
4+
import android.os.Bundle
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import androidx.preference.PreferenceManager
9+
import androidx.recyclerview.widget.LinearLayoutManager
10+
import com.amaze.filemanager.R
11+
import com.amaze.filemanager.adapters.AppsRecyclerAdapter
12+
import com.amaze.filemanager.adapters.data.AppDataParcelable
13+
import com.amaze.filemanager.adapters.glide.AppsAdapterPreloadModel
14+
import com.amaze.filemanager.adapters.holders.AppHolder
15+
import com.amaze.filemanager.databinding.FragmentOpenFileDialogBinding
16+
import com.amaze.filemanager.ui.activities.MainActivity
17+
import com.amaze.filemanager.ui.base.BaseBottomSheetFragment
18+
import com.amaze.filemanager.ui.fragments.AdjustListViewForTv
19+
import com.amaze.filemanager.utils.GlideConstants
20+
import com.bumptech.glide.Glide
21+
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
22+
import com.bumptech.glide.util.ViewPreloadSizeProvider
23+
24+
abstract class AbstractChooseAppToOpenFragment :
25+
BaseBottomSheetFragment(),
26+
AdjustListViewForTv<AppHolder> {
27+
28+
protected var fragmentOpenFileDialogBinding: FragmentOpenFileDialogBinding? = null
29+
protected val viewBinding get() = fragmentOpenFileDialogBinding!!
30+
31+
private lateinit var adapter: AppsRecyclerAdapter
32+
private lateinit var sharedPreferences: SharedPreferences
33+
34+
override fun onCreate(savedInstanceState: Bundle?) {
35+
super.onCreate(savedInstanceState)
36+
setStyle(STYLE_NORMAL, R.style.appBottomSheetDialogTheme)
37+
}
38+
39+
override fun onCreateView(
40+
inflater: LayoutInflater,
41+
container: ViewGroup?,
42+
savedInstanceState: Bundle?,
43+
): View? {
44+
fragmentOpenFileDialogBinding = FragmentOpenFileDialogBinding.inflate(inflater)
45+
initDialogResources(viewBinding.parent)
46+
return viewBinding.root
47+
}
48+
49+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
50+
super.onViewCreated(view, savedInstanceState)
51+
52+
val modelProvider = AppsAdapterPreloadModel(this, true)
53+
val sizeProvider = ViewPreloadSizeProvider<String>()
54+
val preloader = RecyclerViewPreloader(
55+
Glide.with(this),
56+
modelProvider,
57+
sizeProvider,
58+
GlideConstants.MAX_PRELOAD_FILES,
59+
)
60+
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
61+
62+
val appDataParcelableList = loadAppList()
63+
64+
adapter = AppsRecyclerAdapter(
65+
this,
66+
modelProvider,
67+
true,
68+
this,
69+
appDataParcelableList,
70+
)
71+
loadViews()
72+
viewBinding.appsRecyclerView.addOnScrollListener(preloader)
73+
}
74+
75+
override fun onDestroyView() {
76+
super.onDestroyView()
77+
fragmentOpenFileDialogBinding = null
78+
}
79+
80+
override fun onPause() {
81+
super.onPause()
82+
dismiss()
83+
}
84+
85+
private fun loadViews() {
86+
viewBinding.run {
87+
appsRecyclerView.layoutManager = LinearLayoutManager(requireContext())
88+
appsRecyclerView.adapter = adapter
89+
doLoadViewsWith(this)
90+
}
91+
}
92+
93+
protected open fun doLoadViewsWith(viewBinding: FragmentOpenFileDialogBinding) = Unit
94+
95+
protected abstract fun loadAppList(): MutableList<AppDataParcelable>
96+
97+
protected abstract fun initLastAppData(
98+
lastClassAndPackage: List<String>?,
99+
appDataParcelableList: MutableList<AppDataParcelable>,
100+
): AppDataParcelable?
101+
102+
override fun adjustListViewForTv(viewHolder: AppHolder, mainActivity: MainActivity) {
103+
// do nothing
104+
}
105+
}

0 commit comments

Comments
 (0)