diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 0774cd120..77f2b4d8f 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -44,7 +44,6 @@ import retrofit2.http.GET; import retrofit2.http.Header; import retrofit2.http.POST; import retrofit2.http.PUT; -import retrofit2.http.Query; import retrofit2.http.QueryMap; import retrofit2.http.Url; @@ -95,9 +94,10 @@ public interface NcApi { Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room/roomToken */ + @FormUrlEncoded @PUT - Observable renameRoom(@Header("Authorization") String authorization, @Url String url, - @QueryMap Map options); + Observable renameRoom(@Header("Authorization") String authorization, @Url String url, + @Field("roomName") String roomName); /* @@ -242,8 +242,9 @@ public interface NcApi { @Url String url, @QueryMap Map fields); + @FormUrlEncoded @PUT Observable setPassword(@Header("Authorization") String authorization, @Url String url, - @Query("password") String password); + @Field("password") String password); } diff --git a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java index 0cf1e08cb..bb2a685f8 100644 --- a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java +++ b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java @@ -82,19 +82,6 @@ public class ApiHelper { return retrofitBucket; } - public static RetrofitBucket getRetrofitBucketForRenameRoom(String baseUrl, String token, String newRoomName) { - RetrofitBucket retrofitBucket = new RetrofitBucket(); - retrofitBucket.setUrl(baseUrl + ocsApiVersion + spreedApiVersion + "/room/" + token); - - Map queryMap = new HashMap<>(); - - queryMap.put("roomName", newRoomName); - - retrofitBucket.setQueryMap(queryMap); - - return retrofitBucket; - } - public static RetrofitBucket getRetrofitBucketForAddParticipant(String baseUrl, String token, String user) { RetrofitBucket retrofitBucket = new RetrofitBucket(); retrofitBucket.setUrl(baseUrl + ocsApiVersion + spreedApiVersion + "/room/" + token + "/participants"); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java index 534c688bc..3aec7e299 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java @@ -297,12 +297,16 @@ public class CallsListController extends BaseController implements SearchView.On } if (fromBottomSheet) { - bottomSheet.setCancelable(true); - if (bottomSheet.isShowing()) { - bottomSheet.cancel(); - } + new Handler().postDelayed(() -> { + bottomSheet.setCancelable(true); + if (bottomSheet.isShowing()) { + bottomSheet.cancel(); + } + }, 2500); } + }); + } private void prepareViews() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java index b2bf1a059..8945f0140 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java @@ -117,21 +117,22 @@ public class CallMenuController extends BaseController implements FlexibleAdapte } else { if (room.isHasPassword()) { menuItems.add(new MenuItem(getResources().getString(R.string.nc_change_password), 4)); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_clear_password), 5)); } else { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_set_password), 5)); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_set_password), 6)); } } } if (room.isPublic()) { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_share_link), 6)); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_share_link), 7)); if (room.canModerate()) { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_make_call_private), 7)); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_make_call_private), 8)); } } if (room.isDeletable()) { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_delete_call), 8)); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_delete_call), 9)); } } @@ -139,14 +140,23 @@ public class CallMenuController extends BaseController implements FlexibleAdapte public boolean onItemClick(int position) { MenuItem menuItem = (MenuItem) adapter.getItem(position); Bundle bundle = new Bundle(); - bundle.putParcelable(BundleKeys.KEY_ROOM, Parcels.wrap(room)); if (menuItem != null) { int tag = menuItem.getTag(); - if (tag > 0 && tag < 9) { - eventBus.post(new BottomSheetLockEvent(false, 0, false)); + + if (tag == 5) { + room.setPassword(""); + } + bundle.putParcelable(BundleKeys.KEY_ROOM, Parcels.wrap(room)); + + if (tag > 0 && tag < 10) { bundle.putInt(BundleKeys.KEY_OPERATION_CODE, tag); - if (tag != 6 && tag != 2) { + if (tag != 2 && tag != 4 && tag != 6 && tag != 7) { + eventBus.post(new BottomSheetLockEvent(false, 0, false)); getRouter().pushController(RouterTransaction.with(new OperationsMenuController(bundle))); + } else if (tag != 7) { + getRouter().pushController(RouterTransaction.with(new EntryMenuController(bundle))); + } else { + // do nothing for now, this is share } } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.java new file mode 100644 index 000000000..5e2799fb0 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.java @@ -0,0 +1,164 @@ +/* + * Nextcloud Talk application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.controllers.bottomsheet; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.bluelinelabs.conductor.RouterTransaction; +import com.nextcloud.talk.R; +import com.nextcloud.talk.api.models.json.rooms.Room; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.controllers.base.BaseController; +import com.nextcloud.talk.events.BottomSheetLockEvent; +import com.nextcloud.talk.utils.bundle.BundleKeys; + +import org.greenrobot.eventbus.EventBus; +import org.parceler.Parcels; + +import javax.inject.Inject; + +import autodagger.AutoInjector; +import butterknife.BindView; +import butterknife.OnClick; +import studio.carbonylgroup.textfieldboxes.ExtendedEditText; +import studio.carbonylgroup.textfieldboxes.TextFieldBoxes; + +@AutoInjector(NextcloudTalkApplication.class) +public class EntryMenuController extends BaseController { + private static final String TAG = "EntryMenuController"; + + @BindView(R.id.ok_button) + Button proceedButton; + + @BindView(R.id.extended_edit_text) + ExtendedEditText editText; + + @BindView(R.id.text_field_boxes) + TextFieldBoxes textFieldBoxes; + + @Inject + EventBus eventBus; + + private int operationCode; + private Room room; + + public EntryMenuController(Bundle args) { + super(args); + this.operationCode = args.getInt(BundleKeys.KEY_OPERATION_CODE); + this.room = Parcels.unwrap(args.getParcelable(BundleKeys.KEY_ROOM)); + } + + @Override + protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { + return inflater.inflate(R.layout.controller_entry_menu, container, false); + } + + @OnClick(R.id.ok_button) + public void onProceedButtonClick() { + eventBus.post(new BottomSheetLockEvent(false, 0, false)); + + Bundle bundle = new Bundle(); + if (operationCode == 4 || operationCode == 6) { + room.setPassword(editText.getText().toString()); + } else { + room.setName(editText.getText().toString()); + } + bundle.putParcelable(BundleKeys.KEY_ROOM, Parcels.wrap(room)); + bundle.putInt(BundleKeys.KEY_OPERATION_CODE, operationCode); + getRouter().pushController(RouterTransaction.with(new OperationsMenuController(bundle))); + } + + @Override + protected void onViewBound(@NonNull View view) { + super.onViewBound(view); + NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + if (operationCode == 2) { + if (room.getName() == null || !room.getName().equals(s.toString())) { + if (proceedButton.isEnabled()) { + proceedButton.setEnabled(true); + proceedButton.setAlpha(1.0f); + } + } else { + if (!proceedButton.isEnabled()) { + proceedButton.setEnabled(false); + proceedButton.setAlpha(0.7f); + } + textFieldBoxes.setError(getResources().getString(R.string.nc_call_name_is_same), + true); + } + } else { + if (!proceedButton.isEnabled()) { + proceedButton.setEnabled(true); + proceedButton.setAlpha(1.0f); + } + } + } else { + if (proceedButton.isEnabled()) { + proceedButton.setEnabled(false); + proceedButton.setAlpha(0.7f); + } + } + } + }); + + String helperText = ""; + switch (operationCode) { + case 2: + helperText = getResources().getString(R.string.nc_call_name); + break; + case 4: + helperText = getResources().getString(R.string.nc_new_password); + break; + case 6: + helperText = getResources().getString(R.string.nc_password); + break; + default: + break; + } + + textFieldBoxes.setHelperText(helperText); + editText.requestFocus(); + } + +} diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java index a9a4cc5a3..19acbdc78 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java @@ -37,7 +37,6 @@ import com.nextcloud.talk.api.models.json.rooms.Room; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.events.BottomSheetLockEvent; -import com.nextcloud.talk.models.RetrofitBucket; import com.nextcloud.talk.persistence.entities.UserEntity; import com.nextcloud.talk.utils.ColorUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; @@ -57,6 +56,8 @@ import io.reactivex.schedulers.Schedulers; @AutoInjector(NextcloudTalkApplication.class) public class OperationsMenuController extends BaseController { + private static final String TAG = "OperationsMenuController"; + @BindView(R.id.progress_bar) ProgressBar progressBar; @@ -119,9 +120,8 @@ public class OperationsMenuController extends BaseController { .subscribe(operationsObserver); break; case 2: - RetrofitBucket retrofitBucket = ApiHelper.getRetrofitBucketForRenameRoom(userEntity.getBaseUrl(), - room.getToken(), room.getName()); - ncApi.renameRoom(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap()) + ncApi.renameRoom(credentials, ApiHelper.getRoom(userEntity.getBaseUrl(), room.getToken()), + room.getName()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .retry(1) @@ -137,6 +137,7 @@ public class OperationsMenuController extends BaseController { break; case 4: case 5: + case 6: String pass = ""; if (room.getPassword() != null) { pass = room.getPassword(); @@ -148,10 +149,10 @@ public class OperationsMenuController extends BaseController { .retry(1) .subscribe(operationsObserver); break; - case 6: + case 7: // Operation 6 is sharing, so we handle this differently break; - case 7: + case 8: ncApi.makeRoomPrivate(credentials, ApiHelper.getUrlForRoomVisibility(userEntity.getBaseUrl(), room .getToken())) .subscribeOn(Schedulers.newThread()) @@ -159,7 +160,7 @@ public class OperationsMenuController extends BaseController { .retry(1) .subscribe(operationsObserver); break; - case 8: + case 9: ncApi.deleteRoom(credentials, ApiHelper.getUrlForRoomParticipants(userEntity.getBaseUrl(), room.getToken())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) @@ -174,20 +175,31 @@ public class OperationsMenuController extends BaseController { private void showResultImage(boolean everythingOK) { progressBar.setVisibility(View.GONE); + + if (everythingOK) { + resultImageView.setImageDrawable(ColorUtils.getTintedDrawable(getResources(), R.drawable + .ic_check_circle_black_24dp, R.color.nc_darkGreen)); + } else { + resultImageView.setImageDrawable(ColorUtils.getTintedDrawable(getResources(), R.drawable + .ic_cancel_black_24dp, R.color.nc_darkRed)); + } + resultImageView.setVisibility(View.VISIBLE); if (everythingOK) { resultsTextView.setText(R.string.nc_all_ok_operation); } else { + resultsTextView.setTextColor(getResources().getColor(R.color.nc_darkRed)); resultsTextView.setText(R.string.nc_failed_to_perform_operation); } - boolean shouldRefreshData = operationCode != 4 && operationCode != 5; resultsTextView.setVisibility(View.VISIBLE); if (everythingOK) { - eventBus.post(new BottomSheetLockEvent(true, 2500, shouldRefreshData)); + eventBus.post(new BottomSheetLockEvent(true, 2500, true)); } else { - okButton.setOnClickListener(v -> eventBus.post(new BottomSheetLockEvent(true, 0, shouldRefreshData))); + resultImageView.setImageDrawable(ColorUtils.getTintedDrawable(getResources(), R.drawable + .ic_cancel_black_24dp, R.color.nc_darkRed)); + okButton.setOnClickListener(v -> eventBus.post(new BottomSheetLockEvent(true, 0, true))); okButton.setVisibility(View.VISIBLE); } } @@ -210,16 +222,12 @@ public class OperationsMenuController extends BaseController { @Override public void onNext(Object o) { - resultImageView.setImageDrawable(ColorUtils.getTintedDrawable(getResources(), R.drawable - .ic_check_circle_black_24dp, R.color.nc_darkGreen)); showResultImage(true); } @Override public void onError(Throwable e) { if (retryCount == 1) { - resultImageView.setImageDrawable(ColorUtils.getTintedDrawable(getResources(), R.drawable - .ic_cancel_black_24dp, R.color.nc_darkRed)); showResultImage(false); } dispose(); @@ -231,5 +239,9 @@ public class OperationsMenuController extends BaseController { } } - + @Override + public void onDestroy() { + super.onDestroy(); + dispose(); + } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ColorUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ColorUtils.java index d9483f913..bd56859b9 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ColorUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ColorUtils.java @@ -21,7 +21,6 @@ package com.nextcloud.talk.utils; import android.content.res.Resources; -import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; @@ -30,7 +29,7 @@ public class ColorUtils { public static Drawable getTintedDrawable(Resources res, @DrawableRes int drawableResId, @ColorRes int colorResId) { Drawable drawable = res.getDrawable(drawableResId); int color = res.getColor(colorResId); - drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + drawable.setTint(color); return drawable; } } diff --git a/app/src/main/res/layout/controller_entry_menu.xml b/app/src/main/res/layout/controller_entry_menu.xml new file mode 100644 index 000000000..85c217534 --- /dev/null +++ b/app/src/main/res/layout/controller_entry_menu.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + +