Browse Source

Allow to force a rotation

inorichi 9 years ago
parent
commit
140bf8caee

+ 4 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.java

@@ -60,6 +60,10 @@ public class PreferencesHelper {
         return rxPrefs.getBoolean(getKey(R.string.pref_lock_orientation_key), true);
     }
 
+    public Preference<Integer> rotation() {
+        return rxPrefs.getInteger(getKey(R.string.pref_rotation_type_key), 1);
+    }
+
     public Preference<Boolean> enableTransitions() {
         return rxPrefs.getBoolean(getKey(R.string.pref_enable_transitions_key), true);
     }

+ 22 - 25
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.java

@@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.reader;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
 import android.graphics.Color;
 import android.os.Build;
 import android.os.Bundle;
@@ -13,7 +14,6 @@ import android.support.v7.widget.Toolbar;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.Surface;
 import android.view.View;
 import android.view.WindowManager;
 import android.widget.TextView;
@@ -277,9 +277,9 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
                 .asObservable()
                 .subscribe(this::setPageNumberVisibility));
 
-        subscriptions.add(preferences.lockOrientation()
+        subscriptions.add(preferences.rotation()
                 .asObservable()
-                .subscribe(this::setOrientation));
+                .subscribe(this::setRotation));
 
         subscriptions.add(preferences.hideStatusBar()
                 .asObservable()
@@ -299,28 +299,25 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
                 .subscribe(this::applyTheme));
     }
 
-    private void setOrientation(boolean locked) {
-        if (locked) {
-            int orientation;
-            int rotation = ((WindowManager) getSystemService(
-                    Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
-            switch (rotation) {
-                case Surface.ROTATION_0:
-                    orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
-                    break;
-                case Surface.ROTATION_90:
-                    orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
-                    break;
-                case Surface.ROTATION_180:
-                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
-                    break;
-                default:
-                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
-                    break;
-            }
-            setRequestedOrientation(orientation);
-        } else {
-            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+    private void setRotation(int rotation) {
+        switch (rotation) {
+            // Rotation free
+            case 1:
+                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+                break;
+            // Lock in current rotation
+            case 2:
+                int currentOrientation = getResources().getConfiguration().orientation;
+                setRotation(currentOrientation == Configuration.ORIENTATION_PORTRAIT ? 3 : 4);
+                break;
+            // Lock in portrait
+            case 3:
+                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
+                break;
+            // Lock in landscape
+            case 4:
+                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
+                break;
         }
     }
 

+ 18 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderMenu.java

@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader;
 
 import android.app.Dialog;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.support.v7.widget.Toolbar;
 import android.view.Gravity;
 import android.view.Menu;
@@ -178,20 +179,31 @@ public class ReaderMenu {
         if (nextChapterBtn != null) nextChapterBtn.setVisible(nextChapter != null);
     }
 
+    @SuppressWarnings("ConstantConditions")
     private void initializeMenu() {
-        // Orientation changes
+        // Orientation selector
         add(preferences.lockOrientation().asObservable()
                 .subscribe(locked -> {
-                    int resourceId = !locked ? R.drawable.ic_screen_rotation :
-                            activity.getResources().getConfiguration().orientation == 1 ?
+                    boolean isPortrait = activity.getResources().getConfiguration()
+                            .orientation == Configuration.ORIENTATION_PORTRAIT;
+                    int resourceId = !locked ? R.drawable.ic_screen_rotation : isPortrait ?
                                     R.drawable.ic_screen_lock_portrait :
                                     R.drawable.ic_screen_lock_landscape;
 
                     lockOrientation.setImageResource(resourceId);
                 }));
 
-        lockOrientation.setOnClickListener(v ->
-                preferences.lockOrientation().set(!preferences.lockOrientation().get()));
+        lockOrientation.setOnClickListener(v -> {
+            showImmersiveDialog(new MaterialDialog.Builder(activity)
+                    .title(R.string.pref_rotation_type)
+                    .items(R.array.rotation_type)
+                    .itemsCallbackSingleChoice(preferences.rotation().get() - 1,
+                            (d, itemView, which, text) -> {
+                                preferences.rotation().set(which + 1);
+                                return true;
+                            })
+                    .build());
+        });
 
         // Zoom selector
         zoomSelector.setOnClickListener(v -> {
@@ -279,6 +291,7 @@ public class ReaderMenu {
             initializePopupMenu();
         }
 
+        @SuppressWarnings("ConstantConditions")
         private void initializePopupMenu() {
             // Load values from preferences
             enableTransitions.setChecked(preferences.enableTransitions().get());

+ 14 - 0
app/src/main/res/values/arrays.xml

@@ -80,6 +80,20 @@
         <item>4</item>
     </string-array>
 
+    <string-array name="rotation_type">
+        <item>@string/rotation_free</item>
+        <item>@string/rotation_lock</item>
+        <item>@string/rotation_force_portrait</item>
+        <item>@string/rotation_force_landscape</item>
+    </string-array>
+    
+    <string-array name="rotation_type_values">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+    </string-array>
+
     <string-array name="library_update_interval">
         <item>@string/update_never</item>
         <item>@string/update_1hour</item>

+ 1 - 0
app/src/main/res/values/keys.xml

@@ -20,6 +20,7 @@
     <string name="pref_zoom_start_key">pref_zoom_start_key</string>
     <string name="pref_hide_status_bar_key">pref_hide_status_bar_key</string>
     <string name="pref_lock_orientation_key">pref_lock_orientation_key</string>
+    <string name="pref_rotation_type_key">pref_rotation_type_key</string>
     <string name="pref_enable_transitions_key">pref_enable_transitions_key</string>
     <string name="pref_show_page_number_key">pref_show_page_number_key</string>
     <string name="pref_keep_screen_on_key">pref_keep_screen_on_key</string>

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -111,6 +111,12 @@
     <string name="zoom_start_left">Left</string>
     <string name="zoom_start_right">Right</string>
     <string name="zoom_start_center">Center</string>
+    <string name="pref_rotation_type">Rotation</string>
+    <string name="rotation_free">Free</string>
+    <string name="rotation_lock">Lock</string>
+    <string name="rotation_force_portrait">Force portrait</string>
+    <string name="rotation_force_landscape">Force landscape</string>
+
 
       <!-- Downloads section -->
     <string name="pref_download_directory">Downloads directory</string>