/** * Wire * Copyright (C) 2016 Wire Swiss GmbH * * 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 <http://www.gnu.org/licenses/>. */ package com.waz.zclient; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.ShareCompat; import android.util.AttributeSet; import android.view.View; import com.waz.api.Self; import com.waz.api.User; import com.waz.utils.wrappers.AndroidURI; import com.waz.utils.wrappers.AndroidURIUtil; import com.waz.utils.wrappers.URI; import com.waz.zclient.controllers.SharingController; import com.waz.zclient.controllers.accentcolor.AccentColorObserver; import com.waz.zclient.controllers.confirmation.TwoButtonConfirmationCallback; import com.waz.zclient.controllers.sharing.SharedContentType; import com.waz.zclient.conversation.ShareToMultipleFragment; import com.waz.zclient.core.stores.api.ZMessagingApiStoreObserver; import com.waz.zclient.utils.AssetUtils; import com.waz.zclient.utils.PermissionUtils; import com.waz.zclient.utils.ViewUtils; import com.waz.zclient.views.menus.ConfirmationMenu; import timber.log.Timber; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class ShareActivity extends BaseActivity implements AccentColorObserver, ZMessagingApiStoreObserver { private static final String TAG = ShareActivity.class.getName(); private static final int EXTERNAL_STORAGE_PERMISSION_CODE = 1; private static final String[] EXTERNAL_STORAGE_PERMISSIONS = {android.Manifest.permission.READ_EXTERNAL_STORAGE}; private ConfirmationMenu confirmationMenu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_share); confirmationMenu = ViewUtils.getView(this, R.id.cm__conversation_list__login_prompt); if (!PermissionUtils.hasSelfPermissions(this, EXTERNAL_STORAGE_PERMISSIONS)) { ActivityCompat.requestPermissions(this, EXTERNAL_STORAGE_PERMISSIONS, EXTERNAL_STORAGE_PERMISSION_CODE); } if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.fl_main_content, ShareToMultipleFragment.newInstance(), ShareToMultipleFragment.TAG()) .commit(); } handleIncomingIntent(); } @Override public int getBaseTheme() { return R.style.Theme_Dark; } @Override public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) { return super.onCreateView(name, context, attrs); } @Override public void onStart() { getStoreFactory().getZMessagingApiStore().addApiObserver(this); getControllerFactory().getAccentColorController().addAccentColorObserver(this); super.onStart(); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIncomingIntent(); } @Override public void onStop() { getStoreFactory().getZMessagingApiStore().removeApiObserver(this); getControllerFactory().getAccentColorController().removeAccentColorObserver(this); super.onStop(); } @Override public void onDestroy() { confirmationMenu = null; super.onDestroy(); } private void setUserImage(User callingUser) { getControllerFactory().getBackgroundController().setImageAsset(callingUser.getPicture()); } ////////////////////////////////////////////////////////////////////////////////////////// // // AccentColorObserver // ////////////////////////////////////////////////////////////////////////////////////////// @Override public void onAccentColorHasChanged(Object sender, int color) { confirmationMenu.setButtonColor(color); } private void enterApplication(Self self) { if (!self.isLoggedIn()) { // User not logged in showUserNotLoggedInDialog(); } else if (self.isEmailVerified()) { // User logged in User callingUser = getStoreFactory().getZMessagingApiStore().getApi().getSelf().getUser(); setUserImage(callingUser); } } public void showUserNotLoggedInDialog() { confirmationMenu.setHeader(getString(R.string.sharing__user_not_logged_in__dialog__title)); confirmationMenu.setText(getString(R.string.sharing__user_not_logged_in__dialog__message)); confirmationMenu.setPositiveButton(getString(R.string.sharing__user_not_logged_in__dialog__confirm)); confirmationMenu.setNegativeButton(""); confirmationMenu.setCallback(new TwoButtonConfirmationCallback() { @Override public void positiveButtonClicked(boolean checkboxIsSelected) { finish(); } @Override public void negativeButtonClicked() { } @Override public void onHideAnimationEnd(boolean confirmed, boolean canceled, boolean checkboxIsSelected) { } }); confirmationMenu.animateToShow(true); } private void handleIncomingIntent() { ShareCompat.IntentReader intentReader = ShareCompat.IntentReader.from(this); if (!intentReader.isShareIntent()) { finish(); return; } if (intentReader.getType().equals("text/plain")) { getSharingController().publishTextContent(String.valueOf(intentReader.getText())); } else { final Set<URI> sharedFileUris = new HashSet<>(); if (intentReader.isMultipleShare()) { for (int i = 0; i < intentReader.getStreamCount(); i++) { URI uri = new AndroidURI(intentReader.getStream(i)); if (uri != null) { sharedFileUris.add(uri); } } } else { Uri uri = intentReader.getStream(); if (uri != null) { sharedFileUris.add(new AndroidURI(uri)); } } if (sharedFileUris.size() == 0) { finish(); return; } boolean sharingImages = intentReader.getType().startsWith("image/"); final SharedContentType contentType; if (sharingImages && sharedFileUris.size() == 1) { contentType = SharedContentType.IMAGE; } else { contentType = SharedContentType.FILE; } List<URI> sanitisedUris = new ArrayList<>(); for (URI uri : sharedFileUris) { String path = AssetUtils.getPath(getApplicationContext(), uri); if (path == null) { Timber.e("Something went wrong, unable to retrieve path"); sanitisedUris.add(uri); } else { sanitisedUris.add(AndroidURIUtil.fromFile(new File(path))); } } switch (contentType) { case IMAGE: getSharingController().publishImageContent(sanitisedUris); break; case FILE: getSharingController().publishFileContent(sanitisedUris); break; } } } @Override public void onInitialized(Self self) { enterApplication(self); } @Override public void onLogout() { } @Override public void onForceClientUpdate() { } @Override public void onBackPressed() { Fragment fragment = getSupportFragmentManager().findFragmentByTag(ShareToMultipleFragment.TAG()); if (fragment != null && ((ShareToMultipleFragment) fragment).onBackPressed()) { return; } super.onBackPressed(); } private SharingController getSharingController() { return injectJava(SharingController.class); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); ShareToMultipleFragment fragment = ((ShareToMultipleFragment) getSupportFragmentManager().findFragmentByTag(ShareToMultipleFragment.TAG())); if (fragment != null) { fragment.updatePreview(); } } }