fixed crashes on tablets

improved performance by reducing setTheme() call
This commit is contained in:
Mariotaku Lee 2015-04-27 20:25:26 +08:00
parent f99df87959
commit b1e00a9dce
62 changed files with 1601 additions and 1210 deletions

View File

@ -101,6 +101,10 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst
public static final String AUTHORITY_RETWEETS_OF_ME = "retweets_of_me";
public static final String AUTHORITY_MUTES_USERS = "mutes_users";
public static final String AUTHORITY_NOTIFICATIONS = "notifications";
public static final String AUTHORITY_ACCOUNTS = "accounts";
public static final String AUTHORITY_DRAFTS = "drafts";
public static final String AUTHORITY_FILTERS = "filters";
public static final String AUTHORITY_PROFILE_EDITOR = "profile_editor";
public static final String QUERY_PARAM_ACCOUNT_ID = "account_id";
public static final String QUERY_PARAM_ACCOUNT_IDS = "account_ids";

View File

@ -34,9 +34,7 @@ public interface IntentConstants {
public static final String INTENT_ACTION_SETTINGS = INTENT_PACKAGE_PREFIX + "SETTINGS";
public static final String INTENT_ACTION_SELECT_ACCOUNT = INTENT_PACKAGE_PREFIX + "SELECT_ACCOUNT";
public static final String INTENT_ACTION_VIEW_MEDIA = INTENT_PACKAGE_PREFIX + "VIEW_MEDIA";
public static final String INTENT_ACTION_FILTERS = INTENT_PACKAGE_PREFIX + "FILTERS";
public static final String INTENT_ACTION_TWITTER_LOGIN = INTENT_PACKAGE_PREFIX + "TWITTER_LOGIN";
public static final String INTENT_ACTION_DRAFTS = INTENT_PACKAGE_PREFIX + "DRAFTS";
public static final String INTENT_ACTION_PICK_FILE = INTENT_PACKAGE_PREFIX + "PICK_FILE";
public static final String INTENT_ACTION_PICK_DIRECTORY = INTENT_PACKAGE_PREFIX + "PICK_DIRECTORY";
public static final String INTENT_ACTION_VIEW_WEBPAGE = INTENT_PACKAGE_PREFIX + "VIEW_WEBPAGE";
@ -44,7 +42,6 @@ public interface IntentConstants {
public static final String INTENT_ACTION_CUSTOM_TABS = INTENT_PACKAGE_PREFIX + "CUSTOM_TABS";
public static final String INTENT_ACTION_ADD_TAB = INTENT_PACKAGE_PREFIX + "ADD_TAB";
public static final String INTENT_ACTION_EDIT_TAB = INTENT_PACKAGE_PREFIX + "EDIT_TAB";
public static final String INTENT_ACTION_EDIT_USER_PROFILE = INTENT_PACKAGE_PREFIX + "EDIT_USER_PROFILE";
public static final String INTENT_ACTION_SERVICE_COMMAND = INTENT_PACKAGE_PREFIX + "SERVICE_COMMAND";
public static final String INTENT_ACTION_REQUEST_PERMISSIONS = INTENT_PACKAGE_PREFIX + "REQUEST_PERMISSIONS";
public static final String INTENT_ACTION_SELECT_USER_LIST = INTENT_PACKAGE_PREFIX + "SELECT_USER_LIST";

View File

@ -25,7 +25,7 @@
android:name=".activity.support.OpenStreetMapViewerActivity"
android:exported="false"
android:label="@string/view_map"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge">
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>

View File

@ -16,7 +16,7 @@
android:name=".activity.support.GoogleMapViewerActivity"
android:exported="false"
android:label="@string/view_map"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge">
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>

View File

@ -5,61 +5,61 @@
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
<uses-sdk/>
<uses-sdk />
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
android:required="false" />
<uses-feature
android:name="android.hardware.location"
android:required="false"/>
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false"/>
android:required="false" />
<uses-feature
android:name="android.hardware.location.network"
android:required="false"/>
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
android:required="false" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false"/>
android:required="false" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
android:required="true" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS"/>
<uses-permission android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA"/>
<uses-permission android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS" />
<uses-permission android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA" />
<uses-permission android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE" />
<permission-group
android:name="org.mariotaku.twidere.permission.PERMISSION_GROUP"
android:label="@string/app_name"/>
android:label="@string/app_name" />
<permission
android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS"
android:description="@string/permission_description_shorten_status"
android:label="@string/permission_label_shorten_status"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
<permission
android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA"
android:description="@string/permission_description_upload_media"
android:label="@string/permission_label_upload_media"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
<permission
android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE"
android:description="@string/permission_description_sync_timeline"
android:label="@string/permission_label_sync_timeline"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
<application
android:name=".app.TwidereApplication"
@ -68,32 +68,32 @@
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Blank">
android:theme="@style/Theme.Twidere.Dark.NoActionBar">
<uses-library
android:name="com.sec.android.app.multiwindow"
android:required="false"/>
android:required="false" />
<meta-data
android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA"/>
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA" />
<meta-data
android:name="com.sec.android.support.multiwindow"
android:value="true"/>
android:value="true" />
<meta-data
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W"
android:value="480dp"/>
android:value="480dp" />
<meta-data
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H"
android:value="640dp"/>
android:value="640dp" />
<meta-data
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W"
android:value="240dp"/>
android:value="240dp" />
<meta-data
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H"
android:value="320dp"/>
android:value="320dp" />
<meta-data
android:name="override_tinted_status_bar_defaults"
android:value="true"/>
android:value="true" />
<activity
android:name=".activity.MainActivity"
@ -103,11 +103,11 @@
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustNothing">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -119,100 +119,101 @@
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.HomeActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.Dark.NoActionBar"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.HOME"/>
<action android:name="org.mariotaku.twidere.HOME" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
android:resource="@xml/searchable" />
<meta-data
android:name="android.app.default_searchable"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.support.HomeActivity" />
</activity>
<activity
android:name=".activity.support.ComposeActivity"
android:excludeFromRecents="true"
android:label="@string/compose"
android:launchMode="singleTop"
android:theme="@style/Theme.Blank.Dialog"
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/compose">
<action android:name="android.intent.action.MAIN"/>
<action android:name="org.mariotaku.twidere.COMPOSE"/>
<action android:name="org.mariotaku.twidere.REPLY"/>
<action android:name="org.mariotaku.twidere.QUOTE"/>
<action android:name="org.mariotaku.twidere.EDIT_DRAFT"/>
<action android:name="org.mariotaku.twidere.MENTION"/>
<action android:name="org.mariotaku.twidere.REPLY_MULTIPLE"/>
<action android:name="android.intent.action.MAIN" />
<action android:name="org.mariotaku.twidere.COMPOSE" />
<action android:name="org.mariotaku.twidere.REPLY" />
<action android:name="org.mariotaku.twidere.QUOTE" />
<action android:name="org.mariotaku.twidere.EDIT_DRAFT" />
<action android:name="org.mariotaku.twidere.MENTION" />
<action android:name="org.mariotaku.twidere.REPLY_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*" />
<data android:mimeType="text/plain" />
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.support.HomeActivity" />
</activity>
<activity
android:name=".activity.support.QuickSearchBarActivity"
android:label="@string/search"
android:launchMode="singleTop"
android:theme="@style/Theme.Blank.Dialog"
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.GLOBAL_SEARCH"/>
<action android:name="org.mariotaku.twidere.GLOBAL_SEARCH" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.SignInActivity"
android:label="@string/sign_in"
android:theme="@style/Theme.Twidere.Dark"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge.NoActionBar"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.TWITTER_LOGIN"/>
<action android:name="org.mariotaku.twidere.TWITTER_LOGIN" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.BrowserSignInActivity"
android:label="@string/browser_sign_in"
android:theme="@style/Theme.Blank.Dialog"
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.TWITTER_BROWSER_LOGIN"/>
<action android:name="org.mariotaku.twidere.TWITTER_BROWSER_LOGIN" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -221,45 +222,29 @@
android:theme="@style/Theme.Twidere.Dark"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
<action android:name="org.mariotaku.twidere.SETTINGS"/>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
<action android:name="org.mariotaku.twidere.SETTINGS" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.FiltersActivity"
android:exported="false"
android:label="@string/filters"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.FILTERS"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.support.HomeActivity" />
</activity>
<activity
android:name=".activity.support.APIEditorActivity"
android:label="@string/edit_api"
android:theme="@style/Theme.Blank.Dialog"
android:windowSoftInputMode="adjustResize"/>
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".activity.support.AccountSelectorActivity"
android:label="@string/select_account"
android:theme="@style/Theme.Blank.Dialog">
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.SELECT_ACCOUNT"/>
<action android:name="org.mariotaku.twidere.SELECT_ACCOUNT" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -267,142 +252,36 @@
android:exported="false"
android:label="@string/browser">
<intent-filter>
<action android:name="org.mariotaku.twidere.VIEW_WEBPAGE"/>
<action android:name="org.mariotaku.twidere.VIEW_WEBPAGE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:scheme="file" />
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.ColorPickerDialogActivity"
android:label="@string/set_color"
android:theme="@style/Theme.Twidere.Light.NoDisplay"/>
android:theme="@style/Theme.Twidere.Light.NoDisplay" />
<activity
android:name=".activity.support.LinkHandlerActivity"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge.NoActionBar"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.support.HomeActivity" />
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="user"
android:scheme="twidere"/>
<data
android:host="users"
android:scheme="twidere"/>
<data
android:host="user_timeline"
android:scheme="twidere"/>
<data
android:host="user_media_timeline"
android:scheme="twidere"/>
<data
android:host="user_favorites"
android:scheme="twidere"/>
<data
android:host="user_followers"
android:scheme="twidere"/>
<data
android:host="user_friends"
android:scheme="twidere"/>
<data
android:host="user_blocks"
android:scheme="twidere"/>
<data
android:host="status"
android:scheme="twidere"/>
<data
android:host="status_retweeters"
android:scheme="twidere"/>
<data
android:host="status_favoriters"
android:scheme="twidere"/>
<data
android:host="status_replies"
android:scheme="twidere"/>
<data
android:host="statuses"
android:scheme="twidere"/>
<data
android:host="direct_messages_conversation"
android:scheme="twidere"/>
<data
android:host="user_list"
android:scheme="twidere"/>
<data
android:host="user_lists"
android:scheme="twidere"/>
<data
android:host="user_list_timeline"
android:scheme="twidere"/>
<data
android:host="user_list_members"
android:scheme="twidere"/>
<data
android:host="user_list_subscribers"
android:scheme="twidere"/>
<data
android:host="user_list_memberships"
android:scheme="twidere"/>
<data
android:host="saved_searches"
android:scheme="twidere"/>
<data
android:host="user_mentions"
android:scheme="twidere"/>
<data
android:host="incoming_friendships"
android:scheme="twidere"/>
<data
android:host="search"
android:scheme="twidere"/>
<data
android:host="mutes_users"
android:scheme="twidere"/>
<data android:scheme="twidere" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.DraftsActivity"
android:exported="false"
android:label="@string/drafts"
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge">
<intent-filter>
<action android:name="org.mariotaku.twidere.DRAFTS"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.AccountsManagerActivity"
android:exported="false"
android:label="@string/accounts"
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge">
<intent-filter>
<action android:name="org.mariotaku.twidere.ACCOUNTS"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.MediaViewerActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
@ -411,14 +290,14 @@
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.Viewer">
<intent-filter>
<action android:name="org.mariotaku.twidere.VIEW_MEDIA"/>
<action android:name="org.mariotaku.twidere.VIEW_MEDIA" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:scheme="file"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="file" />
</intent-filter>
</activity>
<activity
@ -428,10 +307,10 @@
android:theme="@style/Theme.Twidere.Light.NoDisplay"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.PICK_FILE"/>
<action android:name="org.mariotaku.twidere.PICK_DIRECTORY"/>
<action android:name="org.mariotaku.twidere.PICK_FILE" />
<action android:name="org.mariotaku.twidere.PICK_DIRECTORY" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -440,36 +319,24 @@
android:theme="@style/Theme.Twidere.Light.NoDisplay"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="org.mariotaku.twidere.PICK_IMAGE"/>
<action android:name="org.mariotaku.twidere.TAKE_PHOTO"/>
<action android:name="android.intent.action.MAIN" />
<action android:name="org.mariotaku.twidere.PICK_IMAGE" />
<action android:name="org.mariotaku.twidere.TAKE_PHOTO" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".activity.support.UserProfileEditorActivity"
android:exported="false"
android:label="@string/edit_profile"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.EDIT_USER_PROFILE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.CustomTabEditorActivity"
android:exported="false"
android:label="@string/add_tab"
android:theme="@style/Theme.Blank.Dialog"
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.ADD_TAB"/>
<action android:name="org.mariotaku.twidere.EDIT_TAB"/>
<action android:name="org.mariotaku.twidere.ADD_TAB" />
<action android:name="org.mariotaku.twidere.EDIT_TAB" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -477,60 +344,60 @@
android:label="@string/compose"
android:theme="@style/Theme.Twidere.Dark.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT"/>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.RequestPermissionsActivity"
android:label="@string/permissions_request"
android:theme="@style/Theme.Blank.Dialog">
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.REQUEST_PERMISSIONS"/>
<action android:name="org.mariotaku.twidere.REQUEST_PERMISSIONS" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.CameraCropActivity"
android:exported="false">
<intent-filter>
<action android:name="org.mariotaku.twidere.CAMERA_CROP"/>
<action android:name="org.mariotaku.twidere.CAMERA_CROP" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.support.UserListSelectorActivity"
android:label="@string/select_user_list"
android:theme="@style/Theme.Blank.Dialog">
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.SELECT_USER"/>
<action android:name="org.mariotaku.twidere.SELECT_USER_LIST"/>
<action android:name="org.mariotaku.twidere.SELECT_USER" />
<action android:name="org.mariotaku.twidere.SELECT_USER_LIST" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.SettingsWizardActivity"
android:label="@string/settings_wizard"
android:theme="@style/Theme.Twidere.Wizard"/>
android:theme="@style/Theme.Twidere.Wizard" />
<activity
android:name=".activity.support.DataExportActivity"
android:label="@string/export_settings"
android:theme="@android:style/Theme.NoDisplay"/>
android:theme="@android:style/Theme.NoDisplay" />
<activity
android:name=".activity.support.DataImportActivity"
android:label="@string/import_settings"
android:theme="@android:style/Theme.NoDisplay"/>
android:theme="@android:style/Theme.NoDisplay" />
<activity
android:name=".activity.support.ActivityPickerActivity"
android:theme="@style/Theme.Blank.Dialog">
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY"/>
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
@ -542,33 +409,33 @@
<data
android:host="twitter.com"
android:scheme="http"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<data
android:host="twitter.com"
android:scheme="https"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<data
android:host="www.twitter.com"
android:scheme="http"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<data
android:host="www.twitter.com"
android:scheme="https"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<data
android:host="mobile.twitter.com"
android:scheme="http"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<data
android:host="mobile.twitter.com"
android:scheme="https"
android:pathPrefix="/"/>
android:pathPrefix="/" />
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
@ -578,18 +445,18 @@
android:taskAffinity=":twidere_assist_launcher"
android:theme="@style/Theme.Launcher">
<intent-filter>
<action android:name="android.intent.action.ASSIST"/>
<action android:name="android.intent.action.ASSIST" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="com.android.systemui.action_assist_icon"
android:resource="@drawable/ic_assist_twidere"/>
android:resource="@drawable/ic_assist_twidere" />
</activity>
<activity
android:name=".activity.KeyboardShortcutPreferenceCompatActivity"
android:theme="@style/Theme.Blank.Dialog"/>
android:theme="@style/Theme.Twidere.Dark.Dialog" />
<activity
android:name=".activity.TestActivity"
android:enabled="false"
@ -597,27 +464,27 @@
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.NyanActivity"
android:launchMode="singleTop"
android:theme="@style/Theme.Nyan"
android:windowSoftInputMode="stateAlwaysHidden"/>
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name=".activity.UsageStatisticsActivity"
android:label="@string/usage_statistics"
android:theme="@android:style/Theme.NoDisplay"/>
android:theme="@android:style/Theme.NoDisplay" />
<service
android:name=".service.RefreshService"
android:label="@string/label_refresh_service"/>
android:label="@string/label_refresh_service" />
<service
android:name=".service.BackgroundOperationService"
android:label="@string/label_background_operation_service"/>
android:label="@string/label_background_operation_service" />
<service
android:name=".nyan.NyanWallpaperService"
android:enabled="false"
@ -627,12 +494,12 @@
android:permission="android.permission.BIND_WALLPAPER"
android:process=":wallpaper">
<intent-filter android:priority="1">
<action android:name="android.service.wallpaper.WallpaperService"/>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/nyan_wallpaper"/>
android:resource="@xml/nyan_wallpaper" />
</service>
<service
android:name=".nyan.NyanDaydreamService"
@ -643,7 +510,7 @@
android:process=":daydream"
tools:ignore="ExportedService">
<intent-filter android:priority="1">
<action android:name="android.service.dreams.DreamService"/>
<action android:name="android.service.dreams.DreamService" />
</intent-filter>
</service>
@ -653,67 +520,65 @@
android:exported="true"
android:grantUriPermissions="true"
android:label="@string/label_data_provider"
tools:ignore="ExportedContentProvider"/>
tools:ignore="ExportedContentProvider" />
<provider
android:name=".provider.TwidereCommandProvider"
android:authorities="twidere.command"
android:exported="true"
tools:ignore="ExportedContentProvider"/>
tools:ignore="ExportedContentProvider" />
<provider
android:name=".provider.RecentSearchProvider"
android:authorities="org.mariotaku.twidere.provider.SearchRecentSuggestions"
tools:ignore="ExportedContentProvider"/>
tools:ignore="ExportedContentProvider" />
<receiver android:name=".receiver.ConnectivityStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<receiver
android:name=".receiver.NotificationReceiver"
android:exported="false">
<intent-filter>
<action android:name="org.mariotaku.twidere.NOTIFICATION_DELETED"/>
<action android:name="org.mariotaku.twidere.NOTIFICATION_DELETED" />
</intent-filter>
</receiver>
<receiver
android:name=".receiver.SecretCodeBroadcastReceiver"
android:label="@string/twidere_test">
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE"/>
<action android:name="android.provider.Telephony.SECRET_CODE" />
<data
android:host="8943373"
android:scheme="android_secret_code"/>
android:scheme="android_secret_code" />
</intent-filter>
</receiver>
<!-- Begin third Party components -->
<service
android:name="edu.ucdavis.earlybird.UCDService"/>
<service android:name="edu.ucdavis.earlybird.UCDService" />
<receiver
android:name="edu.ucdavis.earlybird.UploadReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
<action android:name="edu.ucdavis.earlybird.UPLOAD_PROFILE"/>
<action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="edu.ucdavis.earlybird.UPLOAD_PROFILE" />
</intent-filter>
</receiver>
<!-- SPICE -->
<service
android:name="edu.tsinghua.spice.SpiceService"/>
<service android:name="edu.tsinghua.spice.SpiceService" />
<receiver
android:name="edu.tsinghua.spice.SpiceUploadReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
<action android:name="edu.tsinghua.spice.UPLOAD_PROFILE"/>
<action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="edu.tsinghua.spice.UPLOAD_PROFILE" />
</intent-filter>
</receiver>

View File

@ -0,0 +1,41 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package android.support.v7.app;
import android.support.annotation.Nullable;
/**
* Created by mariotaku on 15/4/27.
*/
public class AppCompatDelegateTrojan {
@Nullable
public static ActionBar peekActionBar(@Nullable AppCompatDelegate delegate) {
if (delegate instanceof AppCompatDelegateImplBase)
return ((AppCompatDelegateImplBase) delegate).peekSupportActionBar();
return null;
}
public static boolean isFloating(AppCompatDelegate delegate) {
if (delegate instanceof AppCompatDelegateImplBase)
return ((AppCompatDelegateImplBase) delegate).mIsFloating;
return false;
}
}

View File

@ -141,6 +141,10 @@ public interface Constants extends TwidereConstants {
int LINK_ID_STATUS_FAVORITERS = 27;
int LINK_ID_SEARCH = 28;
int LINK_ID_MUTES_USERS = 41;
int LINK_ID_ACCOUNTS = 101;
int LINK_ID_DRAFTS = 102;
int LINK_ID_FILTERS = 103;
int LINK_ID_PROFILE_EDITOR = 104;
String DIR_NAME_IMAGE_CACHE = "image_cache";
String DIR_NAME_FULL_IMAGE_CACHE = "full_image_cache";

View File

@ -150,7 +150,7 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity imp
getDelegate().setTitle(title);
}
private AppCompatDelegate getDelegate() {
public AppCompatDelegate getDelegate() {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, this);
}

View File

@ -20,11 +20,11 @@
package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
@ -46,7 +46,7 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
@ -143,10 +143,8 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
setTheme();
setupWindow();
super.onCreate(savedInstanceState);
setupActionBar();
mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler();
}
@ -236,7 +234,7 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity
final Toolbar toolbar = (Toolbar) actionBarView;
ThemeUtils.setActionBarOverflowColor(toolbar, itemColor);
final int popupColor = ThemeUtils.getThemeForegroundColor(toolbar.getContext(), toolbar.getPopupTheme());
ThemeUtils.wrapToolbarMenuIcon(ViewUtils.findViewByType(actionBarView, ActionMenuView.class), itemColor, popupColor);
ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(actionBarView, ActionMenuView.class), itemColor, popupColor);
}
return result;
}
@ -255,15 +253,26 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity
return (FrameLayout) view.findViewById(R.id.main_content);
}
private void setTheme() {
mCurrentThemeResource = getThemeResourceId();
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resid, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
setTheme(mCurrentThemeResource);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
super.onApplyThemeResource(theme, resid, first);
}
@Override
public void setTheme(int resid) {
super.setTheme(mCurrentThemeResource = getThemeResourceId());
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setupActionBar();
}
private void setupActionBar() {
@ -299,9 +308,9 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_MODE_OVERLAY);
// supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
// supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
// supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_MODE_OVERLAY);
}
}

View File

@ -20,7 +20,9 @@
package org.mariotaku.twidere.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.CompareUtils;
@ -102,8 +104,6 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
setTheme();
super.onCreate(savedInstanceState);
setActionBarBackground();
}
@ -119,14 +119,20 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
private void setActionBarBackground() {
}
private void setTheme() {
mCurrentThemeResource = getThemeResourceId();
@Override
public void setTheme(int resid) {
super.setTheme(mCurrentThemeResource = getThemeResourceId());
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resid, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mProfileImageStyle = Utils.getProfileImageStyle(this);
setTheme(mCurrentThemeResource);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
super.onApplyThemeResource(theme, resid, first);
}
}

View File

@ -1,98 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.view.MenuItem;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseDialogWhenLargeActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredKeywordsFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredLinksFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredSourcesFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredUsersFragment;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.TabPagerIndicator;
public class FiltersActivity extends BaseDialogWhenLargeActivity {
private TabPagerIndicator mPagerIndicator;
private ViewPager mViewPager;
private SupportTabsAdapter mAdapter;
@Override
public boolean getSystemWindowsInsets(Rect insets) {
return false;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
NavUtils.navigateUpFromSameTask(this);
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filters);
mAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), null, 1);
mViewPager.setAdapter(mAdapter);
mViewPager.setOffscreenPageLimit(2);
mPagerIndicator.setViewPager(mViewPager);
mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL);
mAdapter.addTab(FilteredUsersFragment.class, null, getString(R.string.users), null, 0, null);
mAdapter.addTab(FilteredKeywordsFragment.class, null, getString(R.string.keywords), null, 1, null);
mAdapter.addTab(FilteredSourcesFragment.class, null, getString(R.string.sources), null, 2, null);
mAdapter.addTab(FilteredLinksFragment.class, null, getString(R.string.links), null, 3, null);
ThemeUtils.initPagerIndicatorAsActionBarTab(this, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(this, new EmptyDrawable());
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
}
@Override
protected boolean isActionBarOutlineEnabled() {
return false;
}
@Override
public void onContentChanged() {
super.onContentChanged();
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mPagerIndicator = (TabPagerIndicator) findViewById(R.id.view_pager_tabs);
}
}

View File

@ -33,7 +33,6 @@ import android.content.res.Resources;
import android.graphics.PorterDuff.Mode;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.KeyEvent;
@ -257,7 +256,7 @@ public class SettingsActivity extends BasePreferenceActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
// supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setIntent(getIntent().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
final ActionBar actionBar = getSupportActionBar();
@ -270,7 +269,7 @@ public class SettingsActivity extends BasePreferenceActivity {
final ListView listView = getListView();
if (listView != null) {
listView.setDivider(new EmptyDrawable());
listView.setChoiceMode(isMultiPane() ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);
// listView.setChoiceMode(isMultiPane() ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);
listView.setDividerHeight(0);
final LayoutParams lp = listView.getLayoutParams();
if (lp instanceof MarginLayoutParams) {

View File

@ -1,42 +0,0 @@
package org.mariotaku.twidere.activity.support;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.view.MenuItem;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.fragment.support.AccountsManagerFragment;
/**
* Accounts manager
* Created by mariotaku on 14/10/26.
*/
public class AccountsManagerActivity extends BaseDialogWhenLargeActivity {
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.activity_accounts_manager);
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_content, new AccountsManagerFragment());
ft.commit();
}
}

View File

@ -69,7 +69,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
@Override
public int getThemeResourceId() {
return ThemeUtils.getThemeResource(this);
return ThemeUtils.getNoActionBarThemeResource(this);
}
public TwidereApplication getTwidereApplication() {
@ -86,7 +86,11 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
@Override
public void onFitSystemWindows(Rect insets) {
mSystemWindowsInsets = new Rect(insets);
if (mSystemWindowsInsets == null)
mSystemWindowsInsets = new Rect(insets);
else {
mSystemWindowsInsets.set(insets);
}
notifyControlBarOffsetChanged();
}

View File

@ -21,28 +21,26 @@ package org.mariotaku.twidere.activity.support;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.TintedStatusLayout;
/**
* Created by mariotaku on 15/4/17.
*/
public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
private TintedStatusFrameLayout mMainContent;
private TintedStatusLayout mMainContent;
@Override
public final int getThemeResourceId() {
public int getThemeResourceId() {
return ThemeUtils.getDialogWhenLargeThemeResource(this);
}
@ -50,21 +48,19 @@ public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
setupWindow();
super.onCreate(savedInstanceState);
setupActionBar();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean result = super.onPrepareOptionsMenu(menu);
if (!shouldSetActionItemColor()) return result;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
final Toolbar toolbar = peekActionBarToolbar();
if (toolbar != null) {
final int themeColor = getCurrentThemeColor();
final int themeId = getCurrentThemeResourceId();
final int itemColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor);
final Toolbar toolbar = (Toolbar) actionBarView;
ThemeUtils.setActionBarOverflowColor(toolbar, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewUtils.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(toolbar, ActionMenuView.class), itemColor, itemColor);
}
return result;
}
@ -72,11 +68,11 @@ public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
@Override
public void onContentChanged() {
super.onContentChanged();
mMainContent = (TintedStatusFrameLayout) findViewById(R.id.main_content);
mMainContent = (TintedStatusLayout) findViewById(R.id.main_content);
setupTintStatusBar();
}
protected TintedStatusFrameLayout getMainContent() {
protected TintedStatusLayout getMainContent() {
return mMainContent;
}
@ -88,6 +84,12 @@ public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
return true;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setupActionBar();
}
private void setupActionBar() {
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
@ -98,7 +100,12 @@ public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
final int titleColor = ThemeUtils.getContrastActionBarTitleColor(this, themeId, themeColor);
final int actionBarItemsColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor);
ThemeUtils.applyActionBarBackground(actionBar, this, themeId, themeColor, option, isActionBarOutlineEnabled());
ThemeUtils.setActionBarColor(getWindow(), actionBar, titleColor, actionBarItemsColor);
final Toolbar toolbar = peekActionBarToolbar();
if (toolbar != null) {
ThemeUtils.setToolBarColor(toolbar, titleColor, actionBarItemsColor);
} else {
ThemeUtils.setActionBarColor(getWindow(), getSupportActionBar(), titleColor, actionBarItemsColor);
}
}
private void setupTintStatusBar() {
@ -121,8 +128,5 @@ public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_MODE_OVERLAY);
}
}

View File

@ -94,6 +94,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment;
import org.mariotaku.twidere.fragment.support.DraftsFragment;
import org.mariotaku.twidere.fragment.support.ViewStatusDialogFragment;
import org.mariotaku.twidere.model.DraftItem;
import org.mariotaku.twidere.model.ParcelableAccount;
@ -347,7 +348,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
final Window window = getWindow();
final Rect rect = new Rect();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
final int actionBarHeight = Utils.getActionBarHeight(this);
final int actionBarHeight = ThemeUtils.getActionBarHeight(this);
final View contentView = window.findViewById(android.R.id.content);
final int[] location = new int[2];
contentView.getLocationOnScreen(location);
@ -430,7 +431,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
break;
}
case MENU_DRAFTS: {
startActivity(new Intent(INTENT_ACTION_DRAFTS));
Utils.openDrafts(this);
break;
}
case MENU_DELETE: {
@ -784,7 +785,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
}
builder.setSmallIcon(R.drawable.ic_stat_info);
builder.setAutoCancel(true);
final Intent draftsIntent = new Intent(this, DraftsActivity.class);
final Intent draftsIntent = new Intent(this, DraftsFragment.class);
builder.setContentIntent(PendingIntent.getActivity(this, 0, draftsIntent, PendingIntent.FLAG_UPDATE_CURRENT));
final Intent serviceIntent = new Intent(this, BackgroundOperationService.class);
serviceIntent.setAction(INTENT_ACTION_DISCARD_DRAFT);

View File

@ -96,9 +96,9 @@ import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.accessor.ActivityAccessor;
import org.mariotaku.twidere.util.accessor.ActivityAccessor.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.message.TaskStateChangedEvent;
import org.mariotaku.twidere.util.message.UnreadCountUpdatedEvent;
import org.mariotaku.twidere.view.ExtendedViewPager;
@ -208,7 +208,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override
public boolean getSystemWindowsInsets(Rect insets) {
final int height = mTabIndicator != null ? mTabIndicator.getHeight() : 0;
insets.top = height != 0 ? height : Utils.getActionBarHeight(this);
insets.top = height != 0 ? height : ThemeUtils.getActionBarHeight(this);
return true;
}
@ -804,7 +804,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
final int actionBarAlpha = isTransparent ? ThemeUtils.getUserThemeBackgroundAlpha(this) : 0xFF;
final IHomeActionButton homeActionButton = (IHomeActionButton) mActionsButton;
mTabIndicator.setItemContext(ThemeUtils.getActionBarContext(this));
ViewUtils.setBackground(mActionBar, ThemeUtils.getActionBarBackground(this, themeResId, themeColor,
ViewSupport.setBackground(mActionBar, ThemeUtils.getActionBarBackground(this, themeResId, themeColor,
backgroundOption, true));
final int statusBarColor;
final Resources resources = getResources();
@ -830,7 +830,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mTabIndicator.setStripColor(contrastColor);
mTabIndicator.setIconColor(contrastColor);
mTabIndicator.setLabelColor(contrastColor);
ActivityAccessor.setTaskDescription(this, new TaskDescriptionCompat(null, null, themeColor));
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, themeColor));
}
mColorStatusFrameLayout.setDrawColor(true);
mColorStatusFrameLayout.setDrawShadow(false);
@ -838,7 +838,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mColorStatusFrameLayout.setFactor(1);
mTabIndicator.setAlpha(actionBarAlpha / 255f);
mActionsButton.setAlpha(actionBarAlpha / 255f);
ViewUtils.setBackground(mActionBarOverlay, ThemeUtils.getWindowContentOverlay(this));
ViewSupport.setBackground(mActionBarOverlay, ThemeUtils.getWindowContentOverlay(this));
}
private void setupHomeTabs() {

View File

@ -29,7 +29,7 @@ import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils;
import android.support.v4.view.WindowCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
@ -37,6 +37,7 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
@ -47,14 +48,16 @@ import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCal
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.fragment.support.SearchFragment;
import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.accessor.ActivityAccessor;
import org.mariotaku.twidere.util.accessor.ActivityAccessor.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import static org.mariotaku.twidere.util.Utils.createFragmentForIntent;
@ -74,7 +77,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
public Fragment getCurrentVisibleFragment() {
return getSupportFragmentManager().findFragmentById(R.id.main_content);
return getSupportFragmentManager().findFragmentById(R.id.content_fragment);
}
@Override
@ -89,13 +92,27 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
public void onFitSystemWindows(Rect insets) {
final Toolbar toolbar = peekActionBarToolbar();
if (toolbar != null) {
final ViewGroup.LayoutParams toolBarParams = toolbar.getLayoutParams();
if (toolBarParams instanceof ViewGroup.MarginLayoutParams) {
((ViewGroup.MarginLayoutParams) toolBarParams).topMargin = insets.top;
}
toolbar.setLayoutParams(toolBarParams);
}
insets.top += ThemeUtils.getActionBarHeight(this);
super.onFitSystemWindows(insets);
final Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_content);
final Fragment fragment = getCurrentVisibleFragment();
if (fragment instanceof IBaseFragment) {
((IBaseFragment) fragment).requestFitSystemWindows();
}
}
@Override
public boolean getSystemWindowsInsets(Rect insets) {
return super.getSystemWindowsInsets(insets);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
@ -148,12 +165,17 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
final int linkId = matchLinkId(data);
requestWindowFeatures(getWindow(), linkId, data);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_fragment);
setSupportActionBar((Toolbar) findViewById(R.id.tool_bar));
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
final Toolbar toolbar = peekActionBarToolbar();
ViewCompat.setElevation(toolbar, ThemeUtils.getSupportActionBarElevation(this));
ViewSupport.setOutlineProvider(toolbar, ViewOutlineProviderCompat.BACKGROUND);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
setActionBarTheme(actionBar, linkId, data);
}
setContentView(R.layout.activity_content_fragment);
mMainContent.setOnFitSystemWindowsListener(this);
setStatusBarColor(linkId, data);
setTaskInfo(linkId, data);
@ -162,14 +184,29 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
}
}
private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() {
private final Rect tempInsets = new Rect();
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (left != oldLeft && top != oldTop && right != oldRight && bottom != oldBottom) {
mMainContent.getSystemWindowsInsets(tempInsets);
onFitSystemWindows(tempInsets);
}
}
};
@Override
protected void onStart() {
super.onStart();
mMultiSelectHandler.dispatchOnStart();
mMainContent.addOnLayoutChangeListener(mLayoutChangeListener);
}
@Override
protected void onStop() {
mMainContent.removeOnLayoutChangeListener(mLayoutChangeListener);
mMultiSelectHandler.dispatchOnStop();
super.onStop();
}
@ -178,14 +215,13 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean result = super.onPrepareOptionsMenu(menu);
if (!shouldSetActionItemColor()) return result;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
final Toolbar toolbar = peekActionBarToolbar();
if (toolbar != null) {
final int themeColor = getCurrentThemeColor();
final int themeId = getCurrentThemeResourceId();
final int itemColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor);
final Toolbar toolbar = (Toolbar) actionBarView;
ThemeUtils.setActionBarOverflowColor(toolbar, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewUtils.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(toolbar, ActionMenuView.class), itemColor, itemColor);
}
return result;
}
@ -198,14 +234,12 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
final Toolbar toolbar = peekActionBarToolbar();
final boolean result = super.onPrepareOptionsPanel(view, menu);
if (mActionBarItemsColor != 0) {
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
((Toolbar) actionBarView).setTitleTextColor(mActionBarItemsColor);
((Toolbar) actionBarView).setSubtitleTextColor(mActionBarItemsColor);
ThemeUtils.setActionBarOverflowColor((Toolbar) actionBarView, mActionBarItemsColor);
}
if (mActionBarItemsColor != 0 && toolbar != null) {
toolbar.setTitleTextColor(mActionBarItemsColor);
toolbar.setSubtitleTextColor(mActionBarItemsColor);
ThemeUtils.setActionBarOverflowColor(toolbar, mActionBarItemsColor);
}
return result;
}
@ -245,9 +279,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_MODE_OVERLAY);
final int transitionRes;
switch (linkId) {
case LINK_ID_USER: {
@ -276,12 +307,9 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
final String option = getThemeBackgroundOption();
int actionBarItemsColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor);
switch (linkId) {
// case LINK_ID_USER: {
// actionBarItemsColor = Color.WHITE;
// break;
// }
case LINK_ID_SEARCH:
case LINK_ID_USER_LISTS: {
case LINK_ID_USER_LISTS:
case LINK_ID_FILTERS: {
ThemeUtils.applyActionBarBackground(actionBar, this, themeId, themeColor, option, false);
ThemeUtils.applyActionBarBackground(getActionBar(), this, themeId, themeColor, option, true);
break;
@ -328,7 +356,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
// }
default: {
if (ThemeUtils.isColoredActionBar(getCurrentThemeResourceId())) {
ActivityAccessor.setTaskDescription(this, new TaskDescriptionCompat(null, null,
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null,
getCurrentThemeColor()));
}
break;
@ -443,10 +471,22 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
setSubtitle(uri.getQueryParameter(QUERY_PARAM_QUERY));
break;
}
case LINK_ID_ACCOUNTS: {
setTitle(R.string.accounts);
break;
}
case LINK_ID_DRAFTS: {
setTitle(R.string.drafts);
break;
}
case LINK_ID_FILTERS: {
setTitle(R.string.filters);
break;
}
}
mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY));
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main_content, fragment);
ft.replace(R.id.content_fragment, fragment);
ft.commit();
return true;
}
@ -460,23 +500,22 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
public void setControlBarOffset(float offset) {
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
actionBar.setHideOffset(Math.round((1 - offset) * getControlBarHeight()));
final Toolbar toolbar = peekActionBarToolbar();
if (toolbar == null) return;
toolbar.setTranslationY(-Math.round((1 - offset) * getControlBarHeight()));
notifyControlBarOffsetChanged();
}
@Override
public float getControlBarOffset() {
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return 0;
return 1f - actionBar.getHideOffset() / (float) getControlBarHeight();
final Toolbar toolbar = peekActionBarToolbar();
return toolbar != null ? 1 + toolbar.getTranslationY() / (float) getControlBarHeight() : 0;
}
@Override
public int getControlBarHeight() {
final ActionBar actionBar = getSupportActionBar();
return actionBar != null ? actionBar.getHeight() : 0;
final Toolbar toolbar = peekActionBarToolbar();
return toolbar != null ? toolbar.getHeight() : 0;
}
}

View File

@ -39,8 +39,7 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@ -121,6 +120,10 @@ public class SignInActivity extends BaseDialogWhenLargeActivity implements Twitt
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getThemeResource(this);
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
@ -176,6 +179,8 @@ public class SignInActivity extends BaseDialogWhenLargeActivity implements Twitt
}
}
@Override
public void onContentChanged() {
super.onContentChanged();
@ -277,21 +282,14 @@ public class SignInActivity extends BaseDialogWhenLargeActivity implements Twitt
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mResolver = getContentResolver();
mApplication = TwidereApplication.getInstance(this);
setContentView(R.layout.activity_sign_in);
final long[] account_ids = getActivatedAccountIds(this);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(account_ids.length > 0);
}
// setSupportActionBar((Toolbar) findViewById(R.id.tool_bar));
if (savedInstanceState != null) {
mAPIUrlFormat = savedInstanceState.getString(Accounts.API_URL_FORMAT);
mAuthType = savedInstanceState.getInt(Accounts.AUTH_TYPE);

View File

@ -19,10 +19,15 @@
package org.mariotaku.twidere.activity.support;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.ThemedAppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.View;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
@ -40,6 +45,7 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
private String mCurrentThemeFontFamily;
private AppCompatDelegate mDelegate;
private Toolbar mToolbar;
@Override
public String getCurrentThemeFontFamily() {
@ -98,7 +104,6 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
setupTheme();
super.onCreate(savedInstanceState);
}
@ -115,16 +120,42 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
return mDelegate = ThemedAppCompatDelegate.create(this, this);
}
private void setupTheme() {
mCurrentThemeResource = getThemeResourceId();
@Override
public void setTheme(int resid) {
super.setTheme(mCurrentThemeResource = getThemeResourceId());
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resid, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
setTheme(mCurrentThemeResource);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource,
ThemeUtils.applyWindowBackground(this, getWindow(), getDelegate(), resid,
mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
super.onApplyThemeResource(theme, resid, first);
}
@Override
public void setSupportActionBar(Toolbar toolbar) {
super.setSupportActionBar(toolbar);
mToolbar = toolbar;
}
@Nullable
public final Toolbar peekActionBarToolbar() {
return mToolbar;
}
@Nullable
public final Toolbar getActionBarToolbar() {
if (mToolbar != null) return mToolbar;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
return (Toolbar) actionBarView;
}
return null;
}
}

View File

@ -20,6 +20,7 @@
package org.mariotaku.twidere.activity.support;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
@ -129,7 +130,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
setTheme();
super.onCreate(savedInstanceState);
mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler();
}
@ -146,17 +146,22 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
super.onTitleChanged(title, color);
}
private void setTheme() {
mCurrentThemeResource = getThemeResourceId();
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
setTheme(mCurrentThemeResource);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
@Override
public void setTheme(int resid) {
super.setTheme(mCurrentThemeResource = getThemeResourceId());
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resid, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mProfileImageStyle = Utils.getProfileImageStyle(this);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
super.onApplyThemeResource(theme, resid, first);
}
@Override
public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event) {
return false;

View File

@ -21,17 +21,11 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.support.v7.widget.FixedLinearLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -41,23 +35,19 @@ import com.squareup.otto.Bus;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter.ActivityAdapterListener;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.SimpleDrawerCallback;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback;
import org.mariotaku.twidere.view.holder.GapViewHolder;
/**
* Created by mariotaku on 14/11/5.
*/
public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment implements LoaderCallbacks<Data>,
OnRefreshListener, DrawerCallback, RefreshScrollTopInterface, ActivityAdapterListener {
public abstract class AbsActivitiesFragment<Data> extends AbsContentRecyclerViewFragment<AbsActivitiesAdapter<Data>>
implements LoaderCallbacks<Data>, OnRefreshListener, DrawerCallback, RefreshScrollTopInterface,
ActivityAdapterListener {
private final Object mStatusesBusCallback;
@ -65,80 +55,17 @@ public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment im
mStatusesBusCallback = createMessageBusCallback();
}
private View mContentView;
private SharedPreferences mPreferences;
private View mProgressContainer;
private SwipeRefreshLayout mSwipeRefreshLayout;
private RecyclerView mRecyclerView;
private AbsActivitiesAdapter<Data> mAdapter;
private SimpleDrawerCallback mDrawerCallback;
private final OnScrollListener mOnScrollListener = new OnScrollListener() {
private int mScrollState;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
mScrollState = newState;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (isRefreshing()) return;
if (mAdapter.isLoadMoreIndicatorVisible() && mScrollState != RecyclerView.SCROLL_STATE_IDLE
&& layoutManager.findLastVisibleItemPosition() == mAdapter.getItemCount() - 1) {
onLoadMoreStatuses();
}
}
};
@Override
public boolean canScroll(float dy) {
return mDrawerCallback.canScroll(dy);
}
@Override
public void cancelTouch() {
mDrawerCallback.cancelTouch();
}
@Override
public void fling(float velocity) {
mDrawerCallback.fling(velocity);
}
@Override
public boolean isScrollContent(float x, float y) {
return mDrawerCallback.isScrollContent(x, y);
}
@Override
public void onGapClick(GapViewHolder holder, int position) {
final ParcelableActivity activity = mAdapter.getActivity(position);
final ParcelableActivity activity = getAdapter().getActivity(position);
final long[] accountIds = {activity.account_id};
final long[] maxIds = {activity.min_position};
getActivities(accountIds, maxIds, null);
}
@Override
public void scrollBy(float dy) {
mDrawerCallback.scrollBy(dy);
}
@Override
public boolean shouldLayoutHeaderBottom() {
return mDrawerCallback.shouldLayoutHeaderBottom();
}
@Override
public void topChanged(int offset) {
mDrawerCallback.topChanged(offset);
}
public AbsActivitiesAdapter<Data> getAdapter() {
return mAdapter;
}
public SharedPreferences getSharedPreferences() {
if (mPreferences != null) return mPreferences;
@ -147,14 +74,6 @@ public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment im
public abstract int getActivities(long[] accountIds, long[] maxIds, long[] sinceIds);
public boolean isRefreshing() {
return mSwipeRefreshLayout.isRefreshing();
}
public void setRefreshing(boolean refreshing) {
mSwipeRefreshLayout.setRefreshing(refreshing);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_content_recyclerview, container, false);
@ -165,24 +84,9 @@ public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment im
super.onActivityCreated(savedInstanceState);
final View view = getView();
if (view == null) throw new AssertionError();
final Context context = view.getContext();
final boolean compact = Utils.isCompactCards(context);
mDrawerCallback = new SimpleDrawerCallback(mRecyclerView);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeColors(ThemeUtils.getUserAccentColor(context));
mAdapter = onCreateAdapter(context, compact);
mAdapter.setLoadMoreIndicatorVisible(true);
mAdapter.setListener(this);
final LinearLayoutManager layoutManager = new FixedLinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
if (compact) {
mRecyclerView.addItemDecoration(new DividerItemDecoration(context, layoutManager.getOrientation()));
}
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setOnScrollListener(mOnScrollListener);
getAdapter().setListener(this);
getLoaderManager().initLoader(0, getArguments(), this);
setListShown(false);
showProgress();
}
@Override
@ -202,8 +106,8 @@ public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment im
@Override
public void onLoadFinished(Loader<Data> loader, Data data) {
setRefreshing(false);
mAdapter.setData(data);
setListShown(true);
getAdapter().setData(data);
showContent();
}
@Override
@ -216,56 +120,33 @@ public abstract class AbsActivitiesFragment<Data> extends BaseSupportFragment im
}
@Override
public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mContentView = view.findViewById(R.id.fragment_content);
mProgressContainer = view.findViewById(R.id.progress_container);
mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_layout);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
}
@Override
protected void fitSystemWindows(Rect insets) {
super.fitSystemWindows(insets);
mContentView.setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
@Override
public boolean scrollToStart() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
final int tabPosition = getTabPosition();
if (twitter != null && tabPosition != -1) {
twitter.clearUnreadCountAsync(tabPosition);
final boolean result = super.scrollToStart();
if (result) {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
final int tabPosition = getTabPosition();
if (twitter != null && tabPosition != -1) {
twitter.clearUnreadCountAsync(tabPosition);
}
}
mRecyclerView.smoothScrollToPosition(0);
return true;
}
protected abstract long[] getAccountIds();
protected Data getAdapterData() {
return mAdapter.getData();
return getAdapter().getData();
}
protected void setAdapterData(Data data) {
mAdapter.setData(data);
getAdapter().setData(data);
}
protected Object createMessageBusCallback() {
return new StatusesBusCallback();
}
protected abstract AbsActivitiesAdapter<Data> onCreateAdapter(Context context, boolean compact);
protected abstract void onLoadMoreStatuses();
private void setListShown(boolean shown) {
mProgressContainer.setVisibility(shown ? View.GONE : View.VISIBLE);
mSwipeRefreshLayout.setVisibility(shown ? View.VISIBLE : View.GONE);
}
protected final class StatusesBusCallback {
protected StatusesBusCallback() {

View File

@ -79,15 +79,11 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.mariotaku.querybuilder.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.FiltersActivity;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountsManagerActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.DraftsActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.support.QuickSearchBarActivity;
import org.mariotaku.twidere.activity.support.UserProfileEditorActivity;
import org.mariotaku.twidere.adapter.ArrayAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
@ -305,7 +301,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
final Bundle bundle = new Bundle();
bundle.putLong(EXTRA_ACCOUNT_ID, account.account_id);
final Intent intent = new Intent(INTENT_ACTION_EDIT_USER_PROFILE);
intent.setClass(getActivity(), UserProfileEditorActivity.class);
intent.setClass(getActivity(), UserProfileEditorFragment.class);
intent.putExtras(bundle);
startActivity(intent);
break;
@ -316,20 +312,15 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
final OptionItem option = (OptionItem) item;
switch (option.id) {
case MENU_ACCOUNTS: {
final Intent intent = new Intent(getActivity(), AccountsManagerActivity.class);
startActivity(intent);
Utils.openAccountsManager(getActivity());
break;
}
case MENU_DRAFTS: {
final Intent intent = new Intent(INTENT_ACTION_DRAFTS);
intent.setClass(getActivity(), DraftsActivity.class);
startActivity(intent);
Utils.openDrafts(getActivity());
break;
}
case MENU_FILTERS: {
final Intent intent = new Intent(getActivity(), FiltersActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
Utils.openFilters(getActivity());
break;
}
case MENU_SETTINGS: {

View File

@ -12,6 +12,7 @@ import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
@ -75,6 +76,13 @@ public class AccountsManagerFragment extends BaseSupportFragment implements Load
mProgressContainer.setVisibility(shown ? View.GONE : View.VISIBLE);
}
@Override
protected void fitSystemWindows(Rect insets) {
final View view = getView();
if (view != null) {
view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.fragment.support;
import android.app.AlertDialog;
import android.app.Dialog;
@ -29,24 +29,27 @@ import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Rect;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
@ -57,10 +60,9 @@ import android.widget.TextView;
import org.mariotaku.querybuilder.Columns.Column;
import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.RawItemArray;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.DraftsAdapter;
import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment;
import org.mariotaku.twidere.fragment.support.SupportProgressDialogFragment;
import org.mariotaku.twidere.model.DraftItem;
import org.mariotaku.twidere.model.ParcelableMediaUpdate;
import org.mariotaku.twidere.model.ParcelableStatusUpdate;
@ -75,8 +77,8 @@ import java.util.List;
import static org.mariotaku.twidere.util.Utils.getDefaultTextSize;
public class DraftsActivity extends BaseDialogWhenLargeActivity implements LoaderCallbacks<Cursor>, OnItemClickListener,
MultiChoiceModeListener {
public class DraftsFragment extends BaseSupportFragment implements Constants, LoaderCallbacks<Cursor>,
OnItemClickListener, MultiChoiceModeListener {
private ContentResolver mResolver;
private SharedPreferences mPreferences;
@ -93,7 +95,7 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
getMenuInflater().inflate(R.menu.action_multi_select_drafts, menu);
mode.getMenuInflater().inflate(R.menu.action_multi_select_drafts, menu);
return true;
}
@ -111,7 +113,7 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
final Bundle args = new Bundle();
args.putLongArray(EXTRA_IDS, mListView.getCheckedItemIds());
f.setArguments(args);
f.show(getSupportFragmentManager(), "delete_drafts_confirm");
f.show(getChildFragmentManager(), "delete_drafts_confirm");
break;
}
case MENU_SEND: {
@ -150,7 +152,7 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
final Uri uri = Drafts.CONTENT_URI_UNSENT;
final String[] cols = Drafts.COLUMNS;
final String orderBy = Drafts.TIMESTAMP + " DESC";
return new CursorLoader(this, uri, cols, null, null, orderBy);
return new CursorLoader(getActivity(), uri, cols, null, null, orderBy);
}
@Override
@ -180,31 +182,19 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
}
}
@Nullable
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_drafts, container, false);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mResolver = getContentResolver();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, getDefaultTextSize(this));
setContentView(R.layout.activity_drafts);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
mAdapter = new DraftsAdapter(this);
mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, getDefaultTextSize(getActivity()));
mAdapter = new DraftsAdapter(getActivity());
mListView.setAdapter(mAdapter);
mListView.setEmptyView(mEmptyView);
mListView.setOnItemClickListener(this);
@ -212,12 +202,12 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
mListView.setMultiChoiceModeListener(this);
mEmptyIcon.setImageResource(R.drawable.ic_info_drafts);
mEmptyText.setText(R.string.drafts_hint_messages);
getSupportLoaderManager().initLoader(0, null, this);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
protected void onStart() {
public void onStart() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
twitter.clearNotificationAsync(NOTIFICATION_ID_DRAFTS);
@ -226,9 +216,9 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
}
@Override
protected void onResume() {
public void onResume() {
super.onResume();
final float text_size = mPreferences.getInt(KEY_TEXT_SIZE, getDefaultTextSize(this));
final float text_size = mPreferences.getInt(KEY_TEXT_SIZE, getDefaultTextSize(getActivity()));
mAdapter.setTextSize(text_size);
if (mTextSize != text_size) {
mTextSize = text_size;
@ -237,19 +227,19 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
}
@Override
protected void onStop() {
public void onStop() {
super.onStop();
}
@Override
public void onContentChanged() {
super.onContentChanged();
mListView = (ListView) findViewById(android.R.id.list);
mEmptyView = findViewById(android.R.id.empty);
mEmptyText = (TextView) findViewById(R.id.empty_text);
mEmptyIcon = (ImageView) findViewById(R.id.empty_icon);
mProgressContainer = findViewById(R.id.progress_container);
mListContainer = findViewById(R.id.list_container);
public void onBaseViewCreated(View view, Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mListView = (ListView) view.findViewById(android.R.id.list);
mEmptyView = view.findViewById(android.R.id.empty);
mEmptyText = (TextView) view.findViewById(R.id.empty_text);
mEmptyIcon = (ImageView) view.findViewById(R.id.empty_icon);
mProgressContainer = view.findViewById(R.id.progress_container);
mListContainer = view.findViewById(R.id.list_container);
}
public void setListShown(boolean listShown) {
@ -258,6 +248,14 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
mEmptyView.setVisibility(listShown && mAdapter.isEmpty() ? View.VISIBLE : View.GONE);
}
@Override
protected void fitSystemWindows(Rect insets) {
final View view = getView();
if (view != null) {
view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
}
private void editDraft(final DraftItem draft) {
final Intent intent = new Intent(INTENT_ACTION_EDIT_DRAFT);
final Bundle bundle = new Bundle();
@ -272,7 +270,7 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
if (twitter == null) return false;
for (final DraftItem item : list) {
if (item.action_type == Drafts.ACTION_UPDATE_STATUS || item.action_type <= 0) {
twitter.updateStatusesAsync(new ParcelableStatusUpdate(this, item));
twitter.updateStatusesAsync(new ParcelableStatusUpdate(getActivity(), item));
} else if (item.action_type == Drafts.ACTION_SEND_DIRECT_MESSAGE) {
final long recipientId = item.action_extras.optLong(EXTRA_RECIPIENT_ID);
if (item.account_ids == null || item.account_ids.length <= 0 || recipientId <= 0) {
@ -329,7 +327,7 @@ public class DraftsActivity extends BaseDialogWhenLargeActivity implements Loade
private DeleteDraftsTask(final FragmentActivity activity, final long[] ids) {
mActivity = activity;
mNotificationManager = (NotificationManager) activity.getSystemService(NOTIFICATION_SERVICE);
mNotificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
mIds = ids;
mHandler = new Handler(activity.getMainLooper());
}

View File

@ -0,0 +1,128 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment.support;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredKeywordsFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredLinksFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredSourcesFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment.FilteredUsersFragment;
import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.fragment.support.BaseSupportFragment;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.TabPagerIndicator;
public class FiltersFragment extends BaseSupportFragment implements RefreshScrollTopInterface,
SupportFragmentCallback, IBaseFragment.SystemWindowsInsetsCallback {
private TabPagerIndicator mPagerIndicator;
private ViewPager mViewPager;
private SupportTabsAdapter mPagerAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_content_pages, container, false);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final FragmentActivity activity = getActivity();
mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
mPagerIndicator.setViewPager(mViewPager);
mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL);
mPagerAdapter.addTab(FilteredUsersFragment.class, null, getString(R.string.users), null, 0, null);
mPagerAdapter.addTab(FilteredKeywordsFragment.class, null, getString(R.string.keywords), null, 1, null);
mPagerAdapter.addTab(FilteredSourcesFragment.class, null, getString(R.string.sources), null, 2, null);
mPagerAdapter.addTab(FilteredLinksFragment.class, null, getString(R.string.links), null, 3, null);
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable());
ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable());
}
@Override
public void onBaseViewCreated(View view, Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs);
}
@Override
public boolean scrollToStart() {
final Fragment fragment = getCurrentVisibleFragment();
if (!(fragment instanceof RefreshScrollTopInterface)) return false;
((RefreshScrollTopInterface) fragment).scrollToStart();
return true;
}
@Override
public boolean triggerRefresh() {
return false;
}
@Override
public Fragment getCurrentVisibleFragment() {
final int currentItem = mViewPager.getCurrentItem();
if (currentItem < 0 || currentItem >= mPagerAdapter.getCount()) return null;
return (Fragment) mPagerAdapter.instantiateItem(mViewPager, currentItem);
}
@Override
protected void fitSystemWindows(Rect insets) {
super.fitSystemWindows(insets);
final View view = getView();
if (view == null) {
return;
}
view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
@Override
public boolean getSystemWindowsInsets(Rect insets) {
return false;
}
@Override
public boolean triggerRefresh(int position) {
return false;
}
}

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import com.squareup.otto.Bus;
@ -61,17 +62,7 @@ public abstract class ParcelableActivitiesFragment extends AbsActivitiesFragment
}
@Override
protected long[] getAccountIds() {
return new long[]{getAccountId()};
}
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(final Context context, final boolean compact) {
return new ParcelableActivitiesAdapter(context,compact);
}
@Override
protected void onLoadMoreStatuses() {
public void onLoadMoreContents() {
final IActivitiesAdapter<List<ParcelableActivity>> adapter = getAdapter();
final long[] maxIds = new long[]{adapter.getActivity(adapter.getActivityCount() - 1).min_position};
getActivities(getAccountIds(), maxIds, null);
@ -91,6 +82,22 @@ public abstract class ParcelableActivitiesFragment extends AbsActivitiesFragment
return true;
}
@Override
public boolean isRefreshing() {
return getLoaderManager().hasRunningLoaders();
}
@Override
protected long[] getAccountIds() {
return new long[]{getAccountId()};
}
@NonNull
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(final Context context, final boolean compact) {
return new ParcelableActivitiesAdapter(context, compact);
}
protected long getAccountId() {
final Bundle args = getArguments();
return args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;

View File

@ -150,7 +150,7 @@ public class QuickMenuFragment extends BaseSupportFragment implements OnFitSyste
public Context getThemedContext() {
if (mThemedContext != null) return mThemedContext;
final Context context = getActivity();
final int currentThemeResource = ThemeUtils.getThemeResource(context);
final int currentThemeResource = ThemeUtils.getNoActionBarThemeResource(context);
final int themeResource = ThemeUtils.getDrawerThemeResource(currentThemeResource);
return mThemedContext = new ContextThemeWrapper(context, themeResource);
}

View File

@ -167,6 +167,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable());
ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable());
if (savedInstanceState == null && args != null && args.containsKey(EXTRA_QUERY)) {
final String query = args.getString(EXTRA_QUERY);
final SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(),
@ -298,7 +299,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
controlBarHeight = mControlBarHeight;
}
if (controlBarHeight == 0) {
return Utils.getActionBarHeight(activity);
return ThemeUtils.getActionBarHeight(activity);
}
return controlBarHeight;
}

View File

@ -567,7 +567,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final ParcelableStatus status = data.getData();
final Bundle dataExtra = data.getExtras();
final ParcelableCredentials credentials = dataExtra.getParcelable(EXTRA_ACCOUNT);
if (mStatusAdapter.setStatus(credentials, status)) {
if (mStatusAdapter.setStatus(status, credentials)) {
mLayoutManager.scrollToPositionWithOffset(1, 0);
mStatusAdapter.setConversation(null);
mStatusAdapter.setReplies(null);
@ -1543,7 +1543,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
updateItemDecoration();
}
public boolean setStatus(ParcelableCredentials credentials, ParcelableStatus status) {
public boolean setStatus(final ParcelableStatus status, final ParcelableCredentials credentials) {
final ParcelableStatus old = mStatus;
mStatus = status;
mStatusAccount = credentials;

View File

@ -91,7 +91,6 @@ import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.support.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.activity.support.UserProfileEditorActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
@ -125,13 +124,13 @@ import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.accessor.ActivityAccessor;
import org.mariotaku.twidere.util.accessor.ActivityAccessor.TaskDescriptionCompat;
import org.mariotaku.twidere.util.menu.TwidereMenuInfo;
import org.mariotaku.twidere.util.message.FriendshipUpdatedEvent;
import org.mariotaku.twidere.util.message.ProfileUpdatedEvent;
import org.mariotaku.twidere.util.message.TaskStateChangedEvent;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ColorLabelRelativeLayout;
import org.mariotaku.twidere.view.HeaderDrawerLayout;
import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback;
@ -1135,15 +1134,10 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
@Override
protected void fitSystemWindows(Rect insets) {
super.fitSystemWindows(insets);
final ThemedAppCompatActivity activity = (ThemedAppCompatActivity) getActivity();
mHeaderDrawerLayout.setPadding(insets.left, insets.top, insets.right, insets.bottom);
final FragmentActivity activity = getActivity();
final boolean isTransparentBackground;
if (activity instanceof IThemedActivity) {
final String backgroundOption = ((IThemedActivity) activity).getCurrentThemeBackgroundOption();
isTransparentBackground = ThemeUtils.isTransparentBackground(backgroundOption);
} else {
isTransparentBackground = ThemeUtils.isTransparentBackground(getActivity());
}
final String backgroundOption = activity.getCurrentThemeBackgroundOption();
final boolean isTransparentBackground = ThemeUtils.isTransparentBackground(backgroundOption);
mHeaderDrawerLayout.setClipToPadding(isTransparentBackground);
}
@ -1159,12 +1153,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
}
case R.id.follow: {
if (user.id == user.account_id) {
final Bundle extras = new Bundle();
extras.putLong(EXTRA_ACCOUNT_ID, user.account_id);
final Intent intent = new Intent(INTENT_ACTION_EDIT_USER_PROFILE);
intent.setClass(getActivity(), UserProfileEditorActivity.class);
intent.putExtras(extras);
startActivity(intent);
Utils.openProfileEditor(getActivity(), user.account_id);
break;
}
final Relationship relationship = mRelationship;
@ -1210,7 +1199,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
}
case R.id.name_container: {
if (user.account_id != user.id) return;
startActivity(new Intent(getActivity(), UserProfileEditorActivity.class));
Utils.openProfileEditor(getActivity(), user.account_id);
break;
}
}
@ -1331,6 +1320,11 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
private static void setCompatToolbarOverlayAlpha(FragmentActivity activity, float alpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return;
final View windowOverlay = activity.findViewById(R.id.window_overlay);
if (windowOverlay != null) {
windowOverlay.setAlpha(alpha);
return;
}
final Drawable drawable = ThemeUtils.getCompatToolbarOverlay(activity);
if (drawable == null) return;
drawable.setAlpha(Math.round(alpha * 255));
@ -1356,12 +1350,12 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
if (mActionBarBackground != null) {
mActionBarBackground.setColor(actionBarColor);
}
ActivityAccessor.setTaskDescription(activity, new TaskDescriptionCompat(null, null, actionBarColor));
ActivitySupport.setTaskDescription(activity, new TaskDescriptionCompat(null, null, actionBarColor));
mDescriptionView.setLinkTextColor(color);
mProfileBannerView.setBackgroundColor(color);
mLocationView.setLinkTextColor(color);
mURLView.setLinkTextColor(color);
ViewUtils.setBackground(mPagerIndicator, ThemeUtils.getActionBarStackedBackground(activity, themeRes, color, true));
ViewSupport.setBackground(mPagerIndicator, ThemeUtils.getActionBarStackedBackground(activity, themeRes, color, true));
final HeaderDrawerLayout drawer = mHeaderDrawerLayout;
if (drawer != null) {
@ -1502,13 +1496,13 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
if (mActionBarHomeAsUpIndicator != null) {
mActionBarHomeAsUpIndicator.setColorFilter(itemColor, Mode.SRC_ATOP);
}
final View actionBarView = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
final Toolbar toolbar = (Toolbar) actionBarView;
final Toolbar actionBarView = activity.getActionBarToolbar();
if (actionBarView != null) {
final Toolbar toolbar = actionBarView;
toolbar.setTitleTextColor(itemColor);
toolbar.setSubtitleTextColor(itemColor);
ThemeUtils.setActionBarOverflowColor(toolbar, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewUtils.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor);
ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor);
}
mPagerIndicator.updateAppearance();
}
@ -1521,15 +1515,14 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final float nameShowingRatio = (mHeaderDrawerLayout.getPaddingTop() - location[1])
/ (float) mNameView.getHeight();
final float textAlpha = MathUtils.clamp(nameShowingRatio, 0, 1);
final FragmentActivity activity = getActivity();
final View actionBarView = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
final Toolbar toolbar = (Toolbar) actionBarView;
final TextView titleView = ViewUtils.findViewByText(toolbar, toolbar.getTitle());
final ThemedAppCompatActivity activity = (ThemedAppCompatActivity) getActivity();
final Toolbar actionBarView = activity.getActionBarToolbar();
if (actionBarView != null) {
final TextView titleView = ViewSupport.findViewByText(actionBarView, actionBarView.getTitle());
if (titleView != null) {
titleView.setAlpha(textAlpha);
}
final TextView subtitleView = ViewUtils.findViewByText(toolbar, toolbar.getSubtitle());
final TextView subtitleView = ViewSupport.findViewByText(actionBarView, actionBarView.getSubtitle());
if (subtitleView != null) {
subtitleView.setAlpha(textAlpha);
}

View File

@ -45,31 +45,24 @@ public class UserListsFragment extends BaseSupportFragment implements RefreshScr
private SupportTabsAdapter mPagerAdapter;
private TabPagerIndicator mPagerIndicator;
@Override
public Fragment getCurrentVisibleFragment() {
final int currentItem = mViewPager.getCurrentItem();
if (currentItem < 0 || currentItem >= mPagerAdapter.getCount()) return null;
return (Fragment) mPagerAdapter.instantiateItem(mViewPager, currentItem);
}
public void hideIndicator() {
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Bundle args = getArguments();
final FragmentActivity activity = getActivity();
mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1);
mPagerAdapter.addTab(UserListsListFragment.class, args, getString(R.string.follows), null, 0, null);
mPagerAdapter.addTab(UserListMembershipsListFragment.class, args, getString(R.string.belongs_to), 0, 1, null);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
mPagerIndicator.setViewPager(mViewPager);
mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL);
mPagerAdapter.addTab(UserListsListFragment.class, args, getString(R.string.follows), null, 0, null);
mPagerAdapter.addTab(UserListMembershipsListFragment.class, args, getString(R.string.belongs_to), 0, 1, null);
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable());
ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable());
}
@ -93,9 +86,6 @@ public class UserListsFragment extends BaseSupportFragment implements RefreshScr
return true;
}
public void showIndicator() {
}
@Override
public boolean triggerRefresh() {
final Fragment fragment = getCurrentVisibleFragment();
@ -104,6 +94,12 @@ public class UserListsFragment extends BaseSupportFragment implements RefreshScr
return true;
}
@Override
public Fragment getCurrentVisibleFragment() {
final int currentItem = mViewPager.getCurrentItem();
if (currentItem < 0 || currentItem >= mPagerAdapter.getCount()) return null;
return (Fragment) mPagerAdapter.instantiateItem(mViewPager, currentItem);
}
@Override
protected void fitSystemWindows(Rect insets) {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.content.Intent;
@ -26,25 +26,30 @@ import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.ImagePickerActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.support.SupportProgressDialogFragment;
import org.mariotaku.twidere.loader.support.ParcelableUserLoader;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.SingleResponse;
@ -55,6 +60,7 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.TwitterWrapper;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ForegroundColorView;
import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener;
@ -64,10 +70,8 @@ import twitter4j.User;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.Utils.getTwitterInstance;
import static org.mariotaku.twidere.util.Utils.isMyAccount;
import static org.mariotaku.twidere.util.Utils.showErrorMessage;
public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity implements OnSizeChangedListener, TextWatcher,
public class UserProfileEditorFragment extends BaseSupportFragment implements OnSizeChangedListener, TextWatcher,
OnClickListener, LoaderCallbacks<SingleResponse<ParcelableUser>> {
private static final int LOADER_ID_USER = 1;
@ -118,19 +122,19 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
break;
}
case R.id.profile_image_camera: {
final Intent intent = new Intent(this, ImagePickerActivity.class);
final Intent intent = new Intent(getActivity(), ImagePickerActivity.class);
intent.setAction(INTENT_ACTION_PICK_IMAGE);
startActivityForResult(intent, REQUEST_UPLOAD_PROFILE_IMAGE);
break;
}
case R.id.profile_image_gallery: {
final Intent intent = new Intent(this, ImagePickerActivity.class);
final Intent intent = new Intent(getActivity(), ImagePickerActivity.class);
intent.setAction(INTENT_ACTION_TAKE_PHOTO);
startActivityForResult(intent, REQUEST_UPLOAD_PROFILE_IMAGE);
break;
}
case R.id.profile_banner_gallery: {
final Intent intent = new Intent(this, ImagePickerActivity.class);
final Intent intent = new Intent(getActivity(), ImagePickerActivity.class);
intent.setAction(INTENT_ACTION_PICK_IMAGE);
startActivityForResult(intent, REQUEST_UPLOAD_PROFILE_BANNER_IMAGE);
break;
@ -141,14 +145,14 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
break;
}
case R.id.set_link_color: {
final Intent intent = new Intent(this, ColorPickerDialogActivity.class);
final Intent intent = new Intent(getActivity(), ColorPickerDialogActivity.class);
intent.putExtra(EXTRA_COLOR, user.link_color);
intent.putExtra(EXTRA_ALPHA_SLIDER, false);
startActivityForResult(intent, REQUEST_PICK_LINK_COLOR);
break;
}
case R.id.set_background_color: {
final Intent intent = new Intent(this, ColorPickerDialogActivity.class);
final Intent intent = new Intent(getActivity(), ColorPickerDialogActivity.class);
intent.putExtra(EXTRA_COLOR, user.background_color);
intent.putExtra(EXTRA_ALPHA_SLIDER, false);
startActivityForResult(intent, REQUEST_PICK_BACKGROUND_COLOR);
@ -161,8 +165,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
public Loader<SingleResponse<ParcelableUser>> onCreateLoader(final int id, final Bundle args) {
mProgressContainer.setVisibility(View.VISIBLE);
mEditProfileContent.setVisibility(View.GONE);
return new ParcelableUserLoader(UserProfileEditorActivity.this, mAccountId, mAccountId, null, getIntent()
.getExtras(), false, false);
return new ParcelableUserLoader(getActivity(), mAccountId, mAccountId, null, getArguments(), false, false);
}
@Override
@ -180,18 +183,13 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_profile_editor, menu);
return true;
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_profile_editor, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
finish();
return true;
}
case MENU_SAVE: {
final String name = ParseUtils.parseString(mEditName.getText());
final String url = ParseUtils.parseString(mEditUrl.getText());
@ -209,24 +207,19 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAsyncTaskManager = TwidereApplication.getInstance(this).getAsyncTaskManager();
mLazyImageLoader = TwidereApplication.getInstance(this).getMediaLoaderWrapper();
final Intent intent = getIntent();
final long accountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1);
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final TwidereApplication application = TwidereApplication.getInstance(getActivity());
mAsyncTaskManager = application.getAsyncTaskManager();
mLazyImageLoader = application.getMediaLoaderWrapper();
final Bundle args = getArguments();
final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1);
mAccountId = accountId;
if (!isMyAccount(this, accountId)) {
finish();
if (!Utils.isMyAccount(getActivity(), accountId)) {
getActivity().finish();
return;
}
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.activity_user_profile_editor);
// setOverrideExitAniamtion(false);
mEditName.addTextChangedListener(this);
mEditDescription.addTextChangedListener(this);
@ -254,12 +247,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_USER, mUser);
outState.putString(EXTRA_NAME, ParseUtils.parseString(mEditName.getText()));
@ -268,49 +256,50 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
outState.putString(EXTRA_URL, ParseUtils.parseString(mEditUrl.getText()));
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onSizeChanged(final View view, final int w, final int h, final int oldw, final int oldh) {
}
@Nullable
@Override
public void onContentChanged() {
super.onContentChanged();
mProgressContainer = findViewById(R.id.progress_container);
mEditProfileContent = findViewById(R.id.edit_profile_content);
mProfileBannerView = (ImageView) findViewById(R.id.profile_banner);
mProfileImageView = (ImageView) findViewById(R.id.profile_image);
mEditName = (EditText) findViewById(R.id.name);
mEditDescription = (EditText) findViewById(R.id.description);
mEditLocation = (EditText) findViewById(R.id.location);
mEditUrl = (EditText) findViewById(R.id.url);
mProfileImageCamera = findViewById(R.id.profile_image_camera);
mProfileImageGallery = findViewById(R.id.profile_image_gallery);
mProfileBannerGallery = findViewById(R.id.profile_banner_gallery);
mProfileBannerRemove = findViewById(R.id.profile_banner_remove);
mLinkColor = (ForegroundColorView) findViewById(R.id.link_color);
mBackgroundColor = (ForegroundColorView) findViewById(R.id.background_color);
mSetLinkColor = findViewById(R.id.set_link_color);
mSetBackgroundColor = findViewById(R.id.set_background_color);
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_user_profile_editor, container, false);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (resultCode == RESULT_CANCELED) return;
public void onBaseViewCreated(View view, Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mProgressContainer = view.findViewById(R.id.progress_container);
mEditProfileContent = view.findViewById(R.id.edit_profile_content);
mProfileBannerView = (ImageView) view.findViewById(R.id.profile_banner);
mProfileImageView = (ImageView) view.findViewById(R.id.profile_image);
mEditName = (EditText) view.findViewById(R.id.name);
mEditDescription = (EditText) view.findViewById(R.id.description);
mEditLocation = (EditText) view.findViewById(R.id.location);
mEditUrl = (EditText) view.findViewById(R.id.url);
mProfileImageCamera = view.findViewById(R.id.profile_image_camera);
mProfileImageGallery = view.findViewById(R.id.profile_image_gallery);
mProfileBannerGallery = view.findViewById(R.id.profile_banner_gallery);
mProfileBannerRemove = view.findViewById(R.id.profile_banner_remove);
mLinkColor = (ForegroundColorView) view.findViewById(R.id.link_color);
mBackgroundColor = (ForegroundColorView) view.findViewById(R.id.background_color);
mSetLinkColor = view.findViewById(R.id.set_link_color);
mSetBackgroundColor = view.findViewById(R.id.set_background_color);
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (resultCode == FragmentActivity.RESULT_CANCELED) return;
switch (requestCode) {
case REQUEST_UPLOAD_PROFILE_BANNER_IMAGE: {
if (mTask != null && mTask.getStatus() == Status.RUNNING) return;
mTask = new UpdateProfileBannerImageTaskInternal(this, mAsyncTaskManager, mAccountId, data.getData(), true);
mTask = new UpdateProfileBannerImageTaskInternal(getActivity(), mAsyncTaskManager, mAccountId, data.getData(), true);
AsyncTaskUtils.executeTask(mTask);
break;
}
case REQUEST_UPLOAD_PROFILE_IMAGE: {
if (mTask != null && mTask.getStatus() == Status.RUNNING) return;
mTask = new UpdateProfileImageTaskInternal(this, mAsyncTaskManager, mAccountId, data.getData(), true);
mTask = new UpdateProfileImageTaskInternal(getActivity(), mAsyncTaskManager, mAccountId, data.getData(), true);
AsyncTaskUtils.executeTask(mTask);
break;
}
@ -369,7 +358,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
}
private void getUserInfo() {
final LoaderManager lm = getSupportLoaderManager();
final LoaderManager lm = getLoaderManager();
lm.destroyLoader(LOADER_ID_USER);
mGetUserInfoCalled = true;
if (mUserInfoLoaderInitialized) {
@ -408,7 +397,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
static class UpdateProfileTaskInternal extends AsyncTask<Object, Object, SingleResponse<ParcelableUser>> {
private static final String DIALOG_FRAGMENT_TAG = "updating_user_profile";
private final UserProfileEditorActivity mActivity;
private final UserProfileEditorFragment mFragment;
private final Handler mHandler;
private final long mAccountId;
private final ParcelableUser mOriginal;
@ -418,14 +407,16 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
private final String mDescription;
private final int mLinkColor;
private final int mBackgroundColor;
private final FragmentActivity mActivity;
public UpdateProfileTaskInternal(final UserProfileEditorActivity activity,
public UpdateProfileTaskInternal(final UserProfileEditorFragment fragment,
final long accountId, final ParcelableUser original,
final String name, final String url, final String location,
final String description, final int linkColor,
final int backgroundColor) {
mActivity = activity;
mHandler = new Handler(activity.getMainLooper());
mFragment = fragment;
mActivity = fragment.getActivity();
mHandler = new Handler(mActivity.getMainLooper());
mAccountId = accountId;
mOriginal = original;
mName = name;
@ -482,7 +473,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
@Override
protected void onPostExecute(final SingleResponse<ParcelableUser> result) {
super.onPostExecute(result);
final Fragment f = mActivity.getSupportFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG);
final Fragment f = mFragment.getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG);
if (f instanceof DialogFragment) {
((DialogFragment) f).dismissAllowingStateLoss();
}
@ -493,7 +484,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
mHandler.post(new Runnable() {
@Override
public void run() {
final DialogFragment df = SupportProgressDialogFragment.show(mActivity, DIALOG_FRAGMENT_TAG);
final DialogFragment df = SupportProgressDialogFragment.show(mFragment.getActivity(), DIALOG_FRAGMENT_TAG);
df.setCancelable(false);
}
});
@ -512,7 +503,7 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
@Override
protected SingleResponse<Boolean> doInBackground(final Object... params) {
return TwitterWrapper.deleteProfileBannerImage(UserProfileEditorActivity.this, account_id);
return TwitterWrapper.deleteProfileBannerImage(getActivity(), account_id);
}
@Override
@ -520,10 +511,9 @@ public class UserProfileEditorActivity extends BaseDialogWhenLargeActivity imple
super.onPostExecute(result);
if (result.getData() != null && result.getData()) {
getUserInfo();
Toast.makeText(UserProfileEditorActivity.this, R.string.profile_banner_image_updated,
Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), R.string.profile_banner_image_updated, Toast.LENGTH_SHORT).show();
} else {
showErrorMessage(UserProfileEditorActivity.this, R.string.action_removing_profile_banner_image,
Utils.showErrorMessage(getActivity(), R.string.action_removing_profile_banner_image,
result.getException(), true);
}
setUpdateState(false);

View File

@ -55,7 +55,12 @@ public class ParcelableStatusLoader extends AsyncTaskLoader<SingleResponse<Parce
public SingleResponse<ParcelableStatus> loadInBackground() {
if (!mOmitIntentExtra && mExtras != null) {
final ParcelableStatus cache = mExtras.getParcelable(IntentConstants.EXTRA_STATUS);
if (cache != null) return SingleResponse.getInstance(cache);
if (cache != null) {
final SingleResponse<ParcelableStatus> response = SingleResponse.getInstance(cache);
final Bundle extras = response.getExtras();
extras.putParcelable(EXTRA_ACCOUNT, ParcelableAccount.getCredentials(getContext(), mAccountId));
return response;
}
}
try {
final ParcelableStatus status = findStatus(getContext(), mAccountId, mStatusId);

View File

@ -67,11 +67,11 @@ public class SupportStatusShareProvider extends ActionProvider implements Consta
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
final Intent shareIntent = createStatusShareIntent(mContext, mStatus);
final ParcelableStatus status = mStatus;
if (status == null) return;
final Intent shareIntent = createStatusShareIntent(mContext, status);
subMenu.removeGroup(MENU_GROUP_STATUS_SHARE);
if (mStatus != null) {
addIntentToMenu(mContext, subMenu, shareIntent, MENU_GROUP_STATUS_SHARE);
}
addIntentToMenu(mContext, subMenu, shareIntent, MENU_GROUP_STATUS_SHARE);
}
public void setStatus(ParcelableStatus status) {

View File

@ -24,7 +24,7 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.graphic.AlphaPatternDrawable;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
/**
* Created by mariotaku on 14/11/8.
@ -165,7 +165,7 @@ public class ThemeBackgroundPreference extends DialogPreference implements Const
mAlphaSlider.setOnSeekBarChangeListener(mAlphaSliderChangedListener);
mAlphaSlider.setProgress(preferences.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA));
final int patternSize = res.getDimensionPixelSize(R.dimen.element_spacing_msmall);
ViewUtils.setBackground(mAlphaPreview, new AlphaPatternDrawable(patternSize));
ViewSupport.setBackground(mAlphaPreview, new AlphaPatternDrawable(patternSize));
updateAlphaVisibility();
updateAlphaPreview();

View File

@ -41,7 +41,7 @@ import android.widget.TextView;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.IExtendedView;
import org.mariotaku.twidere.view.iface.IExtendedView.TouchInterceptor;
@ -77,7 +77,7 @@ public class ThemePreviewPreference extends Preference implements Constants, OnS
@Override
protected View onCreateView(final ViewGroup parent) {
final Context context = getContext();
final int themeResource = ThemeUtils.getThemeResource(context);
final int themeResource = ThemeUtils.getNoActionBarThemeResource(context);
final Context theme = new ContextThemeWrapper(context, themeResource);
final LayoutInflater inflater = LayoutInflater.from(theme);
try {
@ -108,13 +108,13 @@ public class ThemePreviewPreference extends Preference implements Constants, OnS
final int cardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
final int accentColor = ThemeUtils.getUserAccentColor(context);
final int themeId = ThemeUtils.getThemeResource(context);
final int themeId = ThemeUtils.getNoActionBarThemeResource(context);
final String backgroundOption = ThemeUtils.getThemeBackgroundOption(context);
ThemeUtils.applyWindowBackground(context, windowBackgroundView, themeId, backgroundOption,
ThemeUtils.getUserThemeBackgroundAlpha(context));
ViewUtils.setBackground(actionBarView, ThemeUtils.getActionBarBackground(context, themeRes,
ViewSupport.setBackground(actionBarView, ThemeUtils.getActionBarBackground(context, themeRes,
accentColor, backgroundOption, true));
ViewUtils.setBackground(actionBarOverlay, ThemeUtils.getWindowContentOverlay(context));
ViewSupport.setBackground(actionBarOverlay, ThemeUtils.getWindowContentOverlay(context));
cardView.setCardBackgroundColor(cardBackgroundColor);
actionBarView.setTitle(R.string.app_name);

View File

@ -43,6 +43,7 @@ import com.nostra13.universalimageloader.utils.IoUtils;
import com.twitter.Extractor;
import org.mariotaku.querybuilder.Expression;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.MainActivity;
@ -382,7 +383,12 @@ public class BackgroundOperationService extends IntentService implements Constan
private void displayTweetNotSendNotification() {
final String title = getString(R.string.status_not_updated);
final String message = getString(R.string.status_not_updated_summary);
final Intent intent = new Intent(INTENT_ACTION_DRAFTS);
final Intent intent = new Intent();
intent.setPackage(BuildConfig.APPLICATION_ID);
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_DRAFTS);
intent.setData(builder.build());
final Notification notification = buildNotification(title, message, R.drawable.ic_stat_twitter, intent, null);
mNotificationManager.notify(NOTIFICATION_ID_DRAFTS, notification);
}

View File

@ -36,6 +36,8 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.AppCompatDelegateTrojan;
import android.support.v7.internal.app.WindowDecorActionBar;
import android.support.v7.internal.app.WindowDecorActionBar.ActionModeImpl;
import android.support.v7.internal.view.SupportActionModeWrapper;
@ -50,6 +52,7 @@ import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper;
@ -70,6 +73,7 @@ import org.mariotaku.twidere.graphic.ActionBarColorDrawable;
import org.mariotaku.twidere.graphic.ActionIconDrawable;
import org.mariotaku.twidere.text.ParagraphSpacingSpan;
import org.mariotaku.twidere.util.menu.TwidereMenuInfo;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.TabPagerIndicator;
import java.lang.reflect.Field;
@ -225,7 +229,7 @@ public class ThemeUtils implements Constants {
final TextView actionBarTitleView = (TextView) contextView.findViewById(android.support.v7.appcompat.R.id.action_bar_title);
final TextView actionBarSubtitleView = (TextView) contextView.findViewById(android.support.v7.appcompat.R.id.action_bar_subtitle);
final ImageView actionModeCloseButton = (ImageView) contextView.findViewById(android.support.v7.appcompat.R.id.action_mode_close_button);
final ActionMenuView menuView = ViewUtils.findViewByType(contextView, ActionMenuView.class);
final ActionMenuView menuView = ViewSupport.findViewByType(contextView, ActionMenuView.class);
final int actionBarColor;
if (isDarkTheme(themeRes)) {
actionBarColor = context.getResources().getColor(R.color.background_color_action_bar_dark);
@ -247,7 +251,7 @@ public class ThemeUtils implements Constants {
setActionBarOverflowColor(menuView, itemColor);
ThemeUtils.wrapToolbarMenuIcon(menuView, itemColor, itemColor);
}
ViewUtils.setBackground(contextView, getActionBarBackground(activity, themeRes, accentColor, backgroundOption, outlineEnabled));
ViewSupport.setBackground(contextView, getActionBarBackground(activity, themeRes, accentColor, backgroundOption, outlineEnabled));
} catch (Exception e) {
e.printStackTrace();
}
@ -263,14 +267,28 @@ public class ThemeUtils implements Constants {
}
}
public static void applyWindowBackground(Context context, Window window, AppCompatDelegate delegate, int theme, String option, int alpha) {
if (isWindowFloating(delegate)) return;
if (VALUE_THEME_BACKGROUND_TRANSPARENT.equals(option)) {
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
window.setBackgroundDrawable(ThemeUtils.getWindowBackgroundApplyAlpha(context, alpha));
} else if (VALUE_THEME_BACKGROUND_SOLID.equals(option)) {
window.setBackgroundDrawable(new ColorDrawable(isDarkTheme(theme) ? Color.BLACK : Color.WHITE));
}
}
private static boolean isWindowFloating(AppCompatDelegate delegate) {
return AppCompatDelegateTrojan.isFloating(delegate);
}
public static void applyWindowBackground(Context context, View window, int theme, String option, int alpha) {
if (isWindowFloating(context, theme)) return;
if (VALUE_THEME_BACKGROUND_TRANSPARENT.equals(option)) {
ViewUtils.setBackground(window, ThemeUtils.getWindowBackgroundApplyAlpha(context, alpha));
ViewSupport.setBackground(window, ThemeUtils.getWindowBackgroundApplyAlpha(context, alpha));
} else if (VALUE_THEME_BACKGROUND_SOLID.equals(option)) {
ViewUtils.setBackground(window, new ColorDrawable(isDarkTheme(theme) ? Color.BLACK : Color.WHITE));
ViewSupport.setBackground(window, new ColorDrawable(isDarkTheme(theme) ? Color.BLACK : Color.WHITE));
} else {
ViewUtils.setBackground(window, ThemeUtils.getWindowBackground(context));
ViewSupport.setBackground(window, ThemeUtils.getWindowBackground(context));
}
}
@ -445,13 +463,13 @@ public class ThemeUtils implements Constants {
public static int getDialogWhenLargeThemeResource(final String name) {
if (VALUE_THEME_NAME_DARK.equals(name)) {
return R.style.Theme_Twidere_Dark_DialogWhenLarge;
return R.style.Theme_Twidere_Dark_DialogWhenLarge_NoActionBar;
}
return R.style.Theme_Twidere_Light_DialogWhenLarge;
return R.style.Theme_Twidere_Light_DialogWhenLarge_NoActionBar;
}
public static int getDrawerThemeResource(final Context context) {
return getDrawerThemeResource(getThemeResource(context));
return getDrawerThemeResource(getNoActionBarThemeResource(context));
}
public static int getDrawerThemeResource(final int themeRes) {
@ -694,6 +712,18 @@ public class ThemeUtils implements Constants {
return R.style.Theme_Twidere_Light;
}
public static int getNoActionBarThemeResource(final Context context) {
return getNoActionBarThemeResource(getThemeNameOption(context));
}
public static int getNoActionBarThemeResource(final String name) {
if (VALUE_THEME_NAME_DARK.equals(name)) {
return R.style.Theme_Twidere_Dark_NoActionBar;
}
return R.style.Theme_Twidere_Light_NoActionBar;
}
public static Context getThemedContext(final Context context) {
return context;
}
@ -805,6 +835,16 @@ public class ThemeUtils implements Constants {
}
}
public static Drawable getWindowContentOverlay(final Context context, int themeRes) {
@SuppressWarnings("ConstantConditions")
final TypedArray a = context.obtainStyledAttributes(null, new int[]{android.R.attr.windowContentOverlay}, 0, themeRes);
try {
return a.getDrawable(0);
} finally {
a.recycle();
}
}
public static void initPagerIndicatorAsActionBarTab(FragmentActivity activity, TabPagerIndicator indicator) {
final float supportActionBarElevation = getSupportActionBarElevation(activity);
ViewCompat.setElevation(indicator, supportActionBarElevation);
@ -823,7 +863,7 @@ public class ThemeUtils implements Constants {
}
final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor,
ACCENT_COLOR_THRESHOLD, colorDark, colorLight);
ViewUtils.setBackground(indicator, getActionBarStackedBackground(activity, themeRes, themeColor, true));
ViewSupport.setBackground(indicator, getActionBarStackedBackground(activity, themeRes, themeColor, true));
if (isDarkTheme(themeRes)) {
final int foregroundColor = getThemeForegroundColor(activity);
indicator.setIconColor(foregroundColor);
@ -842,14 +882,15 @@ public class ThemeUtils implements Constants {
}
public static boolean isDarkTheme(final Context context) {
return isDarkTheme(getThemeResource(context));
return isDarkTheme(getNoActionBarThemeResource(context));
}
public static boolean isDarkTheme(final int themeRes) {
switch (themeRes) {
case R.style.Theme_Twidere_Dark:
case R.style.Theme_Twidere_Dark_NoActionBar:
case R.style.Theme_Twidere_Dark_Dialog:
case R.style.Theme_Twidere_Dark_DialogWhenLarge:
case R.style.Theme_Twidere_Dark_DialogWhenLarge_NoActionBar:
case R.style.Theme_Twidere_Dark_Compose:
return true;
}
@ -949,13 +990,29 @@ public class ThemeUtils implements Constants {
drawable.setColorFilter(itemColor, Mode.SRC_ATOP);
}
actionBar.setHomeAsUpIndicator(drawable);
setActionBarTitleTextColor(window, titleColor);
setActionBarSubtitleTextColor(window, titleColor);
// Ensure title view created
if (actionBar instanceof WindowDecorActionBar) {
actionBar.setTitle(actionBar.getTitle());
actionBar.setSubtitle(actionBar.getSubtitle());
setActionBarTitleTextColor(window, titleColor);
setActionBarSubtitleTextColor(window, titleColor);
}
}
public static void setToolBarColor(@NonNull Toolbar toolbar, int titleColor, int itemColor) {
final Drawable drawable = toolbar.getNavigationIcon();
if (drawable != null) {
drawable.setColorFilter(itemColor, Mode.SRC_ATOP);
}
toolbar.setNavigationIcon(drawable);
// Ensure title view created
toolbar.setTitleTextColor(titleColor);
toolbar.setSubtitleTextColor(titleColor);
}
public static void setActionBarOverflowColor(Toolbar toolbar, int itemColor) {
if (toolbar == null) return;
final ActionMenuView actionMenuView = ViewUtils.findViewByType(toolbar, ActionMenuView.class);
final ActionMenuView actionMenuView = ViewSupport.findViewByType(toolbar, ActionMenuView.class);
if (actionMenuView == null) return;
View overflowView = null;
for (int i = 0, j = actionMenuView.getChildCount(); i < j; i++) {
@ -1028,6 +1085,16 @@ public class ThemeUtils implements Constants {
}
}
public static void setWindowOverlayViewOverlay(Activity activity, Drawable overlay) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return;
final Window window = activity.getWindow();
final View windowOverlay = window.findViewById(R.id.window_overlay);
if (windowOverlay == null) {
return;
}
ViewSupport.setBackground(windowOverlay, overlay);
}
public static void setupDrawerBackground(Context context, View view) {
if (!(context instanceof IThemedActivity)) return;
final int themeRes = ((IThemedActivity) context).getCurrentThemeResourceId();
@ -1038,7 +1105,7 @@ public class ThemeUtils implements Constants {
if (d != null && isTransparentBackground(backgroundOption)) {
d.setAlpha(alpha);
}
ViewUtils.setBackground(view, d);
ViewSupport.setBackground(view, d);
}
public static void wrapMenuIcon(@NonNull Menu menu, int itemColor, int subItemColor, int... excludeGroups) {
@ -1140,4 +1207,13 @@ public class ThemeUtils implements Constants {
Context.MODE_PRIVATE);
}
public static int getActionBarHeight(Context context) {
final TypedValue tv = new TypedValue();
final Resources.Theme theme = context.getTheme();
final int attr = R.attr.actionBarSize;
if (theme.resolveAttribute(attr, tv, true)) {
return TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
}
return 0;
}
}

View File

@ -19,17 +19,22 @@
package org.mariotaku.twidere.util;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.LayoutInflaterFactory;
import android.support.v4.view.TintableBackgroundView;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.AppCompatDelegateTrojan;
import android.support.v7.internal.app.WindowDecorActionBar;
import android.util.AttributeSet;
import android.view.InflateException;
import android.view.View;
@ -118,7 +123,8 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory {
final int noTintColor, tintColor;
final boolean isColorTint;
// View context is not derived from ActionBar, apply color tint directly
if (!isActionBarContext(view.getContext(), getActionBarContext((Activity) activity))) {
final boolean isActionBarContext = isActionBarContext(view.getContext(), getActionBarContext((Activity) activity));
if (!isActionBarContext) {
tintColor = activity.getCurrentThemeColor();
noTintColor = TwidereColorUtils.getContrastYIQ(tintColor, ThemeUtils.ACCENT_COLOR_THRESHOLD);
isColorTint = true;
@ -162,26 +168,31 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory {
}
private static boolean isActionBarContext(Context context, Context actionBarContext) {
if (actionBarContext == null) return false;
if (context == actionBarContext) return true;
Context base = context;
while (base instanceof ContextWrapper && (base = ((ContextWrapper) base).getBaseContext()) != null) {
if (base == actionBarContext) return true;
}
return base == actionBarContext;
return false;
}
private static Context getActionBarContext(Activity activity) {
@Nullable
private static Context getActionBarContext(@NonNull Activity activity) {
if (activity instanceof AppCompatActivity) {
final android.support.v7.app.ActionBar actionBar = ((AppCompatActivity) activity).getSupportActionBar();
if (actionBar != null)
final AppCompatDelegate delegate = ((AppCompatActivity) activity).getDelegate();
final ActionBar actionBar = AppCompatDelegateTrojan.peekActionBar(delegate);
if (actionBar instanceof WindowDecorActionBar)
return actionBar.getThemedContext();
} else if (activity instanceof AppCompatPreferenceActivity) {
final android.support.v7.app.ActionBar actionBar = ((AppCompatPreferenceActivity) activity).getSupportActionBar();
if (actionBar != null)
final AppCompatDelegate delegate = ((AppCompatPreferenceActivity) activity).getDelegate();
final ActionBar actionBar = AppCompatDelegateTrojan.peekActionBar(delegate);
if (actionBar instanceof WindowDecorActionBar)
return actionBar.getThemedContext();
} else {
final android.app.ActionBar actionBar = activity.getActionBar();
if (actionBar != null) return actionBar.getThemedContext();
}
final ActionBar actionBar = activity.getActionBar();
if (actionBar != null) return actionBar.getThemedContext();
return null;
}
}

View File

@ -37,7 +37,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
@ -140,8 +139,11 @@ import org.mariotaku.twidere.adapter.iface.IBaseAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.support.AccountsManagerFragment;
import org.mariotaku.twidere.fragment.support.AddStatusFilterDialogFragment;
import org.mariotaku.twidere.fragment.support.DestroyStatusDialogFragment;
import org.mariotaku.twidere.fragment.support.DraftsFragment;
import org.mariotaku.twidere.fragment.support.FiltersFragment;
import org.mariotaku.twidere.fragment.support.IncomingFriendshipsFragment;
import org.mariotaku.twidere.fragment.support.MessagesConversationFragment;
import org.mariotaku.twidere.fragment.support.MutesUsersListFragment;
@ -168,6 +170,7 @@ import org.mariotaku.twidere.fragment.support.UserListTimelineFragment;
import org.mariotaku.twidere.fragment.support.UserListsFragment;
import org.mariotaku.twidere.fragment.support.UserMediaTimelineFragment;
import org.mariotaku.twidere.fragment.support.UserMentionsFragment;
import org.mariotaku.twidere.fragment.support.UserProfileEditorFragment;
import org.mariotaku.twidere.fragment.support.UserTimelineFragment;
import org.mariotaku.twidere.fragment.support.UsersListFragment;
import org.mariotaku.twidere.graphic.ActionIconDrawable;
@ -393,6 +396,11 @@ public final class Utils implements Constants, TwitterConstants {
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_SEARCH, null, LINK_ID_SEARCH);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_MUTES_USERS, null, LINK_ID_MUTES_USERS);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_ACCOUNTS, null, LINK_ID_ACCOUNTS);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_DRAFTS, null, LINK_ID_DRAFTS);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_FILTERS, null, LINK_ID_FILTERS);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_PROFILE_EDITOR, null, LINK_ID_PROFILE_EDITOR);
HOME_TABS_URI_MATCHER.addURI(AUTHORITY_HOME, null, CustomTabUtils.TAB_CODE_HOME_TIMELINE);
HOME_TABS_URI_MATCHER.addURI(AUTHORITY_MENTIONS, null, CustomTabUtils.TAB_CODE_MENTIONS_TIMELINE);
HOME_TABS_URI_MATCHER.addURI(AUTHORITY_DIRECT_MESSAGES, null, CustomTabUtils.TAB_CODE_DIRECT_MESSAGES);
@ -753,6 +761,25 @@ public final class Utils implements Constants, TwitterConstants {
args.putAll(extras);
}
switch (linkId) {
case LINK_ID_ACCOUNTS: {
fragment = new AccountsManagerFragment();
break;
}
case LINK_ID_DRAFTS: {
fragment = new DraftsFragment();
break;
}
case LINK_ID_FILTERS: {
fragment = new FiltersFragment();
break;
}
case LINK_ID_PROFILE_EDITOR: {
fragment = new UserProfileEditorFragment();
if (!args.containsKey(EXTRA_ACCOUNT_ID) && uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID) == null) {
return null;
}
break;
}
case LINK_ID_STATUS: {
fragment = new StatusFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
@ -1026,7 +1053,7 @@ public final class Utils implements Constants, TwitterConstants {
return fragment;
}
public static Intent createStatusShareIntent(final Context context, final ParcelableStatus status) {
public static Intent createStatusShareIntent(@NonNull final Context context, @NonNull final ParcelableStatus status) {
final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, getStatusShareSubject(context, status));
@ -1072,13 +1099,13 @@ public final class Utils implements Constants, TwitterConstants {
return tag + "_" + TwidereArrayUtils.toString(accountIdsClone, '_', false);
}
public static String getStatusShareText(final Context context, final ParcelableStatus status) {
public static String getStatusShareText(@NonNull final Context context, @NonNull final ParcelableStatus status) {
final Uri link = LinkCreator.getTwitterStatusLink(status.user_screen_name, status.id);
return context.getString(R.string.status_share_text_format_with_link,
status.text_plain, link.toString());
}
public static String getStatusShareSubject(final Context context, ParcelableStatus status) {
public static String getStatusShareSubject(@NonNull final Context context, @NonNull final ParcelableStatus status) {
final String timeString = formatToLongTimeString(context, status.timestamp);
return context.getString(R.string.status_share_subject_format_with_time,
status.user_name, status.user_screen_name, timeString);
@ -3423,6 +3450,13 @@ public final class Utils implements Constants, TwitterConstants {
return top - actionBarHeight;
}
public static int getInsetsTopWithoutActionBarHeight(Context context, int top, int actionBarHeight) {
if (actionBarHeight > top) {
return top;
}
return top - actionBarHeight;
}
public static void openUserProfile(final Context context, final ParcelableUser user,
final Bundle activityOptions) {
if (context == null || user == null) return;
@ -4096,16 +4130,6 @@ public final class Utils implements Constants, TwitterConstants {
return 0;
}
public static int getActionBarHeight(Context context) {
final TypedValue tv = new TypedValue();
final Theme theme = context.getTheme();
final int attr = context instanceof AppCompatActivity ? R.attr.actionBarSize : android.R.attr.actionBarSize;
if (theme.resolveAttribute(attr, tv, true)) {
return TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
}
return 0;
}
public static void makeListFragmentFitsSystemWindows(ListFragment fragment) {
final FragmentActivity activity = fragment.getActivity();
if (!(activity instanceof SystemWindowsInsetsCallback)) return;
@ -4171,6 +4195,47 @@ public final class Utils implements Constants, TwitterConstants {
UtilsL.setSharedElementTransition(context, window, transitionRes);
}
public static void openAccountsManager(Context context) {
final Intent intent = new Intent();
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_ACCOUNTS);
intent.setData(builder.build());
intent.setPackage(BuildConfig.APPLICATION_ID);
context.startActivity(intent);
}
public static void openDrafts(Context context) {
final Intent intent = new Intent();
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_DRAFTS);
intent.setData(builder.build());
intent.setPackage(BuildConfig.APPLICATION_ID);
context.startActivity(intent);
}
public static void openProfileEditor(Context context, long accountId) {
final Intent intent = new Intent();
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_PROFILE_EDITOR);
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, ParseUtils.parseString(accountId));
intent.setData(builder.build());
intent.setPackage(BuildConfig.APPLICATION_ID);
context.startActivity(intent);
}
public static void openFilters(Context context) {
final Intent intent = new Intent();
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_FILTERS);
intent.setData(builder.build());
intent.setPackage(BuildConfig.APPLICATION_ID);
context.startActivity(intent);
}
static class UtilsL {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.util.accessor;
package org.mariotaku.twidere.util.support;
import android.annotation.TargetApi;
import android.app.Activity;
@ -12,7 +12,7 @@ import android.os.Parcelable;
/**
* Created by mariotaku on 14/11/4.
*/
public class ActivityAccessor {
public class ActivitySupport {
public static void setTaskDescription(Activity activity, TaskDescriptionCompat taskDescription) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;

View File

@ -0,0 +1,45 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util.support;
import android.graphics.drawable.Drawable;
import android.os.Build;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
/**
* Created by mariotaku on 15/4/27.
*/
public class DrawableSupport {
public static void getOutline(Drawable drawable, OutlineCompat outlineCompat) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
DrawableSupportLollipop.getOutline(drawable, outlineCompat);
}
private static class DrawableSupportLollipop {
public static void getOutline(Drawable drawable, OutlineCompat outlineCompat) {
drawable.getOutline(OutlineCompat.OutlineL.getWrapped(outlineCompat));
}
}
}

View File

@ -17,23 +17,22 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
package org.mariotaku.twidere.util.support;
import android.annotation.TargetApi;
import android.content.res.ColorStateList;
import android.graphics.Outline;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.TextView;
public final class ViewUtils {
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
public final class ViewSupport {
public static boolean isInLayout(View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
@ -137,7 +136,7 @@ public final class ViewUtils {
public static void setOutlineProvider(View view, ViewOutlineProviderCompat outlineProvider) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setOutlineProvider(new ViewOutlineProviderL(outlineProvider));
view.setOutlineProvider(new ViewOutlineProviderCompat.ViewOutlineProviderL(outlineProvider));
}
@ -168,144 +167,4 @@ public final class ViewUtils {
}
/**
* Interface by which a View builds its {@link ViewUtils.OutlineCompat}, used for shadow casting and clipping.
*/
public static abstract class ViewOutlineProviderCompat {
/**
* Called to get the provider to populate the Outline.
* <p/>
* This method will be called by a View when its owned Drawables are invalidated, when the
* View's size changes, or if {@link View#invalidateOutline()} is called
* explicitly.
* <p/>
* The input outline is empty and has an alpha of <code>1.0f</code>.
*
* @param view The view building the outline.
* @param outline The empty outline to be populated.
*/
public abstract void getOutline(View view, OutlineCompat outline);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static class ViewOutlineProviderL extends ViewOutlineProvider {
private final ViewOutlineProviderCompat providerCompat;
ViewOutlineProviderL(ViewOutlineProviderCompat providerCompat) {
this.providerCompat = providerCompat;
}
@Override
public void getOutline(View view, Outline outline) {
providerCompat.getOutline(view, new OutlineL(outline));
}
}
@SuppressWarnings("unused")
public static abstract class OutlineCompat {
public abstract float getAlpha();
public abstract boolean isEmpty();
public abstract void set(Outline src);
public abstract void setAlpha(float alpha);
public abstract void setConvexPath(Path convexPath);
public abstract void setOval(int left, int top, int right, int bottom);
public abstract void setOval(Rect rect);
public abstract void setEmpty();
public abstract boolean canClip();
public abstract void setRect(int left, int top, int right, int bottom);
public abstract void setRect(Rect rect);
public abstract void setRoundRect(int left, int top, int right, int bottom, float radius);
public abstract void setRoundRect(Rect rect, float radius);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static class OutlineL extends OutlineCompat {
private final Outline outline;
@Override
public void setEmpty() {
outline.setEmpty();
}
@Override
public boolean canClip() {
return outline.canClip();
}
@Override
public void setRect(int left, int top, int right, int bottom) {
outline.setRect(left, top, right, bottom);
}
@Override
public void setOval(int left, int top, int right, int bottom) {
outline.setOval(left, top, right, bottom);
}
@Override
public void setConvexPath(Path convexPath) {
outline.setConvexPath(convexPath);
}
@Override
public void setRect(Rect rect) {
outline.setRect(rect);
}
@Override
public void setOval(Rect rect) {
outline.setOval(rect);
}
@Override
public float getAlpha() {
return outline.getAlpha();
}
@Override
public void set(Outline src) {
outline.set(src);
}
@Override
public void setRoundRect(int left, int top, int right, int bottom, float radius) {
outline.setRoundRect(left, top, right, bottom, radius);
}
@Override
public void setRoundRect(Rect rect, float radius) {
outline.setRoundRect(rect, radius);
}
@Override
public boolean isEmpty() {
return outline.isEmpty();
}
@Override
public void setAlpha(float alpha) {
outline.setAlpha(alpha);
}
public OutlineL(Outline outline) {
this.outline = outline;
}
}
}

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.util.accessor;
package org.mariotaku.twidere.util.support;
import android.annotation.TargetApi;
import android.os.Build;

View File

@ -0,0 +1,138 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util.support.graphics;
import android.annotation.TargetApi;
import android.graphics.Outline;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Build;
/**
* Created by mariotaku on 15/4/27.
*/
@SuppressWarnings("unused")
public abstract class OutlineCompat {
public abstract float getAlpha();
public abstract boolean isEmpty();
public abstract void set(Outline src);
public abstract void setAlpha(float alpha);
public abstract void setConvexPath(Path convexPath);
public abstract void setOval(int left, int top, int right, int bottom);
public abstract void setOval(Rect rect);
public abstract void setEmpty();
public abstract boolean canClip();
public abstract void setRect(int left, int top, int right, int bottom);
public abstract void setRect(Rect rect);
public abstract void setRoundRect(int left, int top, int right, int bottom, float radius);
public abstract void setRoundRect(Rect rect, float radius);
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static class OutlineL extends OutlineCompat {
public static Outline getWrapped(OutlineCompat outlineL) {
return outlineL instanceof OutlineL ? ((OutlineL) outlineL).outline : null;
}
private final Outline outline;
@Override
public void setEmpty() {
outline.setEmpty();
}
@Override
public boolean canClip() {
return outline.canClip();
}
@Override
public void setRect(int left, int top, int right, int bottom) {
outline.setRect(left, top, right, bottom);
}
@Override
public void setOval(int left, int top, int right, int bottom) {
outline.setOval(left, top, right, bottom);
}
@Override
public void setConvexPath(Path convexPath) {
outline.setConvexPath(convexPath);
}
@Override
public void setRect(Rect rect) {
outline.setRect(rect);
}
@Override
public void setOval(Rect rect) {
outline.setOval(rect);
}
@Override
public float getAlpha() {
return outline.getAlpha();
}
@Override
public void set(Outline src) {
outline.set(src);
}
@Override
public void setRoundRect(int left, int top, int right, int bottom, float radius) {
outline.setRoundRect(left, top, right, bottom, radius);
}
@Override
public void setRoundRect(Rect rect, float radius) {
outline.setRoundRect(rect, radius);
}
@Override
public boolean isEmpty() {
return outline.isEmpty();
}
@Override
public void setAlpha(float alpha) {
outline.setAlpha(alpha);
}
public OutlineL(Outline outline) {
this.outline = outline;
}
}
}

View File

@ -0,0 +1,97 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util.support.view;
import android.annotation.TargetApi;
import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.View;
import android.view.ViewOutlineProvider;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
import org.mariotaku.twidere.util.support.DrawableSupport;
/**
* Interface by which a View builds its {@link org.mariotaku.twidere.util.support.graphics.OutlineCompat}, used for shadow casting and clipping.
*/
public abstract class ViewOutlineProviderCompat {
/**
* Called to get the provider to populate the Outline.
* <p/>
* This method will be called by a View when its owned Drawables are invalidated, when the
* View's size changes, or if {@link android.view.View#invalidateOutline()} is called
* explicitly.
* <p/>
* The input outline is empty and has an alpha of <code>1.0f</code>.
*
* @param view The view building the outline.
* @param outline The empty outline to be populated.
*/
public abstract void getOutline(View view, OutlineCompat outline);
/**
* Maintains the outline of the View to match its rectangular bounds,
* at <code>1.0f</code> alpha.
* <p/>
* This can be used to enable Views that are opaque but lacking a background cast a shadow.
*/
public static final ViewOutlineProviderCompat BOUNDS = new ViewOutlineProviderCompat() {
@Override
public void getOutline(View view, OutlineCompat outline) {
outline.setRect(0, 0, view.getWidth(), view.getHeight());
}
};
/**
* Default outline provider for Views, which queries the Outline from the View's background,
* or generates a 0 alpha, rectangular Outline the size of the View if a background
* isn't present.
*
* @see android.graphics.drawable.Drawable#getOutline(android.graphics.Outline)
*/
public static final ViewOutlineProviderCompat BACKGROUND = new ViewOutlineProviderCompat() {
@Override
public void getOutline(View view, OutlineCompat outline) {
Drawable background = view.getBackground();
if (background != null) {
DrawableSupport.getOutline(background, outline);
} else {
outline.setRect(0, 0, view.getWidth(), view.getHeight());
outline.setAlpha(0.0f);
}
}
};
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static class ViewOutlineProviderL extends ViewOutlineProvider {
private final ViewOutlineProviderCompat providerCompat;
public ViewOutlineProviderL(ViewOutlineProviderCompat providerCompat) {
this.providerCompat = providerCompat;
}
@Override
public void getOutline(View view, Outline outline) {
providerCompat.getOutline(view, new OutlineCompat.OutlineL(outline));
}
}
}

View File

@ -39,9 +39,9 @@ import android.widget.ProgressBar;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.ViewUtils.OutlineCompat;
import org.mariotaku.twidere.util.ViewUtils.ViewOutlineProviderCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
import me.uucky.colorpicker.internal.EffectViewHelper;
@ -92,14 +92,14 @@ public class HomeActionButton extends FrameLayout implements IHomeActionButton {
}
mIconView = (ImageView) findViewById(android.R.id.icon);
mProgressBar = (ProgressBar) findViewById(android.R.id.progress);
ViewUtils.setOutlineProvider(this, new HomeActionButtonOutlineProvider());
ViewSupport.setOutlineProvider(this, new HomeActionButtonOutlineProvider());
setClipToOutline(true);
setButtonColor(Color.WHITE);
}
@Override
public void setButtonColor(int color) {
ViewUtils.setBackground(this, new ColorDrawable(color));
ViewSupport.setBackground(this, new ColorDrawable(color));
}
@Override

View File

@ -41,7 +41,7 @@ import android.widget.ProgressBar;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
public class HomeActionButtonCompat extends FrameLayout implements IHomeActionButton {
@ -66,7 +66,7 @@ public class HomeActionButtonCompat extends FrameLayout implements IHomeActionBu
final Resources resources = getResources();
final int radius = resources.getDimensionPixelSize(R.dimen.element_spacing_small);
mBackground = new FloatingActionDrawable(this, radius);
ViewUtils.setBackground(this, mBackground);
ViewSupport.setBackground(this, mBackground);
}
@Override

View File

@ -33,7 +33,7 @@ import android.view.View;
import android.view.ViewConfiguration;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.PagerIndicator;
/**
@ -85,7 +85,7 @@ public class LinePageIndicator extends View implements PagerIndicator {
final Drawable background = a.getDrawable(R.styleable.LinePageIndicator_android_background);
if (background != null) {
ViewUtils.setBackground(this, background);
ViewSupport.setBackground(this, background);
}
a.recycle();

View File

@ -7,9 +7,12 @@ import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import org.mariotaku.twidere.util.ThemeUtils;
public class ProfileBannerSpace extends View {
private final Rect mSystemWindowsInsets;
private final int mActionBarHeight;
/**
* {@inheritDoc}
@ -32,12 +35,7 @@ public class ProfileBannerSpace extends View {
public ProfileBannerSpace(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
mSystemWindowsInsets = new Rect();
}
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
mSystemWindowsInsets.set(insets);
return super.fitSystemWindows(insets);
mActionBarHeight = ThemeUtils.getActionBarHeight(context);
}
/**
@ -49,9 +47,17 @@ public class ProfileBannerSpace extends View {
public void draw(@NonNull final Canvas canvas) {
}
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
mSystemWindowsInsets.set(insets);
return super.fitSystemWindows(insets);
}
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
final int width = MeasureSpec.getSize(widthMeasureSpec), height = width / 2 - mSystemWindowsInsets.top;
final int insetsTop = mSystemWindowsInsets.top;
final int top = insetsTop < mActionBarHeight ? insetsTop + mActionBarHeight : insetsTop;
final int width = MeasureSpec.getSize(widthMeasureSpec), height = width / 2 - top;
setMeasuredDimension(width, height);
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}

View File

@ -49,9 +49,9 @@ import android.view.View;
import android.widget.ImageView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.ViewUtils.OutlineCompat;
import org.mariotaku.twidere.util.ViewUtils.ViewOutlineProviderCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@ -426,8 +426,8 @@ public class ShapedImageView extends ImageView {
}
private void initOutlineProvider() {
ViewUtils.setClipToOutline(this, true);
ViewUtils.setOutlineProvider(this, new CircularOutlineProvider());
ViewSupport.setClipToOutline(this, true);
ViewSupport.setOutlineProvider(this, new CircularOutlineProvider());
}
private void setBorderColorsInternal(int alpha, int... colors) {

View File

@ -31,11 +31,12 @@ import android.util.AttributeSet;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.MathUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.iface.TintedStatusLayout;
/**
* Created by mariotaku on 14/11/26.
*/
public class TintedStatusFrameLayout extends ExtendedFrameLayout {
public class TintedStatusFrameLayout extends ExtendedFrameLayout implements TintedStatusLayout {
private final Paint mBlackPaint, mShadowPaint, mColorPaint;
private boolean mSetPadding;
@ -44,6 +45,7 @@ public class TintedStatusFrameLayout extends ExtendedFrameLayout {
private float mFactor;
private int mColorAlpha, mShadowAlpha;
private boolean mDrawShadow, mDrawColor;
private Rect mSystemWindowsInsets;
public TintedStatusFrameLayout(Context context) {
this(context, null);
@ -62,47 +64,64 @@ public class TintedStatusFrameLayout extends ExtendedFrameLayout {
mBlackPaint.setColor(Color.BLACK);
mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSystemWindowsInsets = new Rect();
setWillNotDraw(false);
setFactor(1);
}
@Override
public void setColor(int color) {
setColor(color, Color.alpha(color));
}
@Override
public void setColor(int color, int alpha) {
mColorPaint.setColor(color);
mColorAlpha = alpha;
updateAlpha();
}
@Override
public void setDrawColor(boolean color) {
mDrawColor = color;
invalidate();
}
@Override
public void setDrawShadow(boolean shadow) {
mDrawShadow = shadow;
invalidate();
}
@Override
public void setFactor(float f) {
mFactor = f;
updateAlpha();
}
@Override
public void setShadowColor(int color) {
mShadowPaint.setColor(color);
mShadowAlpha = Color.alpha(color);
updateAlpha();
}
@Override
public void setSetPaddingEnabled(boolean enabled) {
mSetPadding = enabled;
}
public void setStatusBarHeight(int height) {
mStatusBarHeight = height;
invalidate();
}
@Override
public void getSystemWindowsInsets(Rect insets) {
insets.set(mSystemWindowsInsets);
}
@Override
protected void dispatchDraw(@NonNull Canvas canvas) {
super.dispatchDraw(canvas);
@ -120,6 +139,7 @@ public class TintedStatusFrameLayout extends ExtendedFrameLayout {
if (mSetPadding) {
setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
mSystemWindowsInsets.set(insets);
return super.fitSystemWindows(insets);
}
@ -129,8 +149,4 @@ public class TintedStatusFrameLayout extends ExtendedFrameLayout {
mColorPaint.setAlpha(Math.round(0xFF * MathUtils.clamp(f, 0, 1)));
invalidate();
}
public void setSetPaddingEnabled(boolean enabled) {
mSetPadding = enabled;
}
}

View File

@ -0,0 +1,152 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.MathUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.iface.TintedStatusLayout;
/**
* Created by mariotaku on 14/11/26.
*/
public class TintedStatusRelativeLayout extends ExtendedRelativeLayout implements TintedStatusLayout {
private final Paint mBlackPaint, mShadowPaint, mColorPaint;
private boolean mSetPadding;
private int mStatusBarHeight;
private float mFactor;
private int mColorAlpha, mShadowAlpha;
private boolean mDrawShadow, mDrawColor;
private Rect mSystemWindowsInsets;
public TintedStatusRelativeLayout(Context context) {
this(context, null);
}
public TintedStatusRelativeLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TintedStatusRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TintedStatusLayout);
setSetPaddingEnabled(a.getBoolean(R.styleable.TintedStatusLayout_setPadding, false));
a.recycle();
mBlackPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBlackPaint.setColor(Color.BLACK);
mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSystemWindowsInsets = new Rect();
setWillNotDraw(false);
setFactor(1);
}
@Override
public void setColor(int color) {
setColor(color, Color.alpha(color));
}
@Override
public void setColor(int color, int alpha) {
mColorPaint.setColor(color);
mColorAlpha = alpha;
updateAlpha();
}
@Override
public void setDrawColor(boolean color) {
mDrawColor = color;
invalidate();
}
@Override
public void setDrawShadow(boolean shadow) {
mDrawShadow = shadow;
invalidate();
}
@Override
public void setFactor(float f) {
mFactor = f;
updateAlpha();
}
@Override
public void setShadowColor(int color) {
mShadowPaint.setColor(color);
mShadowAlpha = Color.alpha(color);
updateAlpha();
}
@Override
public void setSetPaddingEnabled(boolean enabled) {
mSetPadding = enabled;
}
public void setStatusBarHeight(int height) {
mStatusBarHeight = height;
invalidate();
}
@Override
public void getSystemWindowsInsets(Rect insets) {
insets.set(mSystemWindowsInsets);
}
@Override
protected void dispatchDraw(@NonNull Canvas canvas) {
super.dispatchDraw(canvas);
if (mDrawShadow) {
canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mShadowPaint);
} else if (mDrawColor) {
canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mBlackPaint);
}
canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mDrawColor ? mColorPaint : mBlackPaint);
}
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
setStatusBarHeight(Utils.getInsetsTopWithoutActionBarHeight(getContext(), insets.top));
if (mSetPadding) {
setPadding(insets.left, insets.top, insets.right, insets.bottom);
}
mSystemWindowsInsets.set(insets);
return super.fitSystemWindows(insets);
}
private void updateAlpha() {
final float f = mFactor;
mShadowPaint.setAlpha(Math.round(mShadowAlpha * MathUtils.clamp(1 - f, 0, 1)));
mColorPaint.setAlpha(Math.round(0xFF * MathUtils.clamp(f, 0, 1)));
invalidate();
}
}

View File

@ -23,7 +23,7 @@ import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
/**
* Created by mariotaku on 15/1/1.
@ -47,7 +47,7 @@ public class TwitterCardContainer extends FrameLayout {
public void setCardSize(int width, int height) {
mCardWidth = width;
mCardHeight = height;
if (!ViewUtils.isInLayout(this)) {
if (!ViewSupport.isInLayout(this)) {
requestLayout();
}
}

View File

@ -0,0 +1,43 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view.iface;
import android.graphics.Rect;
/**
* Created by mariotaku on 15/4/27.
*/
public interface TintedStatusLayout extends IExtendedView {
void setColor(int color);
void setColor(int color, int alpha);
void setDrawColor(boolean color);
void setDrawShadow(boolean shadow);
void setFactor(float f);
void setShadowColor(int color);
void setSetPaddingEnabled(boolean enabled);
void getSystemWindowsInsets(Rect insets);
}

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
@ -18,8 +17,30 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.TintedStatusFrameLayout
<org.mariotaku.twidere.view.TintedStatusFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<org.mariotaku.twidere.view.TwidereToolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize" />
<View
android:background="?android:windowContentOverlay"
android:id="@+id/window_overlay"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</org.mariotaku.twidere.view.TintedStatusFrameLayout>

View File

@ -26,6 +26,7 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tool_bar"
android:layout_gravity="center">
<LinearLayout

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
@ -17,15 +16,12 @@
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.TintedStatusFrameLayout
android:id="@+id/main_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
app:setPadding="true">
android:animateLayoutChanges="true">
<FrameLayout
android:id="@+id/list_container"
@ -36,7 +32,7 @@
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:visibility="gone"/>
tools:visibility="gone" />
<LinearLayout
android:id="@android:id/empty"
@ -50,7 +46,7 @@
android:id="@+id/empty_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:color="?android:textColorSecondary"/>
android:color="?android:textColorSecondary" />
<TextView
android:id="@+id/empty_text"
@ -59,7 +55,7 @@
android:layout_gravity="center"
android:layout_marginTop="@dimen/element_spacing_normal"
android:gravity="center"
android:textAppearance="?android:textAppearanceMedium"/>
android:textAppearance="?android:textAppearanceMedium" />
</LinearLayout>
</FrameLayout>
@ -72,6 +68,7 @@
android:id="@android:id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
android:layout_gravity="center" />
</FrameLayout>
</org.mariotaku.twidere.view.TintedStatusFrameLayout>
</FrameLayout>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
@ -30,14 +29,14 @@
<org.mariotaku.twidere.view.ProfileBannerSpace
android:id="@+id/profile_banner_space"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<View
android:id="@+id/profile_name_background"
android:layout_width="match_parent"
android:layout_alignTop="@+id/profile_name_container"
android:layout_alignBottom="@+id/profile_name_container"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<org.mariotaku.twidere.view.ColorLabelRelativeLayout
android:id="@+id/profile_name_container"
@ -65,7 +64,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
android:visibility="gone" />
<ProgressBar
android:id="@+id/follow_progress"
@ -73,7 +72,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
android:visibility="gone" />
</FrameLayout>
@ -94,7 +93,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="?android:textColorPrimary"
tools:text="Name"/>
tools:text="Name" />
<TextView
android:id="@+id/screen_name"
@ -103,7 +102,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
tools:text="\@screenname"/>
tools:text="\@screenname" />
</LinearLayout>
</org.mariotaku.twidere.view.ColorLabelRelativeLayout>
@ -112,7 +111,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/element_spacing_xsmall"
android:layout_above="@+id/profile_name_container"
android:background="@drawable/shadow_top"/>
android:background="@drawable/shadow_top" />
<FrameLayout
android:id="@+id/profile_details_container"
@ -146,7 +145,7 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"
android:visibility="gone"/>
android:visibility="gone" />
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/description"
@ -156,7 +155,7 @@
android:paddingRight="@dimen/element_spacing_small"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
tools:text="Line 1\nLine 2\nLine 3"/>
tools:text="Line 1\nLine 2\nLine 3" />
</LinearLayout>
<LinearLayout
@ -173,7 +172,7 @@
android:layout_width="@dimen/element_size_small"
android:layout_height="@dimen/element_size_small"
android:color="?android:textColorPrimary"
android:src="@drawable/ic_action_location"/>
android:src="@drawable/ic_action_location" />
<TextView
android:id="@+id/location"
@ -184,7 +183,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
tools:text="Zhengzhou China"/>
tools:text="Zhengzhou China" />
</LinearLayout>
<LinearLayout
@ -201,7 +200,7 @@
android:layout_width="@dimen/element_size_small"
android:layout_height="@dimen/element_size_small"
android:color="?android:textColorPrimary"
android:src="@drawable/ic_action_link"/>
android:src="@drawable/ic_action_link" />
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/url"
@ -213,7 +212,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
tools:text="mariotaku.org"/>
tools:text="mariotaku.org" />
</LinearLayout>
<LinearLayout
@ -230,7 +229,7 @@
android:layout_width="@dimen/element_size_small"
android:layout_height="@dimen/element_size_small"
android:color="?android:textColorPrimary"
android:src="@drawable/ic_action_portal_cake"/>
android:src="@drawable/ic_action_portal_cake" />
<TextView
android:id="@+id/created_at"
@ -241,13 +240,13 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
tools:text="July 17, 2009 18:35 (20 tweets per day)"/>
tools:text="July 17, 2009 18:35 (20 tweets per day)" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.2dp"
android:background="?android:dividerVertical"/>
android:background="?android:dividerVertical" />
<LinearLayout
android:layout_width="match_parent"
@ -276,7 +275,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="?android:textColorPrimary"
tools:text="255"/>
tools:text="255" />
<TextView
android:layout_width="wrap_content"
@ -284,7 +283,7 @@
android:singleLine="true"
android:text="@string/followers"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorSecondary"/>
android:textColor="?android:textColorSecondary" />
</LinearLayout>
<LinearLayout
@ -305,7 +304,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="?android:textColorPrimary"
tools:text="255"/>
tools:text="255" />
<TextView
android:layout_width="wrap_content"
@ -313,7 +312,7 @@
android:singleLine="true"
android:text="@string/following"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorSecondary"/>
android:textColor="?android:textColorSecondary" />
</LinearLayout>
<LinearLayout
@ -334,7 +333,7 @@
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="?android:textColorPrimary"
tools:text="255"/>
tools:text="255" />
<TextView
android:layout_width="wrap_content"
@ -342,12 +341,12 @@
android:singleLine="true"
android:text="@string/listed"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorSecondary"/>
android:textColor="?android:textColorSecondary" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<include layout="@layout/layout_content_fragment_common"/>
<include layout="@layout/layout_content_fragment_common" />
</FrameLayout>
@ -358,7 +357,7 @@
android:layout_height="@dimen/icon_size_user_profile"
android:layout_alignBottom="@+id/profile_name_container"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"/>
android:contentDescription="@string/profile_image" />
<org.mariotaku.twidere.view.BoundsImageView
android:id="@+id/profile_type"
@ -370,7 +369,7 @@
android:layout_marginBottom="@dimen/element_spacing_minus_msmall"
android:layout_marginRight="@dimen/element_spacing_minus_msmall"
android:scaleType="fitCenter"
tools:visibility="gone"/>
tools:visibility="gone" />
<org.mariotaku.twidere.view.AssetFontTextView
android:id="@+id/uucky_footer"
@ -385,6 +384,6 @@
android:textStyle="italic"
android:typeface="serif"
android:visibility="gone"
app:fontPath="fonts/LibreBaskerville-Italic.ttf"/>
app:fontPath="fonts/LibreBaskerville-Italic.ttf" />
</RelativeLayout>

View File

@ -4,7 +4,6 @@
<dimen name="pane_spacing_left">270dp</dimen>
<dimen name="pane_spacing_right">270dp</dimen>
<dimen name="icon_size_wizard_large">480dp</dimen>
<dimen name="drawer_width_home">480dp</dimen>
<dimen name="accounts_drawer_name_size">18sp</dimen>
<dimen name="accounts_drawer_screen_name_size">16sp</dimen>
<dimen name="accounts_drawer_default_indicator_size">14sp</dimen>

View File

@ -7,31 +7,44 @@
<item name="android:windowAnimationStyle">@android:style/Animation.Activity</item>
</style>
<style name="Theme.Blank" parent="Theme.Compat.Base.NoActionBar">
<style name="Theme.Twidere.Dark.NoActionBar" parent="Theme.Compat.Base.NoActionBar">
<!-- Window attributes -->
<!--<item name="android:windowAnimationStyle">@style/Animation.Twidere.Activity</item>-->
<item name="android:windowBackground">@android:color/black</item>
<item name="android:windowBackground">@color/background_color_window_dark</item>
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">@color/background_color_card_item_dark</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_light</item>
<item name="menuIconColorActionBar">?menuIconColor</item>
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Blank.Dialog" parent="Theme.Compat.Base.Dialog" />
<style name="Theme.Twidere.Light.NoActionBar" parent="Theme.Compat.Base.Light.NoActionBar">
<!-- Window attributes -->
<item name="android:windowBackground">@color/background_color_window_light</item>
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.Light.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">#f8f8f8</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_dark</item>
<item name="menuIconColorDisabled">@color/action_icon_dark_disabled</item>
<item name="messageBubbleColor">@color/message_bubble_color_light</item>
</style>
<style name="Theme.Twidere.Dark" parent="Theme.Compat.Base">
<item name="windowActionBar">false</item>
<!-- Colors -->
<!--<item name="android:colorBackgroundCacheHint">@color/bg_color_dark</item>-->
<!-- Window attributes -->
<!--<item name="android:windowAnimationStyle">@style/Animation.Twidere.Activity</item>-->
<item name="android:windowBackground">@color/background_color_window_dark</item>
<!-- ActionBar styles -->
<item name="android:actionBarStyle">@android:style/Widget.DeviceDefault.ActionBar.Solid
</item>
<!-- Custom view styles -->
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.ProfileImage</item>
@ -46,21 +59,9 @@
<style name="Theme.Twidere.Light" parent="Theme.Compat.Base.Light">
<item name="windowActionBar">false</item>
<!-- Colors -->
<!--<item name="android:colorBackgroundCacheHint">@color/bg_color_light</item>-->
<!-- Window attributes -->
<!--<item name="android:windowAnimationStyle">@style/Animation.Twidere.Activity</item>-->
<item name="android:windowBackground">@color/background_color_window_light</item>
<!-- ActionBar styles -->
<!--<item name="android:actionBarStyle">@style/Widget.Twidere.ActionBar.Light.DarkActionBar</item>-->
<!--<item name="android:actionBarWidgetTheme">@style/Theme.Twidere.Dark</item>-->
<!-- Custom view styles -->
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
@ -69,21 +70,14 @@
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_dark</item>
<item name="menuIconColorDisabled">@color/action_icon_dark_disabled</item>
<item name="menuIconColorActionBar">@color/action_icon_light</item>
<item name="messageBubbleColor">@color/message_bubble_color_light</item>
</style>
<style name="Theme.Twidere.Dark.DialogWhenLarge" parent="Theme.Compat.Base.DialogWhenLarge">
<style name="Theme.Twidere.Dark.DialogWhenLarge.NoActionBar" parent="Theme.Compat.Base.DialogWhenLarge">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowBackground">@color/background_color_window_dark</item>
<!-- ActionBar styles -->
<item name="android:actionBarStyle">@android:style/Widget.DeviceDefault.ActionBar.Solid
</item>
<!-- Custom view styles -->
<item name="windowActionModeOverlay">false</item>
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.ProfileImage</item>
@ -96,23 +90,24 @@
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Twidere.Light.DialogWhenLarge" parent="Theme.Compat.Base.Light.DialogWhenLarge">
<style name="Theme.Twidere.Light.DialogWhenLarge.NoActionBar" parent="Theme.Compat.Base.Light.DialogWhenLarge">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="windowActionModeOverlay">false</item>
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.Light.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">#f8f8f8</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_dark</item>
<item name="menuIconColorDisabled">@color/action_icon_dark_disabled</item>
<item name="menuIconColorActionBar">@color/action_icon_light</item>
<item name="messageBubbleColor">@color/message_bubble_color_light</item>
</style>
<style name="Theme.Twidere.Dark.Dialog" parent="Theme.Base.Dialog">
<style name="Theme.Twidere.Dark.Dialog" parent="Theme.Compat.Base.Dialog">
<!-- Custom view styles -->
@ -129,7 +124,7 @@
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Twidere.Light.Dialog" parent="Theme.Base.Light.Dialog">
<style name="Theme.Twidere.Light.Dialog" parent="Theme.Compat.Base.Light.Dialog">
<!-- Custom view styles -->
@ -243,12 +238,12 @@
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Twidere.Drawer.Dark" parent="Theme.Twidere.Dark">
<style name="Theme.Twidere.Drawer.Dark" parent="Theme.Twidere.Dark.NoActionBar">
<!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_drawer_dark</item>
</style>
<style name="Theme.Twidere.Dark.NoDisplay">
<style name="Theme.Twidere.Dark.NoDisplay" parent="Theme.Twidere.Dark.NoActionBar">
<item name="android:windowBackground">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
@ -257,7 +252,7 @@
<item name="android:windowNoDisplay">true</item>
</style>
<style name="Theme.Twidere.Light.NoDisplay">
<style name="Theme.Twidere.Light.NoDisplay" parent="Theme.Twidere.Light.NoActionBar">
<item name="android:windowBackground">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
@ -272,7 +267,7 @@
<item name="android:windowBackground">@color/nyan_background</item>
</style>
<style name="Theme.Twidere.Wizard" parent="Theme.Twidere.Light">
<style name="Theme.Twidere.Wizard" parent="Theme.Twidere.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="android:windowBackground">@color/background_color_window_settings_wizard</item>
<item name="android:colorActivatedHighlight">@color/branding_color</item>