/* * Copyright (C) 2014 Arpit Khurana <arpitkh96@gmail.com>, Vishal Nehra <vishalmeham2@gmail.com> * * This file is part of Amaze File Manager. * * Amaze File Manager is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.amaze.filemanager.fragments; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.media.RingtoneManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.preference.PreferenceManager; import android.support.design.widget.AppBarLayout; import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.view.ActionMode; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.Theme; import com.amaze.filemanager.IMyAidlInterface; import com.amaze.filemanager.Loadlistener; import com.amaze.filemanager.R; import com.amaze.filemanager.activities.BaseActivity; import com.amaze.filemanager.activities.MainActivity; import com.amaze.filemanager.adapters.Recycleradapter; import com.amaze.filemanager.database.Tab; import com.amaze.filemanager.database.TabHandler; import com.amaze.filemanager.filesystem.BaseFile; import com.amaze.filemanager.filesystem.HFile; import com.amaze.filemanager.filesystem.MediaStoreHack; import com.amaze.filemanager.services.asynctasks.LoadList; import com.amaze.filemanager.ui.Layoutelements; import com.amaze.filemanager.ui.icons.IconHolder; import com.amaze.filemanager.ui.icons.IconUtils; import com.amaze.filemanager.ui.icons.Icons; import com.amaze.filemanager.ui.icons.MimeTypes; import com.amaze.filemanager.ui.views.DividerItemDecoration; import com.amaze.filemanager.ui.views.FastScroller; import com.amaze.filemanager.ui.views.RoundedImageView; import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.FileListSorter; import com.amaze.filemanager.utils.Futils; import com.amaze.filemanager.utils.MainActivityHelper; import com.amaze.filemanager.utils.PreferenceUtils; import com.amaze.filemanager.utils.SmbStreamer.Streamer; import com.amaze.filemanager.utils.UtilitiesProviderInterface; import com.amaze.filemanager.utils.color.ColorUsage; import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration; import java.io.File; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import jcifs.smb.SmbException; import jcifs.smb.SmbFile; public class Main extends android.support.v4.app.Fragment { private UtilitiesProviderInterface utilsProvider; private Futils utils; public ArrayList<Layoutelements> LIST_ELEMENTS; public Recycleradapter adapter; public ActionMode mActionMode; public SharedPreferences Sp; public BitmapDrawable folder, apk, DARK_IMAGE, DARK_VIDEO; public LinearLayout buttons; public int sortby, dsort, asc; public String home, CURRENT_PATH = "", goback; public boolean selection, results = false, SHOW_HIDDEN, CIRCULAR_IMAGES, SHOW_PERMISSIONS, SHOW_SIZE, SHOW_LAST_MODIFIED; public LinearLayout pathbar; public int openMode = 0; public android.support.v7.widget.RecyclerView listView; public boolean GO_BACK_ITEM, SHOW_THUMBS, COLORISE_ICONS, SHOW_DIVIDERS; /** * {@link Main#IS_LIST} boolean to identify if the view is a list or grid */ public boolean IS_LIST = true; public IconHolder ic; public MainActivity MAIN_ACTIVITY; public SwipeRefreshLayout mSwipeRefreshLayout; public int file_count, folder_count, columns; public String smbPath; public ArrayList<BaseFile> searchHelper = new ArrayList<>(); public Resources res; HashMap<String, Bundle> scrolls = new HashMap<String, Bundle>(); Main ma = this; IconUtils icons; View footerView; String itemsstring; public int no; TabHandler tabHandler; LinearLayoutManager mLayoutManager; GridLayoutManager mLayoutManagerGrid; boolean addheader = false; StickyRecyclerHeadersDecoration headersDecor; DividerItemDecoration dividerItemDecoration; int hidemode; AppBarLayout mToolbarContainer; TextView pathname, mFullPath; boolean stopAnims = true; View nofilesview; DisplayMetrics displayMetrics; HFile f; Streamer s; private View rootView; private View actionModeView; private FastScroller fastScroller; // ATTRIBUTES FOR APPEARANCE AND COLORS public String fabSkin, iconskin; public float[] color; public int skin_color; public int skinTwoColor; public int icon_skin_color; public int theme1; public int theme; // defines the current visible tab, default either 0 or 1 //private int mCurrentTab; /* * boolean identifying if the search task should be re-run on back press after pressing on * any of the search result */ private boolean mRetainSearchTask = false; public Main() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MAIN_ACTIVITY = (MainActivity) getActivity(); utilsProvider = MAIN_ACTIVITY; utils = utilsProvider.getFutils(); setRetainInstance(true); no = getArguments().getInt("no", 1); home = getArguments().getString("home"); CURRENT_PATH = getArguments().getString("lastpath"); tabHandler = new TabHandler(getActivity(), null, null, 1); Sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); hidemode = Sp.getInt("hidemode", 0); fabSkin = MAIN_ACTIVITY.getColorPreference().getColorAsString(ColorUsage.ACCENT); iconskin = MAIN_ACTIVITY.getColorPreference().getColorAsString(ColorUsage.ICON_SKIN); skin_color = MAIN_ACTIVITY.getColorPreference().getColor(ColorUsage.PRIMARY); skinTwoColor = MAIN_ACTIVITY.getColorPreference().getColor(ColorUsage.PRIMARY_TWO); icon_skin_color = Color.parseColor(iconskin); theme = Integer.parseInt(Sp.getString("theme", "0")); theme1 = theme == 2 ? PreferenceUtils.hourOfDay() : theme; SHOW_PERMISSIONS = Sp.getBoolean("showPermissions", false); SHOW_SIZE = Sp.getBoolean("showFileSize", false); SHOW_DIVIDERS = Sp.getBoolean("showDividers", true); GO_BACK_ITEM = Sp.getBoolean("goBack_checkbox", false); CIRCULAR_IMAGES = Sp.getBoolean("circularimages", true); SHOW_LAST_MODIFIED = Sp.getBoolean("showLastModified", true); icons = new IconUtils(Sp, getActivity()); } @Override public void onAttach(Context context) { super.onAttach(context); MAIN_ACTIVITY = (MainActivity) context; } public void stopAnimation() { if ((!adapter.stoppedAnimation)) { for (int j = 0; j < listView.getChildCount(); j++) { View v = listView.getChildAt(j); if (v != null) v.clearAnimation(); } } adapter.stoppedAnimation = true; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.main_frag, container, false); setRetainInstance(true); listView = (android.support.v7.widget.RecyclerView) rootView.findViewById(R.id.listView); mToolbarContainer = (AppBarLayout) getActivity().findViewById(R.id.lin); fastScroller = (FastScroller) rootView.findViewById(R.id.fastscroll); fastScroller.setPressedHandleColor(Color.parseColor(fabSkin)); listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (adapter != null && stopAnims) { stopAnimation(); stopAnims = false; } return false; } }); mToolbarContainer.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (adapter != null && stopAnims) { stopAnimation(); stopAnims = false; } return false; } }); mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.activity_main_swipe_refresh_layout); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { loadlist((CURRENT_PATH), false, openMode); } }); buttons = (LinearLayout) getActivity().findViewById(R.id.buttons); pathbar = (LinearLayout) getActivity().findViewById(R.id.pathbar); SHOW_THUMBS = Sp.getBoolean("showThumbs", true); res = getResources(); pathname = (TextView) getActivity().findViewById(R.id.pathname); mFullPath = (TextView) getActivity().findViewById(R.id.fullpath); goback = res.getString(R.string.goback); itemsstring = res.getString(R.string.items); apk = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_doc_apk_grid)); mToolbarContainer.setBackgroundColor(MainActivity.currentTab==1 ? skinTwoColor : skin_color); // listView.setPadding(listView.getPaddingLeft(), paddingTop, listView.getPaddingRight(), listView.getPaddingBottom()); return rootView; } public int dpToPx(int dp) { if (displayMetrics == null) displayMetrics = getResources().getDisplayMetrics(); int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(false); //MAIN_ACTIVITY = (MainActivity) getActivity(); initNoFileLayout(); SHOW_HIDDEN = Sp.getBoolean("showHidden", false); COLORISE_ICONS = Sp.getBoolean("coloriseIcons", true); folder = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_grid_folder_new)); getSortModes(); DARK_IMAGE = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_doc_image_dark)); DARK_VIDEO = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_doc_video_dark)); this.setRetainInstance(false); f = new HFile(HFile.UNKNOWN, CURRENT_PATH); f.generateMode(getActivity()); MAIN_ACTIVITY.initiatebbar(); ic = new IconHolder(getActivity(), SHOW_THUMBS, !IS_LIST); /*if (theme1 == 1) { listView.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.holo_dark_background))); } else { if (IS_LIST) listView.setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.background_light))); }*/ if (theme1==0 && !IS_LIST) listView.setBackgroundColor(getResources() .getColor(R.color.grid_background_light)); else listView.setBackgroundDrawable(null); listView.setHasFixedSize(true); columns = Integer.parseInt(Sp.getString("columns", "-1")); if (IS_LIST) { mLayoutManager = new LinearLayoutManager(getActivity()); listView.setLayoutManager(mLayoutManager); } else { if (columns == -1 || columns == 0) mLayoutManagerGrid = new GridLayoutManager(getActivity(), 3); else mLayoutManagerGrid = new GridLayoutManager(getActivity(), columns); listView.setLayoutManager(mLayoutManagerGrid); } // use a linear layout manager footerView = getActivity().getLayoutInflater().inflate(R.layout.divider, null); dividerItemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST, false, SHOW_DIVIDERS); listView.addItemDecoration(dividerItemDecoration); mSwipeRefreshLayout.setColorSchemeColors(Color.parseColor(fabSkin)); DefaultItemAnimator animator = new DefaultItemAnimator(); listView.setItemAnimator(animator); mToolbarContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if ((columns == 0 || columns == -1)) { int screen_width = listView.getWidth(); int dptopx = dpToPx(115); columns = screen_width / dptopx; if (columns == 0 || columns == -1) columns = 3; if (!IS_LIST) mLayoutManagerGrid.setSpanCount(columns); } if (savedInstanceState != null && !IS_LIST) retrieveFromSavedInstance(savedInstanceState); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { mToolbarContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { mToolbarContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } }); if (savedInstanceState == null) { loadlist(CURRENT_PATH, false, openMode); } else { if (IS_LIST) retrieveFromSavedInstance(savedInstanceState); } } void switchToGrid() { IS_LIST = false; ic = new IconHolder(getActivity(), SHOW_THUMBS, !IS_LIST); folder = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_grid_folder_new)); fixIcons(); if (theme1==0) { // will always be grid, set alternate white background listView.setBackgroundColor(getResources().getColor(R.color.grid_background_light)); } if (mLayoutManagerGrid == null) if (columns == -1 || columns == 0) mLayoutManagerGrid = new GridLayoutManager(getActivity(), 3); else mLayoutManagerGrid = new GridLayoutManager(getActivity(), columns); listView.setLayoutManager(mLayoutManagerGrid); adapter = null; } void switchToList() { IS_LIST = true; if (theme1==0) { listView.setBackgroundDrawable(null); } ic = new IconHolder(getActivity(), SHOW_THUMBS, !IS_LIST); folder = new BitmapDrawable(res, BitmapFactory.decodeResource(res, R.drawable.ic_grid_folder_new)); fixIcons(); if (mLayoutManager == null) mLayoutManager = new LinearLayoutManager(getActivity()); listView.setLayoutManager(mLayoutManager); adapter = null; } public void switchView() { createViews(LIST_ELEMENTS, false, CURRENT_PATH, openMode, results, checkforpath(CURRENT_PATH)); } void retrieveFromSavedInstance(final Bundle savedInstanceState) { Bundle b = new Bundle(); String cur = savedInstanceState.getString("CURRENT_PATH"); if (cur != null) { b.putInt("index", savedInstanceState.getInt("index")); b.putInt("top", savedInstanceState.getInt("top")); scrolls.put(cur, b); openMode = savedInstanceState.getInt("openMode", 0); if (openMode == 1) smbPath = savedInstanceState.getString("SmbPath"); LIST_ELEMENTS = savedInstanceState.getParcelableArrayList("list"); CURRENT_PATH = cur; folder_count = savedInstanceState.getInt("folder_count", 0); file_count = savedInstanceState.getInt("file_count", 0); results = savedInstanceState.getBoolean("results"); MAIN_ACTIVITY.updatePath(CURRENT_PATH, results, openMode, folder_count, file_count); createViews(LIST_ELEMENTS, true, (CURRENT_PATH), openMode, results, !IS_LIST); if (savedInstanceState.getBoolean("selection")) { for (int i : savedInstanceState.getIntegerArrayList("position")) { adapter.toggleChecked(i, null); } } } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); int index; View vi; if (listView != null) { if (IS_LIST) { index = (mLayoutManager).findFirstVisibleItemPosition(); vi = listView.getChildAt(0); } else { index = (mLayoutManagerGrid).findFirstVisibleItemPosition(); vi = listView.getChildAt(0); } int top = (vi == null) ? 0 : vi.getTop(); outState.putInt("index", index); outState.putInt("top", top); //outState.putBoolean("IS_LIST", IS_LIST); outState.putParcelableArrayList("list", LIST_ELEMENTS); outState.putString("CURRENT_PATH", CURRENT_PATH); outState.putBoolean("selection", selection); outState.putInt("openMode", openMode); outState.putInt("folder_count", folder_count); outState.putInt("file_count", file_count); if (selection) { outState.putIntegerArrayList("position", adapter.getCheckedItemPositions()); } outState.putBoolean("results", results); if (openMode == 1) { outState.putString("SmbPath", smbPath); } } } public ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { private void hideOption(int id, Menu menu) { MenuItem item = menu.findItem(id); item.setVisible(false); } private void showOption(int id, Menu menu) { MenuItem item = menu.findItem(id); item.setVisible(true); } public void initMenu(Menu menu) { /*menu.findItem(R.id.cpy).setIcon(icons.getCopyDrawable()); menu.findItem(R.id.cut).setIcon(icons.getCutDrawable()); menu.findItem(R.id.delete).setIcon(icons.getDeleteDrawable()); menu.findItem(R.id.all).setIcon(icons.getAllDrawable());*/ } // called when the action mode is created; startActionMode() was called public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); actionModeView = getActivity().getLayoutInflater().inflate(R.layout.actionmode, null); mode.setCustomView(actionModeView); MAIN_ACTIVITY.setPagingEnabled(false); MAIN_ACTIVITY.floatingActionButton.hideMenuButton(true); // translates the drawable content down // if (MAIN_ACTIVITY.isDrawerLocked) MAIN_ACTIVITY.translateDrawerList(true); // assumes that you have "contexual.xml" menu resources inflater.inflate(R.menu.contextual, menu); initMenu(menu); hideOption(R.id.addshortcut, menu); hideOption(R.id.share, menu); hideOption(R.id.openwith, menu); if (MAIN_ACTIVITY.mReturnIntent) showOption(R.id.openmulti, menu); //hideOption(R.id.setringtone,menu); mode.setTitle(getResources().getString(R.string.select)); MAIN_ACTIVITY.updateViews(new ColorDrawable(res.getColor(R.color.holo_dark_action_mode))); // do not allow drawer to open when item gets selected if (!MAIN_ACTIVITY.isDrawerLocked) { MAIN_ACTIVITY.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED, MAIN_ACTIVITY.mDrawerLinear); } return true; } // the following method is called each time // the action mode is shown. Always called after // onCreateActionMode, but // may be called multiple times if the mode is invalidated. public boolean onPrepareActionMode(ActionMode mode, Menu menu) { ArrayList<Integer> positions = adapter.getCheckedItemPositions(); TextView textView1 = (TextView) actionModeView.findViewById(R.id.item_count); textView1.setText(positions.size() + ""); textView1.setOnClickListener(null); mode.setTitle(positions.size() + ""); hideOption(R.id.openmulti, menu); if (openMode == 1) { hideOption(R.id.addshortcut, menu); hideOption(R.id.openwith, menu); hideOption(R.id.share, menu); hideOption(R.id.compress, menu); return true; } if (MAIN_ACTIVITY.mReturnIntent) if (Build.VERSION.SDK_INT >= 16) showOption(R.id.openmulti, menu); //tv.setText(positions.size()); if (!results) { hideOption(R.id.openparent, menu); if (positions.size() == 1) { showOption(R.id.addshortcut, menu); showOption(R.id.openwith, menu); showOption(R.id.share, menu); File x = new File(LIST_ELEMENTS.get(adapter.getCheckedItemPositions().get(0)) .getDesc()); if (x.isDirectory()) { hideOption(R.id.openwith, menu); hideOption(R.id.share, menu); hideOption(R.id.openmulti, menu); } if (MAIN_ACTIVITY.mReturnIntent) if (Build.VERSION.SDK_INT >= 16) showOption(R.id.openmulti, menu); } else { try { showOption(R.id.share, menu); if (MAIN_ACTIVITY.mReturnIntent) if (Build.VERSION.SDK_INT >= 16) showOption(R.id.openmulti, menu); for (int c : adapter.getCheckedItemPositions()) { File x = new File(LIST_ELEMENTS.get(c).getDesc()); if (x.isDirectory()) { hideOption(R.id.share, menu); hideOption(R.id.openmulti, menu); } } } catch (Exception e) { e.printStackTrace(); } hideOption(R.id.openwith, menu); } } else { if (positions.size() == 1) { showOption(R.id.addshortcut, menu); showOption(R.id.openparent, menu); showOption(R.id.openwith, menu); showOption(R.id.share, menu); File x = new File(LIST_ELEMENTS.get(adapter.getCheckedItemPositions().get(0)) .getDesc()); if (x.isDirectory()) { hideOption(R.id.openwith, menu); hideOption(R.id.share, menu); hideOption(R.id.openmulti, menu); } if (MAIN_ACTIVITY.mReturnIntent) if (Build.VERSION.SDK_INT >= 16) showOption(R.id.openmulti, menu); } else { hideOption(R.id.openparent, menu); if (MAIN_ACTIVITY.mReturnIntent) if (Build.VERSION.SDK_INT >= 16) showOption(R.id.openmulti, menu); try { for (int c : adapter.getCheckedItemPositions()) { File x = new File(LIST_ELEMENTS.get(c).getDesc()); if (x.isDirectory()) { hideOption(R.id.share, menu); hideOption(R.id.openmulti, menu); } } } catch (Exception e) { e.printStackTrace(); } hideOption(R.id.openwith, menu); } } return true; // Return false if nothing is done } // called when the user selects a contextual menu item public boolean onActionItemClicked(ActionMode mode, MenuItem item) { computeScroll(); ArrayList<Integer> plist = adapter.getCheckedItemPositions(); switch (item.getItemId()) { case R.id.openmulti: if (Build.VERSION.SDK_INT >= 16) { Intent intentresult = new Intent(); ArrayList<Uri> resulturis = new ArrayList<Uri>(); for (int k : plist) { try { resulturis.add(Uri.fromFile(new File(LIST_ELEMENTS.get(k).getDesc()))); } catch (Exception e) { } } final ClipData clipData = new ClipData( null, new String[]{"*/*"}, new ClipData.Item(resulturis.get(0))); for (int i = 1; i < resulturis.size(); i++) { clipData.addItem(new ClipData.Item(resulturis.get(i))); } intentresult.setClipData(clipData); mode.finish(); getActivity().setResult(getActivity().RESULT_OK, intentresult); getActivity().finish(); } return true; case R.id.about: Layoutelements x; x = LIST_ELEMENTS.get((plist.get(0))); utils.showProps((x).generateBaseFile(), x.getPermissions(), ma, BaseActivity.rootMode); mode.finish(); return true; /*case R.id.setringtone: File fx; if(results) fx=new File(slist.get((plist.get(0))).getDesc()); else fx=new File(list.get((plist.get(0))).getDesc()); ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, fx.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, "Amaze"); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); //values.put(MediaStore.MediaColumns.SIZE, fx.); values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(fx.getAbsolutePath()); Uri newUri = getActivity().getContentResolver().insert(uri, values); try { RingtoneManager.setActualDefaultRingtoneUri(getActivity(), RingtoneManager.TYPE_RINGTONE, newUri); //Settings.System.putString(getActivity().getContentResolver(), Settings.System.RINGTONE, newUri.toString()); Toast.makeText(getActivity(), "Successful" + fx.getAbsolutePath(), Toast.LENGTH_LONG).show(); } catch (Throwable t) { Log.d("ringtone", "failed"); } return true;*/ case R.id.delete: utils.deleteFiles(LIST_ELEMENTS, ma, plist); return true; case R.id.share: ArrayList<File> arrayList = new ArrayList<File>(); for (int i : plist) { arrayList.add(new File(LIST_ELEMENTS.get(i).getDesc())); } if (arrayList.size() > 100) Toast.makeText(getActivity(), "Can't share more than 100 files", Toast.LENGTH_SHORT).show(); else utils.shareFiles(arrayList, getActivity(), theme1, Color.parseColor (fabSkin)); return true; case R.id.openparent: loadlist(new File(LIST_ELEMENTS.get(plist.get(0)).getDesc()).getParent(), false, 0); return true; case R.id.all: if (adapter.areAllChecked(CURRENT_PATH)) { adapter.toggleChecked(false, CURRENT_PATH); } else { adapter.toggleChecked(true, CURRENT_PATH); } mode.invalidate(); return true; case R.id.rename: final ActionMode m = mode; final BaseFile f; f = (LIST_ELEMENTS.get( (plist.get(0)))).generateBaseFile(); rename(f); mode.finish(); return true; case R.id.hide: for (int i1 = 0; i1 < plist.size(); i1++) { hide(LIST_ELEMENTS.get(plist.get(i1)).getDesc()); } updateList(); mode.finish(); return true; case R.id.ex: MAIN_ACTIVITY.mainActivityHelper.extractFile(new File(LIST_ELEMENTS.get(plist.get(0)).getDesc())); mode.finish(); return true; case R.id.cpy: MAIN_ACTIVITY.MOVE_PATH = null; ArrayList<BaseFile> copies = new ArrayList<>(); for (int i2 = 0; i2 < plist.size(); i2++) { copies.add(LIST_ELEMENTS.get(plist.get(i2)).generateBaseFile()); } MAIN_ACTIVITY.COPY_PATH = copies; MAIN_ACTIVITY.supportInvalidateOptionsMenu(); mode.finish(); return true; case R.id.cut: MAIN_ACTIVITY.COPY_PATH = null; ArrayList<BaseFile> copie = new ArrayList<>(); for (int i3 = 0; i3 < plist.size(); i3++) { copie.add(LIST_ELEMENTS.get(plist.get(i3)).generateBaseFile()); } MAIN_ACTIVITY.MOVE_PATH = copie; MAIN_ACTIVITY.supportInvalidateOptionsMenu(); mode.finish(); return true; case R.id.compress: ArrayList<BaseFile> copies1 = new ArrayList<>(); for (int i4 = 0; i4 < plist.size(); i4++) { copies1.add(LIST_ELEMENTS.get(plist.get(i4)).generateBaseFile()); } utils.showCompressDialog((MainActivity) getActivity(), copies1, CURRENT_PATH); mode.finish(); return true; case R.id.openwith: utils.openunknown(new File(LIST_ELEMENTS.get((plist.get(0))).getDesc()), getActivity(), true); return true; case R.id.addshortcut: addShortcut(LIST_ELEMENTS.get(plist.get(0))); mode.finish(); return true; default: return false; } } // called when the user exits the action mode public void onDestroyActionMode(ActionMode mode) { mActionMode = null; selection = false; // translates the drawer content up //if (MAIN_ACTIVITY.isDrawerLocked) MAIN_ACTIVITY.translateDrawerList(false); MAIN_ACTIVITY.floatingActionButton.showMenuButton(true); if (!results) adapter.toggleChecked(false, CURRENT_PATH); else adapter.toggleChecked(false); MAIN_ACTIVITY.setPagingEnabled(true); MAIN_ACTIVITY.updateViews(new ColorDrawable(MainActivity.currentTab==1 ? skinTwoColor : skin_color)); if (!MAIN_ACTIVITY.isDrawerLocked) { MAIN_ACTIVITY.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, MAIN_ACTIVITY.mDrawerLinear); } } }; private BroadcastReceiver receiver2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateList(); } }; public void home() { ma.loadlist((ma.home), false, 0); } /** * method called when list item is clicked in the adapter * @param position the {@link int} position of the list item * @param imageView the check {@link RoundedImageView} that is to be animated */ public void onListItemClicked(int position, ImageView imageView) { if (position >= LIST_ELEMENTS.size()) return; if (results) { // check to initialize search results // if search task is been running, cancel it FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); SearchAsyncHelper fragment = (SearchAsyncHelper) fragmentManager .findFragmentByTag(MainActivity.TAG_ASYNC_HELPER); if (fragment != null) { if (fragment.mSearchTask.getStatus() == AsyncTask.Status.RUNNING) { fragment.mSearchTask.cancel(true); } getActivity().getSupportFragmentManager().beginTransaction().remove(fragment).commit(); } mRetainSearchTask = true; results = false; } else { mRetainSearchTask = false; MainActivityHelper.SEARCH_TEXT = null; } if (selection == true) { if (!LIST_ELEMENTS.get(position).getSize().equals(goback)) { // the first {goback} item if back navigation is enabled adapter.toggleChecked(position, imageView); } else { selection = false; if (mActionMode != null) mActionMode.finish(); mActionMode = null; } } else { if (!LIST_ELEMENTS.get(position).getSize().equals(goback)) { // hiding search view if visible if (MainActivity.isSearchViewEnabled) MAIN_ACTIVITY.hideSearchView(); String path; Layoutelements l = LIST_ELEMENTS.get(position); if (!l.hasSymlink()) { path = l.getDesc(); } else { path = l.getSymlink(); } if (LIST_ELEMENTS.get(position).isDirectory()) { computeScroll(); loadlist(path, false, openMode); } else { if (l.getMode() == HFile.SMB_MODE) try { SmbFile smbFile = new SmbFile(l.getDesc()); launch(smbFile, l.getlongSize()); } catch (MalformedURLException e) { e.printStackTrace(); } else if (MAIN_ACTIVITY.mReturnIntent) { returnIntentResults(new File(l.getDesc())); } else { utils.openFile(new File(l.getDesc()), (MainActivity) getActivity()); } DataUtils.addHistoryFile(l.getDesc()); } } else { goBackItemClick(); } } } public void updateTabWithDb(Tab tab) { CURRENT_PATH = tab.getPath(); home = tab.getHome(); loadlist(CURRENT_PATH, false, -1); } private void returnIntentResults(File file) { MAIN_ACTIVITY.mReturnIntent = false; Intent intent = new Intent(); if (MAIN_ACTIVITY.mRingtonePickerIntent) { Uri mediaStoreUri = MediaStoreHack.getUriFromFile(file.getPath(), getActivity()); System.out.println(mediaStoreUri.toString() + "\t" + MimeTypes.getMimeType(file)); intent.setDataAndType(mediaStoreUri, MimeTypes.getMimeType(file)); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, mediaStoreUri); getActivity().setResult(getActivity().RESULT_OK, intent); getActivity().finish(); } else { Log.d("pickup", "file"); intent.setData(Uri.fromFile(file)); getActivity().setResult(getActivity().RESULT_OK, intent); getActivity().finish(); } } LoadList loadList; public void loadlist(String path, boolean back, int openMode) { if (mActionMode != null) { mActionMode.finish(); } /*if(openMode==-1 && android.util.Patterns.EMAIL_ADDRESS.matcher(path).matches()) bindDrive(path); else */ if (loadList != null) loadList.cancel(true); loadList = new LoadList(ma.getActivity(), utilsProvider, back, ma, openMode); loadList.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (path)); } void initNoFileLayout() { nofilesview = rootView.findViewById(R.id.nofilelayout); if (theme1 == 0) ((ImageView) nofilesview.findViewById(R.id.image)).setColorFilter(Color.parseColor("#666666")); else { nofilesview.setBackgroundColor(getResources().getColor(R.color.holo_dark_background)); ((TextView) nofilesview.findViewById(R.id.nofiletext)).setTextColor(Color.WHITE); } } public boolean checkforpath(String path) { boolean grid = false, both_contain = false; int index1 = -1, index2 = -1; for (String s : DataUtils.gridfiles) { index1++; if ((path).contains(s)) { grid = true; break; } } for (String s : DataUtils.listfiles) { index2++; if ((path).contains(s)) { if (grid == true) both_contain = true; grid = false; break; } } if (!both_contain) return grid; String path1 = DataUtils.gridfiles.get(index1), path2 = DataUtils.listfiles.get(index2); if (path1.contains(path2)) return true; else if (path2.contains(path1)) return false; else return grid; } public void createViews(ArrayList<Layoutelements> bitmap, boolean back, String f, int openMode, boolean results, boolean grid) { try { if (bitmap != null) { if (GO_BACK_ITEM) if (!f.equals("/") && (openMode == 0 || openMode == 3)) { if (bitmap.size() == 0 || !bitmap.get(0).getSize().equals(goback)) { Bitmap iconBitmap = BitmapFactory.decodeResource(res, R.drawable.abc_ic_ab_back_mtrl_am_alpha); bitmap.add(0, utils.newElement(new BitmapDrawable(res, iconBitmap), "..", "", "", goback, 0, false, true, "")); } } if (bitmap.size() == 0 && !results) { nofilesview.setVisibility(View.VISIBLE); listView.setVisibility(View.GONE); mSwipeRefreshLayout.setEnabled(false); } else { mSwipeRefreshLayout.setEnabled(true); nofilesview.setVisibility(View.GONE); listView.setVisibility(View.VISIBLE); } LIST_ELEMENTS = bitmap; if (grid && IS_LIST) switchToGrid(); else if (!grid && !IS_LIST) switchToList(); if (adapter == null) adapter = new Recycleradapter(ma, utilsProvider, bitmap, ma.getActivity()); else { adapter.generate(LIST_ELEMENTS); } stopAnims = true; this.openMode = openMode; if (openMode != 2) DataUtils.addHistoryFile(f); //mSwipeRefreshLayout.setRefreshing(false); try { listView.setAdapter(adapter); if (!addheader) { listView.removeItemDecoration(headersDecor); listView.removeItemDecoration(dividerItemDecoration); addheader = true; } if (addheader && IS_LIST) { dividerItemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST, true, SHOW_DIVIDERS); listView.addItemDecoration(dividerItemDecoration); headersDecor = new StickyRecyclerHeadersDecoration(adapter); listView.addItemDecoration(headersDecor); addheader = false; } if (!results) this.results = false; CURRENT_PATH = f; if (back) { if (scrolls.containsKey(CURRENT_PATH)) { Bundle b = scrolls.get(CURRENT_PATH); if (IS_LIST) mLayoutManager.scrollToPositionWithOffset(b.getInt("index"), b.getInt("top")); else mLayoutManagerGrid.scrollToPositionWithOffset(b.getInt("index"), b.getInt("top")); } } //floatingActionButton.show(); MAIN_ACTIVITY.updatepaths(no); listView.stopScroll(); fastScroller.setRecyclerView(listView, IS_LIST ? 1 : columns); mToolbarContainer.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { fastScroller.updateHandlePosition(verticalOffset, 112); // fastScroller.setPadding(fastScroller.getPaddingLeft(),fastScroller.getTop(),fastScroller.getPaddingRight(),112+verticalOffset); // fastScroller.updateHandlePosition(); } }); fastScroller.registerOnTouchListener(new FastScroller.onTouchListener() { @Override public void onTouch() { if (stopAnims && adapter != null) { stopAnimation(); stopAnims = false; } } }); if (buttons.getVisibility() == View.VISIBLE) MAIN_ACTIVITY.bbar(this); //MAIN_ACTIVITY.invalidateFab(openMode); } catch (Exception e) { } } else {//Toast.makeText(getActivity(),res.getString(R.string.error),Toast.LENGTH_LONG).show(); loadlist(home, true, 0); } } catch (Exception e) { } } public void rename(final BaseFile f) { MaterialDialog.Builder a = new MaterialDialog.Builder(getActivity()); String name = f.getName(); a.input("", name, false, new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { } }); if (theme1 == 1) a.theme(Theme.DARK); a.title(getResources().getString(R.string.rename)); a.callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog materialDialog) { String name = materialDialog.getInputEditText().getText().toString(); if (f.isSmb()) if (f.isDirectory() && !name.endsWith("/")) name = name + "/"; if (MainActivityHelper.validateFileName(new HFile(openMode, CURRENT_PATH + "/" + name), false)) { if (openMode == 1) MAIN_ACTIVITY.mainActivityHelper.rename(openMode, f.getPath(), CURRENT_PATH + name, getActivity(), BaseActivity.rootMode); else MAIN_ACTIVITY.mainActivityHelper.rename(openMode, (f).getPath(), (CURRENT_PATH + "/" + name), getActivity(), BaseActivity.rootMode); } else { Toast.makeText(MAIN_ACTIVITY, R.string.invalid_name, Toast.LENGTH_SHORT).show(); } } @Override public void onNegative(MaterialDialog materialDialog) { materialDialog.cancel(); } }); a.positiveText(R.string.save); a.negativeText(R.string.cancel); int color = Color.parseColor(fabSkin); a.positiveColor(color).negativeColor(color).widgetColor(color); a.build().show(); } public void computeScroll() { View vi = listView.getChildAt(0); int top = (vi == null) ? 0 : vi.getTop(); int index; if (IS_LIST) index = mLayoutManager.findFirstVisibleItemPosition(); else index = mLayoutManagerGrid.findFirstVisibleItemPosition(); Bundle b = new Bundle(); b.putInt("index", index); b.putInt("top", top); scrolls.put(CURRENT_PATH, b); } public void goBack() { if (openMode == 2) { loadlist(home, false, 0); return; } File f = new File(CURRENT_PATH); if (!results && !mRetainSearchTask) { // normal case if (selection) { adapter.toggleChecked(false); } else { if (openMode == 1) try { if (!smbPath.equals(CURRENT_PATH)) { String path = (new SmbFile(CURRENT_PATH).getParent()); loadlist((path), true, openMode); } else loadlist(home, false, 0); } catch (MalformedURLException e) { e.printStackTrace(); } else if (CURRENT_PATH.equals("/") || CURRENT_PATH.equals(home)) MAIN_ACTIVITY.exit(); else if (utils.canGoBack(f)) { loadlist(f.getParent(), true, openMode); } else MAIN_ACTIVITY.exit(); } } else if (!results && mRetainSearchTask) { // case when we had pressed on an item from search results and wanna go back // leads to resuming the search task if (MainActivityHelper.SEARCH_TEXT!=null) { // starting the search query again :O MAIN_ACTIVITY.mainFragment = (Main) MAIN_ACTIVITY.getFragment().getTab(); FragmentManager fm = MAIN_ACTIVITY.getSupportFragmentManager(); // getting parent path to resume search from there String parentPath = new File(CURRENT_PATH).getParent(); // don't fuckin' remove this line, we need to change // the path back to parent on back press CURRENT_PATH = parentPath; MainActivityHelper.addSearchFragment(fm, new SearchAsyncHelper(), parentPath, MainActivityHelper.SEARCH_TEXT, openMode, BaseActivity.rootMode, Sp.getBoolean(SearchAsyncHelper.KEY_REGEX, false), Sp.getBoolean(SearchAsyncHelper.KEY_REGEX_MATCHES, false)); } else loadlist(CURRENT_PATH, true, -1); mRetainSearchTask = false; } else { // to go back after search list have been popped FragmentManager fm = getActivity().getSupportFragmentManager(); SearchAsyncHelper fragment = (SearchAsyncHelper) fm.findFragmentByTag(MainActivity.TAG_ASYNC_HELPER); if (fragment != null) { if (fragment.mSearchTask.getStatus() == AsyncTask.Status.RUNNING) { fragment.mSearchTask.cancel(true); } } loadlist(new File(CURRENT_PATH).getPath(), true, -1); results = false; } } public void reauthenticateSmb() { if (smbPath != null) { try { MAIN_ACTIVITY.runOnUiThread(new Runnable() { @Override public void run() { int i=-1; if((i=DataUtils.containsServer(smbPath))!=-1){ MAIN_ACTIVITY.showSMBDialog(DataUtils.getServers().get(i)[0], smbPath, true); } } }); } catch (Exception e) { e.printStackTrace(); } } } public void goBackItemClick() { if (openMode == 2) { loadlist(home, false, 0); return; } File f = new File(CURRENT_PATH); if (!results) { if (selection) { adapter.toggleChecked(false); } else { if (openMode == 1) try { if (!CURRENT_PATH.equals(smbPath)) { String path = (new SmbFile(CURRENT_PATH).getParent()); loadlist((path), true, 1); } else loadlist(home, false, 0); } catch (MalformedURLException e) { e.printStackTrace(); } else if (CURRENT_PATH.equals("/")) MAIN_ACTIVITY.exit(); else if (utils.canGoBack(f)) { loadlist(f.getParent(), true, openMode); } else MAIN_ACTIVITY.exit(); } } else { loadlist(f.getPath(), true, openMode); } } public void updateList() { computeScroll(); ic.cleanup(); loadlist((CURRENT_PATH), true, openMode); } public void getSortModes() { int t = Integer.parseInt(Sp.getString("sortby", "0")); if (t <= 3) { sortby = t; asc = 1; } else if (t > 3) { asc = -1; sortby = t - 4; } dsort = Integer.parseInt(Sp.getString("dirontop", "0")); } @Override public void onResume() { super.onResume(); (getActivity()).registerReceiver(receiver2, new IntentFilter("loadlist")); } @Override public void onPause() { super.onPause(); (getActivity()).unregisterReceiver(receiver2); } @Override public void onStop() { super.onStop(); } @Override public void onDestroyView() { super.onDestroyView(); tabHandler.close(); } void fixIcons() { for (Layoutelements layoutelements : LIST_ELEMENTS) { BitmapDrawable iconDrawable = layoutelements.isDirectory() ? folder : Icons.loadMimeIcon(getActivity(), layoutelements.getDesc(), !IS_LIST, res); layoutelements.setImageId(iconDrawable); } } public ArrayList<Layoutelements> addToSmb(SmbFile[] mFile, String path) throws SmbException { ArrayList<Layoutelements> a = new ArrayList<Layoutelements>(); if (searchHelper.size() > 500) searchHelper.clear(); for (int i = 0; i < mFile.length; i++) { if (DataUtils.hiddenfiles.contains(mFile[i].getPath())) continue; String name = mFile[i].getName(); name = (mFile[i].isDirectory() && name.endsWith("/")) ? name.substring(0, name.length() - 1) : name; if (path.equals(smbPath)) { if (name.endsWith("$")) continue; } if (mFile[i].isDirectory()) { folder_count++; Layoutelements layoutelements = new Layoutelements(folder, name, mFile[i].getPath(), "", "", "", 0, false, mFile[i].lastModified() + "", true); layoutelements.setMode(1); searchHelper.add(layoutelements.generateBaseFile()); a.add(layoutelements); } else { file_count++; try { Layoutelements layoutelements = new Layoutelements(Icons.loadMimeIcon(getActivity(), mFile[i].getPath(), !IS_LIST, res), name, mFile[i].getPath(), "", "", Futils.readableFileSize(mFile[i].length()), mFile[i].length(), false, mFile[i].lastModified() + "", false); layoutelements.setMode(1); searchHelper.add(layoutelements.generateBaseFile()); a.add(layoutelements); } catch (Exception e) { e.printStackTrace(); } } } return a; } // method to add search result entry to the LIST_ELEMENT arrayList private void addTo(BaseFile mFile) { File f = new File(mFile.getPath()); String size = ""; if (!DataUtils.hiddenfiles.contains(mFile.getPath())) { if (mFile.isDirectory()) { size = ""; Layoutelements layoutelements = utils.newElement(folder, f.getPath(), mFile.getPermisson(), mFile.getLink(), size, 0, true, false, mFile.getDate() + ""); layoutelements.setMode(mFile.getMode()); LIST_ELEMENTS.add(layoutelements); folder_count++; } else { long longSize = 0; try { if (mFile.getSize() != -1) { longSize = Long.valueOf(mFile.getSize()); size = Futils.readableFileSize(longSize); } else { size = ""; longSize = 0; } } catch (NumberFormatException e) { //e.printStackTrace(); } try { Layoutelements layoutelements = utils.newElement(Icons.loadMimeIcon(getActivity(), f.getPath(), !IS_LIST, res), f.getPath(), mFile.getPermisson(), mFile.getLink(), size, longSize, false, false, mFile.getDate() + ""); layoutelements.setMode(mFile.getMode()); LIST_ELEMENTS.add(layoutelements); file_count++; } catch (Exception e) { e.printStackTrace(); } } } } @Override public void onDestroy() { super.onDestroy(); } public void hide(String path) { DataUtils.addHiddenFile(path); if (new File(path).isDirectory()) { File f1 = new File(path + "/" + ".nomedia"); if (!f1.exists()) { try { MAIN_ACTIVITY.mainActivityHelper.mkFile(new HFile(HFile.LOCAL_MODE, f1.getPath()), this); } catch (Exception e) { e.printStackTrace(); } } Futils.scanFile(path, getActivity()); } } private void addShortcut(Layoutelements path) { //Adding shortcut for MainActivity //on Home screen Intent shortcutIntent = new Intent(getActivity().getApplicationContext(), MainActivity.class); shortcutIntent.putExtra("path", path.getDesc()); shortcutIntent.setAction(Intent.ACTION_MAIN); shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); Intent addIntent = new Intent(); addIntent .putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, new File(path.getDesc()).getName()); addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getActivity(), R.mipmap.ic_launcher)); addIntent .setAction("com.android.launcher.action.INSTALL_SHORTCUT"); getActivity().sendBroadcast(addIntent); } // adds search results based on result boolean. If false, the adapter is initialised with initial // values, if true, new values are added to the adapter. public void addSearchResult(BaseFile a) { if (listView != null) { // initially clearing the array for new result set if (!results) { LIST_ELEMENTS.clear(); file_count = 0; folder_count = 0; } // adding new value to LIST_ELEMENTS addTo(a); if (!results) { createViews(LIST_ELEMENTS, false, (CURRENT_PATH), openMode, false, !IS_LIST); pathname.setText(MAIN_ACTIVITY.getString(R.string.empty)); mFullPath.setText(MAIN_ACTIVITY.getString(R.string.searching)); results = true; } else { adapter.addItem(); } stopAnimation(); } } public void onSearchCompleted() { if (!results) { // no results were found LIST_ELEMENTS.clear(); } new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Collections.sort(LIST_ELEMENTS, new FileListSorter(dsort, sortby, asc, BaseActivity.rootMode)); return null; } @Override public void onPostExecute(Void c) { createViews(LIST_ELEMENTS, true, (CURRENT_PATH), openMode, true, !IS_LIST); pathname.setText(MAIN_ACTIVITY.getString(R.string.empty)); mFullPath.setText(MAIN_ACTIVITY.getString(R.string.searchresults)); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } Loadlistener loadlistener = new Loadlistener.Stub() { @Override public void load(final List<Layoutelements> layoutelements, String driveId) throws RemoteException { System.out.println(layoutelements.size() + "\t" + driveId); } @Override public void error(final String message, final int mode) throws RemoteException { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MAIN_ACTIVITY, "Error " + message + mode, Toast.LENGTH_SHORT).show(); } }); } }; IMyAidlInterface aidlInterface; boolean mbound = false; public void bindDrive(String account) { Intent i = new Intent(); i.setClassName("com.amaze.filemanager.driveplugin", "com.amaze.filemanager.driveplugin.MainService"); i.putExtra("account", account); try { getActivity().bindService((i), mConnection, Context.BIND_AUTO_CREATE); } catch (Exception e) { e.printStackTrace(); } } void unbindDrive() { if (mbound != false) getActivity().unbindService(mConnection); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance aidlInterface = (IMyAidlInterface.Stub.asInterface(service)); mbound = true; try { aidlInterface.registerCallback(loadlistener); } catch (RemoteException e) { e.printStackTrace(); } try { aidlInterface.loadRoot(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName arg0) { mbound = false; Log.d("DriveConnection", "DisConnected"); aidlInterface = null; } }; private void launch(final SmbFile smbFile, final long si) { s = Streamer.getInstance(); new Thread() { public void run() { try { s.setStreamSrc(smbFile, null, si);//the second argument can be a list of subtitle files getActivity().runOnUiThread(new Runnable() { public void run() { try { Uri uri = Uri.parse(Streamer.URL + Uri.fromFile(new File(Uri.parse(smbFile.getPath()).getPath())).getEncodedPath()); Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(uri, MimeTypes.getMimeType(new File(smbFile.getPath()))); PackageManager packageManager = getActivity().getPackageManager(); List<ResolveInfo> resInfos = packageManager.queryIntentActivities(i, 0); if (resInfos != null && resInfos.size() > 0) startActivity(i); else Toast.makeText(getActivity(), "You will need to copy this file to storage to open it", Toast.LENGTH_SHORT).show(); } catch (ActivityNotFoundException e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } } }.start(); } @Override public void onDetach() { super.onDetach(); } }