package de.luhmer.owncloudnewsreader; import android.animation.AnimatorListenerAdapter; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.helper.FavIconHandler; import de.luhmer.owncloudnewsreader.helper.ThemeChooser; import de.luhmer.owncloudnewsreader.reader.HttpJsonRequest; import de.luhmer.owncloudnewsreader.reader.owncloud.API; import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; public class NewsReaderListDialogFragment extends DialogFragment{ static NewsReaderListDialogFragment newInstance(long feedId, String dialogTitle, String iconurl, String feedurl) { NewsReaderListDialogFragment f = new NewsReaderListDialogFragment(); Bundle args = new Bundle(); args.putLong("feedid", feedId); args.putString("title", dialogTitle); args.putString("iconurl", iconurl); args.putString("feedurl", feedurl); f.setArguments(args); return f; } private long mFeedId; private String mDialogTitle; private String mDialogText; private String mDialogIconUrl; private RemoveFeedTask mRemoveFeedTask = null; private RenameFeedTask mRenameFeedTask = null; private LinkedHashMap<String, MenuAction> mMenuItems; private NewsReaderListActivity parentActivity; private RelativeLayout mRemoveFeedDialogView, mRenameFeedDialogView, mProgressView; private Button mButtonRemoveConfirm, mButtonRemoveCancel, mButtonRenameConfirm, mButtonRenameCancel; private ListView mListView; private EditText mFeedName; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFeedId = getArguments().getLong("feedid"); mDialogTitle = getArguments().getString("title"); mDialogIconUrl = getArguments().getString("iconurl"); mDialogText = getArguments().getString("feedurl"); mMenuItems = new LinkedHashMap<>(); mMenuItems.put(getString(R.string.action_feed_rename), new MenuAction() { @Override public void execute() { showRenameFeedView(mFeedId, mDialogTitle); } }); mMenuItems.put(getString(R.string.action_feed_remove), new MenuAction() { @Override public void execute() { showRemoveFeedView(mFeedId); } }); int style = DialogFragment.STYLE_NO_TITLE; int theme = ThemeChooser.isDarkTheme(getActivity()) ? R.style.FloatingDialog : R.style.FloatingDialogLight; setStyle(style, theme); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_dialog_feedoptions, container, false); TextView tvTitle = (TextView) v.findViewById(R.id.tv_menu_title); TextView tvText = (TextView) v.findViewById(R.id.tv_menu_text); ImageView imgTitle = (ImageView) v.findViewById(R.id.ic_menu_feedicon); mRemoveFeedDialogView = (RelativeLayout) v.findViewById(R.id.remove_feed_dialog); mRenameFeedDialogView = (RelativeLayout) v.findViewById(R.id.rename_feed_dialog); mProgressView = (RelativeLayout) v.findViewById(R.id.progressView); mButtonRemoveConfirm = (Button) v.findViewById(R.id.button_remove_confirm); mButtonRemoveCancel = (Button) v.findViewById(R.id.button_remove_cancel); mButtonRenameConfirm = (Button) v.findViewById(R.id.button_rename_confirm); mButtonRenameCancel = (Button) v.findViewById(R.id.button_rename_cancel); mFeedName = (EditText) v.findViewById(R.id.renamefeed_feedname); FavIconHandler favIconHandler = new FavIconHandler(getContext()); favIconHandler.loadFavIconForFeed(mDialogIconUrl, imgTitle); tvTitle.setText(mDialogTitle); tvText.setText(mDialogText); tvText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mDialogText != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(mDialogText)); startActivity(i); } } }); mListView = (ListView) v.findViewById(R.id.lv_menu_list); List<String> menuItemsList = new ArrayList<>(mMenuItems.keySet()); final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>( getActivity(), R.layout.fragment_dialog_listviewitem, menuItemsList); mListView.setAdapter(arrayAdapter); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { String key = arrayAdapter.getItem(i); MenuAction mAction = mMenuItems.get(key); mAction.execute(); } }); return v; } public void setActivity(Activity parentActivity) { this.parentActivity = (NewsReaderListActivity)parentActivity; } public void showProgress(final boolean show) { int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); mRenameFeedDialogView.setVisibility(show ? View.GONE : View.VISIBLE); mRemoveFeedDialogView.setVisibility(show ? View.GONE : View.VISIBLE); mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); mProgressView.animate().setDuration(shortAnimTime).alpha( show ? 1 : 0).setListener(new AnimatorListenerAdapter() { }); } private void showRenameFeedView(final long feedId, final String feedName) { mFeedName.setText(feedName); mButtonRenameConfirm.setEnabled(false); mListView.setVisibility(View.GONE); mRenameFeedDialogView.setVisibility(View.VISIBLE); mFeedName.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) {} @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().equals(feedName) || s.length() == 0) { mButtonRenameConfirm.setEnabled(false); } else { mButtonRenameConfirm.setEnabled(true); } } }); mButtonRenameCancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dismiss(); } }); mButtonRenameConfirm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showProgress(true); setCancelable(false); getDialog().setCanceledOnTouchOutside(false); mRenameFeedTask = new RenameFeedTask(feedId, mFeedName.getText().toString() ); mRenameFeedTask.execute((Void) null); } }); } private void showRemoveFeedView(final long feedId) { mListView.setVisibility(View.GONE); mRemoveFeedDialogView.setVisibility(View.VISIBLE); mButtonRemoveCancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dismiss(); } }); mButtonRemoveConfirm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showProgress(true); setCancelable(false); getDialog().setCanceledOnTouchOutside(false); mRemoveFeedTask = new RemoveFeedTask(feedId); mRemoveFeedTask.execute((Void) null); } }); } public class RemoveFeedTask extends AsyncTask<Void, Void, Boolean> { private final long mFeedId; RemoveFeedTask(long feedId) { this.mFeedId = feedId; } @Override protected Boolean doInBackground(Void... params) { API api = new APIv2(HttpJsonRequest.getInstance().getRootUrl()); try { int status = HttpJsonRequest.getInstance().performRemoveFeedRequest(api.getFeedUrl(), mFeedId); if(status == 200) { return true; } Log.d("NewFeedActivity", "Status: " + status); } catch(Exception ex) { ex.printStackTrace(); } return false; } @Override protected void onPostExecute(final Boolean success) { mRemoveFeedTask = null; if (success) { DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext()); dbConn.removeFeedById(mFeedId); Long currentFeedId = parentActivity.getNewsReaderDetailFragment().getIdFeed(); if(currentFeedId != null && currentFeedId == mFeedId) { parentActivity.switchToAllUnreadItemsFolder(); } parentActivity.getSlidingListFragment().ReloadAdapter(); parentActivity.updateCurrentRssView(); } else { Toast.makeText(getContext().getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong), Toast.LENGTH_LONG).show(); } dismiss(); } @Override protected void onCancelled() { mRemoveFeedTask = null; dismiss(); } } public class RenameFeedTask extends AsyncTask<Void, Void, Boolean> { private final long mFeedId; private final String mFeedName; RenameFeedTask(long feedId, String newName) { mFeedId = feedId; mFeedName = newName; } @Override protected Boolean doInBackground(Void... params) { API api = new APIv2(HttpJsonRequest.getInstance().getRootUrl()); try { int status = HttpJsonRequest.getInstance().performRenameFeedRequest(api.getFeedUrl(), mFeedId, mFeedName); if(status == 200) { return true; } Log.d("NewFeedActivity", "Status: " + status); } catch(Exception ex) { ex.printStackTrace(); } return false; } @Override protected void onPostExecute(final Boolean success) { mRenameFeedTask = null; if (success) { DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext()); dbConn.renameFeedById(mFeedId, mFeedName); parentActivity.getSlidingListFragment().ReloadAdapter(); parentActivity.startSync(); } else { Toast.makeText(getContext().getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong), Toast.LENGTH_LONG).show(); } dismiss(); } @Override protected void onCancelled() { mRenameFeedTask = null; dismiss(); } } interface MenuAction { void execute(); } }