get rid of the activites

This commit is contained in:
contrudar 2016-10-03 19:53:43 +03:00
parent aba30dc710
commit 17bab40222
5 changed files with 39 additions and 152 deletions

View File

@ -14,8 +14,8 @@ def gitCommitCount =
Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
minSdkVersion 9
@ -27,9 +27,9 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
testCompile 'junit:junit:4.12'
}

View File

@ -14,11 +14,13 @@ import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StyleRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.util.SortedList;
import android.support.v7.view.ContextThemeWrapper;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
@ -123,12 +125,12 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
* <p/>
* The key/value-pairs listed below will be overwritten however.
*
* @param startPath path to directory the picker will show upon start
* @param mode what is allowed to be selected (dirs, files, both)
* @param allowMultiple selecting a single item or several?
* @param allowDirCreate can new directories be created?
* @param startPath path to directory the picker will show upon start
* @param mode what is allowed to be selected (dirs, files, both)
* @param allowMultiple selecting a single item or several?
* @param allowDirCreate can new directories be created?
* @param allowExistingFile if selecting a "new" file, can existing files be chosen
* @param singleClick selecting an item does not require a press on OK
* @param singleClick selecting an item does not require a press on OK
*/
public void setArgs(@Nullable final String startPath, final int mode,
final boolean allowMultiple, final boolean allowDirCreate,
@ -162,7 +164,9 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflateRootView(inflater, container);
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), getStyleId());
final LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
final View view = localInflater.inflate(R.layout.nnf_fragment_filepicker, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.nnf_picker_toolbar);
if (toolbar != null) {
@ -177,7 +181,7 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
// Set Item Decoration if exists
configureItemDecoration(inflater, recyclerView);
configureItemDecoration(localInflater, recyclerView);
// Set adapter
mAdapter = new FileItemAdapter<>(this);
recyclerView.setAdapter(mAdapter);
@ -191,11 +195,11 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
});
view.findViewById(R.id.nnf_button_ok).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
onClickOk(v);
}
});
@Override
public void onClick(final View v) {
onClickOk(v);
}
});
view.findViewById(R.id.nnf_button_ok_newfile).setOnClickListener(
new View.OnClickListener() {
@Override
@ -207,6 +211,8 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
mNewFileButtonContainer = view.findViewById(R.id.nnf_newfile_button_container);
mRegularButtonContainer = view.findViewById(R.id.nnf_button_container);
setModeView(view);
mEditTextFileName = (EditText) view.findViewById(R.id.nnf_text_filename);
mEditTextFileName.addTextChangedListener(new TextWatcher() {
@Override
@ -235,10 +241,6 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
return view;
}
protected View inflateRootView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate( R.layout.nnf_fragment_filepicker, container, false);
}
/**
* Checks if a divider drawable has been defined in the current theme. If it has, will apply
* an item decoration with the divider. If no divider has been specified, then does nothing.
@ -323,7 +325,6 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
}
/**
*
* @return filename as entered/picked by the user for the new file
*/
@NonNull
@ -390,24 +391,7 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
/**
* Called when the fragment's activity has been created and this
* fragment's view hierarchy instantiated. It can be used to do final
* initialization once these pieces are in place, such as retrieving
* views or restoring state. It is also useful for fragments that use
* {@link #setRetainInstance(boolean)} to retain their instance,
* as this callback tells the fragment when it is fully associated with
* the new activity instance. This is called after {@link #onCreateView}
* and before {@link #onViewStateRestored(Bundle)}.
*
* @param savedInstanceState If the fragment is being re-created from
* a previous saved state, this is the state.
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Only if we have no state
if (mCurrentPath == null) {
if (savedInstanceState != null) {
@ -450,8 +434,6 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
}
}
setModeView();
// If still null
if (mCurrentPath == null) {
mCurrentPath = getRoot();
@ -459,16 +441,17 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
refresh(mCurrentPath);
}
/**
* Hides/Shows appropriate views depending on mode
*/
protected void setModeView() {
protected void setModeView(@NonNull View view) {
boolean nf = mode == MODE_NEW_FILE;
mNewFileButtonContainer.setVisibility(nf ? View.VISIBLE : View.GONE);
mRegularButtonContainer.setVisibility(nf ? View.GONE : View.VISIBLE);
if (!nf && singleClick) {
getActivity().findViewById(R.id.nnf_button_ok).setVisibility(View.GONE);
view.findViewById(R.id.nnf_button_ok).setVisibility(View.GONE);
}
}
@ -627,23 +610,28 @@ public abstract class AbstractFilePickerFragment<T> extends Fragment
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), getStyleId());
final LayoutInflater localInflater = LayoutInflater.from(getActivity()).cloneInContext(contextThemeWrapper);
switch (viewType) {
case LogicHandler.VIEWTYPE_HEADER:
v = LayoutInflater.from(getActivity()).inflate(R.layout.nnf_filepicker_listitem_dir,
v = localInflater.inflate(R.layout.nnf_filepicker_listitem_dir,
parent, false);
return new HeaderViewHolder(v);
case LogicHandler.VIEWTYPE_CHECKABLE:
v = LayoutInflater.from(getActivity()).inflate(R.layout.nnf_filepicker_listitem_checkable,
v = localInflater.inflate(R.layout.nnf_filepicker_listitem_checkable,
parent, false);
return new CheckableViewHolder(v);
case LogicHandler.VIEWTYPE_DIR:
default:
v = LayoutInflater.from(getActivity()).inflate(R.layout.nnf_filepicker_listitem_dir,
v = localInflater.inflate(R.layout.nnf_filepicker_listitem_dir,
parent, false);
return new DirViewHolder(v);
}
}
@StyleRes
protected abstract int getStyleId();
/**
* @param vh to bind data from either a file or directory
* @param position 0 - n, where the header has been subtracted

View File

@ -1,74 +0,0 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.nononsenseapps.filepicker;
import android.annotation.SuppressLint;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@SuppressLint("Registered")
public class FilePickerActivity extends AbstractFilePickerActivity<File> {
@NonNull
private final List<OnBackPressedListener> onBackPressedListeners = new ArrayList<>();
public FilePickerActivity() {
super();
}
@Override
protected AbstractFilePickerFragment<File> getFragment(
@Nullable final String startPath, final int mode, final boolean allowMultiple,
final boolean allowCreateDir, final boolean allowExistingFile,
final boolean singleClick) {
AbstractFilePickerFragment<File> fragment = new FilePickerFragment();
// startPath is allowed to be null. In that case, default folder should be SD-card and not "/"
fragment.setArgs(startPath != null ? startPath : Environment.getExternalStorageDirectory().getPath(),
mode, allowMultiple, allowCreateDir, allowExistingFile, singleClick);
return fragment;
}
public void addOnBackPressedListener(@NonNull final OnBackPressedListener onBackPressedListener) {
onBackPressedListeners.add(onBackPressedListener);
}
public void removeOnBackPressedListener(@NonNull final OnBackPressedListener onBackPressedListener) {
onBackPressedListeners.remove(onBackPressedListener);
}
@Override
public void onBackPressed() {
for (final OnBackPressedListener onBackPressedListener : onBackPressedListeners) {
if (onBackPressedListener.onBackPressed()) {
return;
}
}
if (getSupportFragmentManager().getBackStackEntryCount() <= 1) {
supportFinishAfterTransition();
} else {
getSupportFragmentManager().popBackStack();
}
}
public interface OnBackPressedListener {
/**
* Calls when user presses device back button.
*
* @return True if it is processed by this object.
*/
boolean onBackPressed();
}
}

View File

@ -9,7 +9,6 @@ package com.nononsenseapps.filepicker;
import android.Manifest;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.FileObserver;
import android.support.annotation.NonNull;
import android.support.v4.content.AsyncTaskLoader;
@ -25,7 +24,7 @@ import java.io.File;
* An implementation of the picker which allows you to select a file from the internal/external
* storage (SD-card) on a device.
*/
public class FilePickerFragment extends AbstractFilePickerFragment<File> implements FilePickerActivity.OnBackPressedListener {
public abstract class FilePickerFragment extends AbstractFilePickerFragment<File> {
private static final String[] extensions = new String[]{".doc", ".docx", ".xlsx", ".xls", ".png", ".jpg", ".tif", ".pdf", ".jpeg"};
@ -33,15 +32,6 @@ public class FilePickerFragment extends AbstractFilePickerFragment<File> impleme
protected boolean showHiddenItems = false;
private File mRequestedPath = null;
public FilePickerFragment() {
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((FilePickerActivity) getActivity()).addOnBackPressedListener(this);
}
/**
* This method is used to dictate whether hidden files and folders should be shown or not
*
@ -375,20 +365,4 @@ public class FilePickerFragment extends AbstractFilePickerFragment<File> impleme
}
}
@Override
public boolean onBackPressed() {
if ("/".equals(mCurrentPath.toString())) {
return false;
} else {
goUp();
return true;
}
}
@Override
public void onDestroy() {
super.onDestroy();
((FilePickerActivity) getActivity()).removeOnBackPressedListener(this);
}
}

View File

@ -7,10 +7,9 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FilePickerActivity">
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/nnf_picker_toolbar"
@ -26,7 +25,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="start"
android:singleLine="true"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
</android.support.v7.widget.Toolbar>