Gifs aren't animated anymore in the file picker.

This commit is contained in:
Lyndon
2017-11-14 10:48:19 +01:00
parent 7cd5ff902b
commit c225007d71
20 changed files with 242 additions and 224 deletions

View File

@@ -60,9 +60,13 @@
<activity
android:name=".filepicker.FilePickerActivity"
android:configChanges="orientation|screenSize"/>
android:theme="@style/AppTheme.NoActionBar"
android:screenOrientation="portrait"
/>
<activity android:name=".filepicker.MediaDetailsActivity"
android:configChanges="orientation|screenSize"/>
android:theme="@style/AppTheme.NoActionBar"
android:screenOrientation="portrait"
/>
<meta-data
android:name="io.fabric.ApiKey"

View File

@@ -11,7 +11,6 @@ import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.os.Build;
import io.fabric.sdk.android.Fabric;

View File

@@ -11,6 +11,11 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import java.io.File;
import java.util.ArrayList;
@@ -24,24 +29,38 @@ import de.beyondsoft.ownchat.filepicker.utils.AndroidLifecycleUtils;
* Created by Lyndon on 26-Oct-2017.
*/
public class FolderGridAdapter extends SelectableAdapter<FolderGridAdapter.ImageViewHolder, ImageDirectory> {
public class FolderGridAdapter extends SelectableAdapter<FolderGridAdapter.ImageViewHolder, ImageDirectory> implements RequestListener<File, GlideDrawable> {
private final Context context;
private final RequestManager glide;
private final boolean showCamera;
private int imageSize;
public final static int ITEM_TYPE_CAMERA = 100;
public final static int ITEM_TYPE_PHOTO = 101;
private final static int ITEM_TYPE_CAMERA = 100;
private final static int ITEM_TYPE_PHOTO = 101;
private FolderGridAdapterListener folderGridAdapterListener;
@Override
public boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if(resource.isAnimated()) {
target.onResourceReady(new GlideBitmapDrawable(null, ((GifDrawable) resource).getFirstFrame()), null);
return true;
}
return false;
}
public interface FolderGridAdapterListener{
void onCameraClicked();
void onFolderClicked(ImageDirectory photoDirectory);
}
public FolderGridAdapter(Context context, RequestManager requestManager, ArrayList<ImageDirectory> photos, ArrayList<String> selectedPaths, boolean showCamera)
{
public FolderGridAdapter(Context context, RequestManager requestManager, ArrayList<ImageDirectory> photos, ArrayList<String> selectedPaths, boolean showCamera) {
super(photos, selectedPaths);
this.context = context;
this.glide = requestManager;
@@ -58,42 +77,37 @@ public class FolderGridAdapter extends SelectableAdapter<FolderGridAdapter.Image
@Override
public int getItemViewType(int position) {
if(showCamera)
if(showCamera) {
return (position == 0) ? ITEM_TYPE_CAMERA : ITEM_TYPE_PHOTO;
else
} else {
return ITEM_TYPE_PHOTO;
}
}
@Override
public void onBindViewHolder(final ImageViewHolder holder, int position) {
if(getItemViewType(position) == ITEM_TYPE_PHOTO) {
final ImageDirectory photoDirectory = getItems().get(showCamera?position-1:position);
if(AndroidLifecycleUtils.canLoadImage(holder.imageView.getContext())) {
glide.load(new File(photoDirectory.getCoverPath()))
.override(imageSize, imageSize)
.fallback(R.drawable.document)
.thumbnail(0.5f)
.listener(this)
.into(holder.imageView);
}
holder.folderTitle.setText(photoDirectory.getName());
holder.folderCount.setText(String.valueOf(photoDirectory.getMedias().size()));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(folderGridAdapterListener!=null) {
folderGridAdapterListener.onFolderClicked(photoDirectory);
}
holder.itemView.setOnClickListener(view -> {
if(folderGridAdapterListener!=null) {
folderGridAdapterListener.onFolderClicked(photoDirectory);
}
});
holder.bottomOverlay.setVisibility(View.VISIBLE);
}
else
{
} else {
holder.imageView.setImageResource(PickerManager.getInstance().getCameraDrawable());
holder.itemView.setOnClickListener(view -> {
if(folderGridAdapterListener!=null) {
@@ -115,13 +129,14 @@ public class FolderGridAdapter extends SelectableAdapter<FolderGridAdapter.Image
@Override
public int getItemCount() {
if(showCamera)
return getItems().size()+1;
if(showCamera) {
return getItems().size() + 1;
}
return getItems().size();
}
public void setFolderGridAdapterListener(FolderGridAdapterListener onClickListener)
{
public void setFolderGridAdapterListener(FolderGridAdapterListener onClickListener) {
this.folderGridAdapterListener = onClickListener;
}
@@ -134,6 +149,7 @@ public class FolderGridAdapter extends SelectableAdapter<FolderGridAdapter.Image
ImageViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.iv_photo);
folderTitle = itemView.findViewById(R.id.folder_title);
folderCount = itemView.findViewById(R.id.folder_count);

View File

@@ -11,6 +11,11 @@ import android.widget.CheckBox;
import android.widget.ImageView;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import java.io.File;
import java.util.ArrayList;
@@ -25,7 +30,7 @@ import de.beyondsoft.ownchat.filepicker.utils.AndroidLifecycleUtils;
* Created by Lyndon on 26-Oct-2017.
*/
public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageViewHolder, Media> {
public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageViewHolder, Media> implements RequestListener<File, GlideDrawable> {
private final Context context;
private final RequestManager glide;
private final boolean showCamera;
@@ -36,13 +41,7 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
public final static int ITEM_TYPE_PHOTO = 101;
private View.OnClickListener cameraOnClickListener;
public ImageGridAdapter(Context context,
RequestManager requestManager,
ArrayList<Media> medias,
ArrayList<String> selectedPaths,
boolean showCamera,
FileAdapterListener photoGridAdapterListener)
{
public ImageGridAdapter(Context context, RequestManager requestManager, ArrayList<Media> medias, ArrayList<String> selectedPaths, boolean showCamera, FileAdapterListener photoGridAdapterListener) {
super(medias, selectedPaths);
this.context = context;
this.glide = requestManager;
@@ -70,13 +69,13 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
@Override
public void onBindViewHolder(final ImageViewHolder holder, int position) {
if(getItemViewType(position) == ITEM_TYPE_PHOTO) {
final Media media = getItems().get(showCamera?position-1:position);
final Media media = getItems().get(showCamera ? position - 1 : position);
if(AndroidLifecycleUtils.canLoadImage(holder.imageView.getContext())) {
glide.load(new File(media.getPath()))
.override(imageSize, imageSize)
.placeholder(R.drawable.document)
.thumbnail(0.5f)
.listener(this)
.into(holder.imageView);
}
@@ -104,13 +103,10 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
toggleSelection(media);
holder.selectBg.setVisibility(isChecked ? View.VISIBLE : View.GONE);
if (isChecked)
{
if (isChecked) {
holder.checkBox.setVisibility(View.VISIBLE);
PickerManager.getInstance().add(media.getPath(), FilePickerConst.FILE_TYPE_MEDIA);
}
else
{
} else {
holder.checkBox.setVisibility(View.GONE);
PickerManager.getInstance().remove(media.getPath(),FilePickerConst.FILE_TYPE_MEDIA);
}
@@ -119,9 +115,7 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
mListener.onItemSelected();
}
});
}
else
{
} else {
holder.imageView.setImageResource(PickerManager.getInstance().getCameraDrawable());
holder.checkBox.setVisibility(View.GONE);
holder.itemView.setOnClickListener(cameraOnClickListener);
@@ -136,8 +130,7 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
if(mListener!=null) {
mListener.onItemSelected();
}
}
else if (holder.checkBox.isChecked() || PickerManager.getInstance().shouldAdd()) {
} else if (holder.checkBox.isChecked() || PickerManager.getInstance().shouldAdd()) {
holder.checkBox.setChecked(!holder.checkBox.isChecked());
}
}
@@ -159,12 +152,26 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
return getItems().size();
}
public void setCameraListener(View.OnClickListener onClickListener)
{
public void setCameraListener(View.OnClickListener onClickListener) {
this.cameraOnClickListener = onClickListener;
}
public static class ImageViewHolder extends RecyclerView.ViewHolder {
@Override
public boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if(resource.isAnimated()) {
target.onResourceReady(new GlideBitmapDrawable(null, ((GifDrawable) resource).getFirstFrame()), null);
return true;
}
return false;
}
static class ImageViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBox;
ImageView imageView;
@@ -173,7 +180,7 @@ public class ImageGridAdapter extends SelectableAdapter<ImageGridAdapter.ImageVi
View selectBg;
public ImageViewHolder(View itemView) {
ImageViewHolder(View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.checkbox);
imageView = itemView.findViewById(R.id.iv_photo);

View File

@@ -19,7 +19,6 @@ import java.util.List;
import de.beyondsoft.ownchat.R;
import de.beyondsoft.ownchat.filepicker.PickerManager;
import de.beyondsoft.ownchat.filepicker.adapters.SectionsPagerAdapter;
import de.beyondsoft.ownchat.filepicker.cursors.loadercallbacks.FileResultCallback;
import de.beyondsoft.ownchat.filepicker.models.Document;
import de.beyondsoft.ownchat.filepicker.models.FileType;
import de.beyondsoft.ownchat.filepicker.utils.MediaStoreHelper;
@@ -91,38 +90,38 @@ public class DocPickerFragment extends BaseFragment {
}
private void setViews(View view) {
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
viewPager = (ViewPager) view.findViewById(R.id.viewPager);
progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
tabLayout = view.findViewById(R.id.tabs);
viewPager = view.findViewById(R.id.viewPager);
progressBar = view.findViewById(R.id.progress_bar);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
private void setData() {
MediaStoreHelper.getDocs(getActivity(), new FileResultCallback<Document>() {
@Override
public void onResultCallback(List<Document> files) {
if(!isAdded()) return;
progressBar.setVisibility(View.GONE);
setDataOnFragments(files);
MediaStoreHelper.getDocs(getActivity(), files -> {
if(!isAdded()) {
return;
}
progressBar.setVisibility(View.GONE);
setDataOnFragments(files);
});
}
private void setDataOnFragments(List<Document> files) {
SectionsPagerAdapter sectionsPagerAdapter = (SectionsPagerAdapter) viewPager.getAdapter();
if(sectionsPagerAdapter!=null)
{
if(sectionsPagerAdapter != null) {
for (int index = 0; index < sectionsPagerAdapter.getCount(); index++) {
DocFragment docFragment = (DocFragment) getChildFragmentManager()
.findFragmentByTag(
"android:switcher:" + R.id.viewPager + ":"+index);
if(docFragment!=null)
{
DocFragment docFragment = (DocFragment) getChildFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewPager + ":"+index);
if(docFragment != null) {
FileType fileType = docFragment.getFileType();
if(fileType!=null)
if(fileType != null) {
docFragment.updateList(filterDocuments(fileType.extensions, files));
}
}
}
}
@@ -131,6 +130,7 @@ public class DocPickerFragment extends BaseFragment {
private void setUpViewPager() {
SectionsPagerAdapter adapter = new SectionsPagerAdapter(getChildFragmentManager());
ArrayList<FileType> supportedTypes = PickerManager.getInstance().getFileTypes();
for (int index = 0; index < supportedTypes.size(); index++) {
adapter.addFragment(DocFragment.newInstance(supportedTypes.get(index)),supportedTypes.get(index).title);
}
@@ -143,13 +143,8 @@ public class DocPickerFragment extends BaseFragment {
mTabLayoutHelper.setAutoAdjustTabModeEnabled(true);
}
private ArrayList<Document> filterDocuments(final String[] type, List<Document> documents)
{
final Predicate<Document> docType = new Predicate<Document>() {
public boolean apply(Document document) {
return document.isThisType(type);
}
};
private ArrayList<Document> filterDocuments(final String[] type, List<Document> documents) {
final Predicate<Document> docType = document -> document.isThisType(type);
return new ArrayList<>(Utils.filter(new HashSet<>(documents),docType));
}

View File

@@ -22,7 +22,6 @@ import com.bumptech.glide.RequestManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import de.beyondsoft.ownchat.R;
@@ -30,7 +29,6 @@ import de.beyondsoft.ownchat.filepicker.FilePickerConst;
import de.beyondsoft.ownchat.filepicker.PickerManager;
import de.beyondsoft.ownchat.filepicker.adapters.FileAdapterListener;
import de.beyondsoft.ownchat.filepicker.adapters.ImageGridAdapter;
import de.beyondsoft.ownchat.filepicker.cursors.loadercallbacks.FileResultCallback;
import de.beyondsoft.ownchat.filepicker.models.ImageDirectory;
import de.beyondsoft.ownchat.filepicker.models.Media;
import de.beyondsoft.ownchat.filepicker.utils.AndroidLifecycleUtils;
@@ -60,8 +58,7 @@ public class MediaDetailPickerFragment extends BaseFragment implements FileAdapt
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_image_picker, container, false);
}
@@ -69,11 +66,11 @@ public class MediaDetailPickerFragment extends BaseFragment implements FileAdapt
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof ImagePickerFragmentListener) {
mListener = (ImagePickerFragmentListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement PhotoPickerFragmentListener");
throw new RuntimeException(context.toString() + " must implement PhotoPickerFragmentListener");
}
}
@@ -126,7 +123,7 @@ public class MediaDetailPickerFragment extends BaseFragment implements FileAdapt
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// Log.d(">>> Picker >>>", "dy = " + dy);
if (Math.abs(dy) > SCROLL_THRESHOLD) {
mGlideRequestManager.pauseRequests();
} else {
@@ -149,85 +146,62 @@ public class MediaDetailPickerFragment extends BaseFragment implements FileAdapt
mediaStoreArgs.putInt(FilePickerConst.EXTRA_FILE_TYPE, fileType);
if(fileType==FilePickerConst.MEDIA_TYPE_IMAGE) {
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs,
dirs -> updateList(dirs));
}
else if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO)
{
MediaStoreHelper.getVideoDirs(getActivity(), mediaStoreArgs,
dirs -> updateList(dirs));
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs, this::updateList);
} else if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO) {
MediaStoreHelper.getVideoDirs(getActivity(), mediaStoreArgs, this::updateList);
}
}
private void updateList(List<ImageDirectory> dirs) {
ArrayList<Media> medias = new ArrayList<>();
for (int i = 0; i < dirs.size(); i++) {
medias.addAll(dirs.get(i).getMedias());
}
Collections.sort(medias,new Comparator<Media>() {
@Override
public int compare(Media a, Media b) {
return b.getId() - a.getId();
}
});
Collections.sort(medias, (a, b) -> b.getId() - a.getId());
if(medias.size()>0) {
if(medias.size() > 0) {
emptyView.setVisibility(View.GONE);
}
else {
} else {
emptyView.setVisibility(View.VISIBLE);
}
if(photoGridAdapter!=null)
{
if(photoGridAdapter != null) {
photoGridAdapter.setData(medias);
photoGridAdapter.notifyDataSetChanged();
}
else
{
photoGridAdapter = new ImageGridAdapter(getActivity(), mGlideRequestManager, (ArrayList<Media>) medias, PickerManager.getInstance().getSelectedPhotos(),(fileType==FilePickerConst.MEDIA_TYPE_IMAGE) && PickerManager.getInstance().isEnableCamera(), this);
} else {
photoGridAdapter = new ImageGridAdapter(getActivity(), mGlideRequestManager, medias, PickerManager.getInstance().getSelectedPhotos(),(fileType==FilePickerConst.MEDIA_TYPE_IMAGE) && PickerManager.getInstance().isEnableCamera(), this);
recyclerView.setAdapter(photoGridAdapter);
photoGridAdapter.setCameraListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent intent = imageCaptureManager.dispatchTakePictureIntent(getActivity());
if(intent!=null)
startActivityForResult(intent, ImageCaptureManager.REQUEST_TAKE_PHOTO);
else
Toast.makeText(getActivity(), R.string.no_camera_exists, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
photoGridAdapter.setCameraListener(v -> {
try {
Intent intent = imageCaptureManager.dispatchTakePictureIntent(getActivity());
if(intent!=null) {
startActivityForResult(intent, ImageCaptureManager.REQUEST_TAKE_PHOTO);
} else {
Toast.makeText(getActivity(), R.string.no_camera_exists, Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
switch (requestCode) {
case ImageCaptureManager.REQUEST_TAKE_PHOTO:
if(resultCode== Activity.RESULT_OK)
{
if(resultCode== Activity.RESULT_OK) {
String imagePath = imageCaptureManager.galleryAddPic();
if(imagePath!=null && PickerManager.getInstance().getMaxCount()==1)
{
if(imagePath!=null && PickerManager.getInstance().getMaxCount() == 1) {
PickerManager.getInstance().add(imagePath, FilePickerConst.FILE_TYPE_MEDIA);
mListener.onItemSelected();
}
else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getDataFromMedia();
}
}, 1000);
} else {
new Handler().postDelayed(() -> getDataFromMedia(), 1000);
}
}
break;

View File

@@ -28,7 +28,6 @@ import de.beyondsoft.ownchat.filepicker.FilePickerConst;
import de.beyondsoft.ownchat.filepicker.MediaDetailsActivity;
import de.beyondsoft.ownchat.filepicker.PickerManager;
import de.beyondsoft.ownchat.filepicker.adapters.FolderGridAdapter;
import de.beyondsoft.ownchat.filepicker.cursors.loadercallbacks.FileResultCallback;
import de.beyondsoft.ownchat.filepicker.models.ImageDirectory;
import de.beyondsoft.ownchat.filepicker.utils.AndroidLifecycleUtils;
import de.beyondsoft.ownchat.filepicker.utils.GridSpacingItemDecoration;
@@ -52,14 +51,11 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
private RequestManager mGlideRequestManager;
private int fileType;
public MediaFolderPickerFragment() {
// Required empty public constructor
}
public MediaFolderPickerFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_media_folder_picker, container, false);
}
@@ -67,11 +63,11 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof ImagePickerFragmentListener) {
mListener = (ImagePickerFragmentListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement PhotoPickerFragmentListener");
throw new RuntimeException(context.toString() + " must implement PhotoPickerFragmentListener");
}
}
@@ -102,8 +98,8 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
}
private void initView(View view) {
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
emptyView = (TextView) view.findViewById(R.id.empty_view);
recyclerView = view.findViewById(R.id.recyclerview);
emptyView = view.findViewById(R.id.empty_view);
fileType = getArguments().getInt(FILE_TYPE);
imageCaptureManager = new ImageCaptureManager(getActivity());
@@ -111,21 +107,22 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
int spanCount = 2; // 2 columns
int spacing = 5; // 5px
boolean includeEdge = false;
recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge));
recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, false));
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// Log.d(">>> Picker >>>", "dy = " + dy);
if (Math.abs(dy) > SCROLL_THRESHOLD) {
mGlideRequestManager.pauseRequests();
} else {
resumeRequestsIfNotDestroyed();
}
}
@Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
resumeRequestsIfNotDestroyed();
@@ -142,23 +139,19 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
mediaStoreArgs.putInt(FilePickerConst.EXTRA_FILE_TYPE, fileType);
if(fileType==FilePickerConst.MEDIA_TYPE_IMAGE) {
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs,
dirs -> updateList(dirs));
}
else if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO)
{
MediaStoreHelper.getVideoDirs(getActivity(), mediaStoreArgs,
dirs -> updateList(dirs));
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs, this::updateList);
} else if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO) {
MediaStoreHelper.getVideoDirs(getActivity(), mediaStoreArgs, this::updateList);
}
}
private void updateList(List<ImageDirectory> dirs) {
Log.i("updateList",""+dirs.size());
if(dirs.size()>0) {
emptyView.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
}
else {
} else {
emptyView.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
return;
@@ -167,20 +160,15 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
ImageDirectory photoDirectory = new ImageDirectory();
photoDirectory.setBucketId(FilePickerConst.ALL_PHOTOS_BUCKET_ID);
if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO)
{
if(fileType==FilePickerConst.MEDIA_TYPE_VIDEO) {
photoDirectory.setName(getString(R.string.all_videos));
}
else if(fileType==FilePickerConst.MEDIA_TYPE_IMAGE)
{
} else if(fileType==FilePickerConst.MEDIA_TYPE_IMAGE) {
photoDirectory.setName(getString(R.string.all_photos));
}
else {
} else {
photoDirectory.setName(getString(R.string.all_files));
}
if(dirs.size()>0 && dirs.get(0).getMedias().size()>0)
{
if(dirs.size() > 0 && dirs.get(0).getMedias().size() > 0) {
photoDirectory.setDateAdded(dirs.get(0).getDateAdded());
photoDirectory.setCoverPath(dirs.get(0).getMedias().get(0).getPath());
}
@@ -191,29 +179,27 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
dirs.add(0,photoDirectory);
if(photoGridAdapter!=null)
{
if(photoGridAdapter != null) {
photoGridAdapter.setData(dirs);
photoGridAdapter.notifyDataSetChanged();
}
else
{
} else {
photoGridAdapter = new FolderGridAdapter(getActivity(), mGlideRequestManager, (ArrayList<ImageDirectory>) dirs, null, (fileType== FilePickerConst.MEDIA_TYPE_IMAGE) && PickerManager.getInstance().isEnableCamera());
recyclerView.setAdapter(photoGridAdapter);
photoGridAdapter.setFolderGridAdapterListener(this);
}
}
@Override
public void onCameraClicked() {
try {
Intent intent = imageCaptureManager.dispatchTakePictureIntent(getActivity());
if(intent!=null)
if(intent!=null) {
startActivityForResult(intent, ImageCaptureManager.REQUEST_TAKE_PHOTO);
else
} else {
Toast.makeText(getActivity(), R.string.no_camera_exists, Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
@@ -230,27 +216,21 @@ public class MediaFolderPickerFragment extends BaseFragment implements FolderGri
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
switch(requestCode) {
case ImageCaptureManager.REQUEST_TAKE_PHOTO:
if(resultCode== Activity.RESULT_OK)
{
if(resultCode== Activity.RESULT_OK) {
String imagePath = imageCaptureManager.galleryAddPic();
if(imagePath!=null && PickerManager.getInstance().getMaxCount()==1)
{
PickerManager.getInstance().add(imagePath, FilePickerConst.FILE_TYPE_MEDIA);
mListener.onItemSelected();
}
else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getDataFromMedia();
}
}, 1000);
} else {
new Handler().postDelayed(this::getDataFromMedia, 1000);
}
}
break;
}
}

View File

@@ -630,9 +630,9 @@ abstract class BaseChatActivity extends RuntimePermissionActivity implements Cha
@Override
protected void onNewIntent(Intent intent) {
boolean test = intent.getBooleanExtra("TEST_EXTRA", false);
boolean hasOpenChat = intent.getBooleanExtra(Constants.HAS_OPEN_CHAT, false);
if(test) {
if(hasOpenChat) {
Group group = intent.getParcelableExtra(GROUP_ARG);
if(group != null) {

View File

@@ -213,6 +213,7 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
void setLoading(boolean loading) {
mIsLoading = loading;
if (loading) {
notifyItemRangeInserted(getItemCount(), 1);
} else {

View File

@@ -26,20 +26,26 @@ class GroupChatAdapter extends BaseChatAdapter {
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == LEFT_CHAT_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_chat_left, parent, false);
return new MessageViewHolder(view);
} else if (viewType == RIGHT_CHAT_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_chat_right, parent, false);
return new MessageViewHolder(view);
} else if (viewType == DATE_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_date, parent, false);
return new DateViewHolder(view);
}
ProgressBar progressBar = new ProgressBar(parent.getContext());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
params.setMargins(0, (int) parent.getContext().getResources().getDimension(R.dimen.messages_progress_top_margin), 0, 0);
progressBar.setLayoutParams(params);
ViewUtils.setProgressBarColor(progressBar, R.color.colorWhite);
return new ProgressViewHolder(progressBar);
@@ -55,11 +61,13 @@ class GroupChatAdapter extends BaseChatAdapter {
break;
case DATE_TYPE:
((DateViewHolder) holder).dateTextView.setText(DateUtils.toDayOfYearString(mDateList.get(position)));
break;
case LEFT_CHAT_TYPE:
final Message leftMessage = mMessages.get(position - mPositionOffset.get(position));
MessageViewHolder leftMessageViewHolder = (MessageViewHolder) holder;
setGroupMessage(leftMessageViewHolder, leftMessage, position, true);
break;
case RIGHT_CHAT_TYPE:
final Message rightMessage = mMessages.get(position - mPositionOffset.get(position));

View File

@@ -26,21 +26,27 @@ class SingleChatAdapter extends BaseChatAdapter {
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == LEFT_CHAT_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_single_chat_left, parent, false);
return new MessageViewHolder(view);
} else if (viewType == RIGHT_CHAT_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_single_chat_right, parent, false);
return new MessageViewHolder(view);
} else if (viewType == DATE_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_date, parent, false);
return new DateViewHolder(view);
}
ProgressBar progressBar = new ProgressBar(parent.getContext());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
params.setMargins(0, (int) parent.getContext().getResources().getDimension(R.dimen.messages_progress_top_margin), 0, 0);
progressBar.setLayoutParams(params);
ViewUtils.setProgressBarColor(progressBar, R.color.colorWhite);
return new ProgressViewHolder(progressBar);
}
@@ -53,16 +59,21 @@ class SingleChatAdapter extends BaseChatAdapter {
break;
case DATE_TYPE:
((DateViewHolder) holder).dateTextView.setText(DateUtils.toDayOfYearString(mDateList.get(position)));
break;
case LEFT_CHAT_TYPE:
MessageViewHolder leftChatHolder = (MessageViewHolder) holder;
final Message leftMessage = mMessages.get(position - mPositionOffset.get(position));
setSingleMessage(leftChatHolder, leftMessage, position, true);
break;
case RIGHT_CHAT_TYPE:
MessageViewHolder rightChatHolder = (MessageViewHolder) holder;
final Message rightMessage = mMessages.get(position - mPositionOffset.get(position));
setSingleMessage(rightChatHolder, rightMessage, position, false);
if (rightMessage.status == Message.Status.DELIVERED) {
rightChatHolder.statusProgressBar.setVisibility(View.GONE);
rightChatHolder.statusImageView.setVisibility(View.VISIBLE);
@@ -79,6 +90,7 @@ class SingleChatAdapter extends BaseChatAdapter {
rightChatHolder.sendingFailedTextView.setVisibility(View.GONE);
rightChatHolder.statusImageView.setVisibility(View.GONE);
}
break;
}
}

View File

@@ -10,12 +10,16 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
import butterknife.OnClick;
import de.beyondsoft.ownchat.R;
@@ -34,10 +38,11 @@ import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import de.beyondsoft.ownchat.utils.ui.ViewUtils;
import hani.momanii.supernova_emoji_library.Actions.EmojIconActions;
import hani.momanii.supernova_emoji_library.Helper.EmojiconEditText;
public class FileConfirmationActivity extends AppCompatActivity implements FileConfirmationView {
public class FileConfirmationActivity extends AppCompatActivity implements FileConfirmationView, RequestListener<String, GlideDrawable> {
@BindView(R.id.file_message)
EmojiconEditText mMessageEmojiconEditText;
@@ -69,6 +74,9 @@ public class FileConfirmationActivity extends AppCompatActivity implements FileC
@BindView(R.id.chat_toolbar_extra_image)
ImageView mExtraImageView;
@BindView(R.id.file_preview_progress_bar)
ProgressBar statusProgressBar;
@Inject
FileConfirmationPresenter mFileConfirmationPresenter;
@@ -91,11 +99,16 @@ public class FileConfirmationActivity extends AppCompatActivity implements FileC
mSelectedUri = Uri.parse(fileUri);
ViewUtils.setProgressBarColor(statusProgressBar, R.color.colorDefault);
showLoading();
Glide.with(this)
.load(fileUri)
.dontAnimate()
.placeholder(R.drawable.document)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(this)
.into(new GlideDrawableImageViewTarget(mFileImageView));
mGroup = getIntent().getParcelableExtra(Constants.EXTRA_GROUP);
@@ -159,7 +172,12 @@ public class FileConfirmationActivity extends AppCompatActivity implements FileC
@Override
public void showLoading() {
statusProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
statusProgressBar.setVisibility(View.GONE);
}
@Override
@@ -176,4 +194,18 @@ public class FileConfirmationActivity extends AppCompatActivity implements FileC
public void showError(String message) {
}
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
hideLoading();
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
hideLoading();
return false;
}
}

View File

@@ -7,5 +7,7 @@ import de.beyondsoft.ownchat.page.mvp.MVPLceView;
*/
public interface FileConfirmationView extends MVPLceView {
void showLoading();
void hideLoading();
}

View File

@@ -9,11 +9,9 @@ import android.support.annotation.StringRes;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
@@ -27,16 +25,15 @@ import butterknife.OnClick;
import de.beyondsoft.ownchat.R;
import de.beyondsoft.ownchat.data.AppPrefsConstants;
import de.beyondsoft.ownchat.data.prefs.BooleanPreference;
import de.beyondsoft.ownchat.data.prefs.LongPreference;
import de.beyondsoft.ownchat.data.prefs.StringPreference;
import de.beyondsoft.ownchat.di.InjectionHelper;
import de.beyondsoft.ownchat.model.Group;
import de.beyondsoft.ownchat.page.chat.GroupChatActivity;
import de.beyondsoft.ownchat.page.chat.SingleChatActivity;
import de.beyondsoft.ownchat.page.common.RuntimePermissionActivity;
import de.beyondsoft.ownchat.page.contacts.ContactsFragment;
import de.beyondsoft.ownchat.page.login.LoginActivity;
import de.beyondsoft.ownchat.page.main.MainActivity;
import de.beyondsoft.ownchat.utils.Constants;
import de.beyondsoft.ownchat.utils.ui.EmptyLayout;
import de.beyondsoft.ownchat.utils.ui.HorizontalDividerItemDecoration;
@@ -160,7 +157,7 @@ public class SharingActivity extends RuntimePermissionActivity implements Sharin
@Override
public void onOpenGroupMessage(Group group) {
Intent intent = GroupChatActivity.createIntent(this, group);
intent.putExtra("TEST_EXTRA", true);
intent.putExtra(Constants.HAS_OPEN_CHAT, true);
startActivity(intent);
finishAffinity();
@@ -170,7 +167,7 @@ public class SharingActivity extends RuntimePermissionActivity implements Sharin
public void onOpenPrivateMessage(Group contact) {
Intent intent = SingleChatActivity.createIntent(this, contact);
intent.putExtra("TEST_EXTRA", true);
intent.putExtra(Constants.HAS_OPEN_CHAT, true);
startActivity(intent);
finishAffinity();

View File

@@ -32,4 +32,6 @@ public interface Constants {
String MIME_TYPE_GIF = "image/gif";
String TMP_FILE_DIR = "tmp_files";
String HAS_OPEN_CHAT = "has_open_chat";
}

View File

@@ -42,7 +42,6 @@
android:layout_height="wrap_content"
android:contentDescription="@null"
android:paddingBottom="10dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingTop="10dp"
android:src="@drawable/smiley"
@@ -55,8 +54,6 @@
android:contentDescription="@null"
android:paddingBottom="10dp"
android:paddingEnd="22dp"
android:paddingLeft="16dp"
android:paddingRight="22dp"
android:paddingStart="16dp"
android:paddingTop="10dp"
android:src="@drawable/attachment"
@@ -71,7 +68,6 @@
android:background="@android:color/transparent"
android:hint="@string/chat_type_your_message"
android:paddingEnd="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:scrollHorizontally="false"
@@ -87,7 +83,6 @@
android:layout_height="wrap_content"
android:contentDescription="@null"
android:paddingEnd="16dp"
android:paddingRight="16dp"
android:src="@drawable/send"
tools:ignore="RtlSymmetry" />

View File

@@ -11,12 +11,22 @@
<include layout="@layout/chat_toolbar" />
<ImageView
android:id="@+id/media_file"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:src="@drawable/document"
android:contentDescription="@null" />
</ImageView>
<ProgressBar
android:id="@+id/file_preview_progress_bar"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerInParent="true"
android:visibility="visible"
tools:visibility="visible" />
<LinearLayout
android:layout_width="match_parent"
@@ -29,10 +39,9 @@
android:id="@+id/file_emoji_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_marginEnd="5dp"
android:contentDescription="@null"
android:paddingBottom="10dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingTop="10dp"
android:src="@drawable/smiley"
@@ -49,7 +58,6 @@
android:maxHeight="100dp"
android:paddingBottom="10dp"
android:paddingEnd="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
android:scrollHorizontally="false"
android:scrollbars="vertical"
@@ -65,7 +73,6 @@
android:layout_gravity="center_vertical"
android:contentDescription="@null"
android:paddingEnd="16dp"
android:paddingRight="16dp"
android:src="@drawable/send"
tools:ignore="RtlSymmetry" />
</LinearLayout>

View File

@@ -26,8 +26,9 @@
<View
android:id="@+id/bottomOverlay"
android:layout_width="fill_parent"
android:layout_height="70.0dip"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:visibility="visible"
android:background="@drawable/gallery_album_overlay" />
<LinearLayout
@@ -50,19 +51,19 @@
android:layout_weight="1.0"
android:ellipsize="marquee"
android:gravity="start"
tools:text="All Photos"
android:singleLine="true"
android:textColor="#ffffffff"
android:textSize="13.0sp" />
android:textColor="@color/colorAccent"
android:textSize="13.0sp"
tools:text="All Photos" />
<TextView
android:id="@+id/folder_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
tools:text="123"
android:singleLine="true"
android:textColor="#ffeeeeee"
android:textSize="12sp" />
android:textColor="@color/colorAccent"
android:textSize="12sp"
tools:text="123" />
</LinearLayout>
</de.beyondsoft.ownchat.filepicker.views.SquareRelativeLayout>

View File

@@ -8,13 +8,9 @@
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:paddingLeft="40dp"
android:paddingEnd="40dp"
android:paddingRight="0dp"
android:paddingStart="0dp">
<RelativeLayout
style="@style/RightChatItemRelativeLayout"
android:layout_width="wrap_content"
@@ -25,7 +21,6 @@
android:id="@+id/chat_item_sending_failed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/chat_item_message_status"
android:layout_toEndOf="@+id/chat_item_message_status"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
@@ -43,10 +38,8 @@
android:layout_height="15dp"
android:layout_alignBottom="@+id/chat_item_time"
android:layout_alignTop="@+id/chat_item_time"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_toEndOf="@+id/chat_item_time"
android:layout_toRightOf="@+id/chat_item_time"
android:visibility="visible"
tools:visibility="visible" />
@@ -58,8 +51,6 @@
android:layout_alignBottom="@+id/chat_item_time"
android:layout_alignTop="@+id/chat_item_time"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/chat_item_time"
android:layout_toEndOf="@+id/chat_item_time"
android:contentDescription="@null"
android:visibility="gone"
@@ -70,7 +61,6 @@
android:id="@+id/chat_item_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="@color/colorTimestamp"
android:textSize="10sp"
@@ -82,7 +72,6 @@
android:id="@+id/chat_item_file"
android:layout_width="wrap_content"
android:layout_height="120dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/chat_item_time"
android:layout_marginTop="4dp"
@@ -97,7 +86,6 @@
android:id="@+id/chat_item_progress"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/chat_item_time"
android:layout_marginTop="4dp"
@@ -111,7 +99,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/chat_item_file"
android:textColor="@color/colorBlack"
android:visibility="gone"
@@ -123,7 +110,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_below="@id/chat_item_file_name"
android:visibility="gone"
emojicon:emojiconSize="20sp"

View File

@@ -6,7 +6,7 @@
<color name="colorBackground">#F3F3F3</color>
<color name="colorBlack">#000000</color>
<color name="colorWhite">#ffffff</color>
<color name="colorDefault">#FFFF5E00</color>
<color name="colorDefault">#ff5e00</color>
<color name="colorDefaultBright">#B3FF5E00</color>
<color name="colorDivider">#4D000000</color>
<color name="colorHint">#80000000</color>