Files
app_Settings/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
Jorim Jaggi 88957ef8ee Add timeout if we dont get onEnterAnimationComplete
Window manager doesn't send us onEnterAnimationComplete in the case
where there are two activites starting at the same time and the
screen orientation is changing. Add a timeout to work around this
until we have a proper fix.

Bug: 23849216
Change-Id: I4be7787d1bc13f8cb0ffd892010c4b5c0142c783
2015-09-11 14:02:45 -07:00

113 lines
3.8 KiB
Java

/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 com.android.settings;
import android.app.Fragment;
import android.app.KeyguardManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.view.WindowManager;
public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivity {
private boolean mRestoring;
private boolean mDark;
private boolean mEnterAnimationPending;
private boolean mFirstTimeVisible = true;
private final Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedState) {
if (getIntent().getBooleanExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
mDark = true;
}
super.onCreate(savedState);
boolean deviceLocked = getSystemService(KeyguardManager.class).isKeyguardLocked();
if (deviceLocked && getIntent().getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false)) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}
CharSequence msg = getIntent().getStringExtra(
ConfirmDeviceCredentialBaseFragment.TITLE_TEXT);
setTitle(msg);
if (getActionBar() != null) {
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
}
mRestoring = savedState != null;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onResume() {
super.onResume();
if (!isChangingConfigurations() && !mRestoring && mDark && mFirstTimeVisible) {
mFirstTimeVisible = false;
prepareEnterAnimation();
mEnterAnimationPending = true;
mHandler.postDelayed(mEnterAnimationCompleteTimeoutRunnable, 1000);
}
}
private ConfirmDeviceCredentialBaseFragment getFragment() {
Fragment fragment = getFragmentManager().findFragmentById(R.id.main_content);
if (fragment != null && fragment instanceof ConfirmDeviceCredentialBaseFragment) {
return (ConfirmDeviceCredentialBaseFragment) fragment;
}
return null;
}
@Override
public void onEnterAnimationComplete() {
super.onEnterAnimationComplete();
if (mEnterAnimationPending) {
mHandler.removeCallbacks(mEnterAnimationCompleteTimeoutRunnable);
startEnterAnimation();
mEnterAnimationPending = false;
}
}
public void prepareEnterAnimation() {
getFragment().prepareEnterAnimation();
}
public void startEnterAnimation() {
getFragment().startEnterAnimation();
}
/**
* Workaround for a bug in window manager which results that onEnterAnimationComplete doesn't
* get called in all cases.
*/
private final Runnable mEnterAnimationCompleteTimeoutRunnable = new Runnable() {
@Override
public void run() {
onEnterAnimationComplete();
}
};
}