From f414f46cbaa3bd79aa155bbd497677a948dfbf4b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 27 Jun 2019 11:52:30 +0200 Subject: [PATCH] General setting: avatar and display name --- .../core/preference/UserAvatarPreference.kt | 13 +- .../settings/VectorSettingsGeneral.kt | 77 +++- .../VectorSettingsPreferencesFragment.kt | 429 ------------------ 3 files changed, 83 insertions(+), 436 deletions(-) delete mode 100755 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt diff --git a/vector/src/main/java/im/vector/riotredesign/core/preference/UserAvatarPreference.kt b/vector/src/main/java/im/vector/riotredesign/core/preference/UserAvatarPreference.kt index 89eb6549..79969ffa 100755 --- a/vector/src/main/java/im/vector/riotredesign/core/preference/UserAvatarPreference.kt +++ b/vector/src/main/java/im/vector/riotredesign/core/preference/UserAvatarPreference.kt @@ -24,6 +24,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import im.vector.matrix.android.api.session.Session import im.vector.riotredesign.R +import im.vector.riotredesign.features.home.AvatarRenderer open class UserAvatarPreference : Preference { @@ -52,11 +53,15 @@ open class UserAvatarPreference : Preference { } open fun refreshAvatar() { - if (null != mAvatarView && null != mSession) { - // TODO - // val myUser = session!!.myUser - // VectorUtils.loadUserAvatar(context, session, mAvatarView, myUser.avatarUrl, myUser.user_id, myUser.displayname) + val session = mSession ?: return + val view = mAvatarView ?: return + + session.getUser(session.sessionParams.credentials.userId)?.let { + AvatarRenderer.render(it, view) + } ?: run { + AvatarRenderer.render(null, session.sessionParams.credentials.userId, null, view) } + } fun setSession(session: Session) { diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt index f073c796..6f38ef18 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt @@ -19,6 +19,7 @@ package im.vector.riotredesign.features.settings import android.app.Activity import android.content.Context import android.content.Intent +import android.os.AsyncTask import android.text.Editable import android.text.TextUtils import android.view.View @@ -44,6 +45,7 @@ import im.vector.riotredesign.core.utils.copyToClipboard import im.vector.riotredesign.core.utils.toast import im.vector.riotredesign.features.MainActivity import im.vector.riotredesign.features.themes.ThemeUtils +import java.lang.ref.WeakReference import java.util.* class VectorSettingsGeneral : VectorSettingsBaseFragment() { @@ -89,7 +91,8 @@ class VectorSettingsGeneral : VectorSettingsBaseFragment() { // Display name mDisplayNamePreference.let { - it.summary = "TODO" // session.myUser.displayname + it.summary = mSession.getUser(mSession.sessionParams.credentials.userId)?.displayName ?: "" + it.text = it.summary.toString() it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> onDisplayNameClick(newValue?.let { (it as String).trim() }) false @@ -98,7 +101,8 @@ class VectorSettingsGeneral : VectorSettingsBaseFragment() { // Password mPasswordPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - onPasswordUpdateClick() + notImplemented() + // onPasswordUpdateClick() false } @@ -114,7 +118,8 @@ class VectorSettingsGeneral : VectorSettingsBaseFragment() { // it.editText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - addEmail((newValue as String).trim()) + notImplemented() + //addEmail((newValue as String).trim()) false } } @@ -251,6 +256,56 @@ class VectorSettingsGeneral : VectorSettingsBaseFragment() { when (requestCode) { REQUEST_NEW_PHONE_NUMBER -> refreshPhoneNumbersList() REQUEST_PHONEBOOK_COUNTRY -> onPhonebookCountryUpdate(data) + /* TODO + VectorUtils.TAKE_IMAGE -> { + val thumbnailUri = VectorUtils.getThumbnailUriFromIntent(activity, data, session.mediaCache) + + if (null != thumbnailUri) { + displayLoadingView() + + val resource = ResourceUtils.openResource(activity, thumbnailUri, null) + + if (null != resource) { + session.mediaCache.uploadContent(resource.mContentStream, null, resource.mMimeType, null, object : MXMediaUploadListener() { + + override fun onUploadError(uploadId: String?, serverResponseCode: Int, serverErrorMessage: String?) { + activity?.runOnUiThread { onCommonDone(serverResponseCode.toString() + " : " + serverErrorMessage) } + } + + override fun onUploadComplete(uploadId: String?, contentUri: String?) { + activity?.runOnUiThread { + session.myUser.updateAvatarUrl(contentUri, object : MatrixCallback { + override fun onSuccess(info: Void?) { + onCommonDone(null) + refreshDisplay() + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + if (MatrixError.M_CONSENT_NOT_GIVEN == e.errcode) { + activity?.runOnUiThread { + hideLoadingView() + (activity as VectorAppCompatActivity).consentNotGivenHelper.displayDialog(e) + } + } else { + onCommonDone(e.localizedMessage) + } + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + } + } + }) + } + } + } + */ } } } @@ -808,6 +863,22 @@ class VectorSettingsGeneral : VectorSettingsBaseFragment() { */ } + private class ClearMediaCacheAsyncTask internal constructor( + backgroundTask: () -> Unit, + onCompleteTask: () -> Unit + ) : AsyncTask() { + + private val backgroundTaskReference = WeakReference(backgroundTask) + private val onCompleteTaskReference = WeakReference(onCompleteTask) + override fun doInBackground(vararg params: Unit?) { + backgroundTaskReference.get()?.invoke() + } + + override fun onPostExecute(result: Unit?) { + super.onPostExecute(result) + onCompleteTaskReference.get()?.invoke() + } + } companion object { private const val ADD_EMAIL_PREFERENCE_KEY = "ADD_EMAIL_PREFERENCE_KEY" diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt deleted file mode 100755 index d1b98d1a..00000000 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright 2018 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.riotredesign.features.settings - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.content.SharedPreferences -import android.os.AsyncTask -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog -import androidx.core.content.edit -import androidx.preference.Preference -import androidx.preference.PreferenceManager -import im.vector.riotredesign.R -import im.vector.riotredesign.core.preference.BingRule -import im.vector.riotredesign.core.preference.VectorPreference -import java.lang.ref.WeakReference - -// TODO Remove -class VectorSettingsPreferencesFragment { - - // disable some updates if there is - // TODO private val mNetworkListener = IMXNetworkEventListener { refreshDisplay() } - // events listener - // TODO private val mEventsListener = object : MXEventListener() { - // TODO override fun onBingRulesUpdate() { - // TODO refreshPreferences() - // TODO refreshDisplay() - // TODO } - - // TODO override fun onAccountInfoUpdate(myUser: MyUser) { - // TODO // refresh the settings value - // TODO PreferenceManager.getDefaultSharedPreferences(VectorApp.getInstance().applicationContext).edit { - // TODO putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, myUser.displayname) - // TODO } - - // TODO refreshDisplay() - // TODO } - // TODO } - - - // TODO private var mDisplayedPushers = ArrayList() - - private var interactionListener: VectorSettingsFragmentInteractionListener? = null - - - fun bindPref() { - // push rules - - // background sync tuning settings - // these settings are useless and hidden if the app is registered to the FCM push service - /* - TODO - val pushManager = Matrix.getInstance(appContext).pushManager - if (pushManager.useFcm() && pushManager.hasRegistrationToken()) { - // Hide the section - preferenceScreen.removePreference(backgroundSyncDivider) - preferenceScreen.removePreference(backgroundSyncCategory) - } else { - backgroundSyncPreference.let { - it.isChecked = pushManager.isBackgroundSyncAllowed - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, aNewValue -> - val newValue = aNewValue as Boolean - - if (newValue != pushManager.isBackgroundSyncAllowed) { - pushManager.isBackgroundSyncAllowed = newValue - } - - displayLoadingView() - - Matrix.getInstance(activity)?.pushManager?.forceSessionsRegistration(object : MatrixCallback { - override fun onSuccess(info: Void?) { - hideLoadingView() - } - - override fun onMatrixError(e: MatrixError?) { - hideLoadingView() - } - - override fun onNetworkError(e: java.lang.Exception?) { - hideLoadingView() - } - - override fun onUnexpectedError(e: java.lang.Exception?) { - hideLoadingView() - } - }) - - true - } - } - } - */ - - - - } - - fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { - // if the user toggles the contacts book permission - /* TODO - if (TextUtils.equals(key, ContactsManager.CONTACTS_BOOK_ACCESS_KEY)) { - // reset the current snapshot - ContactsManager.getInstance().clearSnapshot() - } - */ - } - - /* TODO - override fun onAttach(context: Context) { - super.onAttach(context) - if (context is VectorSettingsFragmentInteractionListener) { - interactionListener = context - } - } - - override fun onDetach() { - interactionListener = null - super.onDetach() - } - */ - -// override fun onResume() { -// super.onResume() -// -// -// /* TODO -// if (session.isAlive) { -// val context = activity?.applicationContext -// -// session.dataHandler.addListener(mEventsListener) -// -// Matrix.getInstance(context)?.addNetworkEventListener(mNetworkListener) -// -// session.myUser.refreshThirdPartyIdentifiers(object : SimpleApiCallback() { -// override fun onSuccess(info: Void?) { -// // ensure that the activity still exists -// // and the result is called in the right thread -// activity?.runOnUiThread { -// refreshEmailsList() -// refreshPhoneNumbersList() -// } -// } -// }) -// -// Matrix.getInstance(context)?.pushManager?.refreshPushersList(Matrix.getInstance(context)?.sessions, object : SimpleApiCallback(activity) { -// override fun onSuccess(info: Void?) { -// refreshPushersList() -// } -// }) -// -// PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this) -// -// // refresh anything else -// refreshPreferences() -// refreshNotificationPrivacy() -// refreshDisplay() -// refreshBackgroundSyncPrefs() -// } -// */ -// -// interactionListener?.requestedKeyToHighlight()?.let { key -> -// interactionListener?.requestHighlightPreferenceKeyOnResume(null) -// val preference = findPreference(key) -// (preference as? VectorPreference)?.isHighlighted = true -// } -// } - -// override fun onPause() { -// super.onPause() -// -// val context = activity?.applicationContext -// -// /* TODO -// if (session.isAlive) { -// session.dataHandler.removeListener(mEventsListener) -// Matrix.getInstance(context)?.removeNetworkEventListener(mNetworkListener) -// } -// */ -// -// PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this) -// } - - //============================================================================================================== - // Display methods - //============================================================================================================== - - /** - * Refresh the preferences. - */ - private fun refreshDisplay() { - /* TODO - // If Matrix instance is null, then connection can't be there - val isConnected = Matrix.getInstance(activity)?.isConnected ?: false - val appContext = activity?.applicationContext - - val preferenceManager = preferenceManager - - // refresh the avatar - mUserAvatarPreference.refreshAvatar() - mUserAvatarPreference.isEnabled = isConnected - - // refresh the display name - mDisplayNamePreference.summary = session.myUser.displayname - mDisplayNamePreference.text = session.myUser.displayname - mDisplayNamePreference.isEnabled = isConnected - - // change password - mPasswordPreference.isEnabled = isConnected - - // update the push rules - val preferences = PreferenceManager.getDefaultSharedPreferences(appContext) - - val rules = session.dataHandler.pushRules() - - val pushManager = Matrix.getInstance(appContext)?.pushManager - - for (preferenceKey in mPrefKeyToBingRuleId.keys) { - val preference = preferenceManager.findPreference(preferenceKey) - - if (null != preference) { - - if (preference is SwitchPreference) { - when (preferenceKey) { - PreferencesManager.SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY -> - preference.isChecked = pushManager?.areDeviceNotificationsAllowed() ?: true - - PreferencesManager.SETTINGS_TURN_SCREEN_ON_PREFERENCE_KEY -> { - preference.isChecked = pushManager?.isScreenTurnedOn ?: false - preference.isEnabled = pushManager?.areDeviceNotificationsAllowed() ?: true - } - else -> { - preference.isEnabled = null != rules && isConnected - preference.isChecked = preferences.getBoolean(preferenceKey, false) - } - } - } - } - } - - // If notifications are disabled for the current user account or for the current user device - // The others notifications settings have to be disable too - val areNotificationAllowed = rules?.findDefaultRule(BingRule.RULE_ID_DISABLE_ALL)?.isEnabled == true - - mNotificationPrivacyPreference.isEnabled = !areNotificationAllowed - && (pushManager?.areDeviceNotificationsAllowed() ?: true) && pushManager?.useFcm() ?: true - */ - } - - //============================================================================================================== - // Update items methods - //============================================================================================================== - - - fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - /* TODO - VectorUtils.TAKE_IMAGE -> { - val thumbnailUri = VectorUtils.getThumbnailUriFromIntent(activity, data, session.mediaCache) - - if (null != thumbnailUri) { - displayLoadingView() - - val resource = ResourceUtils.openResource(activity, thumbnailUri, null) - - if (null != resource) { - session.mediaCache.uploadContent(resource.mContentStream, null, resource.mMimeType, null, object : MXMediaUploadListener() { - - override fun onUploadError(uploadId: String?, serverResponseCode: Int, serverErrorMessage: String?) { - activity?.runOnUiThread { onCommonDone(serverResponseCode.toString() + " : " + serverErrorMessage) } - } - - override fun onUploadComplete(uploadId: String?, contentUri: String?) { - activity?.runOnUiThread { - session.myUser.updateAvatarUrl(contentUri, object : MatrixCallback { - override fun onSuccess(info: Void?) { - onCommonDone(null) - refreshDisplay() - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - if (MatrixError.M_CONSENT_NOT_GIVEN == e.errcode) { - activity?.runOnUiThread { - hideLoadingView() - (activity as VectorAppCompatActivity).consentNotGivenHelper.displayDialog(e) - } - } else { - onCommonDone(e.localizedMessage) - } - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - } - } - }) - } - } - } - */ - } - } - } - - /** - * Refresh the known information about the account - */ - private fun refreshPreferences() { - //PreferenceManager.getDefaultSharedPreferences(activity).edit { - // putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, "TODO") //session.myUser.displayname) -// - /* TODO - session.dataHandler.pushRules()?.let { - for (preferenceKey in mPrefKeyToBingRuleId.keys) { - val preference = findPreference(preferenceKey) - - if (null != preference && preference is SwitchPreference) { - val ruleId = mPrefKeyToBingRuleId[preferenceKey] - - val rule = it.findDefaultRule(ruleId) - var isEnabled = null != rule && rule.isEnabled - - if (TextUtils.equals(ruleId, BingRule.RULE_ID_DISABLE_ALL) || TextUtils.equals(ruleId, BingRule.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS)) { - isEnabled = !isEnabled - } else if (isEnabled) { - val domainActions = rule?.domainActions - - // no action -> noting will be done - if (null == domainActions || domainActions.isEmpty()) { - isEnabled = false - } else if (1 == domainActions.size) { - try { - isEnabled = !TextUtils.equals(domainActions[0] as String, BingRule.ACTION_DONT_NOTIFY) - } catch (e: Exception) { - Timber.e(e, "## refreshPreferences failed " + e.message) - } - - } - }// check if the rule is only defined by don't notify - - putBoolean(preferenceKey, isEnabled) - } - } - } - */ - // } - } - - - //============================================================================================================== - // background sync management - //============================================================================================================== - - /** - * Convert a delay in seconds to string - * - * @param seconds the delay in seconds - * @return the text - */ -// private fun secondsToText(seconds: Int): String { -// return if (seconds > 1) { -// seconds.toString() + " " + getString(R.string.settings_seconds) -// } else { -// seconds.toString() + " " + getString(R.string.settings_second) -// } -// } - - - - private class ClearMediaCacheAsyncTask internal constructor( - backgroundTask: () -> Unit, - onCompleteTask: () -> Unit - ) : AsyncTask() { - - private val backgroundTaskReference = WeakReference(backgroundTask) - private val onCompleteTaskReference = WeakReference(onCompleteTask) - override fun doInBackground(vararg params: Unit?) { - backgroundTaskReference.get()?.invoke() - } - - override fun onPostExecute(result: Unit?) { - super.onPostExecute(result) - onCompleteTaskReference.get()?.invoke() - } - } - - /* ========================================================================================== - * Companion - * ========================================================================================== */ - - companion object { - // arguments indexes - private const val ARG_MATRIX_ID = "VectorSettingsPreferencesFragment.ARG_MATRIX_ID" - -// // static constructor -// fun newInstance(matrixId: String) = VectorSettingsPreferencesFragment() -// .withArgs { -// //putString(ARG_MATRIX_ID, matrixId) -// } - } - -} \ No newline at end of file