mirror of
https://github.com/gsantner/dandelion
synced 2024-11-22 04:12:08 +01:00
Use searchable dialog for tag and aspect/contact list
* Remove seperate fragments for both cases * Make use of opoc/SearchOrCustomTextDialog * Basically also removes all fragment swaps * Only two fragments are stream and podselection * Pod logout restarts app * Thus long known Android Supportlib bug can't occur * Fixes #198
This commit is contained in:
parent
918adcf358
commit
dbbd3cef35
13 changed files with 358 additions and 457 deletions
|
@ -1,208 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the dandelion*.
|
|
||||||
|
|
||||||
dandelion* 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.
|
|
||||||
|
|
||||||
dandelion* 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 the dandelion*.
|
|
||||||
|
|
||||||
If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.github.dfa.diaspora_android.activity;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
import android.support.v7.widget.AppCompatImageView;
|
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.RelativeLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.github.dfa.diaspora_android.App;
|
|
||||||
import com.github.dfa.diaspora_android.R;
|
|
||||||
import com.github.dfa.diaspora_android.data.DiasporaAspect;
|
|
||||||
import com.github.dfa.diaspora_android.listener.OnSomethingClickListener;
|
|
||||||
import com.github.dfa.diaspora_android.ui.theme.ThemedFragment;
|
|
||||||
import com.github.dfa.diaspora_android.util.AppSettings;
|
|
||||||
import com.github.dfa.diaspora_android.util.ContextUtils;
|
|
||||||
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fragment that shows a list of the Aspects
|
|
||||||
*/
|
|
||||||
public class AspectListFragment extends ThemedFragment implements OnSomethingClickListener<Object> {
|
|
||||||
|
|
||||||
public static final String TAG = "com.github.dfa.diaspora_android.AspectListFragment";
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__recycler_view)
|
|
||||||
public RecyclerView aspectsRecyclerView;
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__spacer)
|
|
||||||
public View space;
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__root)
|
|
||||||
public RelativeLayout rootView;
|
|
||||||
|
|
||||||
protected App app;
|
|
||||||
protected DiasporaUrlHelper urls;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getLayoutResId() {
|
|
||||||
return R.layout.recycler_list__fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
|
||||||
super.onViewCreated(view, savedInstanceState);
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
app = (App) getActivity().getApplication();
|
|
||||||
AppSettings appSettings = app.getSettings();
|
|
||||||
urls = new DiasporaUrlHelper(appSettings);
|
|
||||||
|
|
||||||
aspectsRecyclerView.setHasFixedSize(true);
|
|
||||||
aspectsRecyclerView.setNestedScrollingEnabled(false);
|
|
||||||
|
|
||||||
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
|
|
||||||
aspectsRecyclerView.setLayoutManager(layoutManager);
|
|
||||||
|
|
||||||
final AspectAdapter adapter = new AspectAdapter(appSettings, this);
|
|
||||||
aspectsRecyclerView.setAdapter(adapter);
|
|
||||||
|
|
||||||
//Set window title
|
|
||||||
getActivity().setTitle(R.string.nav_aspects);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getFragmentTag() {
|
|
||||||
return TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onBackPressed() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSomethingClicked(Object null1, Integer null2, String aspectId) {
|
|
||||||
((MainActivity) getActivity()).openDiasporaUrl(urls.getAspectUrl(aspectId));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void applyColorToViews() {
|
|
||||||
aspectsRecyclerView.invalidate();
|
|
||||||
if (getAppSettings().isAmoledColorMode()) {
|
|
||||||
rootView.setBackgroundColor(Color.BLACK);
|
|
||||||
space.setBackgroundColor(Color.BLACK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AspectAdapter extends RecyclerView.Adapter<AspectAdapter.ViewHolder> {
|
|
||||||
private boolean isAmoledColorMode;
|
|
||||||
private final AppSettings appSettings;
|
|
||||||
private final DiasporaAspect[] aspectList;
|
|
||||||
private final List<String> aspectFavsList;
|
|
||||||
private final OnSomethingClickListener<Object> aspectClickedListener;
|
|
||||||
|
|
||||||
static class ViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
@BindView(R.id.recycler_view__list_item__text)
|
|
||||||
public TextView title;
|
|
||||||
@BindView(R.id.recycler_view__list_item__favourite)
|
|
||||||
AppCompatImageView favouriteImage;
|
|
||||||
@BindView(R.id.recycler_view__list_item__root)
|
|
||||||
RelativeLayout root;
|
|
||||||
|
|
||||||
ViewHolder(View v) {
|
|
||||||
super(v);
|
|
||||||
ButterKnife.bind(this, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AspectAdapter(AppSettings appSettings, OnSomethingClickListener<Object> aspectClickedListener) {
|
|
||||||
this.appSettings = appSettings;
|
|
||||||
this.aspectList = appSettings.getAspects();
|
|
||||||
this.aspectFavsList = new ArrayList<>(Arrays.asList(appSettings.getAspectFavs()));
|
|
||||||
this.aspectClickedListener = aspectClickedListener;
|
|
||||||
this.isAmoledColorMode = appSettings.isAmoledColorMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return aspectList.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AspectAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext())
|
|
||||||
.inflate(R.layout.recycler_list__list_item_with_fav, parent, false);
|
|
||||||
return new ViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
|
||||||
// Alternating colors
|
|
||||||
final Context c = holder.root.getContext();
|
|
||||||
final DiasporaAspect aspect = aspectList[position];
|
|
||||||
holder.title.setText(aspect.name);
|
|
||||||
if (position % 2 == 1) {
|
|
||||||
holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : ContextUtils.get().rcolor(R.color.alternate_row_color));
|
|
||||||
holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK);
|
|
||||||
} else {
|
|
||||||
holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Color.WHITE);
|
|
||||||
holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Favourite (Star) Image
|
|
||||||
applyFavouriteImage(holder.favouriteImage, isAspectFaved(aspect.name));
|
|
||||||
|
|
||||||
// Click on fav button
|
|
||||||
holder.favouriteImage.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
if (isAspectFaved(aspect.name)) {
|
|
||||||
aspectFavsList.remove(aspectFavsList.indexOf(aspect.name));
|
|
||||||
} else {
|
|
||||||
aspectFavsList.add(aspect.name);
|
|
||||||
}
|
|
||||||
appSettings.setAspectFavs(aspectFavsList);
|
|
||||||
applyFavouriteImage(holder.favouriteImage, isAspectFaved(aspect.name));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
holder.root.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
aspectClickedListener.onSomethingClicked(null, null, aspect.id + "");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isAspectFaved(String tag) {
|
|
||||||
return aspectFavsList.contains(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void applyFavouriteImage(AppCompatImageView imageView, boolean isFaved) {
|
|
||||||
imageView.setImageResource(isFaved ? R.drawable.ic_star_filled_48px : R.drawable.ic_star_border_black_48px);
|
|
||||||
imageView.setColorFilter(isFaved ? appSettings.getAccentColor() : (isAmoledColorMode ? Color.GRAY : 0), PorterDuff.Mode.SRC_ATOP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -36,6 +36,7 @@ import android.support.customtabs.CustomTabsSession;
|
||||||
import android.support.design.widget.AppBarLayout;
|
import android.support.design.widget.AppBarLayout;
|
||||||
import android.support.design.widget.NavigationView;
|
import android.support.design.widget.NavigationView;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
@ -61,8 +62,8 @@ import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.github.dfa.diaspora_android.App;
|
import com.github.dfa.diaspora_android.App;
|
||||||
import com.github.dfa.diaspora_android.BuildConfig;
|
|
||||||
import com.github.dfa.diaspora_android.R;
|
import com.github.dfa.diaspora_android.R;
|
||||||
|
import com.github.dfa.diaspora_android.data.DiasporaAspect;
|
||||||
import com.github.dfa.diaspora_android.data.DiasporaPodList;
|
import com.github.dfa.diaspora_android.data.DiasporaPodList;
|
||||||
import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
|
import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
|
||||||
import com.github.dfa.diaspora_android.listener.DiasporaUserProfileChangedListener;
|
import com.github.dfa.diaspora_android.listener.DiasporaUserProfileChangedListener;
|
||||||
|
@ -71,6 +72,7 @@ import com.github.dfa.diaspora_android.receiver.OpenExternalLinkReceiver;
|
||||||
import com.github.dfa.diaspora_android.receiver.UpdateTitleReceiver;
|
import com.github.dfa.diaspora_android.receiver.UpdateTitleReceiver;
|
||||||
import com.github.dfa.diaspora_android.ui.BadgeDrawable;
|
import com.github.dfa.diaspora_android.ui.BadgeDrawable;
|
||||||
import com.github.dfa.diaspora_android.ui.PodSelectionDialog;
|
import com.github.dfa.diaspora_android.ui.PodSelectionDialog;
|
||||||
|
import com.github.dfa.diaspora_android.ui.SearchOrCustomTextDialogCreator;
|
||||||
import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
|
import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
|
||||||
import com.github.dfa.diaspora_android.ui.theme.ThemedActivity;
|
import com.github.dfa.diaspora_android.ui.theme.ThemedActivity;
|
||||||
import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder;
|
import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder;
|
||||||
|
@ -306,14 +308,6 @@ public class MainActivity extends ThemedActivity
|
||||||
BrowserFragment bf = new BrowserFragment();
|
BrowserFragment bf = new BrowserFragment();
|
||||||
fm.beginTransaction().add(bf, fragmentTag).commit();
|
fm.beginTransaction().add(bf, fragmentTag).commit();
|
||||||
return bf;
|
return bf;
|
||||||
case TagListFragment.TAG:
|
|
||||||
TagListFragment hlf = new TagListFragment();
|
|
||||||
fm.beginTransaction().add(hlf, fragmentTag).commit();
|
|
||||||
return hlf;
|
|
||||||
case AspectListFragment.TAG:
|
|
||||||
AspectListFragment alf = new AspectListFragment();
|
|
||||||
fm.beginTransaction().add(alf, fragmentTag).commit();
|
|
||||||
return alf;
|
|
||||||
case PodSelectionFragment.TAG:
|
case PodSelectionFragment.TAG:
|
||||||
PodSelectionFragment psf = new PodSelectionFragment();
|
PodSelectionFragment psf = new PodSelectionFragment();
|
||||||
fm.beginTransaction().add(psf, fragmentTag).commit();
|
fm.beginTransaction().add(psf, fragmentTag).commit();
|
||||||
|
@ -370,6 +364,13 @@ public class MainActivity extends ThemedActivity
|
||||||
* @param fragment Fragment to show
|
* @param fragment Fragment to show
|
||||||
*/
|
*/
|
||||||
protected void showFragment(ThemedFragment fragment) {
|
protected void showFragment(ThemedFragment fragment) {
|
||||||
|
if (PodSelectionFragment.TAG.equals(fragment.getTag())) {
|
||||||
|
Fragment fragment1 = fm.findFragmentByTag(DiasporaStreamFragment.TAG);
|
||||||
|
if (fragment1 != null) {
|
||||||
|
new net.gsantner.opoc.util.ContextUtils(this).restartApp(MainActivity.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AppLog.v(this, "showFragment()");
|
AppLog.v(this, "showFragment()");
|
||||||
ThemedFragment currentTop = (ThemedFragment) fm.findFragmentById(R.id.fragment_container);
|
ThemedFragment currentTop = (ThemedFragment) fm.findFragmentById(R.id.fragment_container);
|
||||||
if (currentTop == null || !currentTop.getFragmentTag().equals(fragment.getFragmentTag())) {
|
if (currentTop == null || !currentTop.getFragmentTag().equals(fragment.getFragmentTag())) {
|
||||||
|
@ -457,7 +458,7 @@ public class MainActivity extends ThemedActivity
|
||||||
navMenu.findItem(R.id.nav_statistics).setVisible(_appSettings.isVisibleInNavStatistics());
|
navMenu.findItem(R.id.nav_statistics).setVisible(_appSettings.isVisibleInNavStatistics());
|
||||||
navMenu.findItem(R.id.nav_reports).setVisible(_appSettings.isVisibleInNavReports());
|
navMenu.findItem(R.id.nav_reports).setVisible(_appSettings.isVisibleInNavReports());
|
||||||
navMenu.findItem(R.id.nav_toggle_desktop_page).setVisible(_appSettings.isVisibleInNavToggleMobileDesktop());
|
navMenu.findItem(R.id.nav_toggle_desktop_page).setVisible(_appSettings.isVisibleInNavToggleMobileDesktop());
|
||||||
navMenu.findItem(R.id.nav_dandelion).setVisible(_appSettings.isVisibleInNavDandelionAccount());
|
navMenu.findItem(R.id.nav_product_support).setVisible(_appSettings.isVisibleInNavGsantnerAccount());
|
||||||
|
|
||||||
|
|
||||||
// Hide whole group (for logged in use) if no pod was selected
|
// Hide whole group (for logged in use) if no pod was selected
|
||||||
|
@ -561,16 +562,18 @@ public class MainActivity extends ThemedActivity
|
||||||
} else if ("sc_new_post".equals(action)) {
|
} else if ("sc_new_post".equals(action)) {
|
||||||
openDiasporaUrl(urls.getNewPostUrl());
|
openDiasporaUrl(urls.getNewPostUrl());
|
||||||
return;
|
return;
|
||||||
} else if ("sc_nav_followed_tags".equals(action)) {
|
|
||||||
showFragment(getFragment(TagListFragment.TAG));
|
|
||||||
return;
|
|
||||||
} else if ("sc_aspects".equals(action)) {
|
|
||||||
showFragment(getFragment(AspectListFragment.TAG));
|
|
||||||
return;
|
|
||||||
} else if ("sc_activities".equals(action)) {
|
} else if ("sc_activities".equals(action)) {
|
||||||
openDiasporaUrl(urls.getActivityUrl());
|
openDiasporaUrl(urls.getActivityUrl());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if ("sc_contacts".equals(action)) {
|
||||||
|
onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_aspects));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ("sc_tags".equals(action)) {
|
||||||
|
onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_followed_tags));
|
||||||
|
return;
|
||||||
|
}
|
||||||
//Catch split screen recreation
|
//Catch split screen recreation
|
||||||
if (action != null && action.equals(Intent.ACTION_MAIN) && getTopFragment() != null) {
|
if (action != null && action.equals(Intent.ACTION_MAIN) && getTopFragment() != null) {
|
||||||
return;
|
return;
|
||||||
|
@ -1062,12 +1065,39 @@ public class MainActivity extends ThemedActivity
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R.id.nav_followed_tags: {
|
case R.id.nav_followed_tags: {
|
||||||
showFragment(getFragment(TagListFragment.TAG));
|
SearchOrCustomTextDialogCreator.showDiasporaTagsDialog(this, arg -> {
|
||||||
|
if (arg.startsWith(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX)) {
|
||||||
|
arg = arg.replace(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX, "").trim();
|
||||||
|
if (arg.equals(getString(R.string.pref_title__manage_tags))) {
|
||||||
|
openDiasporaUrl(urls.getManageTagsUrl());
|
||||||
|
} else {
|
||||||
|
openDiasporaUrl(urls.getAllFollowedTagsUrl());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
openDiasporaUrl(urls.getSearchTagsUrl(arg));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R.id.nav_aspects: {
|
case R.id.nav_aspects: {
|
||||||
showFragment(getFragment(AspectListFragment.TAG));
|
SearchOrCustomTextDialogCreator.showDiasporaAspectsDialog(this, arg -> {
|
||||||
|
if (arg.startsWith(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX)) {
|
||||||
|
arg = arg.replace(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX, "").trim();
|
||||||
|
if (arg.equals(getString(R.string.pref_desc__manage_contacts))) {
|
||||||
|
openDiasporaUrl(urls.getContactsUrl());
|
||||||
|
} else if (arg.equals(getString(R.string.nav_profile))) {
|
||||||
|
openDiasporaUrl(urls.getProfileUrl());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (DiasporaAspect daspect : _appSettings.getAspects()) {
|
||||||
|
if (arg.equals(daspect.name)) {
|
||||||
|
openDiasporaUrl(urls.getAspectUrl(Long.toString(daspect.id)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1148,8 +1178,8 @@ public class MainActivity extends ThemedActivity
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R.id.nav_dandelion: {
|
case R.id.nav_product_support: {
|
||||||
openDiasporaUrl(urls.getProfileUrl("48b78420923501341ef3782bcb452bd5"));
|
openDiasporaUrl(urls.getProfileUrl("d1cbdd70095301341e834860008dbc6c"));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -483,11 +483,7 @@ public class SettingsActivity extends ThemedActivity implements SharedPreference
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
appSettings.resetAppSettings();
|
appSettings.resetAppSettings();
|
||||||
appSettings.resetPodSettings();
|
appSettings.resetPodSettings();
|
||||||
Intent restartActivity = new Intent(getActivity(), MainActivity.class);
|
new net.gsantner.opoc.util.ContextUtils(appSettings.getContext()).restartApp(MainActivity.class);
|
||||||
PendingIntent pendingIntent = PendingIntent.getActivity(getActivity(), 12374, restartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
|
|
||||||
AlarmManager mgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
|
|
||||||
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
|
|
||||||
System.exit(0);
|
|
||||||
}
|
}
|
||||||
}).setNegativeButton(android.R.string.cancel, null)
|
}).setNegativeButton(android.R.string.cancel, null)
|
||||||
.create().show();
|
.create().show();
|
||||||
|
|
|
@ -1,206 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the dandelion*.
|
|
||||||
|
|
||||||
dandelion* 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.
|
|
||||||
|
|
||||||
dandelion* 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 the dandelion*.
|
|
||||||
|
|
||||||
If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.github.dfa.diaspora_android.activity;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v7.widget.AppCompatImageView;
|
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.RelativeLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.github.dfa.diaspora_android.App;
|
|
||||||
import com.github.dfa.diaspora_android.R;
|
|
||||||
import com.github.dfa.diaspora_android.listener.OnSomethingClickListener;
|
|
||||||
import com.github.dfa.diaspora_android.ui.theme.ThemedFragment;
|
|
||||||
import com.github.dfa.diaspora_android.util.AppSettings;
|
|
||||||
import com.github.dfa.diaspora_android.util.ContextUtils;
|
|
||||||
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fragment that shows a list of the HashTags the user follows
|
|
||||||
*/
|
|
||||||
public class TagListFragment extends ThemedFragment implements OnSomethingClickListener<Object> {
|
|
||||||
|
|
||||||
public static final String TAG = "com.github.dfa.diaspora_android.TagListFragment";
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__recycler_view)
|
|
||||||
public RecyclerView followedTagsRecyclerView;
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__spacer)
|
|
||||||
public View space;
|
|
||||||
|
|
||||||
@BindView(R.id.fragment_list__root)
|
|
||||||
public RelativeLayout rootView;
|
|
||||||
|
|
||||||
protected App app;
|
|
||||||
protected DiasporaUrlHelper urls;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getLayoutResId() {
|
|
||||||
return R.layout.recycler_list__fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
|
||||||
super.onViewCreated(view, savedInstanceState);
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
app = (App) getActivity().getApplication();
|
|
||||||
AppSettings appSettings = app.getSettings();
|
|
||||||
urls = new DiasporaUrlHelper(appSettings);
|
|
||||||
|
|
||||||
followedTagsRecyclerView.setHasFixedSize(true);
|
|
||||||
followedTagsRecyclerView.setNestedScrollingEnabled(false);
|
|
||||||
|
|
||||||
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
|
|
||||||
followedTagsRecyclerView.setLayoutManager(layoutManager);
|
|
||||||
|
|
||||||
final FollowedTagsAdapter adapter = new FollowedTagsAdapter(appSettings, this);
|
|
||||||
followedTagsRecyclerView.setAdapter(adapter);
|
|
||||||
|
|
||||||
//Set window title
|
|
||||||
getActivity().setTitle(R.string.nav_followed_tags);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getFragmentTag() {
|
|
||||||
return TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onBackPressed() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSomethingClicked(Object null1, Integer null2, String tag) {
|
|
||||||
((MainActivity) getActivity()).openDiasporaUrl(urls.getSearchTagsUrl(tag));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void applyColorToViews() {
|
|
||||||
followedTagsRecyclerView.invalidate();
|
|
||||||
if (getAppSettings().isAmoledColorMode()) {
|
|
||||||
rootView.setBackgroundColor(Color.BLACK);
|
|
||||||
space.setBackgroundColor(Color.BLACK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class FollowedTagsAdapter extends RecyclerView.Adapter<FollowedTagsAdapter.ViewHolder> {
|
|
||||||
private boolean isAmoledColorMode;
|
|
||||||
private AppSettings appSettings;
|
|
||||||
private String[] followedTagsList;
|
|
||||||
private List<String> followedTagsFavsList;
|
|
||||||
private OnSomethingClickListener<Object> tagClickedListener;
|
|
||||||
|
|
||||||
static class ViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
@BindView(R.id.recycler_view__list_item__text)
|
|
||||||
public TextView title;
|
|
||||||
@BindView(R.id.recycler_view__list_item__favourite)
|
|
||||||
AppCompatImageView favouriteImage;
|
|
||||||
@BindView(R.id.recycler_view__list_item__root)
|
|
||||||
RelativeLayout root;
|
|
||||||
|
|
||||||
ViewHolder(View v) {
|
|
||||||
super(v);
|
|
||||||
ButterKnife.bind(this, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FollowedTagsAdapter(AppSettings appSettings, OnSomethingClickListener<Object> tagClickedListener) {
|
|
||||||
this.appSettings = appSettings;
|
|
||||||
this.followedTagsList = appSettings.getFollowedTags();
|
|
||||||
this.followedTagsFavsList = new ArrayList<>(Arrays.asList(appSettings.getFollowedTagsFavs()));
|
|
||||||
this.tagClickedListener = tagClickedListener;
|
|
||||||
this.isAmoledColorMode = appSettings.isAmoledColorMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return followedTagsList.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FollowedTagsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext())
|
|
||||||
.inflate(R.layout.recycler_list__list_item_with_fav, parent, false);
|
|
||||||
return new ViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(final ViewHolder holder, final int position) {
|
|
||||||
// Alternating colors
|
|
||||||
final Context c = holder.root.getContext();
|
|
||||||
final String tag = followedTagsList[position];
|
|
||||||
holder.title.setText(tag);
|
|
||||||
if (position % 2 == 1) {
|
|
||||||
holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : ContextUtils.get().rcolor(R.color.alternate_row_color));
|
|
||||||
holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK);
|
|
||||||
} else {
|
|
||||||
holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Color.WHITE);
|
|
||||||
holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Favourite (Star) Image
|
|
||||||
applyFavouriteImage(holder.favouriteImage, isFollowedTagFaved(tag));
|
|
||||||
|
|
||||||
// Click on fav button
|
|
||||||
holder.favouriteImage.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
if (isFollowedTagFaved(tag)) {
|
|
||||||
followedTagsFavsList.remove(followedTagsFavsList.indexOf(tag));
|
|
||||||
} else {
|
|
||||||
followedTagsFavsList.add(tag);
|
|
||||||
}
|
|
||||||
appSettings.setFollowedTagsFavs(followedTagsFavsList);
|
|
||||||
applyFavouriteImage(holder.favouriteImage, isFollowedTagFaved(tag));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
holder.root.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
tagClickedListener.onSomethingClicked(null, null, tag);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isFollowedTagFaved(String tag) {
|
|
||||||
return followedTagsFavsList.contains(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void applyFavouriteImage(AppCompatImageView imageView, boolean isFaved) {
|
|
||||||
imageView.setImageResource(isFaved ? R.drawable.ic_star_filled_48px : R.drawable.ic_star_border_black_48px);
|
|
||||||
imageView.setColorFilter(isFaved ? appSettings.getAccentColor() : (isAmoledColorMode ? Color.GRAY : 0), PorterDuff.Mode.SRC_ATOP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package com.github.dfa.diaspora_android.ui;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.support.v4.content.ContextCompat;
|
||||||
|
|
||||||
|
import com.github.dfa.diaspora_android.R;
|
||||||
|
import com.github.dfa.diaspora_android.data.DiasporaAspect;
|
||||||
|
import com.github.dfa.diaspora_android.util.AppSettings;
|
||||||
|
|
||||||
|
import net.gsantner.opoc.ui.SearchOrCustomTextDialog;
|
||||||
|
import net.gsantner.opoc.util.Callback;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class SearchOrCustomTextDialogCreator {
|
||||||
|
public static final String SPECIAL_PREFIX = "\uD83D\uDCA0";
|
||||||
|
|
||||||
|
public static void showDiasporaTagsDialog(final Activity activity, final Callback.a1<String> callback) {
|
||||||
|
SearchOrCustomTextDialog.DialogOptions dopt = new SearchOrCustomTextDialog.DialogOptions();
|
||||||
|
baseConf(activity, dopt);
|
||||||
|
dopt.callback = callback;
|
||||||
|
dopt.isSearchEnabled = true;
|
||||||
|
dopt.searchHintText = R.string.search;
|
||||||
|
dopt.titleText = R.string.tags;
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
|
AppSettings appSettings = AppSettings.get();
|
||||||
|
ArrayList<String> hl = new ArrayList<>();
|
||||||
|
ArrayList<String> data = new ArrayList<>(Arrays.asList(appSettings.getFollowedTags()));
|
||||||
|
if (data.size() > 0) {
|
||||||
|
String highlighted = surroundString(data.remove(0));
|
||||||
|
data.add(0, highlighted);
|
||||||
|
hl.add(highlighted);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int strid : new int[]{R.string.pref_title__manage_tags}) {
|
||||||
|
String special = surroundString(appSettings.rstr(strid));
|
||||||
|
data.add(0, special);
|
||||||
|
hl.add(special);
|
||||||
|
}
|
||||||
|
dopt.data = data;
|
||||||
|
dopt.highlightData = hl;
|
||||||
|
activity.runOnUiThread(() -> SearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt));
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String surroundString(String text) {
|
||||||
|
return SPECIAL_PREFIX + " " + text + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void showDiasporaAspectsDialog(final Activity activity, final Callback.a1<String> callback) {
|
||||||
|
SearchOrCustomTextDialog.DialogOptions dopt = new SearchOrCustomTextDialog.DialogOptions();
|
||||||
|
baseConf(activity, dopt);
|
||||||
|
dopt.callback = callback;
|
||||||
|
dopt.isSearchEnabled = false;
|
||||||
|
dopt.titleText = R.string.contacts;
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
|
AppSettings appSettings = AppSettings.get();
|
||||||
|
ArrayList<String> hl = new ArrayList<>();
|
||||||
|
ArrayList<String> data = new ArrayList<>();
|
||||||
|
for (DiasporaAspect aspect : AppSettings.get().getAspects()) {
|
||||||
|
data.add(aspect.name);
|
||||||
|
}
|
||||||
|
for (int strid : new int[]{R.string.nav_profile, R.string.pref_desc__manage_contacts}) {
|
||||||
|
String special = surroundString(appSettings.rstr(strid));
|
||||||
|
data.add(0, special);
|
||||||
|
hl.add(special);
|
||||||
|
}
|
||||||
|
dopt.data = data;
|
||||||
|
dopt.highlightData = hl;
|
||||||
|
activity.runOnUiThread(() -> SearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt));
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void baseConf(Activity activity, SearchOrCustomTextDialog.DialogOptions dopt) {
|
||||||
|
AppSettings as = new AppSettings(activity);
|
||||||
|
dopt.isDarkDialog = as.isAmoledColorMode();
|
||||||
|
dopt.textColor = ContextCompat.getColor(activity, dopt.isDarkDialog ? R.color.white : R.color.primary_text);
|
||||||
|
dopt.highlightColor = as.getAccentColor();
|
||||||
|
}
|
||||||
|
}
|
|
@ -347,8 +347,8 @@ public class AppSettings extends SharedPreferencesPropertyBackend {
|
||||||
return getBool(R.string.pref_key__visibility_nav__reports, false);
|
return getBool(R.string.pref_key__visibility_nav__reports, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisibleInNavDandelionAccount() {
|
public boolean isVisibleInNavGsantnerAccount() {
|
||||||
return getBool(R.string.pref_key__visibility_nav__dandelion_account, false);
|
return getBool(R.string.pref_key__visibility_nav__gsantner_account, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisibleInNavToggleMobileDesktop() {
|
public boolean isVisibleInNavToggleMobileDesktop() {
|
||||||
|
|
|
@ -229,6 +229,15 @@ public class DiasporaUrlHelper {
|
||||||
return getPodUrl() + SUBURL_SEARCH_TAGS + query;
|
return getPodUrl() + SUBURL_SEARCH_TAGS + query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a url that queries posts for the given hashtag query
|
||||||
|
*
|
||||||
|
* @return https://(pod-domain.tld)/followed_tags
|
||||||
|
*/
|
||||||
|
public String getAllFollowedTagsUrl() {
|
||||||
|
return getPodUrl() + SUBURL_FOLOWED_TAGS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a url that queries user accounts for query
|
* Return a url that queries user accounts for query
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,189 @@
|
||||||
|
/*#######################################################
|
||||||
|
*
|
||||||
|
* Maintained by Gregor Santner, 2017-
|
||||||
|
* https://gsantner.net/
|
||||||
|
*
|
||||||
|
* License: Apache 2.0
|
||||||
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
#########################################################*/
|
||||||
|
package net.gsantner.opoc.ui;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.support.annotation.ColorInt;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.annotation.StringRes;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.support.v7.widget.AppCompatEditText;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.Filter;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import net.gsantner.opoc.util.Callback;
|
||||||
|
import net.gsantner.opoc.util.ContextUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@SuppressWarnings("WeakerAccess")
|
||||||
|
public class SearchOrCustomTextDialog {
|
||||||
|
|
||||||
|
public static class DialogOptions {
|
||||||
|
public Callback.a1<String> callback;
|
||||||
|
public List<? extends CharSequence> data = new ArrayList<>();
|
||||||
|
public List<? extends CharSequence> highlightData = new ArrayList<>();
|
||||||
|
public String messageText = "";
|
||||||
|
public boolean isSearchEnabled = true;
|
||||||
|
public boolean isDarkDialog = false;
|
||||||
|
|
||||||
|
@ColorInt
|
||||||
|
public int textColor = 0xFF000000;
|
||||||
|
@ColorInt
|
||||||
|
public int highlightColor = 0xFF00FF00;
|
||||||
|
@StringRes
|
||||||
|
public int cancelButtonText = android.R.string.cancel;
|
||||||
|
@StringRes
|
||||||
|
public int okButtonText = android.R.string.ok;
|
||||||
|
@StringRes
|
||||||
|
public int titleText = android.R.string.untitled;
|
||||||
|
@StringRes
|
||||||
|
public int searchHintText = android.R.string.search_go;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showMultiChoiceDialogWithSearchFilterUI(final Activity activity, final DialogOptions dopt) {
|
||||||
|
final List<CharSequence> allItems = new ArrayList<>(dopt.data);
|
||||||
|
final List<CharSequence> filteredItems = new ArrayList<>(allItems);
|
||||||
|
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, dopt.isDarkDialog
|
||||||
|
? android.support.v7.appcompat.R.style.Theme_AppCompat_Dialog
|
||||||
|
: android.support.v7.appcompat.R.style.Theme_AppCompat_Light_Dialog
|
||||||
|
);
|
||||||
|
|
||||||
|
final ArrayAdapter<CharSequence> listAdapter = new ArrayAdapter<CharSequence>(activity, android.R.layout.simple_list_item_1, filteredItems) {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||||
|
TextView textView = (TextView) super.getView(pos, convertView, parent);
|
||||||
|
String text = textView.getText().toString();
|
||||||
|
|
||||||
|
textView.setTextColor(dopt.textColor);
|
||||||
|
if (dopt.highlightData.contains(text)) {
|
||||||
|
textView.setTextColor(dopt.highlightColor);
|
||||||
|
}
|
||||||
|
return textView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Filter getFilter() {
|
||||||
|
return new Filter() {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
protected void publishResults(final CharSequence constraint, final FilterResults results) {
|
||||||
|
filteredItems.clear();
|
||||||
|
filteredItems.addAll((List<String>) results.values);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FilterResults performFiltering(final CharSequence constraint) {
|
||||||
|
final FilterResults res = new FilterResults();
|
||||||
|
final ArrayList<CharSequence> resList = new ArrayList<>();
|
||||||
|
final String fil = constraint.toString();
|
||||||
|
|
||||||
|
for (final CharSequence str : allItems) {
|
||||||
|
if ("".equals(fil) || str.toString().toLowerCase(Locale.getDefault()).contains(fil.toLowerCase(Locale.getDefault()))) {
|
||||||
|
resList.add(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.values = resList;
|
||||||
|
res.count = resList.size();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
final AppCompatEditText searchEditText = new AppCompatEditText(activity);
|
||||||
|
searchEditText.setSingleLine(true);
|
||||||
|
searchEditText.setMaxLines(1);
|
||||||
|
searchEditText.setTextColor(dopt.textColor);
|
||||||
|
searchEditText.setHintTextColor((dopt.textColor & 0x00FFFFFF) | 0x99000000);
|
||||||
|
searchEditText.setHint(dopt.searchHintText);
|
||||||
|
|
||||||
|
searchEditText.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(final Editable arg0) {
|
||||||
|
listAdapter.getFilter().filter(searchEditText.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final ListView listView = new ListView(activity);
|
||||||
|
final LinearLayout linearLayout = new LinearLayout(activity);
|
||||||
|
listView.setAdapter(listAdapter);
|
||||||
|
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
if (dopt.isSearchEnabled) {
|
||||||
|
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||||
|
ContextUtils cu = new net.gsantner.opoc.util.ContextUtils(listView.getContext());
|
||||||
|
int px = (int) (new net.gsantner.opoc.util.ContextUtils(listView.getContext()).convertDpToPx(8));
|
||||||
|
lp.setMargins(px, px / 2, px, px / 2);
|
||||||
|
linearLayout.addView(searchEditText, lp);
|
||||||
|
}
|
||||||
|
final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
|
||||||
|
layoutParams.weight = 1;
|
||||||
|
linearLayout.addView(listView, layoutParams);
|
||||||
|
if (!TextUtils.isEmpty(dopt.messageText)) {
|
||||||
|
dialogBuilder.setMessage(dopt.messageText);
|
||||||
|
}
|
||||||
|
dialogBuilder.setView(linearLayout)
|
||||||
|
.setTitle(dopt.titleText)
|
||||||
|
.setOnCancelListener(null)
|
||||||
|
.setNegativeButton(dopt.cancelButtonText, null);
|
||||||
|
if (dopt.isSearchEnabled) {
|
||||||
|
dialogBuilder.setPositiveButton(dopt.okButtonText, (dialogInterface, i) -> {
|
||||||
|
dialogInterface.dismiss();
|
||||||
|
if (dopt.callback != null && !TextUtils.isEmpty(searchEditText.getText().toString())) {
|
||||||
|
dopt.callback.callback(searchEditText.getText().toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
final AlertDialog dialog = dialogBuilder.create();
|
||||||
|
listView.setOnItemClickListener((parent, view, position, id) -> {
|
||||||
|
dialog.dismiss();
|
||||||
|
if (dopt.callback != null) {
|
||||||
|
dopt.callback.callback(filteredItems.get(position).toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
searchEditText.setOnKeyListener((keyView, keyCode, keyEvent) -> {
|
||||||
|
if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
|
||||||
|
dialog.dismiss();
|
||||||
|
if (dopt.callback != null && !TextUtils.isEmpty(searchEditText.getText().toString())) {
|
||||||
|
dopt.callback.callback(searchEditText.getText().toString());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@
|
||||||
package net.gsantner.opoc.util;
|
package net.gsantner.opoc.util;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
|
@ -380,6 +381,9 @@ public class ContextUtils {
|
||||||
Intent inte = new Intent(_context, classToStart);
|
Intent inte = new Intent(_context, classToStart);
|
||||||
PendingIntent inteP = PendingIntent.getActivity(_context, 555, inte, PendingIntent.FLAG_CANCEL_CURRENT);
|
PendingIntent inteP = PendingIntent.getActivity(_context, 555, inte, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||||
AlarmManager mgr = (AlarmManager) _context.getSystemService(Context.ALARM_SERVICE);
|
AlarmManager mgr = (AlarmManager) _context.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
if (_context instanceof Activity) {
|
||||||
|
((Activity) _context).finish();
|
||||||
|
}
|
||||||
if (mgr != null) {
|
if (mgr != null) {
|
||||||
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, inteP);
|
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, inteP);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<item
|
<item
|
||||||
android:id="@+id/nav_followed_tags"
|
android:id="@+id/nav_followed_tags"
|
||||||
android:icon="@drawable/ic_local_offer_black_48px"
|
android:icon="@drawable/ic_local_offer_black_48px"
|
||||||
android:title="@string/nav_followed_tags" />
|
android:title="@string/tags" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/nav_aspects"
|
android:id="@+id/nav_aspects"
|
||||||
android:icon="@drawable/ic_group_black_48px"
|
android:icon="@drawable/ic_group_black_48px"
|
||||||
|
@ -54,9 +54,9 @@
|
||||||
android:title="@string/nav_public_activities" />
|
android:title="@string/nav_public_activities" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/nav_dandelion"
|
android:id="@+id/nav_product_support"
|
||||||
android:icon="@drawable/ic_person_black_24px"
|
android:icon="@drawable/ic_person_black_24px"
|
||||||
android:title="@string/dandelion" />
|
android:title="@string/gsantner" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/nav_statistics"
|
android:id="@+id/nav_statistics"
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
*via [dandelion*](/people?q=dandelion00%40diasp.org) client [(Source)](https://github.com/gsantner/dandelion)*</string>
|
*via [dandelion*](/people?q=dandelion00%40diasp.org) client [(Source)](https://github.com/gsantner/dandelion)*</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="tags" translatable="false">Tags</string>
|
||||||
<string name="tor" translatable="false">Tor</string>
|
<string name="tor" translatable="false">Tor</string>
|
||||||
<string name="HTTP" translatable="false">HTTP</string>
|
<string name="HTTP" translatable="false">HTTP</string>
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@
|
||||||
<string name="pref_key__visibility_nav__reports" translatable="false">pref_key__visibility_nav__reports</string>
|
<string name="pref_key__visibility_nav__reports" translatable="false">pref_key__visibility_nav__reports</string>
|
||||||
<string name="pref_key__visibility_nav__statistics" translatable="false">pref_key__visibility_nav__statistics</string>
|
<string name="pref_key__visibility_nav__statistics" translatable="false">pref_key__visibility_nav__statistics</string>
|
||||||
<string name="pref_key__visibility_nav__toggle_mobile_desktop" translatable="false">pref_key__visibility_nav__toggle_mobile_desktop</string>
|
<string name="pref_key__visibility_nav__toggle_mobile_desktop" translatable="false">pref_key__visibility_nav__toggle_mobile_desktop</string>
|
||||||
<string name="pref_key__visibility_nav__dandelion_account" translatable="false">pref_key__visibility_nav__dandelion_account</string>
|
<string name="pref_key__visibility_nav__gsantner_account" translatable="false">pref_key__visibility_nav__gsantner_account</string>
|
||||||
<string name="pref_key__podprofile_avatar_url" translatable="false">pref_key__podprofile_avatar_url</string>
|
<string name="pref_key__podprofile_avatar_url" translatable="false">pref_key__podprofile_avatar_url</string>
|
||||||
<string name="pref_key__podprofile_name" translatable="false">pref_key__podprofile_name</string>
|
<string name="pref_key__podprofile_name" translatable="false">pref_key__podprofile_name</string>
|
||||||
<string name="pref_key__podprofile_id" translatable="false">pref_key__podprofile_id</string>
|
<string name="pref_key__podprofile_id" translatable="false">pref_key__podprofile_id</string>
|
||||||
|
@ -146,4 +147,5 @@
|
||||||
<string name="pref_key__recreate_main_activity" translatable="false">pref_key__recreate_main_activity</string>
|
<string name="pref_key__recreate_main_activity" translatable="false">pref_key__recreate_main_activity</string>
|
||||||
<string name="pref_key__show_title" translatable="false">pref_key__show_title</string>
|
<string name="pref_key__show_title" translatable="false">pref_key__show_title</string>
|
||||||
<string name="pdf" translatable="false">PDF</string>
|
<string name="pdf" translatable="false">PDF</string>
|
||||||
|
<string name="gsantner" translatable="false">gsantner</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -35,14 +35,14 @@
|
||||||
</shortcut>
|
</shortcut>
|
||||||
|
|
||||||
<shortcut
|
<shortcut
|
||||||
android:shortcutId="sc_aspects"
|
android:shortcutId="sc_contacts"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:icon="@drawable/sc_aspect"
|
android:icon="@drawable/sc_aspect"
|
||||||
android:shortcutShortLabel="@string/aspects"
|
android:shortcutShortLabel="@string/contacts"
|
||||||
android:shortcutLongLabel="@string/aspects"
|
android:shortcutLongLabel="@string/contacts"
|
||||||
android:shortcutDisabledMessage="@string/aspects">
|
android:shortcutDisabledMessage="@string/contacts">
|
||||||
<intent
|
<intent
|
||||||
android:action="sc_aspects"
|
android:action="sc_contacts"
|
||||||
android:targetPackage="com.github.dfa.diaspora_android"
|
android:targetPackage="com.github.dfa.diaspora_android"
|
||||||
android:targetClass="com.github.dfa.diaspora_android.activity.MainActivity" />
|
android:targetClass="com.github.dfa.diaspora_android.activity.MainActivity" />
|
||||||
<!-- If your shortcut is associated with multiple intents, include them
|
<!-- If your shortcut is associated with multiple intents, include them
|
||||||
|
@ -52,14 +52,14 @@
|
||||||
</shortcut>
|
</shortcut>
|
||||||
|
|
||||||
<shortcut
|
<shortcut
|
||||||
android:shortcutId="sc_nav_followed_tags"
|
android:shortcutId="sc_tags"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:icon="@drawable/sc_tags"
|
android:icon="@drawable/sc_tags"
|
||||||
android:shortcutShortLabel="@string/nav_followed_tags"
|
android:shortcutShortLabel="@string/tags"
|
||||||
android:shortcutLongLabel="@string/nav_followed_tags"
|
android:shortcutLongLabel="@string/tags"
|
||||||
android:shortcutDisabledMessage="@string/nav_followed_tags">
|
android:shortcutDisabledMessage="@string/tags">
|
||||||
<intent
|
<intent
|
||||||
android:action="sc_nav_followed_tags"
|
android:action="sc_tags"
|
||||||
android:targetPackage="com.github.dfa.diaspora_android"
|
android:targetPackage="com.github.dfa.diaspora_android"
|
||||||
android:targetClass="com.github.dfa.diaspora_android.activity.MainActivity" />
|
android:targetClass="com.github.dfa.diaspora_android.activity.MainActivity" />
|
||||||
<!-- If your shortcut is associated with multiple intents, include them
|
<!-- If your shortcut is associated with multiple intents, include them
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
android:title="@string/nav_public_activities"/>
|
android:title="@string/nav_public_activities"/>
|
||||||
<com.github.dfa.diaspora_android.ui.theme.ThemedVisibilityPreference
|
<com.github.dfa.diaspora_android.ui.theme.ThemedVisibilityPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="@string/pref_key__visibility_nav__dandelion_account"
|
android:key="@string/pref_key__visibility_nav__gsantner_account"
|
||||||
android:title="@string/dandelion"/>
|
android:title="@string/gsantner"/>
|
||||||
|
|
||||||
</com.github.dfa.diaspora_android.ui.theme.ThemedPreferenceCategory>
|
</com.github.dfa.diaspora_android.ui.theme.ThemedPreferenceCategory>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue