1
votes

I am trying to lock my screen in whatever orientation the user is in when the application launches a dialog and then unlocking it when the dialog dismisses. Here is my lock and unlock code:

   // Sets screen rotation as fixed to current rotation setting
     private void mLockScreenRotation() {
         Log.d("####################", "screen orientation is " + mContext.getResources().getConfiguration().orientation);
         // Stop the screen orientation changing during an event
         if (mContext.getResources().getConfiguration().orientation == 1) 
             ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);        
         else ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//       switch (mContext.getResources().getConfiguration().orientation)
//       {
//          case Configuration.ORIENTATION_PORTRAIT:
//              ((Activity) mContext).setRequestedOrientation(
//                  ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//              break;
//          case Configuration.ORIENTATION_LANDSCAPE:
//              ((Activity) mContext).setRequestedOrientation(
//                  ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//              break;
//       }
     }

     // allow screen rotations again
     private void mUnLockScreenRotation()  {
         this.setRequestedOrientation(
                 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         mIsScreenRotationLocked = false;
     } 

I call mLockScreenRotation() when I launch any dialogs and I call mUnlockScreenRotation() in my handler and in my DialogInterface.OnClickListener's.

Sometimes my screen remains locked, but it is not consistent. Any suggestions or ideas why or how to handle this?

Thanks in advance for any help!

Ammendment: code where I am locking my screen:

 public void displayProgressDialog(){
        mLockScreenRotation();
        // Get local handle on class progress dialog for optimization purposes
        ProgressDialog temp = mProgressDialog = new ProgressDialog(this);

        // Get message string (for some reason this dialog can't handle res IDs for messages)
        String message = getString(R.string.downloading);

        // Set some paramaters
        temp.setIndeterminate(true);
        temp.setTitle(R.string.weather_data);
        temp.setMessage(message);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
                WindowManager.LayoutParams.MEMORY_TYPE_PUSH_BUFFERS /*WindowManager.LayoutParams.FLAG_BLUR_BEHIND*/); 

        temp.show();
    }

    public void displayLocationSearchDialog(){
        mLockScreenRotation();
        // Get local handle on class progress dialog for optimization purposes
        ProgressDialog temp = mCoordinateSearchDialog = new ProgressDialog(this);

        // Get message string (for some reason this dialog can't handle res IDs for messages)
        String message = getString(R.string.searching);

        // Set some paramaters
        temp.setIndeterminate(true);
        temp.setTitle(R.string.location_search);
        temp.setMessage(message);
        temp.setCancelable(false);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

        temp.show();

    }

    public void showDatafeedFailedDialog(){
        mLockScreenRotation();
        new AlertDialog.Builder(this)
            .setTitle(R.string.network_error)
            .setMessage(R.string.weather_data_failed)
            .setPositiveButton(R.string.try_again, mTryAgainListener)
            .setNegativeButton(R.string.dismiss, null)
            .create()
            .show();
    }

    public void showCoordinateSearchFailedDialog(){
        mLockScreenRotation();
        new AlertDialog.Builder(this)
        .setTitle(R.string.network_error)
        .setMessage(R.string.location_search_failed)
        .setPositiveButton(R.string.try_again, mCoordTryAgainListener)
        .setNegativeButton(R.string.dismiss, null)
        .create()
        .show();
    }

    private void showGpsAlertDialog(){
        mLockScreenRotation();
        new AlertDialog.Builder(this)
            .setTitle(R.string.gps_error)
            .setMessage(R.string.gps_error_details)
            .setNeutralButton(R.string.dismiss, null)
            .setPositiveButton(R.string.go_to_settings, mToSettingsListener)
            .create()
            .show();
    }

    private void showGpsSearchingDialog(){
        mLockScreenRotation();
        ProgressDialog temp = mGpsSearchAlertDialog = new ProgressDialog(this);

        String message = getString(R.string.location_services_details);
        String btnText = getString(R.string.cancel);

        temp.setIndeterminate(true);
        temp.setTitle(R.string.location_services);
        temp.setMessage(message);
        temp.setButton(btnText, mCancelGpsSearchListener);
        temp.setCancelable(true);
        temp.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

        temp.show();
    }

    private void showGpsTimeoutAlertDialog(){
        mLockScreenRotation();
        new AlertDialog.Builder(this)
        .setTitle(R.string.gps_error)
        .setMessage(R.string.gps_timeout_message)
        .setPositiveButton(R.string.try_again, mGpsTimeoutListener)
        .setNegativeButton(R.string.dismiss, mGpsTimeoutListener)  // check this line with free if still no good
        .create()
        .show();
    }

    private void showWeatherAlertDialog(){
        Log.d("############", "weather alert dialog");
        mLockScreenRotation();
        String message = null;
        if(mWD.getWarningTypes() == null) return;
        int cnt = 0;
        int size = mWD.getWarningTypes().size() - 1;
        for(String warningType : mWD.getWarningTypes()){
            if(cnt == 0) message = warningType;
            else if(cnt == size) message += " and " + warningType;
            else message += ", " + warningType;
            cnt++;
        }

        new AlertDialog.Builder(this)
            .setTitle(R.string.watches_and_warnings)
            .setMessage(message)
            .setPositiveButton(R.string.go_to_accuweather, mToAlertWebListener)
            .setNeutralButton(R.string.dismiss, null)
            .create()
            .show();
    }

    private void showNeedLocationAlertDialog() {
        mLockScreenRotation();
        new AlertDialog.Builder(this).setTitle(R.string.error).setMessage(
        R.string.add_location).setNeutralButton(R.string.dismiss, null)
        .setPositiveButton(R.string.okay, mToLocationSearchListener)
        .create().show();
    }

    private void showConnectivityAlertDialog() {
        mLockScreenRotation();
        new AlertDialog.Builder(this).setTitle(R.string.network_error)
        .setMessage(R.string.no_connection).setNeutralButton(
        R.string.dismiss, null).create().show();
    }

    private void showCurrentUrlInBrowser(){
        // Show current conditions web page
        if(mWD.getURL() == null || mWD.getURL().length() 
2
Post the code where you are calling mLockScreenRotation.user432209
I have added the code where I am calling mLockScreenRotation.taraloca

2 Answers

1
votes

This is a bad solution, but it works. Tested on LG GT540(Android 2.3.7) and Asus Transformer(Android 3.2):

private void stopRotate()
{
    if(getResources().getConfiguration().orientation == 1)
    {
        if( display.getOrientation() == 1 || display.getOrientation() == 2)
            setRequestedOrientation(9);
        else    
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    else
    {
        if( display.getOrientation() == 2 || display.getOrientation() == 3)
            setRequestedOrientation(8);
        else    
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

private void startRotate()
{
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
0
votes

Instead of putting the call to change orientation within the dialog (and then presumably dismissing said dialog immediately afterwards), try implementing onDismiss listener to your Dialog, as outlined here.