Use a single AccountManager for android.

This commit is contained in:
Gabriel Calero 2018-05-02 12:11:11 -03:00
parent ce8bd13685
commit 0f08bd8fa1
10 changed files with 114 additions and 27 deletions

View file

@ -151,9 +151,10 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea
unpackAndroidAssets();
qInstallMessageHandler(oldMessageHandler);
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [](const QString& a) {
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::androidActivityRequested, [](const QString& a, const bool backToScene) {
QAndroidJniObject string = QAndroidJniObject::fromString(a);
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;)V", string.object<jstring>());
jboolean jBackToScene = (jboolean) backToScene;
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;Z)V", string.object<jstring>(), jBackToScene);
});
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](const QString &c) {

View file

@ -199,10 +199,13 @@ public class InterfaceActivity extends QtActivity {
}
}
public void openAndroidActivity(String activityName) {
public void openAndroidActivity(String activityName, boolean backToScene) {
switch (activityName) {
case "Home": {
case "Home":
case "Login": {
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName);
intent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene);
startActivity(intent);
break;
}
@ -228,7 +231,7 @@ public class InterfaceActivity extends QtActivity {
@Override
public void onBackPressed() {
openAndroidActivity("Home");
openAndroidActivity("Home", false);
}
}

View file

@ -17,6 +17,7 @@ import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -40,6 +41,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
GotoFragment.OnGotoInteractionListener {
private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar;
public static final String DEFAULT_FRAGMENT = "Home";
public static final String EXTRA_FRAGMENT = "fragment";
public static final String EXTRA_BACK_TO_SCENE = "backToScene";
private String TAG = "HighFidelity";
public native boolean nativeIsLoggedIn();
@ -51,6 +56,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
private ImageView mProfilePicture;
private TextView mDisplayName;
private boolean backToScene;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -76,7 +83,34 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(ContextCompat.getColor(this, R.color.statusbar_color));
loadHomeFragment();
if (getIntent() != null) {
if (getIntent().hasExtra(EXTRA_FRAGMENT)) {
loadFragment(getIntent().getStringExtra(EXTRA_FRAGMENT));
} else {
loadFragment(DEFAULT_FRAGMENT);
}
if (getIntent().hasExtra(EXTRA_BACK_TO_SCENE)) {
backToScene = getIntent().getBooleanExtra(EXTRA_BACK_TO_SCENE, false);
}
}
}
private void loadFragment(String fragment) {
switch (fragment) {
case "Login":
loadLoginFragment();
break;
case "Home":
loadHomeFragment();
break;
case "Privacy Policy":
loadPrivacyPolicyFragment();
break;
default:
Log.e(TAG, "Unknown fragment " + fragment);
}
}
private void loadHomeFragment() {
@ -200,6 +234,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
goToDomain(domainUrl);
}
private void goToLastLocation() {
goToDomain("");
}
private void goToDomain(String domainUrl) {
Intent intent = new Intent(this, InterfaceActivity.class);
intent.putExtra(InterfaceActivity.DOMAIN_URL, domainUrl);
@ -212,6 +250,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public void onLoginCompleted() {
loadHomeFragment();
updateLoginMenu();
if (backToScene) {
backToScene = false;
goToLastLocation();
}
}
public void handleUsernameChanged(String username) {
@ -246,7 +288,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
@Override
public void onError(Exception e) {
mProfilePicture.setImageResource(PROFILE_PICTURE_PLACEHOLDER);
}
}
@ -255,8 +296,24 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
int index = getFragmentManager().getBackStackEntryCount() - 1;
if (index > -1) {
super.onBackPressed();
if (backToScene) {
backToScene = false;
goToLastLocation();
}
} else {
finishAffinity();
finishAffinity();
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putBoolean(EXTRA_BACK_TO_SCENE, backToScene);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
backToScene = savedInstanceState.getBoolean(EXTRA_BACK_TO_SCENE, false);
}
}

View file

@ -14,7 +14,6 @@
AndroidHelper::AndroidHelper() :
_accountManager ()
{
workerThread.start();
}
AndroidHelper::~AndroidHelper() {
@ -22,18 +21,20 @@ AndroidHelper::~AndroidHelper() {
workerThread.wait();
}
void AndroidHelper::init() {
qDebug() << "[LOGIN] AndroidHelper::init";
workerThread.start();
_accountManager = DependencyManager::get<AccountManager>();
_accountManager->moveToThread(&workerThread);
}
QSharedPointer<AccountManager> AndroidHelper::getAccountManager() {
if (!_accountManager) {
_accountManager = QSharedPointer<AccountManager>(new AccountManager, &QObject::deleteLater);
_accountManager->setIsAgent(true);
_accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL());
_accountManager->moveToThread(&workerThread);
}
assert(_accountManager);
return _accountManager;
}
void AndroidHelper::requestActivity(const QString &activityName) {
emit androidActivityRequested(activityName);
void AndroidHelper::requestActivity(const QString &activityName, const bool backToScene) {
emit androidActivityRequested(activityName, backToScene);
}
void AndroidHelper::notifyLoadComplete() {
@ -48,3 +49,6 @@ void AndroidHelper::performHapticFeedback(const QString& feedbackConstant) {
emit hapticFeedbackRequested(feedbackConstant);
}
void AndroidHelper::showLoginDialog() {
emit androidActivityRequested("Login", true);
}

View file

@ -23,7 +23,8 @@ public:
static AndroidHelper instance;
return instance;
}
void requestActivity(const QString &activityName);
void init();
void requestActivity(const QString &activityName, const bool backToScene);
void notifyLoadComplete();
void notifyLoginComplete(bool success);
@ -33,8 +34,12 @@ public:
AndroidHelper(AndroidHelper const&) = delete;
void operator=(AndroidHelper const&) = delete;
public slots:
void showLoginDialog();
signals:
void androidActivityRequested(const QString &activityName);
void androidActivityRequested(const QString &activityName, const bool backToScene);
void qtAppLoadComplete();
void loginComplete(bool success);
void hapticFeedbackRequested(const QString &feedbackConstant);

View file

@ -830,7 +830,11 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) {
DependencyManager::set<Cursor::Manager>();
DependencyManager::set<VirtualPad::Manager>();
DependencyManager::set<DesktopPreviewProvider>();
#if defined(Q_OS_ANDROID)
DependencyManager::set<AccountManager>(); // use the default user agent getter
#else
DependencyManager::set<AccountManager>(std::bind(&Application::getUserAgent, qApp));
#endif
DependencyManager::set<StatTracker>();
DependencyManager::set<ScriptEngines>(ScriptEngine::CLIENT_SCRIPT);
DependencyManager::set<ScriptInitializerMixin, NativeScriptInitializers>();
@ -1189,7 +1193,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
nodeList.data(), SLOT(reset()));
auto dialogsManager = DependencyManager::get<DialogsManager>();
#if defined(Q_OS_ANDROID)
connect(accountManager.data(), &AccountManager::authRequired, this, []() {
AndroidHelper::instance().showLoginDialog();
});
#else
connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);
#endif
connect(accountManager.data(), &AccountManager::usernameChanged, this, &Application::updateWindowTitle);
// set the account manager's root URL and trigger a login request if we don't have the access token
@ -2166,6 +2176,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID());
#if defined(Q_OS_ANDROID)
AndroidHelper::instance().init();
AndroidHelper::instance().notifyLoadComplete();
#endif
}
@ -3673,7 +3684,7 @@ void Application::keyReleaseEvent(QKeyEvent* event) {
#if defined(Q_OS_ANDROID)
if (event->key() == Qt::Key_Back) {
event->accept();
openAndroidActivity("Home");
openAndroidActivity("Home", false);
}
#endif
_controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts
@ -7936,9 +7947,9 @@ void Application::saveNextPhysicsStats(QString filename) {
_physicsEngine->saveNextPhysicsStats(filename);
}
void Application::openAndroidActivity(const QString& activityName) {
void Application::openAndroidActivity(const QString& activityName, const bool backToScene) {
#if defined(Q_OS_ANDROID)
AndroidHelper::instance().requestActivity(activityName);
AndroidHelper::instance().requestActivity(activityName, backToScene);
#endif
}

View file

@ -403,7 +403,7 @@ public slots:
Q_INVOKABLE bool askBeforeSetAvatarUrl(const QString& avatarUrl) { return askToSetAvatarUrl(avatarUrl); }
Q_INVOKABLE void openAndroidActivity(const QString& activityName);
Q_INVOKABLE void openAndroidActivity(const QString& activityName, const bool backToScene);
Q_INVOKABLE void performHapticFeedback(const QString& feedbackConstant);
private slots:

View file

@ -615,9 +615,12 @@ void Wallet::updateImageProvider() {
securityImageProvider->setSecurityImage(_securityImage);
// inform tablet security image provider
QQmlEngine* tabletEngine = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface()->getSurfaceContext()->engine();
securityImageProvider = reinterpret_cast<SecurityImageProvider*>(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME));
securityImageProvider->setSecurityImage(_securityImage);
OffscreenQmlSurface * tabletSurface = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system")->getTabletSurface();
if (tabletSurface) {
QQmlEngine* tabletEngine = tabletSurface->getSurfaceContext()->engine();
securityImageProvider = reinterpret_cast<SecurityImageProvider*>(tabletEngine->imageProvider(SecurityImageProvider::PROVIDER_NAME));
securityImageProvider->setSecurityImage(_securityImage);
}
}
void Wallet::chooseSecurityImage(const QString& filename) {

View file

@ -31,10 +31,13 @@ HIFI_QML_DEF(LoginDialog)
LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) {
auto accountManager = DependencyManager::get<AccountManager>();
#if !defined(Q_OS_ANDROID)
connect(accountManager.data(), &AccountManager::loginComplete,
this, &LoginDialog::handleLoginCompleted);
connect(accountManager.data(), &AccountManager::loginFailed,
this, &LoginDialog::handleLoginFailed);
#endif
}
void LoginDialog::showWithSelection()

View file

@ -43,7 +43,7 @@ function onBackPressed() {
}
function onBackClicked() {
App.openAndroidActivity("Home");
App.openAndroidActivity("Home", false);
}