aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-10-01 22:40:25 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-10-01 22:40:25 +0900
commit659646390ee980ac615f36585ddddee28c0526e4 (patch)
tree108b91f1417b037a9de78a1f8d151e7ef66571ef
parent977b58533271f8dcf9ce07da787cdac20d7891e7 (diff)
downloadSmileEssence-659646390ee980ac615f36585ddddee28c0526e4.tar.gz
☆マルチアカウント対応☆
-rw-r--r--app/src/main/AndroidManifest.xml8
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java111
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java218
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.java8
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/Account.java130
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/RBinding.java (renamed from app/src/main/java/net/lacolaco/smileessence/entity/RO.java)2
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java10
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/User.java4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/util/UIObservable.java6
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/util/UIObserver.java4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.java20
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java6
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java6
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/viewmodel/EventViewModel.java4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java6
-rw-r--r--app/src/main/res/layout/layout_edit_list.xml4
-rw-r--r--app/src/main/res/layout/layout_license.xml4
-rw-r--r--app/src/main/res/layout/layout_main.xml19
-rw-r--r--app/src/main/res/layout/layout_oauth.xml84
-rw-r--r--app/src/main/res/layout/layout_setting.xml4
-rw-r--r--app/src/main/res/menu/main.xml3
-rw-r--r--app/src/main/res/values-ja/strings.xml7
-rw-r--r--app/src/main/res/values/keys.xml2
-rw-r--r--app/src/main/res/values/strings.xml9
-rw-r--r--app/src/main/res/values/styles.xml6
-rw-r--r--app/src/main/res/xml/setting.xml12
27 files changed, 517 insertions, 184 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 37e9ae00..34850971 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -110,6 +110,11 @@
android:label="@string/activity_edit_template"
android:parentActivityName="net.lacolaco.smileessence.activity.MainActivity" />
<activity
+ android:name=".activity.ManageAccountsActivity"
+ android:configChanges="keyboardHidden|orientation"
+ android:label="@string/activity_manage_accounts"
+ android:parentActivityName=".activity.ManageAccountsActivity" />
+ <activity
android:name=".activity.EditExtractionActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/activity_edit_extraction"
@@ -131,6 +136,7 @@
<activity
android:name=".activity.OAuthActivity"
android:configChanges="keyboardHidden|orientation"
- android:label="@string/activity_authenticate" />
+ android:label="@string/activity_authenticate"
+ android:parentActivityName=".activity.ManageAccountsActivity" />
</application>
</manifest>
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java
index 25a498e1..ce849742 100644
--- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java
+++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java
@@ -36,22 +36,23 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
+import android.widget.TextView;
+import com.android.volley.toolbox.NetworkImageView;
import net.lacolaco.smileessence.Application;
import net.lacolaco.smileessence.BuildConfig;
import net.lacolaco.smileessence.IntentRouter;
import net.lacolaco.smileessence.R;
import net.lacolaco.smileessence.command.CommandOpenURL;
+import net.lacolaco.smileessence.data.ImageCache;
import net.lacolaco.smileessence.data.PostState;
-import net.lacolaco.smileessence.entity.Account;
-import net.lacolaco.smileessence.entity.CommandSetting;
-import net.lacolaco.smileessence.entity.MuteUserIds;
+import net.lacolaco.smileessence.entity.*;
import net.lacolaco.smileessence.logging.Logger;
import net.lacolaco.smileessence.notification.NotificationType;
import net.lacolaco.smileessence.notification.Notificator;
import net.lacolaco.smileessence.preference.InternalPreferenceHelper;
import net.lacolaco.smileessence.preference.UserPreferenceHelper;
-import net.lacolaco.smileessence.twitter.OAuthSession;
import net.lacolaco.smileessence.twitter.UserStreamListener;
+import net.lacolaco.smileessence.twitter.task.ShowUserTask;
import net.lacolaco.smileessence.util.BitmapOptimizer;
import net.lacolaco.smileessence.util.NetworkHelper;
import net.lacolaco.smileessence.util.UIHandler;
@@ -64,14 +65,15 @@ public class MainActivity extends AppCompatActivity {
// ------------------------------ FIELDS ------------------------------
- public static final int REQUEST_OAUTH = 10;
public static final int REQUEST_GET_PICTURE_FROM_GALLERY = 11;
public static final int REQUEST_GET_PICTURE_FROM_CAMERA = 12;
+ private static final int REQUEST_MANAGE_ACCOUNT = 13;
private ViewPager viewPager;
private PageListAdapter pagerAdapter;
private TwitterStream stream;
private Uri cameraTempFilePath;
private UserStreamListener userStreamListener;
+ private boolean waitingAccount = true;
public Uri getCameraTempFilePath() {
return cameraTempFilePath;
@@ -134,8 +136,12 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
- case REQUEST_OAUTH: {
- receiveOAuth(requestCode, resultCode, data);
+ case REQUEST_MANAGE_ACCOUNT: {
+ if (waitingAccount) {
+ // first run
+ waitingAccount = false;
+ startMainLogic();
+ }
break;
}
case REQUEST_GET_PICTURE_FROM_GALLERY:
@@ -154,12 +160,14 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.layout_main);
Notificator.initialize(this);
CommandSetting.initialize();
+ Account.load();
if (setupLastUsedAccount()) {
+ waitingAccount = false;
startMainLogic();
IntentRouter.onNewIntent(this, getIntent());
} else {
- startOAuthActivity();
+ startActivityForResult(new Intent(this, ManageAccountsActivity.class), REQUEST_MANAGE_ACCOUNT);
}
}
@@ -200,6 +208,10 @@ public class MainActivity extends AppCompatActivity {
startActivity(new Intent(this, SettingActivity.class));
return true;
}
+ case R.id.actionbar_accounts: {
+ startActivity(new Intent(this, ManageAccountsActivity.class));
+ return true;
+ }
case R.id.actionbar_edit_templates: {
startActivity(new Intent(this, EditTemplateActivity.class));
return true;
@@ -319,13 +331,11 @@ public class MainActivity extends AppCompatActivity {
public void startMainLogic() {
initializeView();
- startTwitter();
+ onChangeCurrentAccount();
}
public boolean startStream() {
- if (!new NetworkHelper(this).canConnect()) {
- return false;
- }
+
if (stream != null) {
stream.shutdown();
}
@@ -337,26 +347,36 @@ public class MainActivity extends AppCompatActivity {
return true;
}
- public boolean startTwitter() {
- if (!startStream()) {
- return false;
+ private void onChangeCurrentAccount() {
+ if (!new NetworkHelper(this).canConnect()) {
+ return; // TODO: error message?
}
- MuteUserIds.refresh(Application.getCurrentAccount());
- Application.getCurrentAccount().refreshListSubscriptions();
- updateActionBarIcon();
- return true;
- }
- public void updateActionBarIcon() {/*
- final ImageView homeIcon = (ImageView) findViewById(android.R.id.home);
- new ShowUserTask(Application.getCurrentAccount(), Application.getCurrentAccount().getUserId())
- .onDoneUI(user -> {
- String urlHttps = user.getProfileImageUrl();
- homeIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
- new BitmapURLTask(urlHttps, homeIcon).execute();
- })
- .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_show_user, NotificationType.ALERT))
- .execute();*/
+ Account account = Application.getCurrentAccount();
+ User user = account.getUser();
+ startStream();
+ MuteUserIds.refresh(account);
+ account.refreshListSubscriptions();
+
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+ final TextView toolbarTitle = (TextView) findViewById(R.id.toolbar_text);
+ final NetworkImageView iconImageView = (NetworkImageView) findViewById(R.id.toolbar_icon);
+
+ Runnable update = () -> {
+ toolbarTitle.setText(account.getUser().getScreenName());
+ String oldUrl = iconImageView.getImageURL();
+ String newUrl = user.getProfileImageUrl();
+ if (newUrl != null && (oldUrl == null || !oldUrl.equals(newUrl))) {
+ ImageCache.getInstance().setImageToView(newUrl, iconImageView);
+ }
+ };
+
+ update.run();
+ user.addObserver(this, (x, changes) -> {
+ if (changes.contains(RBinding.BASIC)) update.run();
+ });
+
+ new ShowUserTask(account, account.getUserId()).execute();
}
private void getImageUri(int requestCode, int resultCode, Intent data) {
@@ -396,10 +416,7 @@ public class MainActivity extends AppCompatActivity {
public void initializeView() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- //ActionBar bar = getActionBar();
- //bar.setDisplayShowHomeEnabled(true);
- //bar.setDisplayShowTitleEnabled(false);
- //bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
+
viewPager = (ViewPager) findViewById(R.id.viewPager);
pagerAdapter = new PageListAdapter(this, viewPager);
initializePages();
@@ -409,28 +426,14 @@ public class MainActivity extends AppCompatActivity {
setSelectedPageIndex(pagerAdapter.getIndex(UserListFragment.class));
}
- private void receiveOAuth(int requestCode, int resultCode, Intent data) {
- if (resultCode != RESULT_OK) {
- Logger.error(requestCode);
- Notificator.getInstance().publish(R.string.notice_error_authenticate);
- finish();
- } else {
- Account account = new Account(data.getStringExtra(OAuthSession.KEY_TOKEN),
- data.getStringExtra(OAuthSession.KEY_TOKEN_SECRET),
- data.getLongExtra(OAuthSession.KEY_USER_ID, -1L),
- data.getStringExtra(OAuthSession.KEY_SCREEN_NAME));
- account.save();
- Application.setCurrentAccount(account);
- InternalPreferenceHelper.getInstance().set(R.string.key_last_used_account_id, account.getId());
- startMainLogic();
- }
- }
-
private boolean setupLastUsedAccount() {
long lastId = InternalPreferenceHelper.getInstance().get(R.string.key_last_used_account_id, -1L);
Account account = null;
if (lastId != -1) {
- account = Account.load(Account.class, lastId);
+ account = Account.get(lastId);
+ }
+ if (account == null && Account.count() > 0) {
+ account = Account.all().get(0);
}
if (account != null) {
Application.setCurrentAccount(account);
@@ -439,8 +442,4 @@ public class MainActivity extends AppCompatActivity {
return false;
}
}
-
- private void startOAuthActivity() {
- startActivityForResult(new Intent(this, OAuthActivity.class), REQUEST_OAUTH);
- }
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java
new file mode 100644
index 00000000..508c3b83
--- /dev/null
+++ b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java
@@ -0,0 +1,218 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2014 lacolaco.net
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.lacolaco.smileessence.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.*;
+import android.widget.*;
+import net.lacolaco.smileessence.Application;
+import net.lacolaco.smileessence.R;
+import net.lacolaco.smileessence.entity.Account;
+import net.lacolaco.smileessence.logging.Logger;
+import net.lacolaco.smileessence.notification.Notificator;
+import net.lacolaco.smileessence.preference.InternalPreferenceHelper;
+import net.lacolaco.smileessence.twitter.OAuthSession;
+import net.lacolaco.smileessence.view.dialog.ConfirmDialogFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ManageAccountsActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AbsListView.OnItemLongClickListener {
+ public static final int REQUEST_OAUTH = 10;
+ private EditAccountsAdapter adapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTheme(Application.getThemeResId());
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.layout_edit_list);
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ ListView listView = (ListView) findViewById(R.id.listview_edit_list);
+ adapter = new EditAccountsAdapter();
+ listView.setAdapter(adapter);
+ listView.setOnItemClickListener(this);
+ listView.setOnItemLongClickListener(this);
+
+ Logger.debug("onCreate");
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuItem add = menu.add(Menu.NONE, R.id.menu_edit_list_add, Menu.NONE, "");
+ add.setIcon(android.R.drawable.ic_menu_add);
+ add.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ return true;
+ }
+
+ @Override
+ public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
+ if (adapter.getCount() > 1) {
+ // remove account from application
+ Account account = adapter.getItem(i);
+ ConfirmDialogFragment.show(this, getString(R.string.dialog_confirm_clear_account, account.getUser().getScreenName()), () -> {
+ adapter.removeAt(i);
+ Account.unregister(account.getModelId());
+ if (account == Application.getCurrentAccount()) {
+ setCurrentAccount(adapter.getItem(0));
+ }
+ }, false);
+ return true;
+ } else {
+ Notificator.getInstance().publish("You can't remove last account");
+ return false;
+ }
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ // switch current application to this account
+ Account account = adapter.getItem(position);
+ setCurrentAccount(account);
+ safeFinish();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_edit_list_add: {
+ startActivityForResult(new Intent(this, OAuthActivity.class), REQUEST_OAUTH);
+ break;
+ }
+ case android.R.id.home: {
+ safeFinish();
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onBackPressed() {
+ safeFinish();
+ }
+
+ private void safeFinish() {
+ if (Application.getCurrentAccount() != null) {
+ setResult(RESULT_OK);
+ finish();
+ } else {
+ Notificator.getInstance().publish("[TODO] No account selected"); // TODO
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_OAUTH: {
+ receiveOAuth(requestCode, resultCode, data);
+ break;
+ }
+ default: {
+ Logger.error(String.format("[BUG] unexpected activity result: reqCode=%d, resCode=%d", requestCode, resultCode));
+ break;
+ }
+ }
+ }
+
+ private void receiveOAuth(int requestCode, int resultCode, Intent data) {
+ if (resultCode == RESULT_OK) {
+ Account account = Account.register(data.getStringExtra(OAuthSession.KEY_TOKEN),
+ data.getStringExtra(OAuthSession.KEY_TOKEN_SECRET),
+ data.getLongExtra(OAuthSession.KEY_USER_ID, -1L),
+ data.getStringExtra(OAuthSession.KEY_SCREEN_NAME));
+ adapter.add(account);
+ if (Application.getCurrentAccount() == null) {
+ setCurrentAccount(account);
+ }
+ } else {
+ Logger.error(requestCode);
+ Notificator.getInstance().publish(R.string.notice_error_authenticate);
+ }
+ }
+
+ private void setCurrentAccount(Account account) {
+ Application.setCurrentAccount(account);
+ InternalPreferenceHelper.getInstance().set(R.string.key_last_used_account_id, account.getModelId());
+ }
+
+ private class EditAccountsAdapter extends BaseAdapter {
+ private final List<Account> accounts;
+
+ public EditAccountsAdapter() {
+ accounts = new ArrayList<>(Account.all());
+ }
+
+ @Override
+ public int getCount() {
+ return accounts.size();
+ }
+
+ @Override
+ public Account getItem(int position) {
+ return accounts.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return accounts.get(position).getModelId();
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ convertView = inflater.inflate(R.layout.menu_item_simple_text, null);
+ }
+ Account account = getItem(position);
+ TextView textView = (TextView) convertView.findViewById(R.id.textView_menuItem_simple);
+ String text = account.getUser().getScreenName();
+ if (account == Application.getCurrentAccount()) {
+ text = "(*) " + text;
+ }
+ textView.setText(text); // TODO: show profile image
+
+ return convertView;
+ }
+
+ public int add(Account account) {
+ accounts.add(account);
+ notifyDataSetChanged();
+ return accounts.size() - 1;
+ }
+
+ public Account removeAt(int position) {
+ Account account = accounts.remove(position);
+ notifyDataSetChanged();
+ return account;
+ }
+ }
+}
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.java
index 77658fed..6672843d 100644
--- a/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.java
+++ b/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.java
@@ -27,6 +27,7 @@ package net.lacolaco.smileessence.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -41,7 +42,6 @@ import twitter4j.auth.AccessToken;
public class OAuthActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher {
- public static final int PIN_CODE_LENGTH = 7;
private TextView linkTextView;
private EditText pinEditText;
private Button authButton;
@@ -52,6 +52,10 @@ public class OAuthActivity extends AppCompatActivity implements View.OnClickList
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_oauth);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
linkTextView = (TextView) findViewById(R.id.textView_oauth_link);
pinEditText = (EditText) findViewById(R.id.editText_oauth_pin);
pinEditText.addTextChangedListener(this);
@@ -96,7 +100,7 @@ public class OAuthActivity extends AppCompatActivity implements View.OnClickList
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- authButton.setEnabled(s.length() == PIN_CODE_LENGTH);
+ authButton.setEnabled(s.length() > 0);
}
@Override
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Account.java b/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
index a5fdd25f..0f346642 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
@@ -25,10 +25,10 @@
package net.lacolaco.smileessence.entity;
import android.os.Handler;
-import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Delete;
+import com.activeandroid.query.Select;
import net.lacolaco.smileessence.twitter.task.GetUserListsTask;
import net.lacolaco.smileessence.twitter.task.ShowStatusTask;
import net.lacolaco.smileessence.util.BackgroundTask;
@@ -39,69 +39,99 @@ import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.auth.AccessToken;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
-@Table(name = "Accounts")
-public class Account extends Model {
+public class Account {
+ private static Map<Long, Account> cache; // model id -> Account
private User user;
+ private Model model;
private final Set<String> listSubscriptions = Collections.newSetFromMap(new ConcurrentHashMap<>());
- @Column(name = "Token", notNull = true)
- private String accessToken;
- @Column(name = "Secret", notNull = true)
- private String accessSecret;
- @Column(name = "UserID", notNull = true)
- private long userID;
- @Column(name = "ScreenName", notNull = true)
- private String screenName;
+ // --------------------- static methods ---------------------
+ public static synchronized Account get(long i) {
+ if (cache == null) {
+ throw new IllegalStateException("Load first");
+ }
+ return cache.get(i);
+ }
- // Required by ActiveAndroid
- public Account() {
- super();
+ public static synchronized int count() {
+ return cache.size();
}
- public Account(String token, String tokenSecret, long userID, String screenName) {
- super();
- this.accessToken = token;
- this.accessSecret = tokenSecret;
- this.userID = userID;
- this.screenName = screenName;
+ public static synchronized List<Account> all() {
+ return new ArrayList<>(cache.values());
}
- @Deprecated
- public static void deleteAll() {
- new Delete().from(Account.class).execute();
+ public static synchronized void load() {
+ cache = new LinkedHashMap<>();
+ List<Model> all = new Select().from(Model.class).execute();
+ for (Model model : all) {
+ cache.put(model.getId(), new Account(model));
+ }
+ }
+
+ public static synchronized Account register(String token, String tokenSecret, long userID, String screenName) {
+ Account account = Account.get(userID);
+ if (account == null) {
+ Model model = new Model(token, tokenSecret, userID, screenName);
+ model.save();
+ account = new Account(model);
+ cache.put(model.getId(), account);
+ } else {
+ Model model = account.model;
+ model.accessToken = token;
+ model.accessSecret = tokenSecret;
+ model.screenName = screenName;
+ model.save();
+ }
+ return account;
+ }
+
+ public static synchronized Account unregister(long modelId) {
+ Account account = cache.remove(modelId);
+ if (account != null) {
+ Model.delete(Model.class, modelId);
+ }
+ return account;
+ }
+
+ // --------------------- instance methods ---------------------
+ private Account(Model model) {
+ this.model = model;
}
public long getUserId() {
- return userID;
+ return model.userID;
+ }
+
+ public long getModelId() {
+ return model.getId();
}
public Twitter getTwitter() {
Twitter twitter = new TwitterFactory().getInstance();
- twitter.setOAuthAccessToken(new AccessToken(accessToken, accessSecret));
+ twitter.setOAuthAccessToken(new AccessToken(model.accessToken, model.accessSecret));
return twitter;
}
public TwitterStream getTwitterStream() {
TwitterStream stream = new TwitterStreamFactory().getInstance();
- stream.setOAuthAccessToken(new AccessToken(accessToken, accessSecret));
+ stream.setOAuthAccessToken(new AccessToken(model.accessToken, model.accessSecret));
return stream;
}
public User getUser() {
if (user == null) {
- user = User.fetch(userID);
+ user = User.fetch(model.userID);
if (user == null) {
- user = User._makeSkeleton(getUserId(), screenName);
+ user = User._makeSkeleton(getUserId(), model.screenName);
}
user.addObserver(this, (user, objs) -> {
- if (!this.screenName.equals(((User) user).getScreenName())) {
- this.screenName = ((User) user).getScreenName();
- this.save();
+ if (!model.screenName.equals(((User) user).getScreenName())) {
+ model.screenName = ((User) user).getScreenName();
+ model.save();
}
});
}
@@ -153,4 +183,34 @@ public class Account extends Model {
public boolean removeListSubscription(String fullName) {
return listSubscriptions.remove(fullName);
}
-}
+
+ @Table(name = "Accounts")
+ private static class Model extends com.activeandroid.Model {
+ @Column(name = "Token", notNull = true)
+ private String accessToken;
+ @Column(name = "Secret", notNull = true)
+ private String accessSecret;
+ @Column(name = "UserID", notNull = true)
+ private long userID;
+ @Column(name = "ScreenName", notNull = true)
+ private String screenName;
+
+ // Required by ActiveAndroid
+ public Model() {
+ super();
+ }
+
+ public Model(String token, String tokenSecret, long userID, String screenName) {
+ super();
+ this.accessToken = token;
+ this.accessSecret = tokenSecret;
+ this.userID = userID;
+ this.screenName = screenName;
+ }
+
+ @Deprecated
+ public static void deleteAll() {
+ new Delete().from(Model.class).execute();
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/RO.java b/app/src/main/java/net/lacolaco/smileessence/entity/RBinding.java
index db613730..ba9be9e5 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/RO.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/RBinding.java
@@ -1,6 +1,6 @@
package net.lacolaco.smileessence.entity;
-public enum RO {
+public enum RBinding {
// Tweet
REACTION_COUNT,
FAVORITERS,
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
index 52d23617..bf7fdca9 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
@@ -76,7 +76,7 @@ public class Tweet extends EntitySupport {
favoriteCount = status.getFavoriteCount();
retweetCount = status.getRetweetCount();
- notifyChange(RO.REACTION_COUNT);
+ notifyChange(RBinding.REACTION_COUNT);
}
inReplyTo = status.getInReplyToStatusId();
@@ -175,13 +175,13 @@ public class Tweet extends EntitySupport {
public boolean addFavoriter(long id) {
boolean changed = favoriters.add(id);
- if (changed) notifyChange(RO.FAVORITERS);
+ if (changed) notifyChange(RBinding.FAVORITERS);
return changed;
}
public boolean removeFavoriter(long id) {
boolean changed = favoriters.remove(id);
- if (changed) notifyChange(RO.FAVORITERS);
+ if (changed) notifyChange(RBinding.FAVORITERS);
return changed;
}
@@ -204,13 +204,13 @@ public class Tweet extends EntitySupport {
public boolean addRetweet(long uid, long sid) {
Long result = retweets.put(uid, sid);
boolean changed = result == null || result != sid;
- if (changed) notifyChange(RO.RETWEETERS);
+ if (changed) notifyChange(RBinding.RETWEETERS);
return changed;
}
private boolean removeRetweet(long sid) {
boolean changed = retweets.values().remove(sid);
- if (changed) notifyChange(RO.RETWEETERS);
+ if (changed) notifyChange(RBinding.RETWEETERS);
return changed;
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/User.java b/app/src/main/java/net/lacolaco/smileessence/entity/User.java
index 7834e9ce..1ee7815c 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/User.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/User.java
@@ -70,7 +70,7 @@ public class User extends UIObservable {
if (user.getProfileImageURLHttps() != null)
profileImageUrl = user.getProfileImageURLHttps();
- notifyChange(RO.BASIC);
+ notifyChange(RBinding.BASIC);
}
if (getProfileBannerUrl() == null || !getProfileBannerUrl().equals(user.getProfileBannerURL()) ||
@@ -99,7 +99,7 @@ public class User extends UIObservable {
if (user.getFollowersCount() != -1)
followersCount = user.getFollowersCount();
- notifyChange(RO.DETAIL);
+ notifyChange(RBinding.DETAIL);
}
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/util/UIObservable.java b/app/src/main/java/net/lacolaco/smileessence/util/UIObservable.java
index dbf97b78..4c13e3f6 100644
--- a/app/src/main/java/net/lacolaco/smileessence/util/UIObservable.java
+++ b/app/src/main/java/net/lacolaco/smileessence/util/UIObservable.java
@@ -1,6 +1,6 @@
package net.lacolaco.smileessence.util;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import java.util.*;
@@ -19,11 +19,11 @@ public abstract class UIObservable {
}
}
- public void notifyChange(RO flag) {
+ public void notifyChange(RBinding flag) {
notifyChange(EnumSet.of(flag));
}
- public void notifyChange(EnumSet<RO> flags) {
+ public void notifyChange(EnumSet<RBinding> flags) {
List<UIObserver> obs = new ArrayList<>();
synchronized(this) {
obs.addAll(observers.values());
diff --git a/app/src/main/java/net/lacolaco/smileessence/util/UIObserver.java b/app/src/main/java/net/lacolaco/smileessence/util/UIObserver.java
index adfece0a..63918607 100644
--- a/app/src/main/java/net/lacolaco/smileessence/util/UIObserver.java
+++ b/app/src/main/java/net/lacolaco/smileessence/util/UIObserver.java
@@ -1,9 +1,9 @@
package net.lacolaco.smileessence.util;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import java.util.EnumSet;
public interface UIObserver {
- void update(UIObservable observable, EnumSet<RO> flags);
+ void update(UIObservable observable, EnumSet<RBinding> flags);
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.java
index e98a56db..cabe46ce 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.java
+++ b/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.java
@@ -33,10 +33,9 @@ import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.text.TextUtils;
import net.lacolaco.smileessence.R;
+import net.lacolaco.smileessence.activity.ManageAccountsActivity;
import net.lacolaco.smileessence.activity.LicenseActivity;
-import net.lacolaco.smileessence.entity.Account;
import net.lacolaco.smileessence.notification.Notificator;
-import net.lacolaco.smileessence.view.dialog.ConfirmDialogFragment;
import net.lacolaco.smileessence.view.dialog.SimpleDialogFragment;
import static android.content.SharedPreferences.OnSharedPreferenceChangeListener;
@@ -94,12 +93,8 @@ public class SettingFragment extends PreferenceFragment implements OnSharedPrefe
R.layout.dialog_app_info,
getString(R.string.dialog_title_about));
DialogHelper.showDialog(getActivity(), informationDialog);
- } else if (key.contentEquals(getString(R.string.key_setting_clear_account))) {
- ConfirmDialogFragment.show(getActivity(), getString(R.string.dialog_confirm_clear_account), () -> {
- Notificator.getInstance().publish(R.string.notice_cleared_account);
- Account.deleteAll();
- getActivity().finish();
- }, false);
+ } else if (key.contentEquals(getString(R.string.key_setting_accounts))) {
+ openManageAccountsActivity();
} else if (key.contentEquals(getString(R.string.key_setting_licenses))) {
openLicenseActivity();
}
@@ -119,6 +114,8 @@ public class SettingFragment extends PreferenceFragment implements OnSharedPrefe
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setting);
+ Preference manageAccounts = findPreference(R.string.key_setting_accounts);
+ manageAccounts.setOnPreferenceClickListener(this);
EditTextPreference textSizePreference = (EditTextPreference) findPreference(R.string.key_setting_text_size);
textSizePreference.setSummary(textSizePreference.getText());
textSizePreference.setOnPreferenceChangeListener(this);
@@ -132,8 +129,6 @@ public class SettingFragment extends PreferenceFragment implements OnSharedPrefe
timelinesPreference.setOnPreferenceChangeListener(this);
Preference appInfoPreference = findPreference(R.string.key_setting_application_information);
appInfoPreference.setOnPreferenceClickListener(this);
- Preference clearAccount = findPreference(R.string.key_setting_clear_account);
- clearAccount.setOnPreferenceClickListener(this);
Preference license = findPreference(R.string.key_setting_licenses);
license.setOnPreferenceClickListener(this);
}
@@ -163,6 +158,11 @@ public class SettingFragment extends PreferenceFragment implements OnSharedPrefe
getActivity().startActivity(intent);
}
+ private void openManageAccountsActivity() {
+ Intent intent = new Intent(getActivity(), ManageAccountsActivity.class);
+ getActivity().startActivity(intent);
+ }
+
private void setSummaryCurrentValue() {
EditTextPreference textSizePreference = (EditTextPreference) findPreference(R.string.key_setting_text_size);
textSizePreference.setSummary(textSizePreference.getText());
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java
index 6ec85e92..206c795a 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java
+++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java
@@ -37,7 +37,7 @@ import net.lacolaco.smileessence.command.Command;
import net.lacolaco.smileessence.command.CommandOpenURL;
import net.lacolaco.smileessence.data.PostState;
import net.lacolaco.smileessence.entity.Account;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.notification.NotificationType;
import net.lacolaco.smileessence.notification.Notificator;
@@ -157,9 +157,9 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen
bundle.attach(tweet, (x, changes) -> {
if (getActivity() != null) {
- if (changes.contains(RO.REACTION_COUNT))
+ if (changes.contains(RBinding.REACTION_COUNT))
updateViewReactions(view, tweet);
- if (changes.contains(RO.FAVORITERS) || changes.contains(RO.RETWEETERS))
+ if (changes.contains(RBinding.FAVORITERS) || changes.contains(RBinding.RETWEETERS))
updateViewButtons(view, tweet);
}
});
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java
index e11b117c..8bfc119d 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java
+++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java
@@ -43,7 +43,7 @@ import net.lacolaco.smileessence.command.Command;
import net.lacolaco.smileessence.command.CommandOpenURL;
import net.lacolaco.smileessence.data.ImageCache;
import net.lacolaco.smileessence.entity.Account;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.entity.User;
import net.lacolaco.smileessence.notification.NotificationType;
@@ -308,9 +308,9 @@ public class UserDetailDialogFragment extends StackableDialogFragment implements
observerBundle.attach(user, (x, changes) -> {
if (getActivity() != null) {
- if (changes.contains(RO.BASIC))
+ if (changes.contains(RBinding.BASIC))
updateUserDataBasic(user);
- if (changes.contains(RO.DETAIL))
+ if (changes.contains(RBinding.DETAIL))
updateUserDataDetail(user);
}
});
diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/EventViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/EventViewModel.java
index 4c3ba160..f586f2e2 100644
--- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/EventViewModel.java
+++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/EventViewModel.java
@@ -33,7 +33,7 @@ import com.android.volley.toolbox.NetworkImageView;
import net.lacolaco.smileessence.Application;
import net.lacolaco.smileessence.R;
import net.lacolaco.smileessence.data.ImageCache;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.entity.User;
import net.lacolaco.smileessence.preference.UserPreferenceHelper;
@@ -147,7 +147,7 @@ public class EventViewModel implements IViewModel {
final View finalView = convertedView;
bundle.attach(source, (x, changes) -> {
- if (changes.contains(RO.BASIC))
+ if (changes.contains(RBinding.BASIC))
updateViewUser(finalView);
});
diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java
index 07d2b42c..ecb47823 100644
--- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java
+++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java
@@ -35,7 +35,7 @@ import net.lacolaco.smileessence.R;
import net.lacolaco.smileessence.data.ImageCache;
import net.lacolaco.smileessence.entity.Account;
import net.lacolaco.smileessence.entity.DirectMessage;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import net.lacolaco.smileessence.preference.UserPreferenceHelper;
import net.lacolaco.smileessence.util.NameStyles;
import net.lacolaco.smileessence.util.StringUtils;
@@ -110,7 +110,7 @@ public class MessageViewModel implements IViewModel {
final View finalView = convertedView;
bundle.attach(directMessage.getSender(), (x, changes) -> {
- if (changes.contains(RO.BASIC))
+ if (changes.contains(RBinding.BASIC))
updateViewSender(activity, finalView);
});
diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java
index 9b61319f..cb7cde63 100644
--- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java
+++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java
@@ -36,7 +36,7 @@ import net.lacolaco.smileessence.Application;
import net.lacolaco.smileessence.R;
import net.lacolaco.smileessence.activity.MainActivity;
import net.lacolaco.smileessence.data.ImageCache;
-import net.lacolaco.smileessence.entity.RO;
+import net.lacolaco.smileessence.entity.RBinding;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.preference.UserPreferenceHelper;
import net.lacolaco.smileessence.util.*;
@@ -113,11 +113,11 @@ public class StatusViewModel implements IViewModel {
final View view = convertedView;
bundle.attach(tweet, (x, changes) -> {
- if (changes.contains(RO.FAVORITERS))
+ if (changes.contains(RBinding.FAVORITERS))
updateViewFavorited(((MainActivity) activity), view);
});
bundle.attach(tweet.getUser(), (x, changes) -> {
- if (changes.contains(RO.BASIC))
+ if (changes.contains(RBinding.BASIC))
updateViewUser(((MainActivity) activity), view);
});
diff --git a/app/src/main/res/layout/layout_edit_list.xml b/app/src/main/res/layout/layout_edit_list.xml
index 3311477f..396fb732 100644
--- a/app/src/main/res/layout/layout_edit_list.xml
+++ b/app/src/main/res/layout/layout_edit_list.xml
@@ -26,6 +26,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -34,7 +35,8 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<FrameLayout
android:id="@+id/main_layout"
diff --git a/app/src/main/res/layout/layout_license.xml b/app/src/main/res/layout/layout_license.xml
index 0e50b861..aa2fcbe7 100644
--- a/app/src/main/res/layout/layout_license.xml
+++ b/app/src/main/res/layout/layout_license.xml
@@ -25,6 +25,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -33,7 +34,8 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<FrameLayout
android:id="@+id/main_layout"
diff --git a/app/src/main/res/layout/layout_main.xml b/app/src/main/res/layout/layout_main.xml
index 6de7b0fd..44328132 100644
--- a/app/src/main/res/layout/layout_main.xml
+++ b/app/src/main/res/layout/layout_main.xml
@@ -24,19 +24,32 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ tools:context=".MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity">
+ android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+ <com.android.volley.toolbox.NetworkImageView
+ android:id="@+id/toolbar_icon"
+ android:scaleType="fitCenter"
+ android:layout_width="32dp"
+ android:layout_height="32dp" />
+ <TextView
+ android:id="@+id/toolbar_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ </android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/main_layout"
+ android:background="?attr/page_background"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/app/src/main/res/layout/layout_oauth.xml b/app/src/main/res/layout/layout_oauth.xml
index 077fcaf9..61af223d 100644
--- a/app/src/main/res/layout/layout_oauth.xml
+++ b/app/src/main/res/layout/layout_oauth.xml
@@ -23,43 +23,59 @@
~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
~ SOFTWARE.
-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="15dp"
- android:gravity="center_vertical|center_horizontal"
- android:orientation="vertical">
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/message_oauth_text" />
+ <LinearLayout
+ android:id="@+id/main_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="15dp"
+ android:gravity="center_vertical|center_horizontal"
+ android:orientation="vertical">
- <TextView
- android:id="@+id/textView_oauth_link"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_margin="10dp"
- android:autoLink="web" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/message_oauth_text" />
- <EditText
- android:id="@+id/editText_oauth_pin"
- android:layout_width="200sp"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginBottom="10dp"
- android:layout_marginTop="10dp"
- android:hint="@string/message_oauth_hint"
- android:inputType="number"
- android:maxLength="7" />
+ <TextView
+ android:id="@+id/textView_oauth_link"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_margin="10dp"
+ android:autoLink="web" />
+
+ <EditText
+ android:id="@+id/editText_oauth_pin"
+ android:layout_width="200sp"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginBottom="10dp"
+ android:layout_marginTop="10dp"
+ android:hint="@string/message_oauth_hint"
+ android:inputType="number"
+ android:maxLength="7" />
+
+ <Button
+ android:id="@+id/button_oauth_auth"
+ android:layout_width="200dp"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:text="@string/message_oauth_authenticate" />
+
+ </LinearLayout>
- <Button
- android:id="@+id/button_oauth_auth"
- android:layout_width="200dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/message_oauth_authenticate" />
</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/layout_setting.xml b/app/src/main/res/layout/layout_setting.xml
index 4eec1bc8..82d3ac1d 100644
--- a/app/src/main/res/layout/layout_setting.xml
+++ b/app/src/main/res/layout/layout_setting.xml
@@ -26,6 +26,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -34,7 +35,8 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<FrameLayout
android:id="@+id/main_layout"
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
index 0d1f73dc..32cf23ec 100644
--- a/app/src/main/res/menu/main.xml
+++ b/app/src/main/res/menu/main.xml
@@ -9,6 +9,9 @@
android:title="@string/actionbar_search"
android:icon="@drawable/icon_search_white"
app:showAsAction="always" /> -->
+ <item android:id="@+id/actionbar_accounts"
+ android:title="@string/actionbar_accounts"
+ app:showAsAction="never" />
<item android:id="@+id/actionbar_settings"
android:title="@string/actionbar_settings"
android:icon="@drawable/icon_settings"
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index bfc6244c..853df747 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -100,9 +100,8 @@
<string name="setting_category_about_title">情報</string>
<string name="setting_application_information_title">アプリ情報</string>
<string name="setting_licenses_title">ライセンスについて</string>
- <string name="setting_category_account_title">アカウント</string>
- <string name="setting_delete_authentication_title">認証情報を削除する</string>
- <string name="setting_delete_authentication_summary">次回起動時に再認証が必要です</string>
+ <string name="setting_category_accounts_title">アカウント</string>
+ <string name="setting_accounts_title">アカウントを管理する</string>
<string name="error_setting_text_size_range">8から24の間で設定してください</string>
<string name="error_setting_text_size_not_number">数を入力してください</string>
<string name="error_setting_timelines_range">1から200の間で設定してください</string>
@@ -236,4 +235,6 @@
<string name="command_search_on_google">Googleで検索する</string>
<string name="notice_error_get_user_timeline">ユーザータイムラインの取得に失敗しました</string>
<string name="notice_error_get_list">リストタイムラインの取得に失敗しました</string>
+ <string name="activity_manage_accounts">アカウント管理</string>
+ <string name="actionbar_accounts">アカウントの管理</string>
</resources>
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index ea2e4dbe..55a0b301 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -27,7 +27,7 @@
<string name="key_test_preference">testPreference</string>
<string name="key_setting_text_size">textSize</string>
<string name="key_setting_back_to_home">onSubmit</string>
- <string name="key_setting_clear_account">clearAccount</string>
+ <string name="key_setting_accounts">manageAccounts</string>
<string name="key_setting_notify_on_unfavorited">unfavNotify</string>
<string name="key_open_ime">openIME</string>
<string name="key_setting_show_confirm_dialog">confirm</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3008eceb..09589d18 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -98,9 +98,8 @@
<string name="setting_timelines_dialog_title">Edit number</string>
<string name="setting_timelines_dialog_message">Set a value between 1\-200</string>
<string name="setting_category_about_title">About</string>
- <string name="setting_delete_authentication_title">Delete authentication</string>
- <string name="setting_delete_authentication_summary">Please authenticate again on next launch</string>
- <string name="setting_category_account_title">Account</string>
+ <string name="setting_accounts_title">Manage accounts</string>
+ <string name="setting_category_accounts_title">Accounts</string>
<string name="setting_application_information_title">Application information</string>
<string name="setting_licenses_title">Licenses</string>
<string name="error_setting_text_size_range">Must be between 8\-24</string>
@@ -135,7 +134,7 @@
<string name="dialog_title_select_image">Select image</string>
<string name="dialog_title_select_search_query">Select search query</string>
<string name="dialog_confirm_commands">Execute, OK?</string>
- <string name="dialog_confirm_clear_account">Clear authentication, Really?</string>
+ <string name="dialog_confirm_clear_account">Are you sure you want to remove this account @%s?</string>
<string name="dialog_title_talk_chain">Talk View</string>
<string name="dialog_title_select_userlist">Select a list</string>
<string name="dialog_review_rating_text">How many favs will you give?</string>
@@ -237,4 +236,6 @@
<string name="notice_error_get_user_timeline">Failed to get user timeline</string>
<string name="notice_error_get_list">Failed to get list timeline</string>
<string name="notices_of_files">Notices of files:</string>
+ <string name="activity_manage_accounts">Accounts</string>
+ <string name="actionbar_accounts">Accounts</string>
</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index caedb611..0831b46f 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -27,6 +27,9 @@
<style name="theme_dark" parent="Theme.AppCompat">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
+ <item name="colorPrimaryDark">@color/black</item>
+ <item name="colorPrimary">@color/black</item>
+ <item name="colorAccent">@color/metro_blue</item>
<item name="page_background">@color/gray_dark_dark</item>
<item name="icon_post_delete">@drawable/icon_delete_w</item>
<item name="icon_post_picture">@drawable/icon_picture_w</item>
@@ -62,6 +65,9 @@
<style name="theme_light" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
+ <item name="colorPrimaryDark">@color/gray_dark_dark</item>
+ <item name="colorPrimary">@color/gray_dark_dark</item>
+ <item name="colorAccent">@color/metro_blue</item>
<item name="page_background">@color/white</item>
<item name="icon_post_delete">@drawable/icon_delete</item>
<item name="icon_post_picture">@drawable/icon_picture</item>
diff --git a/app/src/main/res/xml/setting.xml b/app/src/main/res/xml/setting.xml
index ca8cfbb9..31e720a6 100644
--- a/app/src/main/res/xml/setting.xml
+++ b/app/src/main/res/xml/setting.xml
@@ -26,6 +26,12 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <PreferenceCategory android:title="@string/setting_category_accounts_title">
+ <Preference
+ android:key="@string/key_setting_accounts"
+ android:title="@string/setting_accounts_title" />
+ </PreferenceCategory>
+
<PreferenceCategory
android:summary="@string/setting_category_display_summary"
android:title="@string/setting_category_display_title">
@@ -96,10 +102,4 @@
android:key="@string/key_setting_licenses"
android:title="@string/setting_licenses_title" />
</PreferenceCategory>
- <PreferenceCategory android:title="@string/setting_category_account_title">
- <Preference
- android:key="@string/key_setting_clear_account"
- android:summary="@string/setting_delete_authentication_summary"
- android:title="@string/setting_delete_authentication_title" />
- </PreferenceCategory>
</PreferenceScreen> \ No newline at end of file